//<![CDATA[

var map;
var loadstate;
var markerstate=-1;
var route = new GGeoXml("http://avhaarlemmermeer.nl/marathon/route-2.kmz");
var jeugdloop = new GGeoXml("http://avhaarlemmermeer.nl/marathon/jeugdloop-2.kml");
var r5km = new GGeoXml("http://avhaarlemmermeer.nl/marathon/5km-2.kml");
var r10km = new GGeoXml("http://avhaarlemmermeer.nl/marathon/10km-2.kml");
var halvemarathon = new GGeoXml("http://avhaarlemmermeer.nl/marathon/21km-2.kml");
var marathon = new GGeoXml("http://avhaarlemmermeer.nl/marathon/42km-2.kml");
var parkeren = new GGeoXml("http://avhaarlemmermeer.nl/marathon/parkeren-2.kmz");
var verkeer;
var water;
var sponzen;
var veerooster;
var routeaangever;
var marker;
var gLatLngArray=new Array(0);      // array of coordinates
var gKiloArray =new Array(0);
var kiloState=0; //decides whether button creates or deletes markers 
var distance;
var distanceArray;
var	xpos=0;
var	ypos=0;
var code="";
var	omschrijving="";

function onLoad() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map")); 
	if (xpos==0)
		map.setCenter(new GLatLng(52.32,4.69), 12); 
	else
		map.setCenter(new GLatLng(ypos,xpos), 16); 
    map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GOverviewMapControl());
    map.addOverlay(route);
	if (xpos!=0)
	{    marker=addMarker(xpos,ypos,code,omschrijving);
	     map.addOverlay(marker);
	}
	loadstate=1;
    GEvent.addListener(map, "zoomend", function(oldzoom,newzoom)
	{ 	if (newzoom<12 && markerstate==1)
			toggleMap(7);
		if (oldzoom<12 && newzoom>=12 && markerstate==0)
			toggleMap(7);
		if (newzoom<12 && kiloState==1)
			setKiloMarkers(false);
		if (oldzoom<12 && newzoom>=12 && kiloState==0 && loadstate>1)
			setKiloMarkers(true);
		return;
	});
  }
} 

// load a route from a kml file
function loadRoute( url )
{
	  setKiloMarkers(false);

  for( i = gLatLngArray.length - 1; i >= 0; i-- )
    delete gLatLngArray[i];
  gLatLngArray=[];
  updateDistance();
  GDownloadUrl(url, function(data, responseCode) 
  {	if( responseCode == 200 )
   { isLoading=true;
      var xml = GXml.parse(data);
      var coordinates = xml.documentElement.getElementsByTagName("coordinates");
	  var coordinatesString="";
	  for (var i=0;i<coordinates[0].childNodes.length;i++)
	  { coordinatesString+=coordinates[0].childNodes[i].nodeValue;
	  }
      var coordinatesArray=coordinatesString.split(" ");
	  for (var i = 0; i < coordinatesArray.length-1; i++) 
	  { var points=coordinatesArray[i].split(",");
	  	gLatLngArray.push(new GLatLng(parseFloat(points[1]),
                                     parseFloat(points[0])));
		updateDistance(i-1);
      }
      isLoading=false;
//	  debugAll();
	  setKiloMarkers(true);
    }
    else
    { alert( "Error loading xml file (code=" + responseCode + ")" );
   }
  });
}

function debugAll() 
{
  var msg="points: "
  msg+= gLatLngArray.length +"\n";
  for(i=0; i < gLatLngArray.length; i++)
  {
//    msg += i + " - " + gLatLngArray[i].lat() + " - " + gLatLngArray[i].lng() + "\n";
  }

  msg += "\ndistances: ";
  msg+= distanceArray.length +"\n";
  for(i=0; i < distanceArray.length; i++)
  {
//    msg += i + " - " + distanceArray[i] + "\n";
  }

  msg += "\ndistance: " + distance + "\n";
  alert( msg );
}

// update the global total distance by recomputing distance from point
// index to next point
function updateDistance(index)
{   if( gLatLngArray.length <= 1 ) // less than two points, distance is 0
  {
    distanceArray=[];
    distance=0.0;
  }
  else if( index >= 0 && index < gLatLngArray.length - 1)
  {
    // get distance to next point
    dist = gLatLngArray[index].distanceFrom(gLatLngArray[index+1]);
    if( index < distanceArray.length )  // not for last point
    {
      distance -= distanceArray[index]; // subtract previous computed distance segment
      distanceArray[index] = dist;      // reset segment distance
    }
    else
    {
      distanceArray.push(dist);         // for last point add segment
    }
    distance += dist;                   // add distance
  }
}

//]]>

function setKiloMarkers(state) 
{
	if (state==false && kiloState==1)//Delete kilometers 
	{	var marker;
		for( i = gKiloArray.length - 1; i >= 0; i-- ) {
			map.removeOverlay(gKiloArray.pop());
		}
		delete gKiloArray;
		gKiloArray =new Array(0);
		kiloState=0;
	}
	else
	{ if (state==true)
	  {	var f = new GIcon();
		f.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
		f.iconSize = new GSize(17,17);
		f.shadowSize = new GSize(22,20);
		f.iconAnchor = new GPoint(6,20);
		f.infoWindowAnchor = new GPoint(6,1);
		f.infoShadowAnchor = new GPoint(13,13);
		locDist=0;
		kmStep=1;
		kiloState=1;
		for (index=0;index<gLatLngArray.length-1;index++) {
			kilo = Math.floor (locDist/1000)// the first kilometer in this loop
			locDist+=distanceArray[index] // the next local distance
			for (i=kilo;i<=Math.min(60,Math.floor(locDist/1000));i++) 
			{
			    if (parseInt(i/kmStep)>= gKiloArray.length) {
				    //Calc lat/lng, add point, marker, overlay and add them to arrays
				    var latKM = gLatLngArray[index].lat()+(i*1000-(locDist-distanceArray[index])) / distanceArray[index]*(gLatLngArray[index+1].lat()-gLatLngArray[index].lat());
				    var lngKM = gLatLngArray[index].lng()+(i*1000-(locDist-distanceArray[index])) / distanceArray[index]*(gLatLngArray[index+1].lng()-gLatLngArray[index].lng());
				    var point = new GLatLng(latKM,lngKM);	
					if (i==0)
					{	f.image = "http://maps.google.com/mapfiles/kml/pal4/icon29.png";
				    	var marker = new GMarker(point, {icon:f,draggable:false,bouncy:false,title:'Start'});
					}
					else
					{
				    	f.image = "images/mile_"+i+".png";
				    	var marker = new GMarker(point, {icon:f,draggable:false,bouncy:false,title:i+' Km'});
					}
				    map.addOverlay(marker);
				    gKiloArray.push(marker);
			    }
			}
		} 
	    var point1 = new GLatLng(gLatLngArray[gLatLngArray.length-1].lat(),gLatLngArray[gLatLngArray.length-1].lng());	
		f.image = "http://maps.google.com/mapfiles/kml/pal4/icon29.png";
		var marker1 = new GMarker(point1, {icon:f,draggable:false,bouncy:false,title:'Finish'});
	    map.addOverlay(marker1);
	    gKiloArray.push(marker1);
	  }
	}
}

function defMarker(xpos1,ypos1,code1,omschrijving1)
{	xpos=xpos1;
	ypos=ypos1;
	code=code1;
	omschrijving=omschrijving1;
}

function addMarker(xpos,ypos,code,omschrijving)
{
	var f = new GIcon();
	f.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
	f.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
	f.iconSize = new GSize(12,20);
	f.shadowSize = new GSize(22,20);
	f.iconAnchor = new GPoint(6,20);
	f.infoWindowAnchor = new GPoint(6,1);
	f.infoShadowAnchor = new GPoint(13,13);
    var point = new GLatLng(ypos,xpos);
	return new GMarker(point, {icon:f,draggable:false,bouncy:false,title:code+' '+omschrijving});
}

function toggleMap(target) 
{	
  if (target==7)
  {	if (markerstate<0)
  	{	verkeer=new GGeoXml("http://avhaarlemmermeer.nl/marathon/verkeer-3.kmz");
		water=new GGeoXml("http://avhaarlemmermeer.nl/marathon/water-2.kmz");
		sponzen=new GGeoXml("http://avhaarlemmermeer.nl/marathon/sponzen-2.kmz");
		routeaangever=new GGeoXml("http://avhaarlemmermeer.nl/marathon/routeaangever-2.kmz");
		veerooster=new GGeoXml("http://avhaarlemmermeer.nl/marathon/veerooster-2.kmz");
		markerstate=0;
	}
	if (markerstate==0)
	{	
		map.addOverlay(verkeer);
		map.addOverlay(water);
		map.addOverlay(sponzen);
		map.addOverlay(routeaangever);
		map.addOverlay(veerooster);
		markerstate=1;
		return;
	}
  	if (markerstate==1)
  	{	
		map.removeOverlay(verkeer);
		map.removeOverlay(water);
		map.removeOverlay(sponzen);
		map.removeOverlay(routeaangever);
		map.removeOverlay(veerooster);
		markerstate=0;
	  	return;
	}
  }
  if (loadstate == 1) {
    map.removeOverlay(route);
  } if (loadstate==2) {
    map.removeOverlay(jeugdloop);
  } if (loadstate==3) {
    map.removeOverlay(r5km);
  } if (loadstate==4) {
    map.removeOverlay(r10km);
  } if (loadstate==5) {
    map.removeOverlay(halvemarathon);
  } if (loadstate==6) {
    map.removeOverlay(marathon);
  } 
  

  if (target == 1) 
  {
    map.addOverlay(route);
	setKiloMarkers(false);
  } if (target==2) {
    map.addOverlay(jeugdloop);
	loadRoute("jeugdloop-2.kml");
  } if (target==3) {
    map.addOverlay(r5km);
	loadRoute("5km-2.kml");
  } if (target==4) {
    map.addOverlay(r10km);
	loadRoute("10km-2.kml");
  } if (target==5) {
    map.addOverlay(halvemarathon);
	loadRoute("21km-2.kml");
  } if (target==6) {
    map.addOverlay(marathon);
	loadRoute("42km-2.kml");
  }
  loadstate=target;
}

function CallForm() 
{
	document.downloadkml.submit();
}
//]]>

