/********************************************************
Based on the "BiM Active Map Tool"
Modified by Brainstorm
Bones in Motion - BiM Active Map Tools for Google
Copyright 2007 by Bones in Motion - All Rights Reserved
********************************************************/

var map;
var showMetric = "no";
var startIcon = null;
var endIcon = null;
var startZoom = null;
var startCenter = null;


function load() 
{
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		//map.addControl(new GScaleControl());
		map.setCenter(new GLatLng(parseFloat(43.0),parseFloat(-92.0)), 3);
		map.setMapType(G_MAP_TYPE);
		map.enableContinuousZoom();
		//mgr = new GMarkerManager(map);
        SetupIcons();

        GDownloadUrl("http://" + document.domain + "/race_path.txt", function(data, responseCode) {
              if ( responseCode == 200 ) HandleRoutePath(data);
        });
	}
}

function HandleRoutePath( data )
{
	var temp = null;
	var lastLat = null;
	var lastLon = null;
	var lastDist = null;
	//var endatstart = false;
	var pointarray = Array();
	var dataarray = data.split(";");
	var maxpointindex = dataarray.length - 1;
	var lat_biggest = null;
	var lat_smallest = null;
	var mileMarkerNum = 0;
	var mileMarkerLoc = null;
	var pointMile = 0;
	var mmarkerTestVal = null;
	
	// loop over the points in data making an array of points for the polyline
    for (var i=0; i <= maxpointindex ; i++ ) {
    	temp = dataarray[i].split(",");	
    	if (i == 0) { 
			var startpoint = new GLatLng(parseFloat(temp[2]),parseFloat(temp[3])); 
			var lat_biggest = temp[2];
			var lat_smallest = temp[2];
			var lon_biggest = temp[3];
			var lon_smallest = temp[3];
		} else {
			if ( temp[2] > lat_biggest ) lat_biggest = temp[2];
			if ( temp[2] < lat_smallest ) lat_smallest = temp[2];
			if ( temp[3] > lon_biggest ) lon_biggest = temp[3];
			if ( temp[3] < lon_smallest ) lon_smallest = temp[3];
		} 
		if (i == maxpointindex) { var endpoint = new GLatLng(parseFloat(temp[2]),parseFloat(temp[3])); } 
		pointarray.push( new GLatLng( parseFloat(temp[2]),parseFloat(temp[3])) );
		// mile markers
		mmarkerTestVal = ( showMetric == 'yes' ) ? Math.round(temp[1]*1.61*100)/100 : temp[1];
		if ( mileMarkerNum != Math.floor(mmarkerTestVal) )
		{
			mileMarkerNum = Math.floor(mmarkerTestVal);
			mileMarkerLoc = calcMMarkerLoc( lastLat, lastLon, lastDist, temp[2], temp[3], mmarkerTestVal, mileMarkerNum );
			map.addOverlay( makeMileMarker( new GLatLng(parseFloat(mileMarkerLoc[0]),parseFloat(mileMarkerLoc[1])), mileMarkerLoc[2] ) );
		}
		lastLat = temp[2];
		lastLon = temp[3];
		lastDist = mmarkerTestVal;
	}

	var routeline = new GPolyline(pointarray, "#4000ff", 5, 0.6);
	map.addOverlay(routeline);

	map.addOverlay( new GMarker( endpoint, endIcon) );	
	map.addOverlay( new GMarker( startpoint, startIcon) );

	// zoom and center to enclose the route
	var routebounds = new GLatLngBounds( new GLatLng(parseFloat(lat_smallest),parseFloat(lon_biggest)),  new GLatLng(parseFloat(lat_biggest), parseFloat(lon_smallest)) );
	startZoom = map.getBoundsZoomLevel(routebounds, map.viewSize);
	startCenter = routebounds.getCenter();
	map.setCenter( startCenter, startZoom );
}

function makeMileMarker(point, mileNum)
{
	var newMMarkerIcon = new GIcon();
	newMMarkerIcon.iconSize = new GSize(17, 15);
	newMMarkerIcon.iconAnchor = new GPoint(8, 8);
   	newMMarkerIcon.image = "http://" + document.domain + "/images/mmarker_"+mileNum+".png";
	return new GMarker(point, newMMarkerIcon);
}

function SetupIcons()
{
	var baseIcon = new GIcon();
	baseIcon.shadow = "http://" + document.domain + "/images/shadow50.png";
	baseIcon.iconSize = new GSize(20, 34);
	baseIcon.shadowSize = new GSize(37, 34);
	baseIcon.iconAnchor = new GPoint(9, 34);
	//baseIcon.infoWindowAnchor = new GPoint(9, 2);
	//baseIcon.infoShadowAnchor = new GPoint(18, 25);
	startIcon = new GIcon(baseIcon);
	startIcon.image = "http://" + document.domain + "/images/dd-start.png";
	endIcon = new GIcon(baseIcon);
	endIcon.image = "http://" + document.domain + "/images/dd-end.png";
}

function calcMMarkerLoc( lastLat, lastLon, lastDist, nextLat, nextLon, nextDist, mileMarkerNum )
{
	var latDiff = lastLat - nextLat;
	var lonDiff = lastLon - nextLon;
	var distDiff = nextDist - lastDist;
	var distIn = mileMarkerNum - lastDist;
	var percentIn = distIn / distDiff;
	var outLat = parseFloat(lastLat) - ( latDiff * percentIn );
	var outLon = parseFloat(lastLon) - ( lonDiff * percentIn );
	return Array( outLat, outLon, mileMarkerNum );
}
