//<![CDATA[// GLOBALSvar allMarkers = [];var markersShown;var polyLines = [];var polyLinesShown = [];var polyLinesLoaded = [];var polyLinesBounds = [];var polyLinesMarkers = [];var polyLinesPreferredMapTypes = [];var polyLinesRouteIDs = [];var polyLinesIcons = [];var allPolyLinesShown = false;var allMarkerBounds;var avgMarkerLat;var avgMarkerLon;var markerIcons = [];var iconGroupIDs = [];var gmap;var zoomLevelAreas = new Array(		0.000044782205316291115,		0.00017912880077214252,		0.0007165152014842625,		0.0028660594751396392,		0.01146422704873143,		0.04585681809304249,		0.18342716717851734,		0.7337069855714002,		2.9348010091822907,		11.738430973389503,		46.94408531995497,		187.64344725577126,		748.5823131256056,		2961.473356669126,		11242.849261491675,		36095.54334444813,		86649.85238489839,		177134.48041308092		);function getNextZoomLevel ( gmaparea ) {	var i = 0;	while ( zoomLevelAreas[i] < gmaparea )		i++;	return 17-i;}function calcdist ( from_lat, from_long,                    to_lat, to_long ){        var DE2RA = 0.01745329252;        var ERAD = 6378.137;        var FLATTENING = 1.0 / 298.257223563;    // Earth flattening        var lat1 = from_lat;        var lon1 = from_long;        var lat2 = to_lat;        var lon2 = to_long;        lat1 = DE2RA * lat1;        lon1 = -1.0 * DE2RA * lon1;        lat2 = DE2RA * lat2;        lon2 = -1.0 * DE2RA * lon2;        var F = ( lat1 + lat2 ) / 2.0;        var G = ( lat1 - lat2 ) / 2.0;        var L = ( lon1 - lon2 ) / 2.0;        var sing = Math.sin( G );        var cosl = Math.cos( L );        var cosf = Math.cos( F );        var sinl = Math.sin( L );        var sinf = Math.sin( F );        var cosg = Math.cos( G );        var S = sing * sing * cosl * cosl + cosf * cosf * sinl * sinl;        var C = cosg * cosg * cosl * cosl + sinf * sinf * sinl * sinl;        var W = Math.atan( Math.sqrt( S )/ Math.sqrt( C ) );        var R = Math.sqrt( ( S * C ) ) / W;        var H1 = ( 3 * R - 1.0 ) / ( 2.0 * C );        var H2 = ( 3 * R + 1.0 ) / ( 2.0 * S );        var D = 2 * W * ERAD;        var retval =  ( D * ( 1 + FLATTENING * H1 * sinf * sinf * cosg * cosg -                       FLATTENING * H2 * cosf * cosf * sing * sing ) );	if(isNaN(retval)) return 0;	else return retval;}var count = 0;function createMarker ( title, description, point, number, icon ){	var marker = new GMarker(point,icon);	GEvent.addListener(marker, 'click', function() 	{		var whichmini = "minigmap" + count;		var whichtext = "minitext" + count;		var html = "<div class='infoBody'><b>" + title + "</b><br/>";		//html += "<div id='";		//html += whichmini + "' class='miniMap'></div>";		html += "<div id='" + whichtext + "' class='infoText'>" + description + "</div></div>";		marker.openInfoWindowHtml(html);		//var minigmap = new GMap(document.getElementById(whichmini));		//minigmap.setCenter(point,16);		//minigmap.addControl(new GSmallMapControl());		//minigmap.removeMapType(G_HYBRID_MAP);		//minigmap.addControl(new GMapTypeControl());		//minigmap.addOverlay(new GMarker(point,icon));		count++;	});	return marker;}function toggleMarkers (){	for ( var i = 0 ; i < allMarkers.length ; i++ ) {		if ( markersShown ) {			gmap.removeOverlay(allMarkers[i]);		} else {			gmap.addOverlay(allMarkers[i]);		}	}	markersShown = !markersShown;}function toggleOverLay ( index ){	if ( polyLinesShown[index] == true ) 	{		for(var m = 0; m < polyLines[index].length; m++)		{			gmap.removeOverlay(polyLines[index][m]);		}		polyLinesShown[index] = false;		var mymarkerlist1 = polyLinesMarkers[index];		for ( var i = 0 ; mymarkerlist1 && i < mymarkerlist1.length ; i++ )		{			gmap.removeOverlay(mymarkerlist1[i]);		} 		allPolyLinesShown = false;	} else 	{		if(!polyLinesLoaded[index])		{			loadRoute(polyLinesRouteIDs[index]);			return;		}		for(var m = 0; m < polyLines[index].length; m++)		{			gmap.addOverlay(polyLines[index][m]);		}		polyLinesShown[index] = true;		var mymarkerlist = polyLinesMarkers[index];		//for( var i = 0 ; mymarkerlist && i < mymarkerlist.length ; i++ )		//{		//	gmap.addOverlay(mymarkerlist[i]);		//} 		var mybnds = polyLinesBounds[index];		var sw = mybnds.getSouthWest();		var ne = mybnds.getNorthEast();//		var zoomarea = Math.abs((ne.lat() - sw.lat()) * (ne.lng() - sw.lng()));		var centerx = ((ne.lng() + sw.lng())/2);		var centery = ((ne.lat() + sw.lat())/2);//		var zoomLevel = getNextZoomLevel(zoomarea);		var zoomLevel = gmap.getBoundsZoomLevel(mybnds);		gmap.setCenter(new GLatLng(centery,centerx), zoomLevel);		var mymapType = polyLinesPreferredMapTypes[index];		if(mymapType ==1) gmap.setMapType(G_NORMAL_MAP);		else if(mymapType == 2) gmap.setMapType(G_SATELLITE_MAP);		else if(mymapType == 3) gmap.setMapType(G_HYBRID_MAP);	}}function toggleAllOverlays(){	if(!allPolyLinesShown)	{		var bnds;		for( var i = 0 ; i < polyLines.length ; i++ )		{			if(!polyLinesLoaded[i])				continue;			if(!polyLinesShown[i]) {				toggleOverLay(i);			} 			if(i == 0) {				bnds = new GLatLngBounds(polyLinesBounds[i].getSouthWest(), polyLinesBounds[i].getNorthEast());			} else {				bnds.extend(polyLinesBounds[i].getSouthWest());				bnds.extend(polyLinesBounds[i].getNorthEast());			}		} 		var sw = bnds.getSouthWest();		var ne = bnds.getNorthEast();//		var zoomarea = Math.abs((ne.lat() - sw.lat()) * (ne.lng() - sw.lng()));		var centerx = ((ne.lng() + sw.lng())/2);		var centery = ((ne.lat() + sw.lat())/2);//		var zoomLevel = getNextZoomLevel(zoomarea);		var zoomLevel = gmap.getBoundsZoomLevel(bnds);		gmap.setCenter(new GLatLng(centery,centerx), zoomLevel);		allPolyLinesShown = true;	} else {		for( var i = 0 ; i < polyLines.length ; i++ )		{			if(polyLinesShown[i]) {				toggleOverLay(i);			}		} 		allPolyLinesShown = false;	}}function zoomAllMarkers() {	if(!markersShown)		toggleMarkers();	var zoomLevel = gmap.getBoundsZoomLevel(allMarkerBounds);	var sw = allMarkerBounds.getSouthWest();	var ne = allMarkerBounds.getNorthEast();	gmap.setCenter(new GLatLng(ne.lat() - sw.lat(),ne.lng() - sw.lng()), zoomLevel);}function loadRoute(id){	var requestroute = GXmlHttp.create();	var url = "/cgi-bin/mapping/routes.php?RouteID=" + id;	requestroute.open('GET', url, true);	requestroute.onreadystatechange = function() 	{		if ( requestroute.readyState == 4) 		{			var xmlDoc = requestroute.responseXML;			var routes = xmlDoc.documentElement.getElementsByTagName("route");			for ( var i  = 0 ; i < routes.length ; i++ )			{				var steps = routes[i].getElementsByTagName("step");				var therouteid = parseInt(routes[i].getAttribute("id"));				var points=[];				var polyLinesPoints = [];				var distance = 0;				var altitudechange = 0;				var lastaltitude=0;				var minaltitude = 0;				var maxaltitude = 0;				var climbing = 0;				var plindex = 0;				for(plindex = 0; polyLinesRouteIDs[plindex] != therouteid;)				{					plindex++;				}				var lastPoint;				for ( var j = 0 ; j < steps.length ; j++ )				{					if(j % 100 == 0) {						points = []; 						if( j != 0) { points.push(lastPoint);}						polyLinesPoints.push(points);					}					var newPoint = new GLatLng(								parseFloat(steps[j].getAttribute("latitude")),								parseFloat(steps[j].getAttribute("longitude")));					points.push(newPoint);					if ( j == 0 ) 					{						polyLinesBounds[plindex] = new GLatLngBounds(newPoint,newPoint);						if(steps[j].getAttribute("altitude")) {							lastaltitude=parseInt(steps[j].getAttribute("altitude"));							maxaltitude=lastaltitude;							minaltitude=lastaltitude;						}					} else 					{						polyLinesBounds[plindex].extend(newPoint);						distance += calcdist(lastPoint.lat(),lastPoint.lng(), 									newPoint.lat(), newPoint.lng());						if(steps[j].getAttribute("altitude")) {							var altitude = parseInt(steps[j].getAttribute("altitude"));							altitudechange += Math.abs(altitude - lastaltitude);							if(altitude > lastaltitude)								climbing += (altitude-lastaltitude);							lastaltitude = altitude;							if(minaltitude > altitude)								minaltitude=altitude;							if(maxaltitude < altitude)								maxaltitude=altitude;							}					}					/*var html = steps[j].getElementsByTagName("description")[0];					var title = steps[j].getElementsByTagName("title")[0];					if ( html ) 					{						var markerlist = polyLinesMarkers[plindex];						if ( !markerlist )						{							markerlist = [];						}						var marker;						if ( title ) 						{							marker = createMarker(title.firstChild.nodeValue, html.firstChild.nodeValue, points[j], j,markerIcons[1]);						} else 						{							marker = createMarker(routes[i].getAttribute("name") +": step " + j, 									html.firstChild.nodeValue, points[j], j);						}						markerlist.push(marker);						polyLinesMarkers[plindex] = markerlist;					}*/					lastPoint = newPoint;				}				polyLinesLoaded[plindex]=true;				polyLines[plindex] = [];				for ( var m = 0 ; m < polyLinesPoints.length ; m++ )				{					polyLines[plindex].push(new GPolyline(polyLinesPoints[m]));				}				polyLinesShown[plindex] = false;				var ButtonText = "";				var icon = polyLinesIcons[plindex];				if(icon) {					ButtonText += "<img src='" + icon + "'/>";				} else {					ButtonText += "<img src='http://maps.orawski.com/PlacemarkIcons/mbike.png'/>"				}				ButtonText +="<a href='#' class='routeLink' onClick='toggleOverLay("+plindex+")'>" 						+ routes[i].getAttribute("name") 						+ "</a><br/>";				var routeid = parseInt(routes[i].getAttribute("id"));				polyLinesPreferredMapTypes[plindex] = parseInt(routes[i].getAttribute("preferredmaptype"));				var routehtml = routes[i].getElementsByTagName("routedescription")[0];				var starttime = routes[i].getElementsByTagName("start")[0];				var endtime = routes[i].getElementsByTagName("end")[0];								ButtonText += "<div class='routeNote'>";				if(starttime){					if(endtime)						ButtonText += "From " + starttime.firstChild.nodeValue;					else						ButtonText += "On " + starttime.firstChild.nodeValue;				}				if(endtime)					ButtonText += " until " + endtime.firstChild.nodeValue;				if(starttime || endtime)					ButtonText += "<br/>";				if(altitudechange != 0) { 					ButtonText += "<table><tr><td>Vertical Delta: " + altitudechange + " m</td>";					ButtonText += "<td>Climbing: " + climbing + " m</td></tr>";					ButtonText += "<tr><td>Peak Altitude: " + maxaltitude + " m</td>";					ButtonText += "<td>Lowest Point: " + minaltitude + " m</td></tr></table>";				}				if(polyLinesIcons[plindex].indexOf("sail") >= 0)				{					ButtonText += "Distance: " + (Math.round(distance*10*0.539956803)/10) + " nautical miles <br/>";				} else {						ButtonText += "Distance: " + Math.round(distance*10)/10 + " km <br/>";				}					if(routehtml)					ButtonText += "<b>Description:</b><div class='routeNote'>" + routehtml.firstChild.nodeValue + "</div>";				ButtonText += "</div>";									var theroutedivvar = document.getElementById("route"+id);				theroutedivvar.innerHTML = ButtonText;				toggleOverLay(plindex);			}		}	}	requestroute.send(null);}function gup( namein ){	var name = namein.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");	var regexS = "[\\?&]"+name+"=([^&#]*)";	var regex = new RegExp( regexS );	var results = regex.exec( window.location.href );	if( results == null )		return "";	else		return results[1];};function onLoad () {	var gid = gup("GID");	if ( GBrowserIsCompatible() ) 	{		var themapdivvar = document.getElementById("themapdiv");		gmap = new GMap2(themapdivvar);		gmap.addControl(new GLargeMapControl(false));		gmap.addControl(new GMapTypeControl(false));		gmap.addControl(new GScaleControl(125));		//gmap.addControl(new GOverviewMapControl(),new GControlPosition(G_ANCHOR_TOP_RIGHT));//, new GSize(themapdivvar.style.pixelWidth-100, themapdivvar.style.pixelHeight-100)));		markersShown = true;		var centred=false;		// get the url parameters	var sURL = window.document.URL.toString();	var routeToShow = -1;	var mapType = -1;	if (sURL.indexOf("?") > 0)	{		var arrParams = sURL.split("?");					var arrURLParams = arrParams[1].split("&");				var arrParamNames = new Array(arrURLParams.length);		var arrParamValues = new Array(arrURLParams.length);				var i = 0;		for (i=0;i<arrURLParams.length;i++)		{			var sParam =  arrURLParams[i].split("=");			arrParamNames[i] = sParam[0];			if (sParam[1] != "")				arrParamValues[i] = unescape(sParam[1]);			else				arrParamValues[i] = "No Value";		}				for (i=0;i<arrURLParams.length;i++)		{			if(arrParamNames[i] == "RouteID")				routeToShow = parseInt(arrParamValues[i]);			else if(arrParamNames[i] == "MapType") {				mapType = parseInt(arrParamValues[i]);			}		}	}		var request = GXmlHttp.create();		var url = '/cgi-bin/mapping/mapping.php';		if (gid) {			url = url + "?GID="+gid;		}		request.open('GET',url, true);		request.onreadystatechange = function() 		{			var showRouteIndex = -1;			if ( request.readyState == 4) 			{				var xmlDoc = request.responseXML;				var maplayouts = xmlDoc.documentElement.getElementsByTagName("maplayout");				var showRouteId = -1;								for (var i = 0; i < maplayouts.length; i++) 				{					var myPt = new GLatLng(							parseFloat(maplayouts[i].getAttribute("latitude")),							parseFloat(maplayouts[i].getAttribute("longitude")));					var zoom = parseInt(maplayouts[i].getAttribute("showRouteId"));					if(maplayouts[i].getAttribute("zoom"))					{						showRouteId = parseInt(maplayouts[i].getAttribute("showRouteId"));					}					gmap.setCenter(myPt, zoom);					centred = true;				}				if(mapType ==1) gmap.setMapType(G_NORMAL_MAP);				else if(mapType == 2) gmap.setMapType(G_SATELLITE_MAP);				else if(mapType == 3) gmap.setMapType(G_HYBRID_MAP);				var markergroups = xmlDoc.documentElement.getElementsByTagName("marker_group");				for (var i = 0; i < markergroups.length; i++) 				{					var icon = new GIcon();					icon.image = markergroups[i].getAttribute("icon");					icon.shadowImage = markergroups[i].getAttribute("icon");					icon.shadowSize = new GSize(32,32);					icon.iconSize = new GSize(32,32);					icon.iconAnchor = new GPoint(16,16);					icon.infoWindowAnchor = new GPoint(16,16);					markerIcons.push(icon);					iconGroupIDs.push(parseInt(markergroups[i].getAttribute("id")));				}				var markers = xmlDoc.documentElement.getElementsByTagName("marker");				for (var i = 0; i < markers.length; i++) 				{					var point = new GLatLng(							parseFloat(markers[i].getAttribute("latitude")),							parseFloat(markers[i].getAttribute("longitude")));					if(i == 0)					{						allMarkerBounds = new GLatLngBounds(point,point);					} else {						allMarkerBounds.extend(point);					}					var icon;					var gid = parseInt(markers[i].getAttribute("group"));					for(var j = 0; j < iconGroupIDs.length; j++)					{						if( gid == iconGroupIDs[j] ) {							icon = markerIcons[j];							break;;						}					}					var marker = createMarker(markers[i].getAttribute("title"),							markers[i].getElementsByTagName("description")[0].firstChild.nodeValue,point,i,icon);					gmap.addOverlay(marker);					allMarkers.push(marker);/*					var topElement = marker.iconImage;					if (marker.transparentIcon) {topElement = marker.transparentIcon;}					if (marker.imageMap) {topElement = marker.imageMap;}					topElement.setAttribute( "title" , markers[i].getAttribute("title") );*/				}				var notes = xmlDoc.documentElement.getElementsByTagName("note");				var myDiv = document.getElementById("notesdiv");				var myText = "<div class='listHeader'>Notes</div>";				for ( var i = 0 ; i < notes.length ; i++ ) 				{					myText += "<div id='note" + i;					if ( i == 0 ) 					{						myText += "' class='firstNote'>";					} else					{						myText += "' class='note'>";					}					myText += "<p id='title" + i + "' class='noteTitle'>" + notes[i].getAttribute("title") + "</p>";					myText += "<p id='body" + i + "' class='noteBody'>";					myText += notes[i].getElementsByTagName("description")[0].firstChild.nodeValue;					myText += "</p>";					myText += "</div>";				}				myDiv.innerHTML = myText;				var ButtonText = "<div class='listHeader'>Routes</div>";;				var routes = xmlDoc.documentElement.getElementsByTagName("route");				for ( var i  = 0 ; i < routes.length ; i++ )				{					polyLinesLoaded[i]=false;					polyLinesShown[i] = false;					var routeid = parseInt(routes[i].getAttribute("id"));					ButtonText = ButtonText + 						"<div class='note' id='route" + routeid + "'>";					var plicon = routes[i].getElementsByTagName("routeicon")[0];					if(plicon){						polyLinesIcons[i] = plicon.firstChild.nodeValue;						ButtonText += "<img src='" + plicon.firstChild.nodeValue + "'/>";					} else {						ButtonText += "<img src='http://maps.orawski.com/PlacemarkIcons/mbike.png'/>"					}					ButtonText += "<a href='#' class='routeLink' onClick='loadRoute("+routeid+")'>" 							+ routes[i].getAttribute("name") 							+ "</a><br/>";					polyLinesPreferredMapTypes[i] = parseInt(routes[i].getAttribute("preferredmaptype"));					if(routeid == showRouteId && routeToShow == -1) 					{						showRouteIndex = i;					} else if(routeid == routeToShow) {						showRouteIndex = i;					}					var routehtml = routes[i].getElementsByTagName("routedescription")[0];					var starttime = routes[i].getElementsByTagName("start")[0];					var endtime = routes[i].getElementsByTagName("end")[0];					polyLinesRouteIDs[i] = routeid;					ButtonText += "<div class='routeNote' name='route" + routeid + "'>";					if(routehtml)						ButtonText += "<b>Description:</b><div class='routeNote'>" + routehtml.firstChild.nodeValue + "</div>";					ButtonText += "</div>";										ButtonText += "</div>";				}				var buttonDiv = document.getElementById("routesdiv");				buttonDiv.innerHTML=ButtonText;				var NavBarText = 'Tools: <a class="routeLink" href="#" onClick="toggleMarkers()"> Toggle Markers</a> | <a class="routeLink" href="#" onClick="toggleAllOverlays()"> Toggle All Routes</a> | <a class="routeLink" href="#" onClick="zoomAllMarkers()">Zoom to All Markers</a>';				var navBarDiv = document.getElementById("navigation");				navBarDiv.innerHTML=NavBarText;				if(routeToShow != -1)					loadRoute(routeToShow);			}		}		request.send(null);	}}//]]>