var map;
var globpoint;
var aicon=null;
var oicon=null;
var wicon=null;

var geocoder= null;
var thiscarrier;

var prevlat;
var prevlng;
var showlat;
var showlng;

// Center the map in the middle of europe
var centerLatitude = 57;
var centerLongitude = 10;
var startZoom = 4;


// Init function
function init() 
{
  var mapobj = document.getElementById("map");
  map = new GMap2(mapobj);



  // Mouse wheel functions
 // GEvent.addDomListener(mapobj, "DOMMouseScroll", wheelZoom); 
 // GEvent.addDomListener(mapobj, "mousewheel", wheelZoom);



  // Map controls
  //map.addControl(new GLargeMapControl());
if (showlat || showlng)
{ map.addControl(new GSmallMapControl()); }
else
{ map.addControl(new GLargeMapControl()); 
  map.addControl(new GScaleControl(50));}

  map.addControl(new GMapTypeControl());
  map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom);

  // Zoom functions
  map.enableContinuousZoom(); 
  map.enableDoubleClickZoom();

  // Possible to set map type to satellite
  // map.setMapType(G_SATELLITE_MAP);
 
  // MapOverviewControl
  map.addControl(new GOverviewMapControl(new GSize(80,80)));
  var omap=document.getElementById("map");
omap.firstChild.style.border = "1px solid #006add";
omap.firstChild.firstChild.style.border = "1px solid #006add";
//omap.style.left="2px";
//omap.style.top="2px";
omap.firstChild.firstChild.style.left="0px";
omap.firstChild.firstChild.style.top="0px";
omap.firstChild.firstChild.style.width="79px";
omap.firstChild.firstChild.style.height="79px";


geocoder = new GClientGeocoder();

// Add test marker
if (prevlat)
{
  //alert(prevlat + "," + prevlng);
  addmarker(new GLatLng(parseFloat(prevlat),parseFloat(prevlng)));
  centerandzoom(prevlat,prevlng);
}
//addmarker(new GLatLng(centerLatitude,centerLongitude));

if (showlat)
{
  marker=new GMarker(new GLatLng(parseFloat(showlat),parseFloat(showlng)));
  map.addOverlay(marker);
  centerandzoom(showlat,showlng);
}

  var panoobj = document.getElementById("panophotos");
  if (panoobj)
  { readpano(); }

// Listener on click
if (!showlat)
{
GEvent.addListener(map, "click", function(clickedmarker, point) {
  map.clearOverlays();
  if (point)
  {
    addmarker(point);
  }
  else
  {
    // Remove marker
    document.getElementById("currmarkerpos").innerHTML = "<font size=1>No position given.</font>";
    document.Addentry.lat.value="";
    document.Addentry.lng.value="";
  }

});
}

}


function addmarker(point)
{
    //map.addOverlay(new GMarker(point));
    marker=new GMarker(point,{draggable: true});
    document.Addentry.lat.value=point.lat().toFixed(6);
    document.Addentry.lng.value=point.lng().toFixed(6);
    document.getElementById("currmarkerpos").innerHTML = "<font size=1>Current position: <i>Latitude: "+point.lat().toFixed(6)+" "+"Longitude: "+point.lng().toFixed(6) +"</i> <a href=\"Javascript:centerandzoom("+ point.lat() +","+point.lng() +");\">Center and zoom</a></font>";


    GEvent.addListener(marker, "dragend", function() {
      point=marker.getPoint();
    document.Addentry.lat.value=point.lat().toFixed(6);
    document.Addentry.lng.value=point.lng().toFixed(6);
    document.getElementById("currmarkerpos").innerHTML = "<font size=1>Current position: <i>Latitude: "+point.lat().toFixed(6)+" "+"Longitude: "+point.lng().toFixed(6) +"</i> <a href=\"Javascript:centerandzoom("+ point.lat() +","+point.lng() +");\">Center and zoom</a></font>";
    });
    map.addOverlay(marker);
}

function addmarkerlatlng(lat,lng)
{
  addmarker(new GLatLng(lat,lng));
}


function wheelZoom(a) { 
    if ((a.detail || -a.wheelDelta) < 0) 
        map.zoomIn(); 
    else 
        map.zoomOut(); 

}

function centerandzoom(lat,lng) 
{ 
  tzoom=8;
  nowzoom=map.getZoom() 
  if (nowzoom>=tzoom)
  {tzoom=nowzoom+1;}
  map.setCenter(new GLatLng(lat,lng),tzoom); 
}

    function jumptocountry() {
showAddress(document.Addentry.country.value,5);
}
    function jumptoregion() {
if (document.Addentry.region.value){
showAddress(document.Addentry.region.value + "," + document.Addentry.country.value,7); }
else
{ showAddress(document.Addentry.country.value,5); }
}
    function jumptoplace() {
if (document.Addentry.place.value){
showAddress(document.Addentry.place.value + "," + document.Addentry.country.value,8);}
else
{ showAddress(document.Addentry.country.value,5); }
}

// from Google API official site

    function showAddress(address,zoom) {
      if (geocoder) {
        geocoder.getLatLng(
          address,
          function(point) {
            if (!point) {
              alert(address + " not found.");
            } else {
              map.setCenter(point, zoom);
             // var marker = new GMarker(point);
             // map.addOverlay(marker);
             // marker.openInfoWindowHtml(address);
            }
          }
        );
      }
    }




function showairports(Lat,Lon,carrier,antnum) 
{
  // Clear all overlays
  map.clearOverlays();

  // Add the original marker again
  globpoint=new GLatLng(parseFloat(Lat),parseFloat(Lon));
  marker=new GMarker(globpoint);
  map.addOverlay(marker);
  thiscarrier=carrier;

  GDownloadUrl("findairports.php?lat=" + Lat + "&lng=" + Lon + "&carriers=" + carrier +"&limit=" + antnum , process_it) ;
  // GDownloadUrl("findairports.php?lat=" + Lat + "&lng=" + Lon + "&carriers=" + carrier , process_it) ;
  
}


// Creates a marker at the given point with the given number label
        function createamarker(point, text) {
          var marker = new GMarker(point,aicon);
          GEvent.addListener(marker, "click", function() {
            marker.openInfoWindowHtml(text);
          });
          return marker;
        }

        function createomarker(point, text) {
          var marker = new GMarker(point,oicon);
          GEvent.addListener(marker, "click", function() {
            marker.openInfoWindowHtml(text);
          });
          return marker;
        }

        function createwmarker(point, text) {
          var marker = new GMarker(point,wicon);
          GEvent.addListener(marker, "click", function() {
            marker.openInfoWindowHtml(text);
          });
          return marker;
        }


process_it = function(doc) 
{

  // Bounds to show only the found items
  bounds = new GLatLngBounds();

  // === split the document into lines ===
  lines = doc.split("\n");
  lines.length=lines.length-1;
  foundmaps=lines.length;

  if (!aicon)
  { makeairporticon();}

  for (var i=0; i<lines.length; i++) 
  {
    if (lines[i].length > 1) 
    {
      // === split each line into parts separated by "|" and use the contents ===
      parts = lines[i].split("|");
      var name = parts[0];
      var lat = parseFloat(parts[1]);
      var lng = parseFloat(parts[2]);
      var place = parts[3];
      var country = parts[4];
      var carriers = parts[5];
      var code = parts[6];

      var point = new GLatLng(lat,lng);
      var distance=point.distanceFrom(globpoint)/1000;
      // distance.toFixed(1)
 
      var html="<span class=popuphead>Airport: "+name+"</span><br><table cellspacing=0 cellpadding=2><tr><td><b>Distance to event</b></td><td>"+distance.toFixed(1)+" km</td></tr><tr><td><b>Country:</b></td><td>"+country+"</td></tr><tr><td><b>City:</b></td><td>"+place+"</td></tr><tr><td><b>Airport code:</b></td><td>"+code+"</td></tr></table>\n";

      tocity=code;
      if (thiscarrier=='Norwegian')
      { 
        html+="<p><table cellpadding=2 width=230 style=\"border: 2px solid #ff3300\"><tr><td>";
        html+="<form name=n target=_blank action=\"http://ip.norwegian.no/ip/FareCalendarExecAction.aspx\" method=\"GET\">";
        html+="<b>Search for flights</b><br>";
        html+="<table>";
        html+="<tr><td><b>From:</b></td><td><input name=\"D_City\" size=3 value=\"OSL\"></td></tr>";
        html+="<tr><td><b>To:</b></td><td><input name=\"A_City\" size=3 value=\""+ tocity +"\"></td></tr>"
        html+="<tr><td colspan=2><input type=\"submit\" value=\"Search for flights\"></tr>";
        html+="</table>";
        html+="<input type=hidden name=\"D_Day\" value=\""+startday+"\">";
        html+="<input type=hidden name=\"D_Month\" value=\""+startmonth+"\">";
        html+="<input type=hidden name=\"R_Day\" value=\""+stopday+"\">";
        html+="<input type=hidden name=\"R_Month\" value=\""+stopmonth+"\">";
        html+="<center><img width=135 height=28 src=\"img/norwegian.jpg\"></center>";
        html+="<br><i>Note! Destination and arrival airports MUST be UPPERCASE airport codes!</i>";
        html+="</form>";
        html+="</td></tr></table>";
      }
      else
      {

        if (thiscarrier=='Ryanair')
        { extrainfostr="<tr><td colspan=2><span class=\"ftit\">You can search for Ryanair including other flights in Kayak, or go directly to <a target=_blank href=\"http://www.ryanair.com\">Ryanair</a> to search for yourself. See also Ryainair <a target=_blank href=\"http://www.ryanair.com/site/EN/dests.php?loc="+tocity+"\">destination info for "+tocity+"</a>.</span></td></tr>";} 
        else
        { extrainfostr="<tr><td colspan=2><span class=\"ftit\">Tip! Try to search for flights to several of the airports around the event to get the lowest price. This search uses Kayak.</span></td></tr>";} 
        startmonth=startmonth.toString();
        startdfull=startmonth.substring(4,6) + "/" + startday + "/" + startmonth.substring(0,4); // MM/DD/YYYY
        stopmonth=stopmonth.toString();
        stopdfull=stopmonth.substring(4,6) + "/" + stopday + "/" + stopmonth.substring(0,4); // MM/DD/YYYY
        html+="<p><table cellpadding=2 width=230 style=\"border: 2px solid #FAAA52\"><tr><td>";
        html+="<form name=n target=_blank action=\"http://www.kayak.com/s/search/air\" method=\"GET\">";
        html+="<b>Search for flights</b><br>";
        html+="<table>";
        html+="<tr><td><b>From:</b></td><td><input name=\"l1\" size=14 value=\"Bergen, Norway\"></td></tr>";
        html+="<tr><td><b>To:</b></td><td><input name=\"l2\" size=14 value=\""+ tocity +"\"></td></tr>"
        html+="<tr><td><b>Leave:</b></td><td><input name=\"d1\" value=\""+startdfull+"\"></td></tr>";
        html+="<tr><td><b>Return:</b></td><td><input name=\"d2\" value=\""+stopdfull+"\"></td></tr>";
        html+="<tr><td colspan=2><input type=\"submit\" value=\"Search for flights\"></tr>";
        html+=extrainfostr;
        html+="</table>";
        html+="<center><img width=51 height=28 src=\"img/kayak.gif\"></center>";
        html+="</form>";
        html+="</td></tr></table>";
      }


      //marker=new GMarker(new GLatLng(parseFloat(lat),parseFloat(lng)),aicon);
      marker=createamarker(new GLatLng(parseFloat(lat),parseFloat(lng)),html);

      map.addOverlay(marker);
      bounds.extend(point);

    }          
  }
    var thezoom=map.getBoundsZoomLevel(bounds);
    //if (thezoom>13) {thezoom=13;}
    map.setZoom(thezoom);
    map.setCenter(bounds.getCenter());
}

function makeairporticon()
{
        aicon = new GIcon();
        aicon.image = "img/airport.gif";
        aicon.shadow = "img/airport.gif";
        aicon.iconSize = new GSize(25, 25);
        aicon.shadowSize = new GSize(25,25);
        aicon.iconAnchor = new GPoint(13,13);
        aicon.infoWindowAnchor = new GPoint(13,13);
}


function makewicon()
{
        wicon = new GIcon();
        wicon.image = "img/wiki.gif";
        wicon.shadow = "img/wiki.gif";
        wicon.iconSize = new GSize(52, 37);
        wicon.shadowSize = new GSize(52,37);
        wicon.iconAnchor = new GPoint(26,18);
        wicon.infoWindowAnchor = new GPoint(26,18);
}


function showmaps(Lat,Lon) 
{
  // Clear all overlays
  map.clearOverlays();

  // Add the original marker again
  globpoint=new GLatLng(parseFloat(Lat),parseFloat(Lon));
  marker=new GMarker(globpoint);
  map.addOverlay(marker);
  GDownloadUrl("findmaps.php?lat=" + Lat + "&lng=" + Lon + "&type=1", process_maps) ;
}

process_maps = function(doc) 
{

  // Bounds to show only the found items
  bounds = new GLatLngBounds();
  bounds.extend(globpoint);

  // === split the document into lines ===
  lines = doc.split("\n");
  lines.length=lines.length-1;
  foundmaps=lines.length;
  if (foundmaps==0)
  { alert("No maps found");}

  if (!oicon)
  { makeoicon();}

  for (var i=0; i<lines.length; i++) 
  {
    if (lines[i].length > 1) 
    {
      // === split each line into parts separated by "|" and use the contents ===
      parts = lines[i].split("|");
      var name = parts[0];
      var lat = parseFloat(parts[1]);
      var lng = parseFloat(parts[2]);
      var year = parts[3];
      var id = parts[4];
      var sourceurl = parts[5];
      var source = parts[6];
      var owner = parts[7];
      var scale = parts[8];
      var country = parts[9];
      var checked = parts[10];
      var outline = parts[11];
      var area = parts[12];
      var image = parts[13];
      var email = parts[14];

      var point = new GLatLng(lat,lng);
      var distance=point.distanceFrom(globpoint)/1000;

      var imagestr="";
      if (image)
      {
         smallimage=image.substring(0,image.length-4) + "_s.jpg";
        // newImg="http://maps.worldofo.com/mapimg/"+smallimage;
        // var newImg = new Image();
        // newImg.src = imgSrc;
       //  var height = newImg.height;
       //  var width = newImg.width;

         imagestr="<center><img height=\"60\" width=\"60\" src=\"http://maps.worldofo.com/mapimg/"+smallimage+"\"></center>";}

      var html="<h3>Map: "+name+"</h3><table cellspacing=0 cellpadding=2><tr><td><b>Distance to map</b></td><td>"+distance.toFixed(1)+" km</td></tr><tr><td><b>Country:</b></td><td>"+country+"</td></tr><tr><td><b>Year:</b></td><td>"+year+"</td></tr><tr><td><b>Scale:</b></td><td>"+scale+"</td></tr><tr><td><b>Area:</b></td><td>"+area+" km<sup><font size=1>2</font></sup></td></tr><tr><td colspan=2><a target=_blank href=\"http://maps.worldofo.com/showmap.php?id="+id+"\">Open map page in new window</a></table>"+imagestr+"\n";

      marker=createomarker(new GLatLng(parseFloat(lat),parseFloat(lng)),html);

      map.addOverlay(marker);
      bounds.extend(point);

    }          
  }
    var thezoom=map.getBoundsZoomLevel(bounds);
    //if (thezoom>13) {thezoom=13;}
    map.setZoom(thezoom);
    map.setCenter(bounds.getCenter());
}



function showevents(Lat,Lon,id,startdate,stopdate) 
{
  // Clear all overlays
  map.clearOverlays();

  // Add the original marker again
  globpoint=new GLatLng(parseFloat(Lat),parseFloat(Lon));
  marker=new GMarker(globpoint);
  map.addOverlay(marker);
  startdatestr="";
  if (startdate)
  { startdatestr="&startdate=" + startdate + "&stopdate=" + stopdate; }

  // alert("findevents.php?lat=" + Lat + "&lng=" + Lon + "&id=" + id + startdatestr);
  GDownloadUrl("findevents.php?lat=" + Lat + "&lng=" + Lon + "&id=" + id + startdatestr , process_events) ;
  
}

process_events = function(doc) 
{

  // Bounds to show only the found items
  bounds = new GLatLngBounds();
  bounds.extend(globpoint);

  // === split the document into lines ===
  lines = doc.split("\n");
  lines.length=lines.length-1;
  foundmaps=lines.length;
  if (foundmaps==0)
  { alert("No events found");}

  if (!oicon)
  { makeoicon();}

  for (var i=0; i<lines.length; i++) 
  {
    if (lines[i].length > 1) 
    {
      // === split each line into parts separated by "|" and use the contents ===
      parts = lines[i].split("|");
      var name = parts[0];
      var lat = parseFloat(parts[1]);
      var lng = parseFloat(parts[2]);
      var country = parts[3];
      var id = parts[4];
      var startdate = parts[5];
      var stopdate = parts[6];

      var point = new GLatLng(lat,lng);
      var distance=point.distanceFrom(globpoint)/1000;


      // startdfull=startmonth.substring(4,6) + "/" + startday + "/" + startmonth.substring(0,4); // MM/DD/YYYY
 
      var html="<span class=popuphead>Event: "+name+"</span><br><table cellspacing=0 cellpadding=2><tr><td><b>Distance to event</b></td><td>"+distance.toFixed(1)+" km</td></tr><tr><td><b>Country:</b></td><td>"+country+"</td></tr><tr><td><b>Start date:</b></td><td>"+startdate+"</td></tr><tr><td><b>End date:</b></td><td>"+stopdate+"</td></tr><tr><td colspan=2><a href=\"?id="+id+"\">Open event page</a></table>\n";

      marker=createomarker(new GLatLng(parseFloat(lat),parseFloat(lng)),html);

      map.addOverlay(marker);
      bounds.extend(point);

    }          
  }
    var thezoom=map.getBoundsZoomLevel(bounds);
    //if (thezoom>13) {thezoom=13;}
    map.setZoom(thezoom);
    map.setCenter(bounds.getCenter());
}

function makeoicon()
{
        oicon = new GIcon();
        oicon.image = "img/oflag.png";
        oicon.shadow = "img/oflag.png";
        oicon.iconSize = new GSize(20, 20);
        oicon.shadowSize = new GSize(20,20);
        oicon.iconAnchor = new GPoint(10,10);
        oicon.infoWindowAnchor = new GPoint(10,10);
}

function parsewiki(jData) {
  if (jData == null) {
      alert('Sorry: Could not get in contact with geonames server');
    return;
  }
  // Bounds to show only the found items



  bounds = new GLatLngBounds();

  if (!wicon)
  { makewicon();}

  var geonames = jData.geonames;
  if (geonames.length==0) { alert('Sorry: No results found');}

  for (i=0;i< geonames.length;i++) 
  {
     var tgeo = geonames[i];
     var name=tgeo.title;
     var summary=tgeo.summary;
     var population=tgeo.population;
     var link=tgeo.wikipediaUrl;
     var feature=tgeo.feature;
     var lat=tgeo.lat;
     var lng=tgeo.lng;

     var point = new GLatLng(lat,lng);
     var distance=point.distanceFrom(globpoint)/1000;
     // distance.toFixed(1)
 
     var html="<div style=\"width: 300px;\"><h3>"+name+"</h3><table cellspacing=0 cellpadding=2><tr><td><b>Distance</b></td><td>"+distance.toFixed(1)+" km from marked point</td></tr><tr><td valign=top valign=top><b>Summary:</b></td><td>"+summary+"</td></tr><tr><td><b>Feature:</b></td><td>"+feature+"</td></tr><tr><td><b>Link:</b></td><td><a target=_blank href=\"http://"+link+"\">Wikipedia entry</a></td></tr></table></div>\n";

      //marker=new GMarker(new GLatLng(parseFloat(lat),parseFloat(lng)),aicon);
      marker=createwmarker(new GLatLng(parseFloat(lat),parseFloat(lng)),html);

      map.addOverlay(marker);
      bounds.extend(point);

  }
  var thezoom=map.getBoundsZoomLevel(bounds);
  //if (thezoom>13) {thezoom=13;}
  map.setZoom(thezoom);
  map.setCenter(bounds.getCenter());
  document.getElementById("wikiwait").innerHTML = "";

}

// calls the geonames JSON webservice with the search term
function findwiki(Lat,Lon) {

  document.getElementById("wikiwait").innerHTML = "<font size=1>Loading data....</font>";
  // Clear all overlays
  map.clearOverlays();

  // Add the original marker again
  globpoint=new GLatLng(parseFloat(Lat),parseFloat(Lon));
  marker=new GMarker(globpoint);
  map.addOverlay(marker);

  request = 'http://ws.geonames.org/findNearbyWikipediaJSON?lat='+Lat+'&lng='+Lon+'&callback=parsewiki&maxRows=10';
  aObj = new JSONscriptRequest(request);
  aObj.buildScriptTag();
  aObj.addScriptTag();
}

function JSONscriptRequest(fullUrl) {
    // REST request path
    this.fullUrl = fullUrl; 
    // Keep IE from caching requests
    this.noCacheIE = '&noCacheIE=' + (new Date()).getTime();
    // Get the DOM location to put the script tag
    this.headLoc = document.getElementsByTagName("head").item(0);
    // Generate a unique script tag id
    this.scriptId = 'YJscriptId' + JSONscriptRequest.scriptCounter++;
}

// Static script ID counter
JSONscriptRequest.scriptCounter = 1;

// buildScriptTag method
//
JSONscriptRequest.prototype.buildScriptTag = function () {

    // Create the script tag
    this.scriptObj = document.createElement("script");
    
    // Add script object attributes
    this.scriptObj.setAttribute("type", "text/javascript");
    this.scriptObj.setAttribute("src", this.fullUrl + this.noCacheIE);
    this.scriptObj.setAttribute("id", this.scriptId);
}
 
// removeScriptTag method
// 
JSONscriptRequest.prototype.removeScriptTag = function () {
    // Destroy the script tag
    this.headLoc.removeChild(this.scriptObj);  
}

// addScriptTag method
//
JSONscriptRequest.prototype.addScriptTag = function () {
    // Create the script tag
    this.headLoc.appendChild(this.scriptObj);
}

window.onload = init;


