var polyLines;
var startMarker;
var stopMarker;

var lastMarker;
var map;
var startIcon, stopIcon;

function onLoad() 
{
	if(GBrowserIsCompatible()) 
	{
		map = new GMap(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.addControl(new GScaleControl());
		map.centerAndZoom(new GPoint(centerLon, centerLat), zoom);
		map.setMapType(type);
		GEvent.addListener(map, 'click', this.clickHandler);
	
		startIcon = new GIcon();
		startIcon.image = "http://www.google.com/mapfiles/dd-start.png";
		startIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
		startIcon.iconSize = new GSize(20, 34);
		startIcon.shadowSize = new GSize(37, 34);
		startIcon.iconAnchor = new GPoint(9, 34);
		startIcon.infoWindowAnchor = new GPoint(5, 1);
		
		stopIcon = new GIcon(startIcon);
		stopIcon.image = "http://www.google.com/mapfiles/dd-end.png";
	
		polyLines = new Array();
		
		for(var i=0;i<points.length;i++)
		{
			p = points[i];
			drawNewPoint(p, i+1);
		}
		
		// Monitor the window resize event and let the map know when it occurs
		if (window.attachEvent) 
		{ 
			window.attachEvent("onresize", function() {this.map.onResize()} );
		} 
		else 
		{
			window.addEventListener("resize", function() {this.map.onResize()}, false);
		} 
	}
}

function clickHandler(overlay, point)
{
	if(overlay) return;
 
	document.getElementById('hyperlinkDisplay').innerHTML = "";
	points.push(point);
	drawNewPoint(point, points.length);
}

function drawNewPoint(point, pointNumber)
{
	if(pointNumber == 1)
	{
		startMarker = new GMarker(point, startIcon);
		map.addOverlay(startMarker);
	}
	else if(pointNumber > 1)
	{  
		var lastPoint = points[pointNumber - 2];
		var polyLine = new GPolyline([lastPoint, point], "#cc0000", 5);
		map.addOverlay(polyLine);
		polyLines.push(polyLine);
		
		if(pointNumber > 2)
			map.removeOverlay(stopMarker);
		
		stopMarker = new GMarker(point, stopIcon);
		map.addOverlay(stopMarker);
	}

	calculateTotalDistance();
}

function calculateTotalDistance()
{
	var kmToMi = 0.621371192;
	var kmToFt = 3280.8399;
	var distKm = 0;

	for(var i=0;i<points.length-1;i++)
		distKm += calculateDistance(points[i], points[i+1]);

	if(points.length == 0)
	{
		document.getElementById('miles').value = "";
		document.getElementById('kilometers').value = "";
		document.getElementById('feet').value = "";
		document.getElementById('waypoints').value = "";
	}
	else
	{
		var decimalPlaces = (distKm > 1000) ? 0 : 2;
			
		document.getElementById('kilometers').value = addCommas(distKm.toFixed(decimalPlaces));
		document.getElementById('miles').value = addCommas((distKm * kmToMi).toFixed(decimalPlaces));
		document.getElementById('feet').value = addCommas((distKm * kmToFt).toFixed(0));
		document.getElementById('waypoints').value = addCommas(points.length);
	}

	document.getElementById('waypoints').style.color = (points.length > 500) ? "#ff0000" : "#000000";
}

function clearRoute()
{
	if(points.length != 0)
	{
		if(!confirm("Are you sure you want to start over?"))
			return;
	}
	
	points = [];
	polyLines = [];
	map.clearOverlays();

	document.getElementById('hyperlinkDisplay').innerHTML = "";
	document.getElementById('miles').value = "";
	document.getElementById('kilometers').value = "";
	document.getElementById('feet').value = "";
	document.getElementById('waypoints').value = "";
	document.getElementById('locationSearchTextBox').value = "";

	clearResults();
}

function undo()
{
	if(points.length > 0)
	{
		points.pop();

		if(points.length == 0)
		{
			map.removeOverlay(startMarker);
		}
		else
		{
			map.removeOverlay(stopMarker);

			if(points.length > 1)
			{
				stopMarker = new GMarker(points[points.length-1], stopIcon);
				map.addOverlay(stopMarker);
			}
		}
		
		if(polyLines.length > 0)
		{
			map.removeOverlay(polyLines[polyLines.length-1]);
			polyLines.pop();
		}
		
		calculateTotalDistance();
	}
}

function createHyperlink()
{
	var lat = [];
	var lon = [];
	var center = map.getCenterLatLng();
	var zoom = map.getZoomLevel();
	var type = map.getCurrentMapType();
	
	
	var theURL = "service.createhyperlink.php?";
	var args = "";
	
		for(var i=0;i<points.length;i++)
		{
		args += "pts[]=" + encode(points[i]) + "&";
		}
	
	args += "cnt=" + encode(center) + "&zm=" + encode(zoom);

	if(type == G_NORMAL_MAP)
		args += "&type=Map";
	else if(type == G_HYBRID_MAP)
		args += "&type=Hybrid";
	else
		args += "&type=Satellite";

	loadXMLDoc("service.createhyperlink.php", args, processHyperlinkRequest);
	//alert(args);
	
		
	//document.getElementById("geoResults").innerHTML = theURL; 
	//document.getElementById("geoResults").style.visibility = 'visible';
}

/*
* Calculate distance (in km) between two points specified by latitude/longitude using law of cosines.
*/
function calculateDistance(p1, p2) 
{
	if(p1.x == p2.x && p1.y==p2.y)
		return 0;

	var R = 6371; // earth's mean radius in km
	var p1Lat = toRadians(p1.y);
	var p2Lat = toRadians(p2.y);
	var p1Lon = toRadians(p1.x);
	var p2Lon = toRadians(p2.x);

	var d = Math.acos(Math.sin(p1Lat) * Math.sin(p2Lat) + Math.cos(p1Lat) * Math.cos(p2Lat) * Math.cos(p2Lon - p1Lon)) * R;
	return d;
}

function toRadians(deg)
{
	return deg * Math.PI / 180;
}

function addCommas(nStr)
{
		nStr += '';
		var x = nStr.split('.');
		var x1 = x[0];
		var x2 = x.length > 1 ? '.' + x[1] : '';
		var rgx = /(\d+)(\d{3})/;
		while (rgx.test(x1)) {
			x1 = x1.replace(rgx, '$1' + ',' + '$2');
		}
		return x1 + x2;
}


// AJAX call to perform geocoding
function GeoCode(address) 
{
	if (trim(address) == '') {
		return;
	}

	loadXMLDoc("service.geocode.php", "address=" + encode(address), processGeoCodeRequest);
}

function popup(url)
{
	popupwin = window.open(url, "mywindow","resizable=1,status=1,scrollbars=0,width=465,height=475");
}
