var run_name = '';
var www_url = '';
var mapsURL = "http://maps.google.com/maps";
var imageBaseUrl = "http://www.google.com/mapfiles/";
var maxlines = 1;
var maxpoints = 200;
var linetype = 'plain';
var noIcon = new GIcon({
	image:			imageBaseUrl + "markerTransparent.png",
	shadow:			imageBaseUrl + "markerTransparent.png",
	iconSize:		new GSize(20, 20),
	shadowSize:		new GSize(20, 20),
	iconAnchor:		new GPoint(0, 0),
	infoWindowAnchor:	new GPoint(9, 2),
	infoShadowAnchor:	new GPoint(18, 25)
});
var map;
var request;

function setline(who)
{
	linetype = who.value;
	if (linetype == 'plain'){
		maxlines = 1;
	} else { // colour
		maxlines = 255;
	}
	request = GXmlHttp.create();
	request.open("GET", "xml.cgi?run="+run_name, true);
	request.onreadystatechange = XMLGet_state_change;
	request.send(null);
}

function createMarker(point, index, hrt, dst, alt, speed, grade,
                      cadence, acctime, time)
{
	var marker = new GMarker(point, noIcon);

	// Show this marker's index in the info window when it is clicked
	var html =
		'<SPAN STYLE="font-size:2">' +
		'Index: ' + index +
		'<BR>Heart Rate: ' + hrt +
		'<BR>Altitude: ' + alt +
		'<BR>Distance: ' + dst +
		'<BR>Speed: ' + speed +
		'<BR>Grade: ' + grade +
		'<BR>Cadence: ' + cadence +
		'<BR>Acc Time: ' + acctime +
		'<BR>Time: ' + time +
		'</SPAN>';
	GEvent.addListener(marker, "click", function() {
	marker.openInfoWindowHtml(html);
	});

	return marker;
}

// for 0 to 255
function d2h(d) {
	if (d < 16) return "0" + d.toString(16);
	return d.toString(16);
}

// normalise to 0-255
function normalise(i, max, min) {
	return parseInt(255*((i-min)/(max-min)));
}

function normalise510(i, max, min) {
	return parseInt(510*((i-min)/(max-min)));
}

function getcolor(i, max, min) {
	var j = normalise510(i, min, max);

	if (linetype == 'plain')
		return  "#0000FF";

	if (j <= 255)
		return "#" + d2h(255-j) + d2h(j) + "00";
	else 
		return "#00" + d2h(510-j) + d2h(j-255);
}

// Download the blah.xml and load it on the map. The format we
// expect is:
// <markers>
//   <marker lat="37.441" lng="-122.141"/>
//   <marker lat="37.322" lng="-121.213"/>
// </markers>
function XMLGet_state_change()
{
	if (request.readyState != 4) {
		return;
	}
	var xmlDoc = request.responseXML;
	var markers = xmlDoc.documentElement.getElementsByTagName("marker");
	var summary = markers[0];

	map.centerAndZoom(new GPoint(parseFloat(summary.getAttribute("lng")),
	                             parseFloat(summary.getAttribute("lat"))), 
	                             13);

	document.getElementById('summary').innerHTML = 
		'<H2>'+
			'<A HREF="kml.cgi?run='+run_name+'">Google Earth</A>'+
		'</H2>' + 
		'<H2>'+
		'<A HREF="crs.cgi?run='+run_name+'">Garmin Course</A>'+
		'</H2>' + 
		'<H2>'+
		'<A HREF="'+mapsURL+'?t=h&amp;q=http://'+www_url+'/kml.cgi?run='+run_name+'">Google Maps</A>'+
		'</H2>' + 
		'<H2>Summary:</H2>' + 
		'<BR><B>Distance</B>:' +
			parseFloat(summary.getAttribute("dst")) + ' KM' + 
		'<BR><B>Speed</B>:' +
			parseFloat(summary.getAttribute("speed")) + ' Kph' + 
		'<BR><B>Total Time</B>:' +
			summary.getAttribute("totaltime") + 
		'<BR><B>ALT gain</B>:' +
			summary.getAttribute("altgain") + 'm' + 
		'<BR><B>ALT loss</B>:' +
			summary.getAttribute("altloss") + 'm' + 
		'<BR><B>HRT</B>:' +
			parseFloat(summary.getAttribute("hrt")) +
		' (Max ' + parseFloat(summary.getAttribute("maxhrt")) + ')' + 
		'<BR><B>Cadence</B>:' +
			summary.getAttribute("cadence"); 
	var altmax = summary.getAttribute("altmax");
	var altmin = summary.getAttribute("altmin");
	var lngmin = summary.getAttribute("lngmin");
	var lngmax = summary.getAttribute("lngmax");
	var latmin = summary.getAttribute("latmin");
	var latmax = summary.getAttribute("latmax");

	var m;
	var alt;
	var point;
	var mapcolor;
	var marker;
	var lastplot = 0;

	var points = [];
	var pointsnumber = markers.length - 1;

	var plotlength;
	
	plotlength = parseInt(pointsnumber/maxlines);
	
	if (plotlength > maxpoints)
		plotlength = maxpoints;

	for (var i = 1; i <= pointsnumber; i++) {
		m = markers[i];
		alt = parseFloat(m.getAttribute("alt"));
		point = new GPoint(parseFloat(m.getAttribute("lng")), 
				       parseFloat(m.getAttribute("lat")));
		
		points.push(point);
		marker = createMarker(point, 
			parseFloat(m.getAttribute("index")),
			parseFloat(m.getAttribute("hrt")),
			parseFloat(m.getAttribute("dst")),
			alt,
			parseFloat(m.getAttribute("speed")),
			parseFloat(m.getAttribute("grade")),
			parseFloat(m.getAttribute("cadence")),
			m.getAttribute("acctime"),
			m.getAttribute("time")
		);
		map.addOverlay(marker);

		mapcolor = getcolor(alt, altmax, altmin);

		if ((i - lastplot) > plotlength) {
			map.addOverlay(new GPolyline(points, mapcolor, 4, 1));
			points.length = 0;
			points.push(point);
			lastplot = i;
		}
	}
	map.setZoom(map.getBoundsZoomLevel(
			    new GLatLngBounds(new GLatLng(latmin, lngmin), 
					      new GLatLng(latmax, lngmax))));

	map.addOverlay(new GPolyline(points, mapcolor, 4, 1));
}

function onLoad(FORM_run, WWWURL)
{
	run_name = FORM_run;
	www_url = WWWURL;

	map = new GMap(document.getElementById("map"));
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GScaleControl());
	map.addControl(new GOverviewMapControl());
	map.addMapType(G_PHYSICAL_MAP);
	map.setMapType(G_HYBRID_MAP);
	map.centerAndZoom(new GPoint(149.10549,-35.345055), 13);

	size = new GSize(0,0);
	size = map.getSize();
	// less 130 to deal with minimap
	graph_init(run_name, size.width - 130);
	graph();

	request = GXmlHttp.create();
	request.open("GET", "xml.cgi?run="+run_name, true);
	request.onreadystatechange = XMLGet_state_change;
	request.send(null);
}

