var map, geocoder = null; 
var centerLatitude = 40.662019656607;
var centerLongitude = -73.969144821167;
var startZoom = 14;

var deselectCurrent = function() {};
var earthRadius = 6378137; // in metres

var latlngs = [];

var startMarker = null;
var endMarker = null;

var startIcon = null;
var endIcon = null;

var startListItem = null;
var endListItem = null;

function init() {
	_mSvgEnabled = false; // Firefox 1.5.0.4/Mac wasn't rendering the SVG.
	
	handleResize();
	
	map = new GMap2(document.getElementById("map"), {draggableCursor: 'crosshair', draggingCursor: 'pointer'});
	
	map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom);	
	map.addControl(new GLargeMapControl());
	map.addControl(new GScaleControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GOverviewMapControl());

	// Get saved route id's
	for(id in savedRoutes) {
		initializeSavedRoutes(savedRoutes[id]);
	}
	if(mapclick == 'allow') {
		GEvent.addListener(map, 'click', handleMapClick);	
	}
	
	// Setup start and end icons
	startIcon = new GIcon();
	startIcon.image = './images/dd-start.png';
	startIcon.iconSize = new GSize(20, 34);
	startIcon.iconAnchor = new GPoint(10, 34);
	endIcon = new GIcon();
	endIcon.image = './images/dd-end.png';
	endIcon.iconSize = new GSize(20, 34);
	endIcon.iconAnchor = new GPoint(10, 34);
}

function handleMapClick(marker, latlng) {
	
	if(marker) {
	}
	else {
		latlngs.push(latlng);	
		map.clearOverlays();
		initializeStartEndMarkers();		
		drawPolyline();	
	}
}

function initializeStartEndMarkers() {

	// Clear previous list items
	clearStartEndListItems();
	
	// Create start marker
	startMarker = new GMarker(latlngs[0], startIcon);
	startListItem = document.createElement('li');
	var listItemLink = startListItem.appendChild(document.createElement('a'));
	listItemLink.href = "#";
	listItemLink.innerHTML = '<strong>Start Point</strong>';
	
	var focusPoint = function() {
		deselectCurrent();
		startListItem.className = 'current';
		deselectCurrent = function() { startListItem.className = ''; }
		map.panTo(latlngs[0]);
		return false;
	}
	
	GEvent.addListener(startMarker, 'click', focusPoint);
	listItemLink.onclick = focusPoint;

	document.getElementById('sidebar-list').appendChild(startListItem);

	map.addOverlay(startMarker); 		
	
	
	// Create end marker
	if(latlngs.length > 1) {
		
		endMarker = new GMarker(latlngs[latlngs.length - 1], endIcon);
		
		endListItem = document.createElement('li');
		var listItemLink = endListItem.appendChild(document.createElement('a'));
		listItemLink.href = "#";
		listItemLink.innerHTML = '<strong>End Point</strong>';
	
		var focusPoint = function() {
			deselectCurrent();
			endListItem.className = 'current';
			deselectCurrent = function() { endListItem.className = ''; }
			map.panTo(latlngs[latlngs.length - 1]);
			return false;
		}
	
		GEvent.addListener(endMarker, 'click', focusPoint);
		listItemLink.onclick = focusPoint;
		
		
		document.getElementById('sidebar-list').appendChild(endListItem);
		
		
		map.addOverlay(endMarker);	
	
	}

}
function initializeSavedRoutes(savedRoute) {

	var routeListItem = document.createElement('li');
	var listItemLink = routeListItem.appendChild(document.createElement('a'));
	listItemLink.href = "#";
	listItemLink.innerHTML = '<strong>' + savedRoute.routeName + '</strong>';

	var focusPoint = function() {
		deselectCurrent();
		routeListItem.className = 'current';
		deselectCurrent = function() { routeListItem.className = ''; }
				
		getRoute(savedRoute.routeId);
				
		return false;
	}
		
	listItemLink.onclick = focusPoint;
				
	document.getElementById('route-list').appendChild(routeListItem);
		
	//document.getElementById("mymessage").innerHTML = 'Saved Routes Obtained';
}
function getRoute(routeId) {
		
	//document.getElementById("mymessage2").innerHTML = routeId;

	var request = GXmlHttp.create();

	//open the request to getRoute.php 
	request.open('GET', 'mapfunctions/getRoute.php' + '?routeId=' + routeId, true);

	request.onreadystatechange = function() {
		
		if (request.readyState == 4) {
			
			//get data
			var routePointsStr = request.responseText;
			
						
			//check to see if it was an error or success
			if(routePointsStr == "failure") {
				alert("Failure");
			} 
			else {
				// Convert string to latlngs array 
				
				var routeLatLngs = stringPointsToJsArray(routePointsStr);
				
				clearRoute();
				
				latlngs = routeLatLngs;					
				
				initializeStartEndMarkers();		
				drawPolyline();	

			}
		}
	}
	request.send(null);
	return false;

}
function stringPointsToJsArray(routePointsStr) {

	var pointsArray = new Array();	
	pointsArray = routePointsStr.split(',');
	
	var routeLatLngs = new Array();
	
	for (var i = 0; i<pointsArray.length; i = i + 2) {
		
		routeLatLngs.push(new GLatLng(parseFloat(pointsArray[i]), parseFloat(pointsArray[i+1]) ) );		
	}
	
	return routeLatLngs;
	
}
function drawPolyline() {

	var pointCount = latlngs.length;
	var id;
	
	var polyline = new GPolyline(latlngs, 'FF6633', 4, 0.8);
	map.addOverlay(polyline);
		
    	// Calculate total length of polyline 
    	if (pointCount >= 2) {
    		
        	var length = 0;
        	for(id = 0; id < (pointCount - 1); id += 1) {
        	
            		length += latlngs[id].distanceFrom(latlngs[id + 1]);
        	}
		
        	document.getElementById('length-km-data').innerHTML = Math.round(length) / 1000;
        	document.getElementById('length-mi-data').innerHTML = Math.round(length * 0.621371192) / 1000;         
    	}  
    	else {
    		document.getElementById('length-km-data').innerHTML = 0;
        	document.getElementById('length-mi-data').innerHTML = 0;    
    	}

}

function clearRoute() {

	if(!latlngs.length == 0) {
		//document.getElementById('mymessage').innerHTML = 'Route Cleared';
		latlngs.length = 0;
	
		document.getElementById('length-km-data').innerHTML = 0;
        	document.getElementById('length-mi-data').innerHTML = 0; 
		clearStartEndListItems();
		
		map.clearOverlays();
	}	
}

function undoLastPoint() {
	
	map.clearOverlays();
	latlngs.pop();
	clearStartEndListItems();
	
	if(latlngs.length > 0) {
				
		initializeStartEndMarkers();		
		drawPolyline();
	}
}

function clearStartEndListItems() {

	try {
	
		document.getElementById('sidebar-list').removeChild(startListItem);
	}
	catch (e) {
		//no error continue
	};
	try {
		document.getElementById('sidebar-list').removeChild(endListItem);
	}
	catch (e) {
		//no error continue
	};
}

function windowHeight() {
	// Standard browsers (Mozilla, Safari, etc.)
	if (self.innerHeight)
		return self.innerHeight;
	// IE 6
	if (document.documentElement && document.documentElement.clientHeight)
		return document.documentElement.clientHeight;
	// IE 5
	if (document.body)
		return document.body.clientHeight;
	// Just in case.
	return 0;
}

function handleResize() {

	var height = windowHeight() - 200;
	document.getElementById('map').style.height = height + 'px';
	//document.getElementById('sidebar').style.height = height + 'px';
}

window.onresize = handleResize;
window.onload = init;
window.onunload = GUnload;