/**
 * 
 */
$(document).ready(function() {
	
	ajaxRequest();
	
	$(".citylist a").click(
		function(e) 
		{
			ajaxRequest($(this).attr('title'));				
			e.preventDefault();
		}
	);
	
	function ajaxRequest(param)
	{	
		$.post("/overview/offerinterface/",
				{},
				function(xml)
				{			
					var markers = new Array();
					markers = createArrayFromXml(xml);
					
					createGoogleMap(markers, param);
				}
		);
	}
	
	function createArrayFromXml(xml)
	{
		var markers = new Array();
		
    	$(xml).find("offers Model_Biete").each(
			function(i)
			{
	    		var $this = $(this);

		    	markers[i] = new Object();
		    	markers[i]['startLatitude'] 			= $this.find("Model_Teilstrecke startLatitude").text().replace(/,/, '.');
		    	markers[i]['startLongitude']			= $this.find("Model_Teilstrecke startLongitude").text().replace(/,/, '.');
		    	markers[i]['destinationLatitude']		= $this.find("Model_Teilstrecke zielLatitude").text().replace(/,/, '.');
		    	markers[i]['destinationLongitude']		= $this.find("Model_Teilstrecke zielLongitude").text().replace(/,/, '.');
		    	markers[i]['startCity']					= $this.find("Model_Teilstrecke startOrt").text();
	           	markers[i]['startStreet']				= $this.find("Model_Teilstrecke startStrasse").text();
	       		markers[i]['destinationCity']			= $this.find("Model_Teilstrecke zielOrt").text();
	       	    markers[i]['destinationStreet']			= $this.find("Model_Teilstrecke zielStrasse").text();
	       	    markers[i]['offerId']					= $this.attr("id");

			}
    	);
	    
	    return markers;
	}
	
	function createGoogleMap(markers, param)
	{
		if (GBrowserIsCompatible())
		{
			var map = new GMap2(document.getElementById("map"));
			addMapOptions(map);
			
			var bounds = new GLatLngBounds();
			
			var startMarker 		= createMarkerIcon("start");
			var destinationMarker	= createMarkerIcon("destination");
			
			startMarkerOptions 			= { icon:startMarker };
			destinationMarkerOptions	= { icon:destinationMarker, zIndexProcess:function() { return 999;} };
			
			var startPoints = new Array();
			for (var i = 0; i < markers.length ; i++)
			{
				var startPoint			= new GLatLng(markers[i]['startLatitude'], markers[i]['startLongitude']);
				var destinationPoint	= new GLatLng(markers[i]['destinationLatitude'], markers[i]['destinationLongitude']);
				
				if(param != "" && typeof param != "undefined")
				{
					if(markers[i]['startCity'] == param)
					{
						bounds.extend(startPoint);
						bounds.extend(destinationPoint);
					}
				}
				else
				{
					bounds.extend(startPoint);
					bounds.extend(destinationPoint);					
				}
				
				var startMarker			= new GMarker(startPoint, startMarkerOptions);
				var destinationMarker 	= new GMarker(destinationPoint, destinationMarkerOptions);
				
				startPoints.push(startMarker);
				
				addMarkerToMap(startMarker, map, false);
				addMarkerToMap(destinationMarker, map, true);
				
				addShowDestinationPointListener(startMarker, destinationMarker, startPoints, map);
				addShowInfoWindowListener(startMarker, markers[i]);
			}	
			
			if(markers.length < 2)
			{
				map.setZoom(map.getBoundsZoomLevel(bounds)-1);
			}
			else
			{
				map.setZoom(map.getBoundsZoomLevel(bounds));
			}
			map.setCenter(bounds.getCenter());
		}		
	}
	
	function addShowDestinationPointListener(startMarker, destinationMarker, startPoints, map)
	{
		GEvent.addListener(startMarker,"mouseover", function() {	
			disableMarkers(startPoints, this);
			this.setImage("/gfx/pin_blau.png");
			destinationMarker.show();
        });
		
		GEvent.addListener(startMarker,"mouseout", function() {
			destinationMarker.hide();
			showMarkers(startPoints);
        }); 
	}
	
	function addShowInfoWindowListener(startMarker, markerData)
	{
		GEvent.addListener(startMarker,"click", function() {
			appendInfoWindowHtml(startMarker, markerData);
        }); 	
	}
	
	function disableMarkers(markers)
	{
		for (var i = 0; i < markers.length ; i++)
		{
			markers[i].setImage("/gfx/pin_grau.png");
			markers[i].closeInfoWindow();
		}
	}
	
	function showMarkers(markers)
	{
		for (var i = 0; i < markers.length ; i++)
		{
			markers[i].setImage("/gfx/pin_blau.png");
		}		
	}
	
	function addMarkerToMap(marker, map, hidden)
	{
		map.addOverlay(marker);
		if(hidden == true)
			marker.hide();		
	}
	
	function addMapOptions(map)
	{
		map.setCenter(new GLatLng(0,0),0);	
		map.addControl(new GSmallZoomControl());
	}
	
	function createMarkerIcon(type)
	{
		var tinyIcon = new GIcon();
		
		if(type == "start")
		{
			tinyIcon.image = "/gfx/pin_blau.png";
		}
		else
		{
			tinyIcon.image = "/gfx/pin_rot.png";
		}
		
		tinyIcon.shadow = "/gfx/pin_shadow.png";
		tinyIcon.iconSize = new GSize(24, 30);
		tinyIcon.shadowSize = new GSize(24, 30);
		tinyIcon.iconAnchor = new GPoint(6, 20);
		tinyIcon.infoWindowAnchor = new GPoint(17, 8);	
		
		return tinyIcon;
	}
	
	function appendInfoWindowHtml(startMarker, markerData)
	{
		var markerData = markerData;
		var startMarker = startMarker;
		$.ajax({
			url: '/tpl/static/googlemapsinfowindow.html',
			success: function(data)
			{
				var $data = $(data);			
				
				var startAdress = 'Von: ' + markerData['startStreet'] + ", " + markerData['startCity'];
				var destinationAdress = 'Nach: ' + markerData['destinationStreet'] + ", " + markerData['destinationCity'];
				var offerLink = '/startseite/angebot/' + markerData['offerId'] + '/';
				
				$data.find('#startadress').text(startAdress);
				$data.find('#destinationadress').text(destinationAdress);
				$data.find('#offerlink').attr('href', offerLink);
				
				startMarker.openInfoWindowHtml($data.html());
			}
		});
	}
});
