	//Global variables
	var map;
	var ge;
	var earthMode = false;
	var mapControl;
	var navControl;
	var placemarks = [];
	var imagemarkLookup = [];
	var earthImagemarks = [];
	var imagemarkList = [];
	var imageIndex = 0;
	var NEPAL = 0;
	var KATHMANDU = 1;
	var TREK = 2;
	var TRACKING = 3;
	var currentMap = NEPAL;
	var currentStage = -1;
	var lastStage = 7;
	var lastMarker;
	var lastKmlLayer;
	var pathOverlays;
	var expeditionStartDate = 12;
	var date;
	
	var imageMarkIcon = new GIcon(G_DEFAULT_ICON);
	imageMarkIcon.image = "http://maps.google.com/mapfiles/kml/paddle/wht-blank.png";
	imageMarkIcon.iconSize = new GSize(32, 32);	
	imageMarkIcon.iconAnchor = new GPoint(16,32);

	// Call this function when the page has been loaded 
  function initialize() 
  {
  
	//set current date
	var currentDate = new Date();
	date = currentDate.getDate();
	
    map = new google.maps.Map2(document.getElementById("mapFrame"));
	map.setCenter(new GLatLng(27.83710,86.762037), 10);

	map.removeMapType(G_NORMAL_MAP);
	map.removeMapType(G_SATELLITE_MAP);
	map.addMapType(G_PHYSICAL_MAP);
	map.addMapType(G_SATELLITE_3D_MAP);
	map.setMapType(G_HYBRID_MAP);
	
	mapControl = new GHierarchicalMapTypeControl()
	mapControl.clearRelationships();
	navControl = new GLargeMapControl();
	
	GEvent.addListener(map, "maptypechanged", mapChangeEventListener);
	
	for(i = 0;i<placemarkArray.length;i++)
	{
		GEvent.addListener(placemarkArray[i].marker, "click", placemarkMapEventListener);	
		
	}
	
	loadMap(TRACKING);

  }
  
	function loadMap(newMap)
	{
		currentMap = newMap;
		
		clearMap();
		
		hideLiveFeed();
		
		switch(newMap)
		{
			case NEPAL:
			map.addOverlay(kathmanduMarker);
			map.setCenter(new GLatLng(27.71667,60), 2);			
			break;
			
			case KATHMANDU:
			map.addOverlay(kathmanduMarker);
			map.setCenter(new GLatLng(27.71667,85.31667), 6);	
			break;
			
			case TREK:
			clearMarkerSelection();
			
			if(!earthMode)
			{
				addTrekMarkers();
				//earthMode = false;
				map.addControl(mapControl);
				map.addControl(navControl);
				map.enableScrollWheelZoom();	
				map.setCenter(new GLatLng(27.83710,86.762037), 10);
				
				if(currentStage != -1)
				{
					selectMarker(placemarkArray[currentStage]);	
				}
			
			}
			
			else if(currentStage != -1)
			{
				selectMarker(placemarks[currentStage]);	
			}
			
			break;
			
			case TRACKING:
			clearMarkerSelection();
			
			if(!earthMode)
			{
				addTrekMarkers();
				//earthMode = false;
				map.addControl(mapControl);
				map.addControl(navControl);
				map.enableScrollWheelZoom();
			}

			if(date >= expeditionStartDate)
			{		
				currentStage = date - expeditionStartDate;
				if(currentStage > lastStage)
					{
					currentStage = lastStage;
					}
			}
			else
			{
				currentStage = 0;
			}
			loadTrackingData(currentStage);
			showLiveFeed();
			break;
		}
		
			
	}

	
	function clearMap()
	{
				
		if((currentMap == NEPAL)||(currentMap == KATHMANDU))
		{
			map.disableScrollWheelZoom();
			map.removeControl(mapControl);
			map.removeControl(navControl);
			map.setMapType(G_HYBRID_MAP);
		}
		clearImage();
		
		clearOverlays();
		
		clearMarkers();
		
		if(lastMarker)
		{
			map.removeOverlay(lastMarker);
			lastMarker = 0;
		}		
		
		
	}
	
	
	function clearMarkers()
	{
		for(i = 0;i<placemarkArray.length;i++)
		{
			map.removeOverlay(placemarkArray[i].marker);		
		}
		
		for(i = 0;i<imagemarkList.length;i++)
		{
			map.removeOverlay(imagemarkList[i].marker);
		}
		
		map.removeOverlay(kathmanduMarker);
		
		
	}
	
	function clearOverlays()
	{
	
	//remove the previous path and markers
		if(lastKmlLayer)
		{
			ge.getFeatures().removeChild(lastKmlLayer);
			lastKmlLayer = 0;
		}
				
		if(pathOverlays)
		{
			for(i=0;i<pathOverlays.length;i++)
			{
				map.removeOverlay(pathOverlays[i]);		
			}
			//reset the array ready for the nest set of markers
			pathOverlays = 0;
		}
	
	}
	
	function addTrekMarkers()
	{
		icon.image = "http://maps.google.com/mapfiles/kml/paddle/blu-blank.png";
		for(i = 0;i<placemarkArray.length;i++)
		{	
			map.addOverlay(placemarkArray[i].marker);		
		}
		map.addOverlay(kathmanduMarker);
	}
	
	function mapChangeEventListener(data)
	{	
		if(map.getCurrentMapType() == G_SATELLITE_3D_MAP)
		{
			earthMode = true;
			//clearMarkers();
			clearMap();
			
			if(!ge)
			{
				map.getEarthInstance(function(gearth) {
					var url = "http://theeveresttest.com/kml/placemarks.kml";
					ge = gearth;
					
					google.earth.fetchKml(ge, url, placemarkKmlCallback);	
					});
			}
			
			else
			{
				if(currentMap == TRACKING)
				{			
					if(currentStage != -1)
					{
					
						loadTrackingData(currentStage);
					}
					else
					{
						loadTrackingData(0);	
					}
				}
				
				else
				{
					if(currentStage != -1)
					{
						lastMarker = placemarks[currentStage];
						setMapStage(currentStage);
					}
					
					else
					{
					showOverview();
					}
				}
			}
			
		}
		
		else
		{		
			if(earthMode)
			{			
				map.setZoom(10);
				addTrekMarkers();
				earthMode = false;
				
				if(currentMap == TRACKING)
				{
					if(currentStage != -1)
					{
					
						loadTrackingData(currentStage);	
					}
					else
					{
						loadTrackingData(0);	
					}					
				}
				else
				{
					if(currentStage != -1)
					{
						lastMarker = placemarkArray[currentStage].marker;
						setMapStage(currentStage);
					}
					else
					{
					showOverview();
					}
				}
				
			}	
		}
		
		
	}
	
	function failureCB(object) 
	{
		alert('Google Earth load failed');
	}
	
	function setMapStage(stage) 
	{	
		var placemark;
		if(!earthMode)
		{
			
			if(currentMap == TREK)
			{				
				placemark = placemarkArray[stage];
				
				//Select marker on map
				selectMarker(placemark);
				
				updateStageText(placemark.name,placemark.description);			
				currentStage = placemark.snippet;
				
				if(map.getCurrentMapType() == G_PHYSICAL_MAP)
				{
					map.setCenter(placemark.point, 13);
				}
				else
				{
					map.setCenter(placemark.point, 12);
				}	
			}
			else
			{
				updateDayView(stage);
			}
						
		}
		
		else
		{		

			
			
			if(currentMap == TREK)
			{
				placemark = placemarks[stage];
				//set flytospeed
				ge.getOptions().setFlyToSpeed(0.5);

				ge.getView().setAbstractView(placemark.getAbstractView()); 
				
				updateStageText(placemark.getName(),placemark.getDescription());
				currentStage = placemark.getSnippet();
				
				//Select marker on map
				selectMarker(placemark);
			
				if(stage == lastStage)
				{
				setTimeout("rotateEarth()",5000);
				}	
				

			}
			else
			{
				updateDayView(stage);
			}
			

		}
		
		currentStage = stage;
		updateDayText(currentStage);
	}
		
		
	function showOverview() 
	{
	
		clearMarkerSelection();
			
		currrentStage = -1;
		
		map.setCenter(new GLatLng(27.83710,86.762037), 10);

		if(earthMode)
		{
			var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
			lookAt.setLatitude(27.784);
			lookAt.setLongitude(86.7355);
			lookAt.setTilt(55);
			lookAt.setRange(22500);
			lookAt.setHeading(20);
			ge.getView().setAbstractView(lookAt); 
		}
	}
	
	function updateDayView(stage) 
	{
		if(earthMode)
		{
			//set flytospeed
			ge.getOptions().setFlyToSpeed(0.5);
			ge.getView().setAbstractView(placemarks[stage].getAbstractView()); 			
		}
		
		else
		{
			var center;
			
			if(currentMap == TREK)
			{
				placemark = placemarkArray[stage];
				center = placemark.point;
				
				if(map.getCurrentMapType() == G_PHYSICAL_MAP)
				{
					map.setCenter(center, 13);
				}
				else
				{
					map.setCenter(center, 12);
				}
			}
			
			//for the tracking map we want to center the map between the point and the next point on the map
			else
			{			
				if(stage < lastStage)
				{
				placemark = placemarkArray[stage];
				placemark2 = placemarkArray[stage + 1];
				
				var lon = ((placemark.point.x + placemark2.point.x) / 2);
				var lat = ((placemark.point.y + placemark2.point.y) / 2);
				
				center = new GLatLng(lat,lon);
				}
				else
				{
					placemark = placemarkArray[stage];
					center = placemark.point;
				}	
				map.setCenter(center, 12);				
			
			}			
				
		}
	}
	
	
	
	function placemarkKmlCallback(kml)
	{
		traverseKml(kml, placemarkEventListener,true);
		kmlOverlay = kml;
		ge.getFeatures().appendChild(kmlOverlay);
		
		
		if(currentMap == TRACKING)
		{
			if(currentStage != -1)
			{
			
				loadTrackingData(currentStage);	
			}
			else
			{
				loadTrackingData(0);	
			}	
			lastMarker = 0;
		}
		
		else
		{
		lastMarker = placemarks[currentStage];
		}
		
	} 

	function placemarkEventListener(kmlEvent) 
	{	 	
		
		if(currentMap == TREK)
		{
			var placemark = kmlEvent.getCurrentTarget();
			
			ge.getView().setAbstractView(placemark.getAbstractView()); 		
			updateStageText(placemark.getName(),placemark.getDescription());
			currentStage = placemark.getSnippet();
			
			selectMarker(placemark);
		}

		kmlEvent.preventDefault();
	}
	
	function placemarkMapEventListener(point)
	{
	
		if(currentMap == TREK)
		{
			var index;
			switch(point.lat())
			{
				
				case 27.687333:
				index = 0;
				break;
			
				case 27.728514:
				index = 1;
				break;
			
				case 27.80932:
				index = 2;
				break;
				
				case 27.816667:
				index = 3;
				break;
				
				case 27.8371:
				index = 4;
				break;
				
				case 27.891887:
				index = 5;
				break;
				
				case 27.943882:
				index = 6;
				break;
				
				case 27.9818:
				index = 7;
				break;
			
			
			}
			
		var marker = placemarkArray[index];
		
		updateStageText(marker.name,marker.description);
		currentStage = marker.snippet;
		
		selectMarker(marker);
		}
		
	}
	
	function selectMarker(placemark)
	{
		//clear last marker
		clearMarkerSelection();
		
		if(earthMode)
		{
		placemark.setStyleUrl('#selectedStyle');
		lastMarker = placemark;
		}
		
		else 
		{
		map.removeOverlay(placemark.marker);
		if(currentMap == TREK)
		{
			icon.image = "http://maps.google.com/mapfiles/kml/paddle/red-blank.png";	
		}
		else if(currentMap == TRACKING)
		{
			imageMarkIcon.image = "http://maps.google.com/mapfiles/kml/paddle/red-blank.png";				
		}

        map.addOverlay(placemark.marker); 
		lastMarker = placemark.marker;
		}	
	}
	
	function clearMarkerSelection()
	{
	
		if(lastMarker)
			{
			if(earthMode)
				{		
					if(currentMap == TREK)	
					{				
						lastMarker.setStyleUrl('#simpleStyle');
					}
					else
					{
						lastMarker.setStyleUrl('#imageStyle');
					}
				}
				else
				{
				map.removeOverlay(lastMarker);
				icon.image = "http://maps.google.com/mapfiles/kml/paddle/blu-blank.png";
				imageMarkIcon.image = "http://maps.google.com/mapfiles/kml/paddle/wht-blank.png";
				map.addOverlay(lastMarker); 
				}
				lastMarker = 0;
			}	
	}
	
	
	
	
	
	function loadTrackingData(stage)
	{	
		updateDayView(stage);
	
		if(earthMode)
		{	
			var url = "http://theeveresttest.com/kml/trackingdata.kml";
			google.earth.fetchKml(ge, url, trackingDataKmlCallback);
					
		}
		
		else
		{
			var url = "./kml/trackingdata.kml";
			GDownloadUrl(url, trackingDataXmlCallback);				
		}

	}
	
	function trackingDataXmlCallback(data)
	{
		
		//Parse the kml data
		var xml = GXml.parse(data);
		
		pathOverlays = getPaths(xml);
		
		for(i=0;i<pathOverlays.length;i++)
		{
			map.addOverlay(pathOverlays[i]);
		}
		
		getMarkers(xml);
	
		for(i=0;i<imagemarkList.length;i++)
		{
			imageMarkIcon.image = "http://maps.google.com/mapfiles/kml/paddle/wht-blank.png";
			GEvent.addListener(imagemarkList[i].marker, "click", imagemarkEventListener);
			map.addOverlay(imagemarkList[i].marker);
		}
		
		if(imagemarkList.length > 0)
		{
			//Display the current image
			lastMarker = 0;
			loadImage(getImage());
		}
			
	}
	
	function trackingDataKmlCallback(kml)
	{
		
		traverseKml(kml, imagemarkEventListener, false);		
		ge.getFeatures().appendChild(kml);
		lastKmlLayer = kml;
		
		//Display the current image
		lastMarker = 0;
		
		if(earthImagemarks.length > 0)
		{
			loadImage(getImage());
		}
		
		parent.updateDayText(kml.getName(), kml.getDescription());		
	} 
	
	
	function imagemarkEventListener(marker) 
	{	 
		//alert('imagemarkEventListener');
		var placemark;
		if(earthMode)
		{
			placemark = marker.getCurrentTarget();
			
			parent.loadImage(placemark.getDescription());
			imageIndex = placemark.getSnippet();
			marker.preventDefault();	
		}
		
		else
		{
			placemark = imagemarkList[imagemarkLookup[marker.y]];
			loadImage(placemark.image);
			imageIndex = placemark.imageIndex;
		}
		
		selectMarker(placemark);	

	}
	
	function getNextImage()
	{
		if(earthMode)
		{	
			if(++imageIndex >= earthImagemarks.length)
			{
				imageIndex = 0;
			}
		}
		
		else
		{	
			if(++imageIndex >= imagemarkList.length)
			{
				imageIndex = 0;
			}
		}
	
		return getImage();	
	}
	
	function getPrevImage()
	{
		if(earthMode)
		{
			if(--imageIndex < 0)
			{
				imageIndex = earthImagemarks.length - 1;
			}
		}
		
		else
		{
			if(--imageIndex < 0)
			{
				imageIndex = imagemarkList.length - 1;
			}
		}
	
		return getImage();	
	}
	
	function getImage()
	{
	
		var placemark;
		var image;
		
		if(earthMode)
		{
			placemark = earthImagemarks[imageIndex];
			image = placemark.getDescription();	
		}
		
		else
		{
			placemark = imagemarkList[imageIndex];
			image = placemark.image;	
		}
		selectMarker(placemark);
		
		return image;
	
	}
	

