(function() {

	google.maps.Map.prototype.markers = new Array();

	google.maps.Map.prototype.addMarker = function(marker) {
		this.markers.push(marker);
	};

	google.maps.Map.prototype.getMarkers = function() {
		return this.markers
	};

	google.maps.Map.prototype.clearMarkers = function() {
		if (Lootogo.visibleInfoWindow) {
			Lootogo.visibleInfoWindow.close();
		}

		for ( var i = 0; i < this.markers.length; i++) {
			this.markers[i].setMap(null);
		}
	};
})();

var Lootogo = {
	visibleInfoWindow : null,
	map : null,
	geocoder : null,
	tilesloaded : null,

	init : function(lat, lng) {
		Lootogo.geocoder = new google.maps.Geocoder();
		var latlng = new google.maps.LatLng(lat, lng);
		var myOptions = {
			zoom : 15,
			center : latlng,
			mapTypeId : google.maps.MapTypeId.ROADMAP
		};
		Lootogo.map = new google.maps.Map(document.getElementById("map"), myOptions);

		var marker = new google.maps.Marker( {
			position : latlng,
			map : Lootogo.map
		});

		google.maps.event.addListener(Lootogo.map, "dragend", function() {
			Lootogo.map.clearMarkers();
			Lootogo.loadToiletten();
		});
		
		google.maps.event.addListener(Lootogo.map, "zoom_changed", function() {
			Lootogo.tilesloaded = google.maps.event.addListener(Lootogo.map, "tilesloaded", function() {
				Lootogo.map.clearMarkers();
				Lootogo.loadToiletten();
				google.maps.event.removeListener(Lootogo.tilesloaded);
			});
		});
				
		Lootogo.tilesloaded = google.maps.event.addListener(Lootogo.map, "tilesloaded", function() {
			Lootogo.map.clearMarkers();
			Lootogo.loadToiletten();
			google.maps.event.removeListener(Lootogo.tilesloaded);
		});
	},

	loadToiletten : function() {
		$("#toiletten").html("<img src=\"/images/load.gif\" alt=\"loading...\" />");

		var bounds = Lootogo.map.getBounds();
		var northEast = bounds.getNorthEast();
		var southWest = bounds.getSouthWest();

		$.getJSON("/api?swlat=" + southWest.lat() + "&swlng=" + southWest.lng() + "&nelat=" + northEast.lat() + "&nelng=" + northEast.lng(), function(data) {
			if(data["toiletten"] == undefined) {
				$("#toilettenCount").html("0");
				$("#toilettenCountSum").html("0");
				$("#toiletten").html("Keine Toilette in der Umgebung gefunden!");
			} else {
				var text = "";
				for ( var i = 0; i < data["toiletten"].length; i++) {
					var bewertung = data["toiletten"][i].bewertung;
					var kindergerecht = data["toiletten"][i].kindergerecht;
					var behindertengerecht = data["toiletten"][i].behindertengerecht;
					var kosten = data["toiletten"][i].kosten;
					var ort = data["toiletten"][i].oertlichkeit;
					var lat = data["toiletten"][i].lat;
					var lng = data["toiletten"][i].lng;
					var hash = data["toiletten"][i].hash;
					var address = data["toiletten"][i].adresse;
					
					if(address == "") {
						address = "-";
					}
	
					if (bewertung == 0) {
						var color = "#cccccc";
						var iconUrl = "/images/gray.png";
					} else if (bewertung < 1.5 && bewertung > 0) {
						var color = "#ccff33";
						var iconUrl = "/images/green.png";
					} else if (bewertung < 3.0) {
						var color = "#ffff66";
						var iconUrl = "/images/yellow.png";
					} else if (bewertung < 4.5) {
						var color = "#ff9933";
						var iconUrl = "/images/orange.png";
					} else {
						var color = "#ff3333";
						var iconUrl = "/images/red.png";
					}
					var text = text + "<a href=\"/toilette/" + hash + "/" + address.replace(/\s/g,"-") + "\" class=\"toilettenhover\" id=\"" + hash + "\"><div style=\"background-color:" + color + ";border-bottom:1px solid #666666;\"><div class=\"left\"><div>" + ort + "</div><div>" + kindergerecht + " - " + behindertengerecht + " - " + kosten + "</div></div><div style=\"margin-left:220px;\"><span style=\"font-size:2em;\">" + bewertung + "</span></div><div class=\"clear\"  /></div></a>";
	
					var marker = new google.maps.Marker( {
						position : new google.maps.LatLng(lat, lng),
						map : Lootogo.map,
						title : ort
					});
					marker.setIcon(new google.maps.MarkerImage(iconUrl));
					marker.set("hash", hash);
					
					var infowindow = new google.maps.InfoWindow( {
						content : ort + " - <a href=\"/toilette/" + hash + "/" + address.replace(/\s/g,"-") + "\">mehr</a>"
					});
					marker.set("infowindow", infowindow)
					
					Lootogo.map.addMarker(marker);
					Lootogo.openWindow(marker, infowindow);
				}
				var toilettenCount = data["count"];
				if(toilettenCount < 25) {
					$("#toilettenCount").html(toilettenCount);
				} else {
					$("#toilettenCount").html("25");
				}
				$("#toilettenCountSum").html(toilettenCount);
				$("#toiletten").html(text);
				$("a.toilettenhover").hover( function() {
					var toilettenHash = $(this).attr("id");
					markers = Lootogo.map.getMarkers();
					for (i=0;i<markers.length;i++) {
						marker = markers[i];
						if(marker.get("hash") == toilettenHash) {
							if (Lootogo.visibleInfoWindow) {
								Lootogo.visibleInfoWindow.close();
							}
							
							var infowindow = marker.get("infowindow");
							Lootogo.visibleInfoWindow = infowindow;
							infowindow.open(Lootogo.map, marker);
						}
					}
				});
			}
		});
		var bounds = Lootogo.map.getBounds();
	},
	openWindow : function(marker, infowindow) {
		google.maps.event.addListener(marker, "click", function() {
			if (Lootogo.visibleInfoWindow) {
				Lootogo.visibleInfoWindow.close();
			}

			Lootogo.visibleInfoWindow = infowindow;
			infowindow.open(Lootogo.map, marker);
		});
	},
	
	searchNewPoint: function(address) {
		Lootogo.geocoder.geocode( { 'address': address}, function(results, status) {
	        if (status == google.maps.GeocoderStatus.OK) {
	        	Lootogo.map.clearMarkers();
	        	$("#newToiletAddressStatus").text("");
	        	$("#newToiletLat").val(results[0].geometry.location.lat());
	        	$("#newToiletLng").val(results[0].geometry.location.lng());
	        	$("#newToiletAddress").val(results[0].formatted_address);
				Lootogo.map.setCenter(results[0].geometry.location);
				Lootogo.loadToiletten();
				var marker = new google.maps.Marker({
				    map: Lootogo.map, 
				    position: results[0].geometry.location,
				    icon: new google.maps.MarkerImage("/images/blue.png")
				});
				Lootogo.map.addMarker(marker);
	        } else {
	        	$("#newToiletAddressStatus").text("Adresse unbekannt!");
	        }
		});

	}
};

$(document).ready(function(){
	var timeout = undefined;
	$("#newToiletEnterAddress").keyup(function(){
		if(timeout != undefined) {
			clearTimeout(timeout);
		}
		timeout = setTimeout(function() {
			timeout = undefined;
			Lootogo.searchNewPoint($("#newToiletEnterAddress").val());
		}, 400);
	});
});
