var googlemaps = new Object();

googlemaps.init = function (ort, aktion){

	var root = "/5_dirt_guide/";

	if (GBrowserIsCompatible() && document.getElementById("map_canvas")){
		
		this.default_suchradius = 30; // in km
		this.maximaler_radius = 100;
		
		this.default_zoom = 13;
		
		this.limit_liste = 5;
		this.limit_ergebnisse = 20;
		
		this.info_window_width = 260;
		
		//
		
		this.neuer_spot = null;
		this.feste_mitte = false;
		
		this.ort = ort;
	
		/* GoogleMap initialisieren */
		
		
		this.geocoder = new GClientGeocoder();
		this.map = new GMap2(document.getElementById("map_canvas"));
				
		var customUI = this.map.getDefaultUI();
		this.map.setUI(customUI);
		//this.map.setMapType(G_PHYSICAL_MAP);
		//this.map.setMapType(G_SATELLITE_MAP);
		this.map.removeMapType(G_PHYSICAL_MAP);
		this.map.setMapType(G_NORMAL_MAP);
		
		/* Heimat */
		
		this.heimat = {
			"ort": "Amerang",
			"lat": 47.9914756,
			"lng": 12.3075348
		};

		/* Icons */

		var definitionen = new Array (
			{
				"name" : "marker",
				"bild" : root + "media/marker.png",
				"abmessung" : new Array(18, 18),
				"nullpunkt" : new Array(7, 7)
			},
			{
				"name" : "spot",
				"bild" : root + "media/stern_rot.png",
				"abmessung" : new Array(20, 20),
				"nullpunkt" : new Array(10, 10)
			},
			{
				"name" : "neu",
				"bild" : root + "media/stern_gelb.png",
				//"bild" : root + "media/marker.png",
				"abmessung" : new Array(20, 20),
				"nullpunkt" : new Array(10, 10)
			},
			{
				"name" : "inaktiv",
				"bild" : root + "media/stern_grau.png",
				"abmessung" : new Array(20, 20),
				"nullpunkt" : new Array(10, 10)
			}
		);

		this.icons = new Object();

		for (var id in definitionen){
			this.icons[definitionen[id].name] = new GIcon();
			this.icons[definitionen[id].name].image = definitionen[id].bild;
			this.icons[definitionen[id].name].iconSize = new GSize(definitionen[id].abmessung[0], definitionen[id].abmessung[1]);
			this.icons[definitionen[id].name].iconAnchor = new GPoint(definitionen[id].nullpunkt[0], definitionen[id].nullpunkt[1]);
			this.icons[definitionen[id].name].infoWindowAnchor = new GPoint(definitionen[id].abmessung[0], 0);
		}
		
				
		/* Eventhandler */
		
		GEvent.addListener(this.map, "dragend", function (){
			googlemaps.updateKarte();
		});


		GEvent.addListener(this.map, "zoomend", function (){
			//srzsd.debug("zoom end");
			googlemaps.updateKarte();
		});

				
		/* Suchen? */

		if (ort){			
			this.suche(this.ort, aktion);
		}
		
		window.onunload = function (){
			GUnload();
		}
				
	}
	
}


/******//* !Suchen *//*****/

googlemaps.suche = function (ort, aktion){

	if (ort != ""){
	
		this.ort = ort;
	
		srzsd.debug("sucheSpots: " + this.ort);
	
		this.geocoder.getLatLng(
			googlemaps.ort,
			function(punkt){
				if (! punkt){
					alert("»" + googlemaps.ort + "« konnte nicht gefunden werden.");
					if (! googlemaps.feste_mitte){
						googlemaps.map.setCenter(new GLatLng(47.9914756, 12.3075348), googlemaps.default_zoom);
					}
				} else {
					if (aktion == "neu"){
						googlemaps.zeigeNeuenSpot(punkt);
					} else if (aktion == "id"){
						googlemaps.zeigeSpotId(punkt);
					} else {
						googlemaps.umkreisSuche(punkt);
					}
				}
			}
		);
	
	}
			
}


googlemaps.umkreisSuche = function (punkt, radius){

	if (radius){
		suchradius = radius;
	} else {
		suchradius = this.default_suchradius;
	}
	
	//alert(suchradius);

	srzsd.debug("umkreisSuche: " + punkt + ", " + suchradius);

	var url = "/5_dirt_guide/getSpots.exc.php?ort=" + this.ort + "&lat=" + punkt.lat() + "&lng=" + punkt.lng() + "&radius=" + suchradius + "&limit=" + (this.limit_ergebnisse + 1);
			
	GDownloadUrl(
		url, 
		function(data){
			var xml = GXml.parse(data);
			var spots = xml.documentElement.getElementsByTagName("spot");			
			
			var ort = googlemaps.heimat.ort;
			var lat = googlemaps.heimat.lat;
			var lng = googlemaps.heimat.lng;
						
			if (xml.getElementsByTagName("spots").length != 0){
				if (xml.getElementsByTagName("spots")[0].getAttribute("ort")){
					ort = xml.getElementsByTagName("spots")[0].getAttribute("ort");
				}
				if (xml.getElementsByTagName("spots")[0].getAttribute("lat")){
					lat = xml.getElementsByTagName("spots")[0].getAttribute("lat");
				}
				if (xml.getElementsByTagName("spots")[0].getAttribute("lng")){
					lng = xml.getElementsByTagName("spots")[0].getAttribute("lng");
				}
			}
			
			
			if (! googlemaps.neuer_spot){
				googlemaps.map.clearOverlays();
			}
			
			var liste = null;
			
			if (document.getElementById("liste")){
				liste = document.getElementById("liste");
				liste.innerHTML = "";
							
				if (spots.length == 0) {
					/*
					if (ort){
						var eintrag = googlemaps.getEintrag(null, null, "<p>Keine Spots im Umkreis von " + googlemaps.default_suchradius + " km um &raquo;" + googlemaps.ort + "&laquo; gefunden.<" + "/p>");
					} else {
						var eintrag = googlemaps.getEintrag(null, null, "<p>Keine Spots in dieser Gegend gefunden.<" + "/p>");
					}
					*/
				
					var eintrag = googlemaps.getEintrag(null, null, 
						"<p>Keine Spots in dieser Gegend gefunden. Um den Suchradius zu vergr&ouml;&szlig;ern, klicke auf die Minus-Taste in der Karte.<" + "/p>", 
					false, "meldung");
					
					liste.appendChild(eintrag);
				}
			}
				
			var gebiet = new GLatLngBounds();
			
			if (spots.length > googlemaps.limit_liste){
				var weitere = googlemaps.getWeitere(radius, spots.length);
			} else {
				var weitere = null;
			}
							
			for (var i = 0; i < spots.length; i++){
			
				var id = spots[i].getAttribute("id");
				var name = spots[i].getAttribute("name");
				var typen = spots[i].getAttribute("typen");
				var adresse = spots[i].getAttribute("adresse");
				var user = spots[i].getAttribute("user");
				var distanz = parseFloat(spots[i].getAttribute("distanz"));
				var punkt = new GLatLng(parseFloat(spots[i].getAttribute("lat")), parseFloat(spots[i].getAttribute('lng')));
				
				var bearbeitbar = (spots[i].getAttribute("bearbeitbar") != null)
		
				var markierung = googlemaps.zeigeSpot(punkt, id, name, typen, adresse, user, bearbeitbar);
				
				if (liste && i < googlemaps.limit_liste){		
					var eintrag = googlemaps.getEintrag(markierung, "&raquo;" + name + "&laquo;", adresse + " (" + distanz.toFixed(1) + " km)");
					liste.appendChild(eintrag);
				}
	
				/*
				if (liste){		
					var eintrag = googlemaps.getEintrag(markierung, "&raquo;" + name + "&laquo;", adresse + " (" + distanz.toFixed(1) + " km)", i >= googlemaps.limit_liste);
					liste.appendChild(eintrag);
				}
				*/
				
				gebiet.extend(punkt);
				
				if (i >= googlemaps.limit_ergebnisse){
					i = spots.length;
					var weitere = googlemaps.getWeitere(radius, spots.length, true);
				}
				
			}
			
			if (liste && weitere){
				liste.appendChild(weitere);
			}
			
			if (! googlemaps.feste_mitte){
			
				if (spots.length == 0){
				
					if (radius){
						googlemaps.map.setCenter(new GLatLng(lat, lng));
					} else {
						googlemaps.map.setCenter(new GLatLng(lat, lng), googlemaps.default_zoom);
					}
				
				} else if (! radius) {
				
					if (spots.length > 1){
						var zoom = googlemaps.map.getBoundsZoomLevel(gebiet);
					} else {
						var zoom = googlemaps.default_zoom;
					}
					
					googlemaps.map.setCenter(gebiet.getCenter(), zoom);
					
				}
			
			}
						
		}
	);
	
}


/***** Spots anzeigen *****/

googlemaps.zeigeSpot = function (punkt, id, name, typen, adresse, user, bearbeitbar){
	
	//srzsd.debug("zeigeSpot: " + adresse + ", " + bearbeitbar);
	
	if (! this.neuer_spot){
		var icon = this.icons["spot"]
	} else {
		if (bearbeitbar){
			var icon = this.icons["spot"];
		} else {
			var icon = this.icons["inaktiv"];
		}
	}

	var markierung = new GMarker(punkt, {
		icon: icon
	});

	var html = "";
	
	html += "<div id='info_window' class='info_window'>\n";
	html += "<h3 class=\"ohne_abstand\">&raquo;" + name + "&laquo;<" + "/h3>";
	html += "<p><small>Angelegt von &raquo;" + user + "&laquo;</" + "small><" + "/p>";
	//html += "<p>" + adresse + "<" + "/p>";
	html += "<p>" + typen + "<" + "/p>";

	if (bearbeitbar){
		html += "<p><a href='/5_dirt_guide/?spot_id=" + id + "&amp;details'>Details anzeigen/bearbeiten<" + "/a><" + "/p>";
	} else {
		html += "<p><a href='/5_dirt_guide/?spot_id=" + id + "&amp;details'>Details anzeigen<" + "/a><" + "/p>";
	}
	
	html += "<" + "/div>\n";

	GEvent.addListener(markierung, 'click', function() {
		markierung.openInfoWindowHtml(html, { maxWidth: googlemaps.info_window_width });
	});
	
	/*
	GEvent.addListener(markierung, "infowindowopen", function(){
		var info_window = document.getElementById("info_window").parentNode.parentNode.parentNode;		
	});
	*/

								
	this.map.addOverlay(markierung);
	
	return markierung;
}


googlemaps.zeigeSpotId = function (punkt){
	
	srzsd.debug("zeigeBestimmtenSpot: " + punkt);
	
	this.feste_mitte = true;
	this.map.setCenter(punkt, this.default_zoom);
	
}


/***** Eintrag für Liste *****/

googlemaps.getEintrag = function (markierung, headline, text, unsichtbar, klasse){

	var div = document.createElement("div");
	
	if (klasse){
		div.setAttribute("class", "eintrag " + klasse);
	} else {
		div.setAttribute("class", "eintrag");
	}
	
	if (unsichtbar){
		div.setAttribute("style", "display: none;");
	}
	
	var html = "";
	if (headline){
		html += "<h3>" + headline + "<" + "/h3>\n";
	}
	html += "<p>" + text + "<" + "/p>";
	
	div.innerHTML = html;
	
	if (markierung){
	
		div.style.cursor = "pointer";
		
		GEvent.addDomListener(div, "click", function() {
			GEvent.trigger(markierung, "click");
		});
		
		GEvent.addDomListener(div, "mouseover", function() {
			div.style.backgroundColor = "#333";
		});
		
		GEvent.addDomListener(div, "mouseout", function() {
			div.style.backgroundColor = "transparent";
		});
		
	}
	
	return div;
	
}

googlemaps.getWeitere = function (radius, anzahl, zuviel){

	if (! radius){
		radius = this.default_suchradius;
	}
	
	if (! zuviel){
		//var text = "Es gibt noch weitere Spots im Umkreis von " + radius + "&nbsp;km. Alle zeigen";
		var text = "Die n&auml;hesten " + this.limit_liste + " Spots von insgesamt " + anzahl + " Spots im Umkreis von " + radius + "&nbsp;km.";
	} else {
		var text = "Es wurden nicht alle gefundenen Spots auf der Karte markiert, da der Suchradius zu groß ist. Um den Radius zu verkleinern, zoome weiter in die Karte.";
	}

	var block = document.createElement("div");
	block.setAttribute("class", "eintrag meldung");
	
	block.innerHTML = "<p>" + text + "</p>";
	
	return block;
	
}


googlemaps.zeigeAlleEintraege = function (){	
	
}



/*******************************/
/***** Neuen Spot anzeigen *****/
/*******************************/

googlemaps.zeigeNeuenSpot = function (punkt){
	
	//srzsd.debug("zeigeNeuenSpot: " + punkt);
	
	if (this.neuer_spot){
		this.map.removeOverlay(this.neuer_spot);

		this.neuer_spot = null;
		this.feste_mitte = true;
		this.window_html = "";
	}
	
	this.info_window_html  = "<div class='info_window'>\n";
	this.info_window_html += "<h3>Neuer Spot<" + "/h3>\n";
	this.info_window_html += "<p><a href='./?latlng=<!--latlng-->&amp;ort=" + this.ort + "'>Hier einen neuen Spot anlegen<" + "/a><" + "/p>\n";
	this.info_window_html += "<" + "/div>\n";
	
	this.neuer_spot = new GMarker(punkt, {
		icon: this.icons["neu"],
		clickable: true,
		draggable: true,
		bouncy: true
	});
	
	this.neuer_spot.bindInfoWindowHtml(this.info_window_html.replace(/<!--latlng-->/, punkt.toUrlValue()));
	
	GEvent.addListener(this.neuer_spot, "dragstart", function(){
		googlemaps.neuer_spot.closeInfoWindow();
	});
	
	GEvent.addListener(this.neuer_spot, "dragend", function(){				
		googlemaps.neuer_spot.openInfoWindowHtml(googlemaps.info_window_html.replace(/<!--latlng-->/, googlemaps.neuer_spot.getPoint().toUrlValue()));
	});
	
	this.map.addOverlay(this.neuer_spot);
	this.map.setCenter(punkt, this.default_zoom);
	
}


/***** Karte updaten *****/

googlemaps.updateKarte = function(){
	
	srzsd.debug("Update: " + this.getSichtbarerRadius() + "km");
	
	if (this.neuer_spot){
		if (! this.map.getBounds().containsLatLng(this.neuer_spot.getPoint())){	
			this.neuer_spot.setLatLng(this.map.getCenter());
		}
	}

	this.umkreisSuche(this.map.getCenter(), this.getSichtbarerRadius());

}

googlemaps.getSichtbarerRadius = function(){
	
	var latlng1 = new GLatLng(this.map.getCenter().lat(), this.map.getCenter().lng());
	var latlng2 = new GLatLng(this.map.getBounds().getSouthWest().lat(), this.map.getBounds().getSouthWest().lng());
	
	var distance = latlng1.distanceFrom(latlng2)/1000;
		
	return distance.toFixed(1);
}



