var wikipediaArray = new Array();


function formatInteger(pInt) {
  var str = pInt.toString();
  var formatedInt = '';

  for (var i = str.length; i >= 0; i--) {
    formatedInt = str.charAt(i) + formatedInt;
    if ((str.length -i) % 3 == 0 && str.length != i && i>0) {
      formatedInt = ',' + formatedInt;
    }
  }

  return formatedInt;
}


function WikipediaEntry() {
  this.lang = '';
  this.title = '';
  this.summary = '';
  this.lat = 0;
  this.lng = 0;
  this.feature = '';
  this.population = 0;
  this.elevation = 0;


    this.getInfoWindowHtml = function() {
	      var html = '<div id=geonameWin style="text-align:left; width:350px ">';
              html = html + '<img src="/img/20px-Wikipedia-logo.png" alt="" align=middle>';
              html = html + '&nbsp;<b>&nbsp;'+ this.title  + '</b><small>';
              if (this.elevation > 0) {
	        html = html + ' ' +  this.elevation + ' m';
              }
              html = html + '<br>';
	      html = html + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + this.feature;
              if (this.population > 0) {
	        html = html + ', population : ' + formatInteger(this.population);
              }
	      html += '<br>';
	      html += '<br>';
              if (this.thumbnailImg != null) {
                html += '<img src="' + this.thumbnailImg + '" alt="thumbnail image" align="right">';
              }
	      html = html + this.summary;
	      html = html + '<br>';
	      html = html + '<br>';
	      html = html + this.getDMSLat() + ' ' + this.getDMSLng() + '<br>';
	      html = html + this.lat + ' / ' + this.lng + '<br>';
	      html = html + '<br>';
	      html = html + '<a href="' + this.getWikipediaURL() + '" title="go to wikipedia" target=_blank>' + this.title + '</a> &nbsp;<img src="/img/new-window.jpg" border=0>';
              html = html + '&nbsp;&nbsp;&nbsp;&nbsp;<span style="white-space: nowrap;">Semapedia: ';
	      html = html + '<a href="' + this.getSemapediaUrlStub() + 'A6" target=_blank title="print A6, 8 small tags" onClick="return confirm(\'I will get the explicit permission *before* I attach my Semapedia Tags onto someone elses property\')"><img src="/img/semapedia13x13.jpg" border=0></a><small>A6</small>';
              html = html + ' ';
	      html = html + '<a href="' + this.getSemapediaUrlStub() + 'A7" target=_blank title="print A7, 4 large tags"onClick="return confirm(\'I will get the explicit permission *before* I attach my Semapedia Tags onto someone elses property\')"><img src="/img/semapedia32x32.jpg" border=0></a><small>A7</small>';
              html = html + '</span>';
              html = html + '<br>';
	      html = html + '</small></div>';
	      return html;
    }
 
    this.getWikipediaURL = function() {
      return 'http://' + this.lang + '.wikipedia.org/wiki/' + this.title;
    }

    this.getSemapediaUrlStub = function() {
       return 'http://www.semapedia.org/create/pdf?url=' + this.getWikipediaURL() + '&tag_size=';
    }


    this.getTableRow = function(rowNr) {
	  var tableRow = '';
      if (rowNr % 2== 0) {
		 tableRow =  '<tr>';
      } else {
         tableRow =  '<tr class=\"odd\">';
      }
      tableRow =  tableRow + '<td>' + (rowNr+1) + 
      '&nbsp;<a href=javascript:showInfo(' + rowNr + ');><img src=/maps/markers/marker10.png border=0></a></td>';

      tableRow = tableRow + '<td><a href="' + this.getWikipediaURL() + '" target=_blank>' + this.title + '</a> &nbsp;<img src="/img/new-window.jpg" border=0></td></td>';

      tableRow = tableRow + '<td>' + this.feature;
      if (this.population > 0) {
        tableRow = tableRow + ' (' + formatInteger(this.population) + ')';
      }
      if (this.elevation > 0) {
        tableRow = tableRow + ' (' + formatInteger(this.elevation) + ' m)';
      }
      tableRow = tableRow + '</td></td>';


      tableRow = tableRow + '<td>' + (Math.round(this.distToCenter*100)/100) + ' km</td></tr>';
      return tableRow;
   }

   this.getDMSLat = function () {
        var dir = "N";
        if (this.lat < 0) {
            dir = "S";
        }
        return dir + " " + getCoordinateAsString(this.lat);
    }

    this.getDMSLng = function() {
        var dir = "E";
        if (this.lng < 0) {
            dir = "W";
        }
        return dir + " " + getCoordinateAsString(this.lng);
    }


}



function parseWikipediaEntry(xmlMarker){
   var entry = new WikipediaEntry();
   entry.lat = parseFloat(xmlMarker.getElementsByTagName("lat")[0].childNodes[0].nodeValue);
   entry.lng = parseFloat(xmlMarker.getElementsByTagName("lng")[0].childNodes[0].nodeValue);
   entry.lang =  xmlMarker.getElementsByTagName("lang")[0].childNodes[0].nodeValue;
   entry.title = xmlMarker.getElementsByTagName("title")[0].childNodes[0].nodeValue;
   var summary = xmlMarker.getElementsByTagName("summary")[0].childNodes[0];
   if (summary != null) {
      entry.summary = summary.nodeValue;
   } 
   var featureTag = xmlMarker.getElementsByTagName("feature")[0].childNodes[0];
   if (featureTag != null) {
     entry.feature = featureTag.nodeValue;
   }
   var population = xmlMarker.getElementsByTagName("population")[0].childNodes[0];
   if (population != null) {
     entry.population = parseInt(population.nodeValue);
   }
   var elevation = xmlMarker.getElementsByTagName("elevation")[0].childNodes[0];
   if (elevation != null){
     entry.elevation = parseInt(elevation.nodeValue);
   }
   var thumbnailImg = xmlMarker.getElementsByTagName("thumbnailImg")[0].childNodes[0];
   if (thumbnailImg != null) {
      entry.thumbnailImg = thumbnailImg.nodeValue;
   }

   return entry;
}

// create table header for result table
function getWikipediaTableHeader() {
    listHtml = '<table class=restable><tr><th></th><th>Title</th><th>Feature</th>';
    listHtml = listHtml + '<th>km to center</th></tr>';
    return listHtml;
}

function getWikipediaTable() {
    wikipediaArray.sort(sortByDistToCenter);
    var listHtml = '';
    if (wikipediaArray.length >= numRows) {
       listHtml = listHtml + '<font color=red>only '+ numRows + ' objects displayed, zoom in or deselect some features</font>';
    }

    // create table header for result table
    listHtml = listHtml + getWikipediaTableHeader();
    
    for (var i = 0; i < wikipediaArray.length; i++) {
      var entry = wikipediaArray[i];
      listHtml = listHtml + entry.getTableRow(i);
    }   // end for 
    listHtml = listHtml + '</table>';
    return listHtml;
}

function setWikipediaMarkers() {
    markerArray= new Array();
    // we keep a hashtable of the markers with the coordinates as key
    // to slighly shift markers sharing the same position
    var markersHT = new Array();

    for (var i = 0; i < wikipediaArray.length; i++) {
      var entry = wikipediaArray[i];
      var keyHT = 'lat' + entry.lat + '-lng' + entry.lng;
      var lat = entry.lat;
      var lng = entry.lng;
      if (markersHT[keyHT] != null) {
         // two markers at same position, we randomly move the diplayed pos
         lat = lat + (signum(0.5-Math.random()))*(bounds.getNorthEast().lat - bounds.getSouthWest().lat)/140*(0.4 + Math.random());
         lng = lng + (signum(0.5-Math.random()))*(bounds.getNorthEast().lng - bounds.getSouthWest().lng)/140*(0.4 + Math.random());
      }
      markersHT[keyHT] = keyHT;                    

      var point = new GLatLng(lat,lng);
      var infoWinHtml = entry.getInfoWindowHtml();
      var icon = new GIcon(baseIcon);
      icon.iconSize = new GSize(12,20);
      icon.shadowSize = new GSize(20,20 );
      icon.iconAnchor = new GPoint(6, 20);
      icon.image = '/maps/markers/marker12.png';

      var marker = createMarker(point,null,infoWinHtml,icon);
      marker.geoname = entry;
      marker.geohtml = infoWinHtml;
      markerArray[i] = marker;

      map.addOverlay(marker);
  }
}

function mapHandlerWikipedia() {
    if (!isOpeningInfoWindow && !isMapUpdateDisabled) {
        map.clearOverlays();
        var request = GXmlHttp.create();
        var options = getHttpParams();

        var listObj =  document.getElementById("list");
        listObj.innerHTML = 'loading ... <img src=/img/loading.gif>' ;

        request.open("GET", "/servlet/geonames?srv=121&lang=" + language + '&' + options, true);
        request.onreadystatechange = function() {
          if (request.readyState == 4) {
            var listHtml = '';
            if (request.status == 200) {
	            var xmlDoc = request.responseXML;
	
                    var centerPt = map.getCenter();
	            var markers = xmlDoc.documentElement.getElementsByTagName("entry");
	            if (markers.length >0) {
                        wikipediaArray.length=0;
	                for (var i = 0; i < markers.length; i++) {
                          var entry = parseWikipediaEntry(markers[i]);
                          entry.distToCenter = distance(entry.lat, entry.lng, centerPt.lat(),centerPt.lng());
	                  wikipediaArray[i] = entry;
	                }
	                listHtml = getWikipediaTable();
                        setWikipediaMarkers();
	            } else  {
	              listHtml = 'no features found in map area. zoom out or move area';
	            }
            } else {
              listHtml = '<font color=red>the server did not respond. (errorcode ' + request.status + ')</font>';
            }
            var listObj =  document.getElementById("list");
            listObj.innerHTML = listHtml;
          } // ready state
       } // function
       request.send(null);
    } else { 
      // map update disabled 
    }

}


function setWikipedia() {
  isWikipedia = true;
  hideCodeForm();
  document.getElementById("cockpit").innerHTML = '';
  document.getElementById("tabWikipedia").className ='tabSelected';
  document.getElementById("tabGeonames").className ='';
  document.getElementById("wikipediaFormDiv").style.visibility ='visible';
}

function loadWikipedia() {
  setWikipedia();
  mapHandler();
}

function setGeonames() {
  isWikipedia = false;
  document.getElementById("cockpit").innerHTML = '';
  showCodeForm();
  mapHandler();
  document.getElementById("tabGeonames").className ='tabSelected';
  document.getElementById("tabWikipedia").className ='';
  document.getElementById("wikipediaFormDiv").style.visibility ='hidden';
}


function setWikipediaLanguage(pLang) {
  language = pLang;
  var objRadios = document.forms['wikipediaLanguageForm'].elements['language'];
  if (objRadios != null) {
    for(var i = 0; i < objRadios.length; i++) {
      if (objRadios[i].value == pLang) {
	objRadios[i].checked = true;
      }
    }
  }
  mapHandler();
}

