var initialiseToLatest = true;

var smallmap;

// Set up paths
var assetdir = "/amazon/images/gmap/interface/map/";
var logfile = "/amazon/customobjects/mappoints/map.xml";
var factfile = "/amazon/customobjects/factfile/countryfacts.xml";


// Set up icons
var iconlog = new GIcon();
iconlog.image = assetdir + "log_marker.png";
iconlog.iconSize = new GSize(13,30);
iconlog.shadow = assetdir + "marker_shadow.png";
iconlog.shadowSize = new GSize(27,30);
iconlog.iconAnchor = new GPoint(6,30);
iconlog.infoWindowAnchor = new GPoint(20,0);

var iconlast = new GIcon();
iconlast.image = assetdir + "current_marker.png";
iconlast.iconSize = new GSize(13,30);
iconlast.shadow = assetdir + "marker_shadow.png";
iconlast.shadowSize = new GSize(27,30);
iconlast.iconAnchor = new GPoint(6, 30);
iconlast.infoWindowAnchor = new GPoint(20,0);

var iconfact = new GIcon();
iconfact.image = assetdir + "icon_info.png";
iconfact.iconSize = new GSize(20,20);
iconfact.iconAnchor = new GPoint(10, 32);
iconfact.infoWindowAnchor = new GPoint(20,0);

var icondanger = new GIcon();
icondanger.image = assetdir + "icon_danger.png";
icondanger.iconSize = new GSize(20,20);
icondanger.iconAnchor = new GPoint(10, 32);
icondanger.infoWindowAnchor = new GPoint(20,0);

var iconjourneypoint = new GIcon();
iconjourneypoint.image = assetdir + "icon_journeypoint.png";
iconjourneypoint.iconSize = new GSize(21,21);
iconjourneypoint.iconAnchor = new GPoint(10, 32);
iconjourneypoint.infoWindowAnchor = new GPoint(20,0);


var airicon = new GIcon();
airicon.image = assetdir + "icon_air.png";
airicon.iconSize = new GSize(26,26);
airicon.iconAnchor = new GPoint(13,13);
airicon.infoWindowAnchor = new GPoint(20,0);


var footicon = new GIcon();
footicon.image = assetdir + "icon_foot.png";
footicon.iconSize = airicon.iconSize;
footicon.iconAnchor = airicon.iconAnchor;
footicon.infoWindowAnchor = airicon.infoWindowAnchor;

var boaticon = new GIcon();
boaticon.image = assetdir + "icon_boat.png";
boaticon.iconSize = airicon.iconSize;
boaticon.iconAnchor = airicon.iconAnchor;
boaticon.infoWindowAnchor = airicon.infoWindowAnchor;

var fourbyfouricon = new GIcon();
fourbyfouricon.image = assetdir + "icon_fourbyfour.png";
fourbyfouricon.iconSize = airicon.iconSize;
fourbyfouricon.iconAnchor = airicon.iconAnchor;
fourbyfouricon.infoWindowAnchor = airicon.infoWindowAnchor;

var kayakicon = new GIcon();
kayakicon.image = assetdir + "icon_kayak.png";
kayakicon.iconSize = airicon.iconSize;
kayakicon.iconAnchor = airicon.iconAnchor;
kayakicon.infoWindowAnchor = airicon.infoWindowAnchor;


var helicoptoricon = new GIcon();
helicoptoricon.image = assetdir + "icon_helicoptor.png";
helicoptoricon.iconSize = airicon.iconSize;
helicoptoricon.iconAnchor = airicon.iconAnchor;
helicoptoricon.infoWindowAnchor = airicon.infoWindowAnchor;


var llamaicon = new GIcon();
llamaicon.image = assetdir + "icon_llama.png";
llamaicon.iconSize = airicon.iconSize;
llamaicon.iconAnchor = airicon.iconAnchor;
llamaicon.infoWindowAnchor = airicon.infoWindowAnchor;



var iconMany = new GIcon();
iconMany.image = assetdir + "log_marker_lots.png";
iconMany.iconSize = new GSize(21,34);
iconMany.shadow = assetdir + "marker_shadow.png";
iconMany.shadowSize = new GSize(27,30);
iconMany.iconAnchor = new GPoint(11,34);
iconMany.infoWindowAnchor = new GPoint(20,0);

// end icons

var myMap;
var myLog;
var currLatLng;

/* set map default values */

var default_lat = -15.525278;
var default_lng = -71.690833;
var default_zoom = 4;
var default_maptype = G_PHYSICAL_MAP;
var default_maxzoom = 10;
var default_maxzoom = 10;
var default_minzoom = 2;

var license = "<a href='http://www.maps-for-free.com'>Relief Maps</a>";
var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, license);
var copyrightCollection = new GCopyrightCollection("");
copyrightCollection.addCopyright(copyright);

var forestLayer;
var adminLayer;
var contourLayer;
var googleLayer;
var streetLayer;
var countryLayer;

var routeLines=[];
var currentDistanceFromSource;

var srclat = -15.525278;
var srclng = -71.690833;

function initMap() {
	smallmap=false;
	if(!document.getElementById) return false;
	if(!document.getElementsByTagName) return false;

	
	forestLayer = new GTileLayerOverlay(getForestLayer());

	myMap = new Map();
	myMap.mapType = default_maptype;
	myMap.zoom = default_zoom;

	myMap.routeVisible = false;

	/* is there a lat/lang value in the querystring - if not, load default lat/lang */
	currLatLng = getLatLng();	
	if(currLatLng === -1){
		myMap.lat = default_lat;
		myMap.lng = default_lng;
	}
	else {
		myMap.lat = currLatLng[0];
		myMap.lng = currLatLng[1];
	}

	myMap.drawMap();

	myMap.map.maxzoom = default_maxzoom;
	myMap.map.minzoom = default_minzoom;
	
//	myMap.addReliefLayer(default_minzoom, default_maxzoom);
	
	myMap.map.addControl(new GSmallMapControl());
	
	myMap.map.addMapType(G_PHYSICAL_MAP) ; 
	
	myMap.map.addControl(new GMenuMapTypeControl());
	var overviewpos = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(0,0));
	
	myMap.map.addControl(new GOverviewMapControl(new GSize(80,80)),overviewpos);
	
	
	myMap.currentDistanceFromSource = 0;
	
	myLog = new Log();

	setTimeout ( "myMap.retrieveEntries()", 500 );
	
	myMap.addExternalControls(); 
	myMap.assignDocumentActions();	

	

}



function initMapSmall() {
	smallmap=true;
	
	if(!document.getElementById) return false;
	if(!document.getElementsByTagName) return false;


	myMap = new Map();
	myMap.mapType = default_maptype;
	myMap.zoom = default_zoom;

	/* is there a lat/lang value in the querystring - if not, load default lat/lang */
	currLatLng = getLatLng();	
	if(currLatLng === -1){
		myMap.lat = default_lat;
		myMap.lng = default_lng;
	}
	else {
		myMap.lat = currLatLng[0];
		myMap.lng = currLatLng[1];
	}

	myMap.drawMap();

	myMap.map.maxzoom = default_maxzoom;
	myMap.map.minzoom = default_minzoom;	

	
	myMap.currentDistanceFromSource = 0;
	
	myLog = new Log();
	myMap.retrieveEntries();

	

}





Map.prototype.addExternalControls = function() {

	document.getElementById('button-gotosource').innerHTML = "Go to the source";
	
/*	var mapcontrols_lower = '<form><fieldset><span class="mapcontrols-prompt">Display:</span>' +
			'<input type="checkbox" name="check_layer_forest" id="check_layer_forest" /> <label id=\"label_check_layer_forest\" for="check_layer_forest">Forest </label> ' +
			'<input type="checkbox" name="check_layer_street" id="check_layer_street" />  <label id=\"label_check_layer_street\" for="check_layer_street">Street </label> ' +
			'<input type="checkbox" name="check_layer_contour" id="check_layer_contour" />  <label id=\"label_check_layer_contour\" for="check_layer_contour">Contours </label> ' +
			'<input type="checkbox" name="check_layer_placenames" id="check_layer_placenames" />  <label id=\"label_check_layer_placenames\" for="check_layer_placenames">Labels </label> ' +
			'</fieldset><fieldset>' +
			'<div id="logmarkers_input"><input type="checkbox" name="check_markers_log" id="check_markers_log" checked /> <label id=\"label_check_markers_log\" for="check_markers_log">Blog entries </label></div> ' +
			'<div id="countrymarkers_input"><input type="checkbox" name="check_markers_countryfacts" id="check_markers_countryfacts" checked />  <label id=\"label_check_layer_forest\" for="check_markers_countryfacts">Country facts </label></div> ' +
			'</fieldset></form>';	
*/		
	var mapcontrols_lower = '<form><fieldset>' +
				'<div id="logmarkers_input"><input type="checkbox" name="check_markers_log" id="check_markers_log" checked /> <label id=\"label_check_markers_log\" for="check_markers_log">Blog entries </label></div> ' +
				'<div id="countrymarkers_input"><input type="checkbox" name="check_markers_countryfacts" id="check_markers_countryfacts" checked />  <label id=\"label_check_layer_forest\" for="check_markers_countryfacts">Country facts </label></div> ' +
				'</fieldset></form>';		
	document.getElementById('mapcontrols-lower').innerHTML = mapcontrols_lower; 

	
}

Map.prototype.assignDocumentActions = function () {
	//document.getElementById('check_layer_forest').onmouseup = _press;
	//document.getElementById('check_layer_street').onmouseup = _press;
	//document.getElementById('check_layer_contour').onmouseup = _press;
	//document.getElementById('check_layer_placenames').onmouseup = _press;
	document.getElementById('check_markers_log').onmouseup = _press;
	document.getElementById('check_markers_countryfacts').onmouseup = _press;
	document.getElementById('button-gotosource').onmouseup = _press;
}


function _press(e) {
	if(!e) var e = window.event;
	var src;
	if (e.target) src = e.target;
	else if (e.srcElement) src = e.srcElement;
	
	if (src.nodeType == 3) // defeat Safari bug
		src = src.parentNode;
		
	var checked = !src.checked;


	switch(src.id) {
		case('check_layer_forest'):
			myMap.switchLayer('forestLayer',checked);
			break;
		case('check_layer_street'):
			myMap.switchLayer('streetLayer',checked);
			break;
		case('check_layer_admin'):
			myMap.switchLayer('adminLayer',checked);
			break;
	/*	case('check_layer_country'):
			myMap.switchLayer('countryLayer',checked);
			break; */
		case('check_layer_contour'):
			myMap.switchLayer('contourLayer',checked);
			break;
		case('check_layer_placenames'):
			myMap.switchLayer('googleLayer',checked);
			break;
		case('check_markers_log'):
			myMap.switchMarkers('log',checked);
			break;
		case('check_markers_countryfacts'):
			myMap.switchMarkers('countryfacts',checked);
			break;
		case('button-gotosource'):
			myMap.goToSource();
			break;
			
	}
}

function Map() {
	if(smallmap){
		this.mapdiv="smallmap";
	}else{
		this.mapdiv="map";
	}
}

/*
name: Map.prototype.drawMap();
*/
Map.prototype.drawMap = function() {
	if(GBrowserIsCompatible()) {
		this.map = new GMap2(document.getElementById(this.mapdiv));
		this.location = new GLatLng(this.lat, this.lng);
		this.map.setCenter(this.location, this.zoom);
		this.map.setMapType(this.mapType);
	}
	else
	{
		alert('Your browser does not support Google maps');
	}

}

Map.prototype.goToSource = function() {
  		myMap.goToPoint( srclat, srclng, 7);
  		
}
 
Map.prototype.addReliefLayer = function(min,max) {


	var relief = [new GTileLayer(copyrightCollection, min, max)];
    relief[0].getTileUrl = function(a,b) { return "http://srtm.in-ulm.de/layer/relief_water/z" + b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".jpg"; };
    
    layer = new GMapType(relief, G_SATELLITE_MAP.getProjection(), "Relief", {minResolution:min, maxResolution:max});
            
    this.map.addMapType(layer);
	//this.map.setMapType(layer);
	

	forestLayer = new GTileLayerOverlay(getForestLayer());
	streetLayer = new GTileLayerOverlay(getStreetLayer());
	adminLayer = new GTileLayerOverlay(getAdminLayer());
	contourLayer = new GTileLayerOverlay(getContourLayer());
	countryLayer = new GTileLayerOverlay(getCountryLayer());
	googleLayer = new GTileLayerOverlay(G_HYBRID_MAP.getTileLayers()[1]);
	
}


Map.prototype.switchMarkers = function(which, onoroff) {
	if(!onoroff) {
		myLog.turnOffEntries(which);

		
	}else{
		myLog.turnOnEntries(which);
	}
	
	if(which=='log'){
		onoroff ? myMap.drawRoute(myMap.entries) : myMap.hideRoute();
	}
}

Map.prototype.switchLayer = function(layer, onoroff) {
	switch(layer) {
		case "forestLayer":
			if(onoroff) {
				this.map.addOverlay(forestLayer);
				forestLayer.visible = true;
			}else { 
				this.map.removeOverlay(forestLayer);
				forestLayer.visible = false;
			}
			break;
		case "streetLayer":
			if(onoroff) {
				this.map.addOverlay(streetLayer);
				streetLayer.visible = true;
			}else { 
				this.map.removeOverlay(streetLayer);
				streetLayer.visible = false;
			}
			break;
		case "adminLayer":
			if(onoroff) {
				this.map.addOverlay(adminLayer);
				adminLayer.visible = true;
			}else { 
				this.map.removeOverlay(adminLayer);
				adminLayer.visible = false;
			}
			break;
		case "contourLayer":
			if(onoroff) {
				this.map.addOverlay(contourLayer);
				contourLayer.visible = true;
			}else { 
				this.map.removeOverlay(contourLayer);
				contourLayer.visible = false;
			}
			break;
		case "countryLayer":
			if(onoroff) {
				this.map.addOverlay(countryLayer);
				countryLayer.visible = true;
			}else { 
				this.map.removeOverlay(countryLayer);
				countryLayer.visible = false;
			}
			break;
		case "googleLayer":
			if(onoroff) {
				this.map.addOverlay(googleLayer);
				googleLayer.visible = true;
			}else { 
				this.map.removeOverlay(googleLayer);
				googleLayer.visible = false;
			}
			break;
		
		
	}
}


/*
name: Map.prototype.recenterMap()
description: uses logentry.lat and logentry.lng values to open a new Info window, moving the map to display this window
params: logentry
returns: none
*/
Map.prototype.recenterMap = function(mylogentry){
/*	// can't mess around with panning, best to recentre the map. 
	var loc = new GLatLng(mylogentry.lat, mylogentry.lng)
	this.map.setCenter(loc, this.zoom);*/
	mylogentry.showwindow();
}

/*
name: Map.prototype.travel()
description: Handles navigation between log entries on the map; calls recenterMap() and passes it the logentry row defined by the id value
params: direction,mylogentryid
returns: none
*/
Map.prototype.travel = function(type,direction,mylogentryid){
	switch(direction){
		case "prev":
		id = (Number(mylogentryid)-2);
		break;
		case "next":
		id = Number(mylogentryid);
		break;
		case "first":
		id = 0;
		break;
		case "last": // this needs adjusting to reflect new icon types
			if(type=="factfile"){
				id = (Number(myMap.lastfact)-1);
			}
			else if(type=="log"){
				id = (Number(myMap.lastentry)-1);
			}
		break;
	}
	switch(type){
		case "factfile":
		myMap.recenterMap(this.factfiles[id]);
		break;
		case "log":
		myMap.recenterMap(this.entries[id]);
		break;
	}
	
}




/*
name: Map.prototype.retrieveEntries()
description: Uses GXmlHttp to run AJAX request for map.xml. Parses results into either LogEntry or CountryFact objects. Draws actual route taken as a Polyline
params: none
returns: none
*/
Map.prototype.retrieveEntries = function(){

	factRequest = GXmlHttp.create();
	factRequest.open("GET", factfile, true);
	factRequest.onreadystatechange = function(){

	if(factRequest.readyState == 4 && factRequest.status == 200){
			
			myMap.parseFactXml(factRequest.responseXML);
			
		}
	}


	factRequest.send(null);



}



Map.prototype.parseLogXml = function(xmlDoc) {
		var points = xmlDoc.getElementsByTagName("point");
		var totalpoints = points.length;
		myMap.points = points;
		
		if( totalpoints == 0){ 
			alert("error - no log entries found");
			return;
		}

		for(var i=0; i<totalpoints; i++){
			var image="";
			var image_alt="";
		//	var id = points[i].getAttribute("id");
			var id=i+1;
			var author = points[i].getAttribute("author");
			var lat = points[i].getAttribute("lat");
			var lng = points[i].getAttribute("lng");
			var zoom = myMap.zoom;
			var title = points[i].getAttribute("title");
			var logdate = points[i].getAttribute("date");
			var href = points[i].getAttribute("href");
			var href_title = points[i].getAttribute("href_title");

			var summaryel = points[i].getElementsByTagName("summary");
			var summary = summaryel[0].firstChild.nodeValue;
			var imageel = points[i].getElementsByTagName("image");
			var imageel_alt = points[i].getElementsByTagName("image_alt");
			var mediatype = points[i].getAttribute("mediatype") ? points[i].getAttribute("mediatype") : 'text';
			
			if(imageel[0].firstChild && imageel[0].firstChild.nodeValue!=null){ 
					image = imageel[0].firstChild.nodeValue;
					
			}
			
			if(imageel_alt && imageel_alt[0].firstChild && imageel_alt[0].firstChild.nodeValue!=null){ 
					image_alt = imageel_alt[0].firstChild.nodeValue;
					
			}			
			
		
			var journeyafter = points[i].getAttribute("journeyafter");
			var journeycomment = points[i].getAttribute("journeycomment");

			var mylogentry = new LogEntry();
			mylogentry.id = id;
			mylogentry.lat = lat;
			mylogentry.lng = lng;
			mylogentry.zoom = zoom;

			mylogentry.mediatype = mediatype;

			mylogentry.title = title;
			mylogentry.author = author;
			mylogentry.summary = summary;
			mylogentry.image = image;
			mylogentry.image_alt = image;
			formatdate = logdate.split("-");
			mylogentry.date = formatdate[2] + "/" + formatdate[1] + "/" + formatdate[0];
			mylogentry.href = href;
			mylogentry.href_title = href_title;
			
			mylogentry.journeyafter = journeyafter;
			mylogentry.journeycomment = journeycomment;
			
			
			prev = mylogentry.id-1;
			next = mylogentry.id+1;
			
			
			mylogentry.prev = String(prev);
			mylogentry.next = String(next);

			mylogentry.type = "log";
			if(i==0)mylogentry.first = true;

			// Calculate distance of this point from source:
			var startLoc = new GLatLng( srclat, srclng);
			var thisLoc = new GLatLng( mylogentry.lat, mylogentry.lng );			
			var leg=[];
			leg.push(startLoc, thisLoc);
 			var polyOptions = {geodesic:true};
			var distance = new GPolyline(leg, "#FFFFFF", 1, 1);
			myMap.map.addOverlay(distance);
			mylogentry.kmfromsource = String(Math.floor( distance.getLength() / 1000));
	
			distance.hide();

			if(i==(totalpoints-1)) { 
				mylogentry.last = true;
				if(! smallmap) { myMap.updateCurrentDistanceFromSource( mylogentry.kmfromsource); }
			}
						
			myLog.addLogEntry(mylogentry,totalpoints);
			
		}
		myMap.processLogGroups();

		// setTimeout ( "myMap.drawRoute(myMap.entries)", 10000 );
		// myMap.drawRoute(myMap.entries);
		
		GEvent.addListener(myMap.map, "movestart", function(){
				myMap.hideRoute();
		});
		
		GEvent.addListener(myMap.map, "moveend", function(){
				setTimeout("myMap.drawRoute(myMap.entries), 1000");
		});		
		
		GEvent.addListener(myMap.map, "zoomend", function() {
			myMap.hideRoute();
  			myMap.drawRoute(myMap.entries);
		});		

}


Map.prototype.updateCurrentDistanceFromSource = function(km) {
	if(document.getElementById('panel-howfar')){
		document.getElementById('panel-howfar').innerHTML = 'Current distance from source: <strong>' + km + 'km</strong>';
	}

}

Map.prototype.processLogGroups = function () {
	for(var i=0; i < myMap.logGroups.length; i++) {
		myMap.logGroups[i].createMarker();
	}

}


Map.prototype.parseFactXml = function(xmlDoc) {
		var facts = xmlDoc.getElementsByTagName("point");
		var totalfacts = facts.length;
		myMap.facts = facts;

		for(var i=0; i<totalfacts; i++){
			var icontype;
			var image;
			var id = i+1;
			var author = facts[i].getAttribute("author");
			var lat = facts[i].getAttribute("lat");
			var lng = facts[i].getAttribute("lng");
			var zoom = myMap.zoom;
			var title = facts[i].getAttribute("title");
			var logdate = facts[i].getAttribute("date");
			var href = facts[i].getAttribute("href");
			if(facts[i].getAttribute("type")){
				icontype = facts[i].getAttribute("type");
			}
			
			

			var summaryel = facts[i].getElementsByTagName("summary");
			var summary = summaryel[0].firstChild.nodeValue;
						
			var imageel = facts[i].getElementsByTagName("image");
			if(imageel[0].firstChild && imageel[0].firstChild.nodeValue!=null){var image = imageel[0].firstChild.nodeValue;}


			var mylogentry = new LogEntry();
			mylogentry.id = id;
			mylogentry.lat = lat;
			mylogentry.lng = lng;
			mylogentry.zoom = zoom;

			mylogentry.title = title;
			mylogentry.author = author;
			mylogentry.summary = summary;
			mylogentry.image = image;
			formatdate = logdate.split("-");
			mylogentry.date = formatdate[2] + "/" + formatdate[1] + "/" + formatdate[0];
			mylogentry.href = href;
			
			prev = parseInt(mylogentry.id)-1;
			next = parseInt(mylogentry.id)+1;
			mylogentry.prev = String(prev);
			mylogentry.next = String(next);

		
			mylogentry.type = "factfile";		
			mylogentry.icontype = icontype;
			
			if(i==0)mylogentry.first = true;
			if(i==(totalfacts-1))mylogentry.last = true;
			myLog.addLogEntry(mylogentry,totalfacts,i);
		}


		
	logRequest = GXmlHttp.create();
	logRequest.open("GET", logfile, true);
	logRequest.onreadystatechange = function(){

		if(logRequest.readyState == 4 && logRequest.status == 200){
			myMap.parseLogXml(logRequest.responseXML);
		}
	}
	
	logRequest.send(null);	
		
}

/*
name: Map.prototype.drawRoute()
description: adds a new Polyline to the map, requires route details (as JS object), colour (as upper case hex), width (as pixels), opacity (as 0-1 e.g. 0.6)
params: route,colour,width,opacity
returns: none
*/
Map.prototype.drawRoute = function(route){
	if(myMap.routeVisible){ return false; }
	var polyOptions = {geodesic:true};

	routeLines=[];

	// Need to get pixel distance of route here, and work out whether it's more than the size of route indicator.

	for(var i=0; i< route.length-1; i++) {
		var thisloc = new GLatLng(parseFloat(route[i].lat),parseFloat(route[i].lng) );
		var nextloc = new GLatLng(parseFloat(route[i+1].lat),parseFloat(route[i+1].lng) );
		var leg=[];
		leg.push(thisloc);
		leg.push(nextloc);
		var col;
		var thickness;
		var opacity;
		
		if( route[i].journeyafter == 'air') {
			col = "#FF00FF";
			var opacity = .6;
			var thickness = 2;
		}else{
			col = "#FF00FF";
			var opacity = 1;
			var thickness = 1;
		}
		
		var pxLength = myMap.calculateLegPixelLength(thisloc, nextloc);
		
		// Don't stick in a journey icon if the line is too short
		var showIcon = pxLength > 60;
		var routeline = new GPolyline(leg, col, thickness, opacity);
				
		routeLines.push(routeline);
		myMap.map.addOverlay(routeline, polyOptions);
		
		if(route[i].journeyafter && showIcon) {
			var xh = x_half_distance_between_points(route[i].point,route[i+1].point);
			var yh = y_half_distance_between_points(route[i].point,route[i+1].point);
			var hwp=new GPoint(yh, xh);
			
			var icon = myMap.getJourneyIcon(route[i].journeyafter);
			
			var pMarker = route[i].createJourneyMarker(hwp, icon);
			
			myMap.map.addOverlay(pMarker);	
			routeLines.push(pMarker);
		}
		
	}

	myMap.routeVisible = true;

}

Map.prototype.hideRoute = function() {
	if(! myMap.routeVisible){ return false; }
	for(var i=0; i < routeLines.length; i++) {
		if(routeLines[i]){
		myMap.map.removeOverlay(routeLines[i]);
		}
	}
	myMap.routeVisible = false;
}

Map.prototype.calculateLegPixelLength = function(thisloc, nextloc) {

	var pxthis =this.map.fromLatLngToDivPixel(thisloc);
	var pxnext = this.map.fromLatLngToDivPixel(nextloc);
	
	var xdist = pxnext.x - pxthis.x;
	var ydist = pxnext.y - pxthis.y;
	
	var actualdist = Math.sqrt( (xdist * xdist) + (ydist * ydist) );
	
	return actualdist;
}

Map.prototype.getJourneyIcon = function(which) {
	switch(which) {
		case "air":
			return airicon;
			break;
		case "foot":
			return footicon;
			break;
		case "helicoptor":
			return helicoptoricon;
			break;
		case "kayak":
			return kayakicon;
			break;
		case "boat":
			return boaticon;
			break;
		case "4x4":
			return fourbyfouricon;
			break;
		case "llama":
			return llamaicon;
			break;
	}
		
}





Map.prototype.goToPoint = function(lat, lng, zoom){
	this.map.closeInfoWindow();
	this.location = new GLatLng(lat, lng);
	this.map.setCenter(this.location, zoom);
}



function x_half_distance_between_points(p1,p2){
	var a= Number(p2.y) + Number(p1.y);
	return a/2;
}
function y_half_distance_between_points(p1,p2){
	var a=Number(p2.x)+Number(p1.x);
	return a/2;
}






/*
name: getLatLng()
description: extracts lat and long data from querystring, following format e.g. ll=1.20,4.30
params: none
returns: none
*/
function getLatLng(){
	var query = location.search.substring(1);
	var pos = query.indexOf("=");
	if(pos === -1) return -1;
	var ll = query.substring(pos+1).split(",");
	return ll;
}

	function getAdminLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/admin/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

   // Water Layer
    function getWaterLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/water/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Addefault_minzoom Layer
    function getAddefault_minzoomLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/addefault_minzoom/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Street Layer
    function getStreetLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/streets/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Tile Layer
    function getTileLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/tiles/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Forest Layer
    function getForestLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/forest/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Tundra Layer
    function getTundraLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/tundra/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Swamp Layer
    function getSwampLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/swamp/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Grass Layer
    function getGrassLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/grass/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Crop Layer
    function getCropLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/crop/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Sand Layer
    function getSandLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/sand/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Ice Layer
    function getIceLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/ice/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".gif";
      };            
      return layer;
    }    

    // Country Layer
    function getCountryLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (a,b) {
        return "http://srtm.in-ulm.de/layer/country/z" +
        b + "/row" + a.y + "/" + b + "_" + a.x + "-" + a.y + ".png";
      };            
      return layer;
    }

    var interval = [1000, 1000,  750,  750,  750,  250,  250,  250, 200, 100,  50,  50,  25,  25, 25, 10,  3];
    // Contour Lines
    function getContourLayer() {
      var layer = new GTileLayer(copyrightCollection, default_minzoom, default_maxzoom);
      layer.getTileUrl = function (tile, zoom) {
        return "http://www.heywhatsthat.com/bin/contour_tiles.cgi?x=" + tile.x + "&y=" + tile.y + "&zoom=" + zoom + "&interval=" + interval[zoom] + "&color=ff0000";
      };            
      return layer;
    }
