(function() {
google.maps.Map.prototype.markers = new Array();


google.maps.Map.prototype.addMarker = function(marker) 
{
	this.markers.push(marker);
};

google.maps.Map.prototype.clearMarkers = function() 
{
	if (AutomatSearch.visibleInfoWindow) 
	{
		AutomatSearch.visibleInfoWindow.close();
	}

	for(var i = 0; i < this.markers.length; i++) 
	{
		this.markers[i].setMap(null);
	}
};
})();

var AutomatSearch = {
	geocoder 			:null,
	domain 				:null,
	shownInfoBox 	    :null,
	map 				:null,
	tilesloaded 		:null,
	zoom 				:null,

	init : function(lat, lng, zoom) 
	{
		AutomatSearch.zoom = zoom;
		AutomatSearch.geocoder = new google.maps.Geocoder();
		var latlng = new google.maps.LatLng(lat, lng);
		
		var myOptions = {
			zoom 		:AutomatSearch.zoom,
			center 		:latlng,
			mapTypeId 	:google.maps.MapTypeId.ROADMAP
		};
		
		AutomatSearch.map = new google.maps.Map(document.getElementById("map"), myOptions);

		google.maps.event.addListener(AutomatSearch.map, "dragend", function() 
		{
			AutomatSearch.loadAutomats();
		});
		
		google.maps.event.addListener(AutomatSearch.map, "tilesloaded", function() 
		{
			AutomatSearch.loadAutomats();
		});

		google.maps.event.addListener(AutomatSearch.map, "click", function(event)  
		{
			if(event != undefined)
			{
				AutomatSearch.addNewAutomatPoint(event.latLng);
			}
			return false;
		});
		
		google.maps.event.addListener(AutomatSearch.map, "zoom_changed", function() 
		{
			AutomatSearch.tilesloaded = google.maps.event.addListener(AutomatSearch.map, "tilesloaded", function() 
			{
				AutomatSearch.map.clearMarkers();
				AutomatSearch.loadAutomats();
			});
		});
		
		// Add Icons to Filter
		$('.automat_filter_cbx').each(function()
		{
			var img = AutomatSearch.getGoogleMapPinIcon($(this).val());

			$(this).before('<img src="' + img + '" />');
		});
	},
	
	getGoogleMapPinIcon : function(typ_id)
	{ 
		switch(parseInt(typ_id))
		{
			case 0:  return AutomatSearch.domain + "images/white.png";
					 break;
			case 1:  return AutomatSearch.domain + "images/blue.png";
					 break;
			case 2:  return AutomatSearch.domain + "images/pink.png";
					 break;
			case 3:  return AutomatSearch.domain + "images/yellow.png";
					 break;
			case 4:  return AutomatSearch.domain + "images/red.png";
					 break;
			case 5:  return AutomatSearch.domain + "images/green.png";
					 break;
			case 6:  return AutomatSearch.domain + "images/lightblue.png";
					 break;
			case 8:  return AutomatSearch.domain + "images/orange.png";
					 break;
			default: return AutomatSearch.domain + "images/purple.png";
					 break;
		}
	},

	loadAutomats : function() 
	{
		var bounds = AutomatSearch.map.getBounds();
		
		if(bounds == undefined)
		{ 	
			return;
		}
		
		var northEast = bounds.getNorthEast();
		var southWest = bounds.getSouthWest();
		
		// Filter beruecksichtigen
		var automatList = "";
		
		$("#filter_options input:checked").each(function(id) 
		{
			if(automatList != "")
			{
				automatList += ",";
			}
			automatList += $("#filter_options input:checked").eq(id).val(); 
		});
	
		$.getJSON(AutomatSearch.domain + "javascript/ajax/getAutomats.json.php?lang=de&southwest_lng=" + southWest.lng() + "&southwest_lat=" + southWest.lat() + "&northeast_lng=" + northEast.lng() + "&northeast_lat=" + northEast.lat() + "&automats=" + escape(automatList), function(json_data) 
		{
			if(json_data["automats"] != undefined)
			{
				AutomatSearch.map.clearMarkers();
				var infobox_text = "";
				
				for(var i = 0; i < json_data["automats"].length; i++) 
				{
					var lat = json_data["automats"][i].lat;
					var lng = json_data["automats"][i].lng;
					var typ = json_data["automats"][i].typ;
					
					infobox_text = "<span style=\"font-weight:bold\">" + json_data["automats"][i].typ + "</span><br /><br />";
					
					if(json_data["automats"][i].ec_card == 1)
					{
						infobox_text += "EC-Karten-Zahlung möglich.<br /><br />";
					}
					else
					{
						infobox_text += "Keine EC-Karten-Zahlung möglich.<br /><br />";
					}
					
					var date = new Date();
					date.setTime(json_data["automats"][i].datetime * 1000);
					
					infobox_text += "Wurde am " + date.getDate() + "." + (date.getMonth() + 1) + "." + date.getFullYear() + " eingetragen.";
					
					var marker = new google.maps.Marker({
						position 	:new google.maps.LatLng(lat, lng),
						map 		:AutomatSearch.map,
						title 		:typ
					});
					
					var color = "#FF3333";
										
					marker.setIcon(new google.maps.MarkerImage(AutomatSearch.getGoogleMapPinIcon(json_data["automats"][i].typ_id)));
					
					var infoBox = new google.maps.InfoWindow( {
						content : infobox_text
					});
					
					marker.set("infowindow", infoBox);
					
					AutomatSearch.map.addMarker(marker);
					AutomatSearch.openWindow(marker, infoBox);
				}
			}
		});
	},
	
	openWindow : function(marker, infoBox) 
	{
		google.maps.event.addListener(marker, "click", function() 
		{
			if (AutomatSearch.shownInfoBox) 
			{
				AutomatSearch.shownInfoBox.close();
			}

			AutomatSearch.shownInfoBox = infoBox;
			infoBox.open(AutomatSearch.map, marker);
		});
	},
	
	addNewAutomatPoint: function(point) 
	{
		AutomatSearch.map.clearMarkers();
		$("#new_automat_lat").val(point.lat());
		$("#new_automat_lng").val(point.lng());

		var marker = new google.maps.Marker({
			map: AutomatSearch.map, 
			position: point,
			icon: new google.maps.MarkerImage(AutomatSearch.domain + "images/white.png")
		});
		AutomatSearch.map.addMarker(marker);
	},
	
	gotoAddress: function(address) 
	{
		AutomatSearch.geocoder.geocode( { 'address': address}, function(results, status) 
		{
	        if(status == google.maps.GeocoderStatus.OK) 
			{
	        	$("#id_address").val(results[0].formatted_address);
				AutomatSearch.map.setCenter(results[0].geometry.location);
				
				if(AutomatSearch.map.getZoom() == AutomatSearch.zoom)
				{
					AutomatSearch.map.setZoom(13);
				}
				AutomatSearch.loadAutomats();
	        }
			else 
			{
				ShowMessage('Adresse nicht gefunden', 'Die Adresse konnte nicht gefunden werden.<br />Bitte gebe eine gültige Adresse ein.');
	        }
		});
	}
};

$(document).ready(function() 
{
	$("#frmAddress").submit(function() 
	{
		AutomatSearch.gotoAddress($("#id_address").val());
		return false;
	});
});
