google.load("maps", "2");
google.load("jquery", "1.3.2");
google.load("jqueryui", "1.7.2");

const markerIcon_startPoint="http://www.google.com/intl/en_ALL/mapfiles/dd-start.png";
const markerIcon_endPoint="http://www.google.com/intl/en_ALL/mapfiles/dd-end.png";
const markerIcon_pickUpPoint="http://www.google.com/intl/en_ALL/mapfiles/marker_orange.png";
const markerIcon_routePoint="http://www.google.com/intl/en_ALL/mapfiles/marker_grey.png";

var marker_pathPoints=new Array();
var marker_startPoint;
var marker_endPoint;
var map;
var directions;
var lastPolyLine;

	
google.setOnLoadCallback(initialize);


// 	Init / Main Function
function initialize() {


	$("#markerList").sortable();
	$("#markerList").disableSelection();
	$(".marker").draggable({ helper: 'clone' });
	
	if (GBrowserIsCompatible()){
		map = new google.maps.Map2(document.getElementById("map"));
		map.addControl(new google.maps.LargeMapControl());
		map.addControl(new google.maps.MapTypeControl());
		
		center = new google.maps.LatLng(48.15507138260328, 11.555728912353516)
		map.setCenter(center, 5);
		directions = new google.maps.Directions();
				
		bindStartPointLink();	
		bindSearchGoLink();
		bindCalculateRouteAfterSort();
		bindUploadRoute();	
		bindListEntryHoverEffect();
	}
	
}


// Bind SetPointLinks

function bindStartPointLink(){
		function addRoutePoint(event, ui){
				if(marker_startPoint){
					map.panTo(marker_startPoint.getLatLng());
				}else{
					var latlng = calculateLatLngPositionForMarkerDrop(ui);
					marker_startPoint = createMarker(latlng, markerIcon_startPoint, "Hier geht die Fahrt los!");
					map.addOverlay(marker_startPoint);
					$(".setEndPoint").fadeTo("fast",1);
					$(".setRoutePoint").fadeTo("fast",1);
					$(".setPickUpPoint").fadeTo("fast",1);
					bindEndPointLink();
					bindPickUpPointLink();
					bindRoutePointLink();
					$("#markerListEntry_start").show('normal');
				}
				
			}

	$(".setStartPoint").bind("click", addRoutePoint);
	$('.setStartPoint').bind('dragstop', addRoutePoint);
}

function bindEndPointLink(){
		function addRoutePoint(event, ui){
				if(marker_endPoint){
					map.panTo(marker_endPoint.getLatLng());
				}else{
					var latlng = calculateLatLngPositionForMarkerDrop(ui);
					marker_endPoint = createMarker(latlng, markerIcon_endPoint, "Hier bist du am Ziel!");
					map.addOverlay(marker_endPoint);
					$("#markerListEntry_end").show('normal');
					$('#uploadRoute').show('normal');
					calculateRoute();
				}
		}

		$(".setEndPoint").bind("click", addRoutePoint);
		$('.setEndPoint').bind('dragstop', addRoutePoint);
}

function bindPickUpPointLink(){		
		function addRoutePoint(event, ui){
				var latlng = calculateLatLngPositionForMarkerDrop(ui);
				var pointLabel = prompt("Wie willst du den Punkt nennen?");
				var marker = createMarker(latlng, markerIcon_pickUpPoint, pointLabel);
				map.addOverlay(marker);
				$("#markerList").append("<li id=\""+marker_pathPoints.length+"\"><img src=\""+markerIcon_pickUpPoint+"\" height=\"25\" >"+pointLabel+"</li>");
				marker_pathPoints[marker_pathPoints.length]=marker;
				calculateRoute();
		}
		$(".setPickUpPoint").bind('click',addRoutePoint);
		$('.setPickUpPoint').bind('dragstop', addRoutePoint);
}

function bindRoutePointLink(){
		function addRoutePoint(event, ui){
				var latlng = calculateLatLngPositionForMarkerDrop(ui);
				var pointLabel = prompt("Wie willst du den Punkt nennen?");
				var marker = createMarker(latlng, markerIcon_routePoint, pointLabel);
				map.addOverlay(marker);
				$("#markerList").append("<li id=\""+marker_pathPoints.length+"\"><img src=\""+markerIcon_routePoint+"\" height=\"25\" >"+pointLabel+"</li>");
				marker_pathPoints[marker_pathPoints.length]=marker;
				calculateRoute();
		}
		$('.setRoutePoint').bind('click', addRoutePoint	);
		$('.setRoutePoint').bind('dragstop', addRoutePoint);
}

function bindSearchGoLink(){
		
		function search(){
				var geocoder = new google.maps.ClientGeocoder();
				geocoder.getLatLng($("#searchBox").val(), function(point){
						if(point){
							map.panTo(point);
						}
					}
				);
			}				


		$("#searchGo").bind("click", search);	
		$("#searchBox").bind("keyup", function(event){
					if(event.keyCode==13){
						search();
					}
				}
		);
}

function bindCalculateRouteAfterSort(){
	$('#markerList').bind('sortupdate', function(event, ui) {
	  calculateRoute();
	});
}

function bindUploadRoute(){
		$('#uploadRoute').bind('click', function(data) {
				if(marker_startPoint && marker_endPoint){
					$('#uploadRoute').fadeTo('fast', 0);
					var wayPoints = generateWayPointArray();
					
					var timestamp = Math.floor(new Date().getTime()/1000);
					
					$('#uploadRoute').before('<br/><b>Speichern: </b>');
					for(var i = 0; i<wayPoints.length; i++){
						lat = wayPoints[i].lat();
						lng = wayPoints[i].lng();
						
						var point_type="route_point";
						if(i==0) point_type="start_point";
						if(i==wayPoints.length-1) point_type="end_point";
						
						var counter=0;
						$.get("addMyRide.php?internal_order="+i+"&point_type="+point_type+"&lng="+lng+"&lat="+lat+"&route_id="+timestamp,function(data){
								$('#uploadRoute').before('|||');
								counter++;
								if(counter==wayPoints.length){
									$('#uploadRoute').before('<br/><b>Fertig!</b>');
								}
						});
					}
					
				}
			}
		);
}


function bindListEntryHoverEffect(){
	$('#markerList > li').live('mouseover', function(e){
        map.panTo(marker_pathPoints[$(this).attr('id')].getLatLng());
    });
	$('#markerListEntry_start').bind('mouseover', function(e){
        map.panTo(marker_startPoint.getLatLng());
    });
	$('#markerListEntry_end').bind('mouseover', function(e){
        map.panTo(marker_endPoint.getLatLng());
    });
}
 
// Helper

function createMarker(latlng, iconUrl, info){
    var markerIcon = new google.maps.Icon(G_DEFAULT_ICON);
    markerIcon.image = iconUrl;
	markerOptions = { icon:markerIcon, draggable: true };
	
	var marker  = new GMarker(latlng, markerOptions);
	
	google.maps.Event.addListener(marker, "dragend", function() {
		calculateRoute();
    });
	
	google.maps.Event.addListener(marker, "dragstart", function() {
      map.closeInfoWindow();
    });
	
	marker.bindInfoWindowHtml(info);
	
	return marker;
}

function calculateRoute(){
	if(marker_startPoint && (marker_endPoint || marker_pathPoints.length>0)){

		directionOptions={getPolyline: true};
				
		directions.loadFromWaypoints(generateWayPointArray(),directionOptions);
		
		google.maps.Event.addListener(directions, "load", function () {
				if(lastPolyLine){
					map.removeOverlay(lastPolyLine);
				}
				lastPolyLine=directions.getPolyline();
				map.addOverlay(lastPolyLine);
			} 
		);
	}
}

function generateWayPointArray(){
		var wayPoints= new Array();
		
		wayPoints[0]=marker_startPoint.getLatLng();
		
		if(marker_pathPoints.length>0){
			var idArray = $('#markerList').sortable('toArray');
			
			for(var i = 0; i<idArray.length; i++){
				wayPoints[wayPoints.length]=marker_pathPoints[idArray[i]].getLatLng();
			}
		}
		if(marker_endPoint){
			wayPoints[wayPoints.length]=marker_endPoint.getLatLng();
		}
		
		return wayPoints;
}

function calculateLatLngPositionForMarkerDrop(ui){
		var latlng;
		if(ui && ui.position){
			latlng  = map.fromContainerPixelToLatLng(new google.maps.Point(ui.position.left-$('#map').position().left+10,ui.position.top-$('#map').position().top+34));
		}else{
			latlng  = map.getCenter();
		}	
		return latlng;
}
