
// some standard functions for Google Maps

var Version = 0.1;


var IconURL = "/images/GoogleMap/";

// Google Map Variables	
var map = null;
var mgr;

var MapWidth = 0;
var MapHeight = 0;


var GeoLat        = new Array();
var GeoLon        = new Array();
var GeoLocation   = new Array();
var GeoMarker     = new Array();

var GeoMarkerText = new Array();
var GeoHeading    = new Array();
var GeoText       = new Array();
var GeoURL        = new Array();

var nPoints = 0;



var TrackPoint = new Array();
var TrackColor;
var TrackHeading;
var nTrackPoints = 0;
var nTracks = 0;
var TrackHeading;
var DistanceTxt;
var StartTime;
var StartDate;
var EndTime;
var EndDate;





var DefaultTrackColor = "Red";
TrackColor = DefaultTrackColor;		 
var ColorIsSetExplicitly = false;		 
		 
var TestMarker;		 
		 
var tinyBlueIcon;

var TempList = new Array();
var t=0;	

var TempLine = new Array();
var DrawingLine; 
var Outline;	

var BlueIcon = new Array(); 
var RedIcon = new Array();
	


var ActiveMarkerPoint; 			
var GeoPointIndex = -1;			


	

// check if online (map API has loaded)
var ApiLoadedOK;
		
if(google == undefined)	
{
	alert("Google Map API cannot be not loaded correctly.\nCheck internet connection!\nThere will be more errors as a result of this.");			
	ApiLoadedOK = false;
}
else
{
	//DebugAlert("Google Map API will be loaded ok.");					
	ApiLoadedOK = true;
}


if(ApiLoadedOK)
{
	google.setOnLoadCallback(MapInitialize);
	google.load("maps", "2.x");     
}



// assign values from URL (GET)
//EvaluateURL();
GetURLParameters(GetURLWindowSize);





//----------------------------
function PlaceGoogleMapField()
//----------------------------
{
	var MapHtml;


	MapHtml = "<div id='mapimage'";
	MapHtml += " style='"; //width:";
	
//		MapHtml += (MapWidth);
//		MapHtml + "px; ";
	MapHtml += "height: ";
	MapHtml += (MapHeight - DataFieldHeight);

	MapHtml += "px' ";
	MapHtml += "></div>";

	document.write(MapHtml);
}

//----------------------
function AdjustMapSize()
//----------------------
{
	var img = document.getElementById("mapimage");

	
	if(MapWidth > 0) img.style.width = MapWidth;

	if(MapHeight > 0) img.style.height = MapHeight;
}

// evaluate URL, GET parameters
//--------------------
function EvaluateURL()
//--------------------
{
	if(location.search.length > 1)
	{
		var ls = location.search.substring(1);
		var ls1 = unescape(ls);

		var namevalue = ls1.split("&");
		var n = namevalue.length;
		
		for(var i=0; i<n; i++)
		{
			var data = namevalue[i].split("=");

			// point				
			if(data[0] == "p")
			{
				var data1 = data[1].split(",");		
				
				var lat1 = data1[0];
				var lon1 = data1[1];
				var txt1 = unescape(data1[2]);
				var url1 = unescape(data1[3]);

				AddPoint(lat1, lon1, txt1, url1);
			} 
				
			// width	
			if(data[0] == "w")
			{
				MapWidth = data[1];
				//AdjustMapSize();				
			}
			
			// height
			if(data[0] == "h")
			{
				MapHeight = data[1];
				//AdjustMapSize();
			}

			// trackfile (GPX)
			if(data[0] == "tr")
			{
				// assign tracks
				var data1 = data[1].split(",");		

				if(data1[1])
				{
					TrackColor = data1[1];
					ColorIsSetExplicitly = true;					
				}

				var FileName = unescape(data1[0]);
				AddTrack(FileName);			
			
			}

		}
	}
}


//-------------------------------
function GetURLPointsTracks(data)
//-------------------------------
{
	if(data[0] == "p")
	{
		var data1 = data[1].split(",");		
				
		var lat1 = data1[0];
		var lon1 = data1[1];
		var txt1 = unescape(data1[2]);
		var url1 = unescape(data1[3]);

		//AddPoint(lat1, lon1, txt1, url1);
		AddGooglePoint(lat1, lon1, txt1, url1);
	} 

	if(data[0] == "tr")
	{
		// assign tracks
		var data1 = data[1].split(",");		

		if(data1[2])
		{
			// overwrite 
			TrackHeading = data1[2];
		}
		
		if(data1[1])
		{
			// overwrite 
			TrackColor = data1[1];
			ColorIsSetExplicitly = true;
		}
	
	
	
		var FileName = unescape(data1[0]);
		AddTrack(FileName);			
	
	}
}				

//-----------------------------
function GetURLWindowSize(data)
//-----------------------------
{
	if(data[0] == "w")
	{
		MapWidth = data[1];
		//AdjustMapSize();				
	}
			
	if(data[0] == "h")
	{
		MapHeight = data[1];
		//AdjustMapSize();
	}
	
}








// evaluate URL, GET parameters in AssignmentFunction function
//-------------------------------------------
function GetURLParameters(AssignmentFunction)
//-------------------------------------------
{
	if(location.search.length > 1)
	{
		var ls = location.search.substring(1);
		var ls1 = unescape(ls);

		var namevalue = ls1.split("&");
		var n = namevalue.length;
		
		for(var i=0; i<n; i++)
		{
			var data = namevalue[i].split("=");
			AssignmentFunction(data);	

		}
	}
}







//----------------------------------------
function AddPoint(lat, lon, headline, URL)
//----------------------------------------
{
	GeoLat[nPoints] = lat;
	GeoLon[nPoints] = lon;
	GeoHeading[nPoints] = headline;
	GeoURL[nPoints] = URL;
	nPoints++;
}

//----------------------------------------------
function AddGooglePoint(lat, lon, headline, URL)
//----------------------------------------------
{
	GeoHeading[nPoints] = headline;
	GeoURL[nPoints] = URL;

	var pt1 = new google.maps.LatLng(lat, lon);
	GeoLocation[nPoints] = pt1;
	nPoints++;
}


//-------------------------
function AddTrack(filename)
//-------------------------
{
	GetXMLfile(filename, AssignTrackPointsFromGPXfile);

	/*
	if (retval == "1")
	{
		alert("track file " +  filename + " is no GPX file");
	
	}
	*/
}



//----------------------------------------
function AssignTrackPointsFromGPXfile(xml)
//----------------------------------------
{
	var gpx = xml.getElementsByTagName("gpx")[0];
	if(gpx == null) 
	{
		alert("track file is no GPX file");
		return 1;
	}

/*	
	var WayPoints = xml.getElementsByTagName("wpt");
	//alert(WayPoints.length);

	for(var i=0; i<WayPoints.length; i++)
	{
		var lat = WayPoints[i].getAttribute("lat");
		var lon = WayPoints[i].getAttribute("lon");
		var name;	
			
		for(var j=0; j<WayPoints[i].childNodes.length; j++)
		{
			if(WayPoints[i].childNodes[j].nodeName == "name")
			{
				name = WayPoints[i].childNodes[j].firstChild.nodeValue;
			}
		}	
				
		AddGooglePoint(lat, lon, name, "");
	}
*/

	
	
	
	var FirstTime = true;
	
	
	var SubTracks = xml.getElementsByTagName("trk");
	
	var TrackColorTemp = DefaultTrackColor;

	for(i=0; i<SubTracks.length; i++)
	{
		for(var j=0; j<SubTracks[i].childNodes.length; j++)
		{
			if(SubTracks[i].childNodes[j].nodeName == "name")
			{
				//alert(tracks[i].childNodes[j].firstChild.nodeValue);
			}
			
			if(SubTracks[i].childNodes[j].nodeName == "extensions")
			{
				var gpxx = SubTracks[i].childNodes[j].firstChild.childNodes[0];
/*				
				// this does not work. gives problems in all browsers except MS IE
				// gpxx is undefined sometimes, then there is no firstChild
				
				if(gpxx != 'undefined')
				{		
					var gpxxx = gpxx.firstChild;
				
					if(gpxx.nodeName == "gpxx:DisplayColor")
					{
						if(gpxxx != 'undefined')
						{
							TrackColorTemp = gpxxx.nodeValue;				
						}
					} 
				}
*/

				
//				gpxx:DisplayColor
			}
			
			if(SubTracks[i].childNodes[j].nodeName == "trkseg")
			{
				var segment = SubTracks[i].childNodes[j];
				
				for(var k=0; k<segment.childNodes.length; k++)
				{
					var gpxx = segment.childNodes[k];
					if(gpxx.nodeName == "trkpt")
					{
						var lat = gpxx.getAttribute("lat");
						var lon = gpxx.getAttribute("lon");

						for(var l=0; l<gpxx.childNodes.length; l++)
						{
							if(gpxx.childNodes[l].nodeName == "time")
							{
								var TimeStamp = gpxx.childNodes[l].firstChild.nodeValue;
								var data = TimeStamp.split("T");

								EndDate = data[0];
								EndTime = data[1].substring(0,data[1].length-1);
								
								
								if(FirstTime)
								{
									FirstTime = false;
									StartDate = EndDate;
									StartTime = EndTime;
								}
							}
						}
						
						
						var pt1 = new google.maps.LatLng(lat, lon);
						TrackPoint[nTrackPoints] = pt1;
						nTrackPoints++;
					}
				}
			}
		}	
	}
	
	
	if(ColorIsSetExplicitly == false) 
	{
		TrackColor = TrackColorTemp;
	}	
	nTracks++;
	CenterOnTrackAndPoints();
	DrawTrack(TrackColor, 3, 0.7);

//	return 0;
}


//-------------------------------
function CenterOnTrackAndPoints()
//-------------------------------
{
	// combine points and tracks
	var temparray = GeoLocation.concat(TrackPoint);
		
	var polygon = new google.maps.Polygon(temparray);
	var bounds = new google.maps.LatLngBounds();
	bounds = polygon.getBounds();
			
	var NewCenterPoint = bounds.getCenter();

	//map.setCenter(NewCenterPoint, 17, G_HYBRID_MAP);			
	map.setCenter(NewCenterPoint);			
			
	var zoomlevel = map.getBoundsZoomLevel(bounds);
	map.setZoom(zoomlevel);
}


//--------------------------------------------
function DrawTrack(color, width, transparency)
//-------------------------------------------
{
	var TrackOutline = new google.maps.Polyline(TrackPoint, color, width, transparency);
	map.addOverlay(TrackOutline);	
	var Distance = TrackOutline.getLength();
	if(Distance > 1000)
	{
		DistanceTxt = sprintf("%.1f km", Distance/1000);
	}
	else
	{
		DistanceTxt = sprintf("%d m", Distance);	
	}
		//alert(Distance);

	google.maps.Event.addListener(TrackOutline, "click", 
		function(latlng)
		{
			var InfoText;
			InfoText = "<b>" + TrackHeading;
			InfoText += " (" + StartDate;
			
			if(StartDate != EndDate)
			{
				InfoText += "-" + EndDate;			
			}
			
			InfoText += ")<hr></b>";
			InfoText += "<table><tr><td>Length:</td><td>" + DistanceTxt + "</td></tr>";
			InfoText += "<tr><td>Start time:</td><td>" + StartTime +  "</td></tr>";
			InfoText += "<tr><td>End time: </td><td>" + EndTime + "</td></tr>";
			InfoText += "<tr><td colspan=2><font size='1'>(times in UTC)</font></td></tr></table>";
						

			map.openInfoWindowHtml(latlng, InfoText,  {maxWidth: 100});
		}); 

}

// call this function when page has loaded
//----------------
function MapLoad()
//----------------
{
	AdjustMapSize();
	Load(); // in Main
}


//------------------
function MapUnload()
//------------------
{
	if(ApiLoadedOK)	google.maps.Unload();
	Unload(); // in Main
}



// Call this function when Google Map AIP has been loaded  
//-------------------
function MapInitialize()
//------------------- 
{    
	map = new google.maps.Map2(document.getElementById("mapimage"));

	InitializeMap(); // in Main

	GetURLParameters(GetURLPointsTracks);
	

	
	
	// draw map
	if(nPoints == 0 && nTrackPoints == 0)
	{
		SetDefaultLocation(map); // in Main
	}
	else if(nPoints > 1 || nTrackPoints > 0)
	{	
		// draw map with tracks
		CenterOnTrackAndPoints();
	}
	else if(nPoints > 0 && nTrackPoints == 0)
	{
		// just one point
		SetMap(map, GeoLocation[0]); // in Main
	}

	
		

	if(MapHeight > 300) map.addControl(new google.maps.LargeMapControl());
	else map.addControl(new google.maps.SmallMapControl());		
		
	if(MapWidth > 500) map.addControl(new google.maps.ScaleControl());
	else map.addControl(new google.maps.ScaleControl());
		

	var mgrOptions = { borderPadding: 50,  maxZoom: 20, trackMarkers: true };
	mgr = new google.maps.MarkerManager(map, mgrOptions);		

	
	BlueIcon = InitializeDotIcon(IconURL + "blue-dot");
	RedIcon =  InitializeDotIcon(IconURL + "red-dot");
		
				
	tinyBlueIcon = new google.maps.Icon();
	tinyBlueIcon.iconSize = new google.maps.Size(12, 20);
	tinyBlueIcon.iconAnchor = new google.maps.Point(6, 20);
	tinyBlueIcon.infoWindowAnchor = new google.maps.Point(5, 1);
	tinyBlueIcon.shadowSize = new google.maps.Size(22, 20);
	tinyBlueIcon.image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";
	tinyBlueIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";

		
	ActiveMarkerPoint = new google.maps.Point();
	ActiveMarkerPoint.x = 0; 
	ActiveMarkerPoint.y = 0;


	
	// draw marker points
	for(i=0; i<nPoints; i++)
	{
		if(GeoHeading[i] == "draw")
		{
			// drawing marker
			GeoMarker[i] = new google.maps.Marker(GeoLocation[i], 
				{draggable: true, icon: BlueIcon[1], title: 'drawing'});
			TestMarker = GeoMarker[i];
			
			mgr.addMarkers(GeoMarker[i]);
			map.addOverlay(GeoMarker[i]);
			
			GeoMarkerText[i] = "<b>" + GeoHeading[i] + "<hr></b>";
			
			google.maps.Event.addListener(TestMarker, "dragstart", 
				function() 
				{  
					map.closeInfoWindow();  
				});

			google.maps.Event.addListener(TestMarker, "drag", 
				function() 
				{  
					var MarkerLocation = TestMarker.getLatLng();
					var MarkerPoint = map.fromLatLngToDivPixel(MarkerLocation);

					if(t>0)
					{
						TempLine[0] = TempList[t-1];
						TempLine[1] = MarkerLocation;
					
						if(DrawingLine != null)
							map.removeOverlay(DrawingLine);
											
						DrawingLine = new google.maps.Polyline(TempLine, "#F0F080", 7, 1.0);

						map.addOverlay(DrawingLine);					
					}
				});

			google.maps.Event.addListener(TestMarker, "dragend", 
				function() 
				{  
					var MarkerLocation = TestMarker.getLatLng();
					var MarkerPoint = map.fromLatLngToDivPixel(MarkerLocation);
					//alert(MarkerLocation);
				
				
//					TestMarker.openInfoWindowHtml("<b>" + MarkerLocation + "</b>",  {maxWidth: 300}); 
//					TestMarker.openInfoWindowHtml("<h2>SetLocation<hr></h2>",  {maxWidth: 100}); 
					ActiveMarkerPoint = MarkerPoint; 
				});
				
				
			google.maps.Event.addListener(TestMarker, "click", 
				function(marker, point) 
				{  
					GeoPointIndex = -1;
					var MarkerLocation = TestMarker.getLatLng();
					var MarkerPoint = map.fromLatLngToDivPixel(MarkerLocation);
					//alert(MarkerLocation);
				
					if(!ActiveMarkerPoint.equals(MarkerPoint))
					{
						ActiveMarkerPoint = MarkerPoint;
						
						var AddPoint = true;
						
						if(t>0)
						{
							if(MarkerLocation == TempList[t-1]) AddPoint = false;							
						}
						
						if(AddPoint)
						{
							TempList[t] = MarkerLocation;
							t++;	
					
							if(Outline != null)
							{
								map.removeOverlay(Outline);
							}
					

							if(DrawingLine != null)
								map.removeOverlay(DrawingLine);

							Outline = new GPolyline(TempList, "#FF808F", 7, 0.7);
							map.addOverlay(Outline);
						}	
					
					
					
					
						var InfoText;
						InfoText = "<b>Set Location List<hr></b>";
						InfoText += "<font size='1'>";
					
						// show points in list on info window
						for(i=0; i<t; i++)
						{
							var TempLat = TempList[i].lat();
							var TempLon = TempList[i].lng();
						
						
							InfoText += sprintf("%0.7f", TempLat);
							InfoText += ", ";
							InfoText += sprintf("%0.7f", TempLon);
							InfoText += "<br>";
						}
					
						InfoText += "</font>";
						InfoText += "<br><input type='button' id='erase' value='erase polygon' onclick='ErasePolygon()'>";					
						TestMarker.openInfoWindowHtml(InfoText, {maxWidth: 80}); 
					} 
					else
					{
						ActiveMarkerPoint.x = 0; 
						ActiveMarkerPoint.y = 0;
					}		
			});

		}
		else
		{
			// normal marker placement
			var ReturnValue = SetNewMarker(GeoLocation[i], GeoHeading[i], GeoURL[i]); // in Main
			GeoMarker[i] = ReturnValue["marker"];
			GeoMarkerText[i] = ReturnValue["txt"]; 

			google.maps.Event.addListener(GeoMarker[i], "click", 
				function() 
				{
				});

			
			
		}
	}	

		
	google.maps.Event.addListener(map, "click", 
		function(overlay, point) 
		{
			GeoPointIndex = -1;

			if (overlay) 
			{
				// map.removeOverlay(marker);
				var MarkerText;
				MarkerText = "no info yet available";
				
				
				
						
				var GeoMarkerPoint = new Array(nPoints);
				GeoPointIndex = -1;

				for(var n = 0; n < nPoints; n++)
				{
					var MarkerPoint;
					if(overlay == GeoMarker[n])
					{
						var MarkerLocation = overlay.getPoint();
						MarkerPoint = map.fromLatLngToDivPixel(MarkerLocation);
					}  
					GeoMarkerPoint[n] = map.fromLatLngToDivPixel(GeoLocation[n]);
					
					if(GeoMarkerPoint[n].equals(MarkerPoint))
					{
						GeoPointIndex = n;
					}
				}
					
				// MarkerText += MarkerLocation;
				if(!ActiveMarkerPoint.equals(MarkerPoint))
				{
					ShowInfoWindow(GeoPointIndex);
				}
				else
				{
					ActiveMarkerPoint.x = 0; 
					ActiveMarkerPoint.y = 0;
					GeoPointIndex = -1;
				}				
				
			}
			else
			{
			}
		});

	mgr.refresh();
}  
	

//---------------------	
function ErasePolygon()
//---------------------	
{
	// delete array point list
	for(i=0; i<t; i++)
	{
		TempList.pop();
	}
	t=0;

	if(Outline != null)
	{
		map.removeOverlay(Outline);
		//alert("hi");
	}
	if(DrawingLine != null)
		map.removeOverlay(DrawingLine);

//				TestMarker.setLatLng(point);
//				map.panTo(point);	

	map.closeInfoWindow();  
}	



//--------------------------------------------
function ShowInfoWindow(GeoPointIndex)
//--------------------------------------------
{
	if(GeoPointIndex > -1)
	{
		var Marker = GeoMarker[GeoPointIndex];
		var MarkerText = GeoMarkerText[GeoPointIndex];
		var MarkerLocation = Marker.getPoint();
		var MarkerPoint = map.fromLatLngToDivPixel(MarkerLocation);
		ActiveMarkerPoint = MarkerPoint;
													
		Marker.openInfoWindowHtml(MarkerText, {maxWidth: 100});
	}
	else
	{
		ActiveMarkerPoint.x = 0;
		ActiveMarkerPoint.y = 0;
	}
}
	
		

