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(centerLat, centerLon), zoom);
		
    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 = "";
	}
	else
	{
  	document.getElementById('kilometers').value = addCommas(distKm.toFixed(2));
    document.getElementById('miles').value = addCommas((distKm * kmToMi).toFixed(2));
    document.getElementById('feet').value = addCommas((distKm * kmToFt).toFixed(0));
  }
}

function clearRoute()
{
  if(points.length != 0)
  {
  	if(!confirm("Are you sure you want to start again?"))
  	  return;
  }
  
  points = [];
  polyLines = [];
  map.clearOverlays();

  document.getElementById('hyperlinkDisplay').innerHTML = "";
  document.getElementById('miles').value = "";
  document.getElementById('kilometers').value = "";
  document.getElementById('feet').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 theURL = "service.createhyperlink.php?";
	
  for(var i=0;i<points.length;i++)
  {
		theURL += "pts[]=" + encode(points[i]) + "&";
		
  }
	theURL += "cnt=" + encode(center) + "&zm=" + encode(zoom);

	loadXMLDoc(theURL, processHyperlinkRequest);
	//alert(theURL);
	
	  
  //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) 
{
  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");
}

