// JavaScript für Google-API
var map;
var gdir;

function googleMap_init() {
	if (GBrowserIsCompatible()) {      
		//gs_google_target_div in routeplaner.inc.php
		map = new GMap2(document.getElementById(gs_google_target_div));

		/** 
		* G_NORMAL_MAP- the default view
		* G_SATELLITE_MAP - showing Google Earth satellite images
		* G_HYBRID_MAP - showing a mixture of normal and satellite views
		* G_DEFAULT_MAP_TYPES - an array of these three types, useful for iterative processing
		**/

		map.addControl(new GLargeMapControl()); //GSmallMapControl
		map.addControl(new GOverviewMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(gi_x, gi_y), gi_zoom);
		map.setMapType(G_HYBRID_MAP);
		
		gdir = new GDirections(map, document.getElementById("directions"));
    	GEvent.addListener(gdir, "error", handleErrors);
    	GEvent.addListener(gdir, "addoverlay", function(){
    		gdir.clear(); //Alles laden abbrechen, damit weder A noch B eingezeichnet werden
    		map.setZoom(gi_zoom); //Zoomstufe auf Initial zurücksetzen
    		removeAllGoogleMapsMarker(); //Alle Marker von der Karte entfernen und Link initialisieren
    	});
		
		GEvent.addListener(map, "moveend", function (){
			setGoogleMapsLink();
			
			//x,y,zoom aktualisieren
			var koordinaten = map.getCenter();
			document.getElementById('google_map_x').value = koordinaten.lat();
			document.getElementById('google_map_y').value = koordinaten.lng();
			document.getElementById('google_map_zoom').value = map.getZoom();
			
			setTimeout("setGoogleMapsLink()",2000);
		});
		
		GEvent.addListener(map, "click", function (overlay, latlng){
			marker = createGoogleMapsMarker(latlng, googleMapsMarkers.length);	
			map.addOverlay(marker);
			
			//Marker positionen merken und Link aktualisieren
			googleMapsMarkers[googleMapsMarkers.length] = latlng;
			
			//Polylinie zeichnen
			if(googleMapsMarkers.length > 1)
			{
				var polyOptions = {geodesic:true};
				var polyline = new GPolyline([googleMapsMarkers[googleMapsMarkers.length-2], googleMapsMarkers[googleMapsMarkers.length-1]],"#FF0000",5,1,polyOptions);	
				map.addOverlay(polyline);
			}
			
			setGoogleMapsLink();
		});
		
		//Marker initialisieren wenn wir se brauchen
		if(googleMapsMarkers.length > 0)
		{
			var polyOptions = {geodesic:true};
			for(i=0; i<googleMapsMarkers.length; i++)
			{
				map.addOverlay(createGoogleMapsMarker(googleMapsMarkers[i], i));
				
				if(i>0)
				{
					polyline = new GPolyline([googleMapsMarkers[i-1], googleMapsMarkers[i]],"#FF0000",5,1,polyOptions);	
					map.addOverlay(polyline);
				}
			}
		}
		
		//5 Sekunden später, damits auch bei langamen leitungen geht, den link initialisieren
		setTimeout("setGoogleMapsLink()",5000);
	}
}

function setGoogleMapsLink()
{
	/*var links = document.getElementById(gs_google_target_div).getElementsByTagName("a");
			
	for(i=0; i< links.length; i++)
	{
		//Suche den Link der auf maps.google.com geht
		if(links[i].href.search(/maps.google.com/) > 0)
		{
			document.getElementById('google_map_link').value = links[i].href;
		}
	}
	
	var link = document.getElementById('google_map_link').value;*/
	
	var link = "webcode=google_map&google_map_x="+document.getElementById('google_map_x').value+"&google_map_y="+document.getElementById('google_map_y').value+"&google_map_zoom="+document.getElementById('google_map_zoom').value;
	link += '&google_map_marker=';
	var hiddenvalue = "lat|lng";
	for(i=0; i<googleMapsMarkers.length; i++)
	{
		hiddenvalue += '|'+ googleMapsMarkers[i].lat() + '|' + googleMapsMarkers[i].lng();
	}
	
	document.getElementById('google_map_link').value = link + hiddenvalue;
	document.getElementById('google_map_marker').value = hiddenvalue;
}

function createGoogleMapsMarker(point, number) 
{
	var marker = new GMarker(point);
	marker.value = number;
  	return marker;
}

function removeAllGoogleMapsMarker()
{
	map.clearOverlays();
	googleMapsMarkers = new Array();
	setGoogleMapsLink();
}

function setLocation(as_locationstring)
{
	gdir.load("from: " + as_locationstring + " to: " + as_locationstring, { "locale": "de_DE" });
}

function handleErrors(){
   if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
     alert("Adresse konnte nicht gefunden werden.");
   
   else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
     alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + gdir.getStatus().code);

//   else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
//     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + gdir.getStatus().code);
     
   else if (gdir.getStatus().code == G_GEO_BAD_KEY)
     alert("Der übergebene Schlüssel ist ungültig oder gehört nicht der richtigen Domain an. \n Error code: " + gdir.getStatus().code);

   else if (gdir.getStatus().code == G_GEO_BAD_REQUEST || gdir.getStatus().code == G_GEO_SERVER_ERROR)
     alert("Die eingegebene Adresse ist ungültig.\n Error code: " + gdir.getStatus().code);
 
   else alert("Unbekannter Fehler.");
   
}
