var contextmenu, clickedPixel;
var startWaypoint, endWaypoint;

// Aktivieren der Routing Funktion
function enableRouting() {
	if(typeof(map) == 'object' && map != null) {
		// Öffnen des Contextmenü
		GEvent.addListener(map, "singlerightclick", function(pixel,tile,overlay) {
			// Klick auf Karte
			showRoutingMenu(pixel);
		});
		
		// Schließen des Contextmenü
		GEvent.addListener(map, "click", hideRoutingMenu);
		GEvent.addListener(map, "movestart", hideRoutingMenu);
		GEvent.addListener(map, "zoomend", hideRoutingMenu);
		
		// Manuelle Route (zb ueber formular)
		setManWaypoints();
	}
}



// Contextmenü erzeugen, falls noch nicht vorhanden
function generateRoutingMenu(menu) {
	if(contextmenu == null) {
		contextmenu = document.createElement("div");
		contextmenu.className = 'contextMenu';
		contextmenu.style.width = '238px';
		contextmenu.style.visibility="hidden";
		contextmenu.innerHTML = '<a href="javascript:setStartWaypoint();">Route von...</a>'
													+ '<a href="javascript:setEndWaypoint();">Route bis...</a>'
													+ '<a href="javascript:showDirections();" id="linkShowDirections" class="disabled">Fahrtanweisungen anzeigen</a>'
													+ '<a href="javascript:delRoute();" id="linkDelRoute" class="disabled">'+unescape("Route l%F6schen")+'</a>'
													+ '<div class="hline"></div>'
													+ '<a href="javascript:setZoom(\'+\');">'+unescape("Vergr%F6%DFern")+'</a>'
													+ '<a href="javascript:setZoom(\'-\');">Verkleinern</a>'
													+ '<a href="javascript:setCenter();">Karte hier zentrieren</a>';
		map.getContainer().appendChild(contextmenu);
	}
}



// Contextmenue oeffnen
function showRoutingMenu(pixel,marker_id) {
	// Speichern des geklickten Pixels
	clickedPixel = pixel;
	
	// Routing Menue erzeugen, falls noch nicht vorhanden
	generateRoutingMenu();
	
	// Position des ContextMenüs bestimmen
	var x=pixel.x;
	var y=pixel.y;
	if(x > map.getSize().width - 240) { x = map.getSize().width - 240 }
	if(y > map.getSize().height - 170) { y = map.getSize().height - 170 }
	var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(x,y));  
	pos.apply(contextmenu);
	
	// Contextmenü einblenden
	contextmenu.style.visibility = "visible";
}



// Contextmenü ausblenden
function hideRoutingMenu() {
	if(contextmenu != null) {
		contextmenu.style.visibility = "hidden";
	}
}



// Startwegpunkt setzen
function setStartWaypoint() {
	// Contextmenü auslbenden
	hideRoutingMenu();
	
	// Alten Marker löschen
	if(startWaypoint != null) {
		map.removeOverlay(startWaypoint);
	}
	// Marker setzen
	startWaypoint = new GMarker(map.fromContainerPixelToLatLng(clickedPixel),icon_default);
	// Marker einzeichnen
	map.addOverlay(startWaypoint);
	// MarkerIcon setzen
	if(typeof(route_starticon) != "undefined") {
		startWaypoint.setImage(route_starticon);
	}
	
	// Route anzeigen
	showRoute();
}



function setManWaypoints() {
	if(typeof(manStartWaypoint) != "undefined" && typeof(manEndWaypoint) != "undefined") {
		generateRoutingMenu();
		
		// Endwegpunkt
		endWaypoint = new GMarker(new GLatLng(manEndWaypoint[0],manEndWaypoint[1]),icon_default);
		map.addOverlay(endWaypoint);
		// MarkerIcon setzen
		if(typeof(route_endicon) != "undefined") {
			endWaypoint.setImage(route_endicon);
		}

		// Startwegpunkt
		if(typeof(manStartWaypoint) != 'object') {
			var geocoder = new GClientGeocoder();
			geocoder.getLatLng(manStartWaypoint,function(point) {
				if(point) {
					startWaypoint = new GMarker(point,icon_default);
					map.addOverlay(startWaypoint);
					// MarkerIcon setzen
					if(typeof(route_starticon) != "undefined") {
						startWaypoint.setImage(route_starticon);
					}
					showRoute();
				} else {
					alert("Adresse wurde leider nicht gefunden.");
				}
			});
		} else {
			startWaypoint = new GMarker(new GLatLng(manStartWaypoint[0],manStartWaypoint[1]),icon_default);
			map.addOverlay(startWaypoint);
			// MarkerIcon setzen
			if(typeof(route_starticon) != "undefined") {
				startWaypoint.setImage(route_starticon);
			}
		}
	}
}



// Endwegpunkt setzen
function setEndWaypoint() {
	// Contextmenü auslbenden
	hideRoutingMenu();
	
	// Alten Marker löschen
	if(endWaypoint != null) {
		map.removeOverlay(endWaypoint);
	}
	// Marker setzen
	endWaypoint = new GMarker(map.fromContainerPixelToLatLng(clickedPixel),icon_default);
	// Marker einzeichnen
	map.addOverlay(endWaypoint);
	// MarkerIcon setzen
	if(typeof(route_endicon) != "undefined") {
		endWaypoint.setImage(route_endicon);
	}
	
	// Route anzeigen
	showRoute();
}



// Route anzeigen
var groute, routePolyline, routeStartMarker, routeEndMarker;
function showRoute() {
	if(startWaypoint != null && endWaypoint != null) {
		// Alte Route löschen
		delRoute();
		// Route erstellen
		groute = new GDirections();
		groute.loadFromWaypoints([startWaypoint.getLatLng(),endWaypoint.getLatLng()],{getPolyline:true,getSteps:true});
	
		// Bei erfolgreichen laden der Route
		GEvent.addListener(groute, "load", function() {
			// Fahrtanweisungen
			var route = groute.getRoute(0);
			var turns = '<div style="float:left;padding-bottom:8px;"><strong>' + groute.getDistance().html + "</strong></div>";
			turns += '<div style="float:right;padding-bottom:8px;"><strong>' + groute.getDuration().html + "</strong></div>";
			
			turns += '<div style="clear:both;" class="waypoint">'+route.getStartGeocode().address+'</div>';
			turns += '<table cellspacing="0" cellpadding="0">';
			for(var i=0;i<route.getNumSteps();i++) {
				var turn = route.getStep(i);
				turns += '<tr><td class="nr">'+(i+1)+'.</td><td class="text">' + turn.getDescriptionHtml() + '</td><td class="distance">' + turn.getDistance().html + '</td></tr>';
			}
			turns += '</table>';
			turns += '<div class="waypoint">'+route.getEndGeocode().address+'</div>';

			
			// Directions DIV erzeugen, falls noch nicht vorhanden
			if(document.getElementById('directions') == null) {
				var directions_div = document.createElement("div");
				directions_div.id = 'directions';
				document.getElementById('map').parentNode.appendChild(directions_div);
			}
			
			// Fahrtanweisungen ausgeben
			document.getElementById('directions').innerHTML = turns;
			
			// Auf die Route zoomen
			var bounds = new GLatLngBounds();
			bounds.extend(startWaypoint.getLatLng());
			bounds.extend(endWaypoint.getLatLng());
			map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds)); 
			
			// Marker loeschen
			map.removeOverlay(startWaypoint);
			startWaypoint = null;
			map.removeOverlay(endWaypoint);
			endWaypoint = null;
			
			// Route anzeigen
			routePolyline = groute.getPolyline();
			map.addOverlay(routePolyline);
			if(typeof(route_color) != "undefined") {
				routePolyline.setStrokeStyle({color:route_color,opacity:0.7});
			}
			// Startmarker
			routeStartMarker = new GMarker(routePolyline.getVertex(0),icon_default);
			map.addOverlay(routeStartMarker);
			if(typeof(route_starticon) != "undefined") {
				routeStartMarker.setImage(route_starticon);
			}
			// Endmarker
			routeEndMarker = new GMarker(routePolyline.getVertex(routePolyline.getVertexCount()-1),icon_default);
			map.addOverlay(routeEndMarker);
			if(typeof(route_endicon) != "undefined") {
				routeEndMarker.setImage(route_endicon);
			}
						
			// Links einblenden
			document.getElementById('linkShowDirections').className = '';
			document.getElementById('linkDelRoute').className = '';
		});
	}
}



// Fahrtanweisungen anzeigen
function showDirections() {
	if(document.getElementById('directions') != null && document.getElementById('directions').innerHTML != '') {
		// Contextmenü auslbenden
		hideRoutingMenu();
		// Zu den Fahrtanweisungen springen
		window.location.hash = 'directions';
	}
}



// Route ausblenden
function delRoute() {
	if(document.getElementById('directions') != null && document.getElementById('directions').innerHTML != '') {
		// Contextmenü ausblenden
		hideRoutingMenu();
		
		// Fahrtanweisungen ausblenden
		document.getElementById('directions').innerHTML = '';
		// Route ausblenden
		groute.clear();
		groute = null;
		map.removeOverlay(routePolyline);
		routePolyline = null;
		map.removeOverlay(routeStartMarker);
		routeStartMarker = null;
		map.removeOverlay(routeEndMarker);
		routeEndMarker = null;
		
		// Links ausblenden
		document.getElementById('linkShowDirections').className = 'disabled';
		document.getElementById('linkDelRoute').className = 'disabled';
	}
}



// Vergrößern / Verkleinern
function setZoom(value) {
	// Gewünschen Zoomlevel herausfinden
	if(value == "+") {
		var zoom = map.getZoom() + 1;
	} else {
		var zoom = map.getZoom() - 1;
	}
	// Zoomen
	map.setCenter(map.fromContainerPixelToLatLng(clickedPixel),zoom);
	// Contextmenü ausblenden
	hideRoutingMenu();
}



// Karte zentrieren
function setCenter() {
	// Contextmenü ausblenden
	hideRoutingMenu();
	// Karte zentrieren
	map.panTo(map.fromContainerPixelToLatLng(clickedPixel));
}



// Routing starten
if(typeof(addLoadEvent) == 'function') {
	addLoadEvent(enableRouting);
}
