function AlternateName() {
  this.alternateNameId = 0;
  this.locale = '';
  this.name = '';
  this.isOfficialName = false;
  this.isShortName = false;
}

var altNames = new Array();
var lastIdx = -1;
var alternateNameGeoNameId;

function getAlternateNames(jData) {
  if (jData == null) {
    alert("There was a problem parsing search results.");
    return;
  }
  altNames = jData.geonames;
  createTable();
}

function loadAlternateNamesForGeoNameId(id) {
  alternateNameGeoNameId = id;
  request = '/servlet/geonames?srv=150&id=' + id + '&callback=getAlternateNames';	  
  // Create a new script object
  aObj = new JSONscriptRequest(request);
  // Build the script tag
  aObj.buildScriptTag();
  // Execute (add) the script tag
  aObj.addScriptTag();
  showAlternateNamesDiv();
}

function createTable(){
  var html = '<table class=restable><tr><th>Name</th><th colspan=2>Language Code</th><th>&#134;</th><th>s</th><th>Action</th></tr>';
  for (var i = 0; i < altNames.length; i++) {
    var locale = altNames[i].locale;
    if (locale == null) {
      locale = "";
      altNames[i].locale = "";
    }
    if (i % 2== 0) {
	  html += '<tr>';
    } else {
      html +=  '<tr class=\"odd\">';
    }
    html += '<td><span id="name.' + i + '">' + altNames[i].name + '</span></td><td><span id="l.' + i + '">' + locale + '</span></td><td>' + altNames[i].displayLocale + '</td>';
    html += '<td><span id="isOfficialName.' + i + '">';
    if (altNames[i].isOfficialName == true) {
       html += 'x';
    } 
    html += '</span></td>';

    html += '<td><span id="isShortName.' + i + '">';
    if (altNames[i].isShortName == true) {
       html += 'x';
    }
    html += '</span></td>';

    html += '<td><span id="action.' + i + '"><a href="javascript:editAlternateName(' + i + ')">edit</a>/<a href="javascript:deleteAlternateName(' + i + ')">delete</a></span></td></tr>'; 

  }

  html = html + '</table>';
  html = html + '<a href="javascript:insertAlternateName()">new</a>';
  document.getElementById("alternateNamesTableDiv").innerHTML = html;
  lastIdx = -1;
}



function editAlternateName(idx) {
  checkDirty();
  var elem = document.getElementById("l."+ idx);
  elem.innerHTML = '<input name=locale type=text value="' + altNames[idx].locale + '" size=3 maxlength=7>';

  var elem = document.getElementById("name."+ idx);
  elem.innerHTML = '<input name=altName type=text value="' + altNames[idx].name + '" size=30 maxlength=200>';

  var elem = document.getElementById("isOfficialName."+ idx);
  var isOfficialName = '<input type="checkbox" name="isOfficialName"';
  if (altNames[idx].isOfficialName) {
   isOfficialName += ' checked';
  }
  isOfficialName += ' value="true">';
  elem.innerHTML = isOfficialName;

  var elem = document.getElementById("isShortName."+ idx);
  var isShortName = '<input type="checkbox" name="isShortName"';
  if (altNames[idx].isShortName) {
   isShortName += ' checked';
  }
  isShortName += ' value="true">';
  elem.innerHTML = isShortName;


  var elem = document.getElementById("action."+ idx);
  elem.innerHTML = '<a href="javascript:saveAlternateName(' + idx + ')">save</a>/<a href="javascript:deleteAlternateName(' + idx + ')">delete</a>';

  lastIdx = idx;
}


function saveAlternateName(idx) {
  if (isDirty(idx)) {
    var alternateName = altNames[idx];
    alternateName.name = document.alternateNamesForm.altName.value;
    alternateName.locale = document.alternateNamesForm.locale.value;
    alternateName.isOfficialName = false;
    if (document.alternateNamesForm.isOfficialName.checked) {
      alternateName.isOfficialName = true;
    }

    alternateName.isShortName = false;
    if (document.alternateNamesForm.isShortName.checked) {
      alternateName.isShortName = true;
    }

    var params = '';
    params = params + '&alternateNameId=' + alternateName.alternateNameId;
    params = params + '&id=' + alternateName.geoNameId;
    params = params + '&alternateName=' + encodeURIComponent(alternateName.name);
    params = params + '&alternateNameLocale=' + alternateName.locale;
    params = params + '&isOfficialName=' + alternateName.isOfficialName;
    params = params + '&isShortName=' + alternateName.isShortName;

    var request = GXmlHttp.create();

    request.open("GET", '/servlet/geonames?srv=151&' + params, true);
    request.onreadystatechange = function() {
      if (request.readyState == 4) {
        var xmlDoc = request.responseXML;
        var status = xmlDoc.documentElement.getElementsByTagName("status")[0];
        if (status.getAttribute("value") == 0) {
          var alternateName = parseAlternateName(xmlDoc);
          setAlternateName(idx,alternateName);
        } else {
          var errMessage = status.getAttribute("message");
          document.getElementById("cockpit").innerHTML = '<font color=red>error while saving:<br>'+ errMessage + '</font>';
          alert(errMessage);
        }
      }
    } // function
    request.send(null);

  } else {
    alert('no changes, save not required');
  }
  createTable();
  lastIdx = -1;
}

function setAlternateName(idx, alternateName) {
  altNames[idx] = alternateName;
}

function deleteAlternateName(idx) {
   var alternateName = altNames[idx];
 
   if (!confirm('do you really want to delete the name "' + alternateName .name + '"?')){
      return;
   }

   if (alternateName.alternateNameId > 0) {
     var request = GXmlHttp.create();
     request.open("GET", '/servlet/geonames?srv=152&alternateNameId=' + alternateName.alternateNameId + '&id=' + alternateName.geoNameId, true);
     request.onreadystatechange = function() {
       if (request.readyState == 4) {
         var xmlDoc = request.responseXML;
         var status = xmlDoc.documentElement.getElementsByTagName("status")[0];
         if (status.getAttribute("value") == 0) {
         } else {
          var errMessage = status.getAttribute("message");
          document.getElementById("cockpit").innerHTML = '<font color=red>error while saving:<br>'+ errMessage + '</font>';
          alert(errMessage);
         }
       }
     } // function
     request.send(null);
   }
   altNames.splice(idx,1);
   createTable();
   lastIdx = -1;
}


function isDirty(idx) {
  var isDirty = false;
  isDirty = isDirty || altNames[idx].locale != document.alternateNamesForm.locale.value;
  isDirty = isDirty || altNames[idx].name != document.alternateNamesForm.altName.value;
  isDirty = isDirty || altNames[idx].isOfficialName != document.alternateNamesForm.isOfficialName.value;
  isDirty = isDirty || altNames[idx].isShortName != document.alternateNamesForm.isShortName.value;

  return isDirty;
}


function checkDirty() {
  if (lastIdx > -1) {
    if (isDirty(lastIdx)) {
      alert(document.alternateNamesForm.locale.value + ' / ' + document.alternateNamesForm.altName.value + ' has not been saved. The modification is discarded.');
    }
    var elem = document.getElementById("l."+ lastIdx);
    elem.innerHTML = altNames[lastIdx].locale;

    var elem = document.getElementById("name."+ lastIdx);
    elem.innerHTML = altNames[lastIdx].name;

    var elem = document.getElementById("isOfficialName."+ lastIdx);
    if (altNames[lastIdx].isOfficialName) {
       elem.innerHTML = 'x';
    } else {
      elem.innerHTML = '';
    }

    var elem = document.getElementById("action."+ lastIdx);
    elem.innerHTML = '<a href="javascript:editAlternateName(' + lastIdx + ')">edit</a>/<a href="javascript:deleteAlternateName(' + lastIdx + ')">delete</a>';
  }
}


function hideAlternateNamesDiv() {
  document.getElementById("alternateNamesDiv").style.visibility='hidden';
}


function showAlternateNamesDiv() {
  document.getElementById("alternateNamesDiv").style.visibility='visible';
}



function insertAlternateName(){
  checkDirty();
  var alt = new AlternateName();
  alt.alternateNameId = 0;
  alt.geoNameId = alternateNameGeoNameId;
  alt.locale = '';
  alt.displayLocale = '';
  alt.name = '';
  alt.isOfficialName = false;
  altNames.push(alt);
  createTable();
  editAlternateName(altNames.length -1 );
}


function parseAlternateName(xmlMarker){
   var alt = new AlternateName();
   alt.alternateNameId  = parseInt(xmlMarker.getElementsByTagName("alternateNameId")[0].childNodes[0].nodeValue);
   alt.geoNameId  = parseInt(xmlMarker.getElementsByTagName("geoNameId")[0].childNodes[0].nodeValue);
   var locale = xmlMarker.getElementsByTagName("locale")[0].childNodes[0];
   if (locale !=  null) {
     alt.locale = locale.nodeValue;
   }
   var displayLocale =  xmlMarker.getElementsByTagName("displayLocale")[0].childNodes[0];
   if (displayLocale != null) {
     alt.displayLocale = displayLocale.nodeValue;
   }
   alt.name =  xmlMarker.getElementsByTagName("name")[0].childNodes[0].nodeValue;
   alt.isOfficialName =  xmlMarker.getElementsByTagName("isOfficialName")[0].childNodes[0].nodeValue;
   alt.isShortName =  xmlMarker.getElementsByTagName("isShortName")[0].childNodes[0].nodeValue;
   return alt;
}
