var data;
var map;
var errmsg = '';

var showtoggle = true;
var showGoogleEarthOption = false;
var toggleLink = "osmap.html";
var linkParms;
var cookiemapid;

function init() 
{
	var queryString = window.location.search.substring(1);

	var fileName;
	
	if  (queryString.length > 0)
	{
		if (queryString.indexOf("f=") > -1)
		{
			fileName = queryString.substring(queryString.indexOf("f=") + 2);
		}
	}
	
	if	(fileName && fileName.length > 4)
	{ 	
		var xotree = new XML.ObjTree();
		data = xotree.parseHTTP("data/" + fileName, {});
	}
	else
	{
		error('No map data file name supplied.');	
		return;	
	}
	

	// Set page title to the filename (minus .gpx extension) ...
	document.title = fileName.substring(0, fileName.length - 4); 

	if	(showtoggle)
	{
		linkParms = '?f=' + fileName;
		cookiemapid = fileName;
	}	 
	
	if  (data)
	{
		doGPXOverlay(data);
		
		if	(tracks.length == 0 && waypoints.length == 0)
		{
			error('No data found - may not be a valid GPX file');
			return;
		}
		
		displayMap();
		displayData();
	}
	else
	{
		error('Data parse problem. Cannot load map data file.')
	}
}



function displayMap()
{

	map = createMap("map");

	maptype = G_NORMAL_MAP;
	
	resizemap();

	var osbounds = getcookiebounds();
	
	if	(osbounds)
	{
		switch (osbounds.mapstyle)
		{
			case "P":
				maptype = G_PHYSICAL_MAP;
				break;
			case "S":
				maptype = G_SATELLITE_MAP;
				break;
			case "H":
				maptype = G_HYBRID_MAP;
				break;
			case "E":
				maptype = G_SATELLITE_3D_MAP;
				break;
			default:
				maptype = G_NORMAL_MAP;
				break;
		}		
		
		var initialZoom = map.getBoundsZoomLevel(new GLatLngBounds(new GLatLng(osbounds.miny, osbounds.minx), new GLatLng(osbounds.maxy, osbounds.maxx)));
		map.setCenter(new GLatLng(osbounds.centrey, osbounds.centrex), initialZoom, maptype); 
	}
	else
	{
		var initialZoom = map.getBoundsZoomLevel(new GLatLngBounds(new GLatLng(minlatitude, minlongitude), new GLatLng(maxlatitude, maxlongitude)));
		map.setCenter(new GLatLng((minlatitude + maxlatitude) / 2, (minlongitude + maxlongitude) / 2), initialZoom, maptype); 
	}
	
	resizemap();
}



//
// Displays a single line for each of the included tracks and/or routes,
// plus a marker for each waypoint.
//
function displayData() 
{
	for (var i = 0; i < tracks.length; i++)
	{
		if	(tracks[i].points.length > 0)
		{
			var tpoints = Array();
				
			for (var j = 0; j < tracks[i].points.length; j++) 
			{
				tpoints.push(new GLatLng(tracks[i].points[j].latitude, tracks[i].points[j].longitude));
			}
			 	
			map.addOverlay(new GPolyline(tpoints, "#660099", 3, 0.7));
		}	
	}
//////// diversion   
		for (var i = 0; i < diversions.length; i++)
	{
		if	(diversions[i].points.length > 0)
		{
			var dpoints = Array();
				
			for (var j = 0; j < diversions[i].points.length; j++) 
			{
				dpoints.push(new GLatLng(diversions[i].points[j].latitude, diversions[i].points[j].longitude));
			}
			 	
			map.addOverlay(new GPolyline(dpoints, "#5501FF", 3, 0.7));
		}	
	}

/// weaypoints
	for (var i = 0; i < waypoints.length; i++) 
	{
		var html;
	
		
		if  (waypoints[i].desc && waypoints[i].desc.length > 0)
		{
			html = waypoints[i].desc;
		}
		else if (waypoints[i].cmt && waypoints[i].cmt.length > 0)
		{
			html = waypoints[i].cmt;
		}	
				if  (waypoints[i].sym && waypoints[i].sym.length > 0)
				{
				//	icondesc = ('waypoints[i].sym;)
				}
				else 
				{
					waypoints[i].sym = 'blank';
		                }
		            
		addMarker(waypoints[i].latitude, waypoints[i].longitude, waypoints[i].name, waypoints[i].sym, html);  
	}
}


function createMap()
{
	sizes = getAvailableArea();
	var mapDiv = document.getElementById("map"); 
	mapDiv.style.height = sizes[1];
	var map = new GMap2(mapDiv, {mapTypes : [G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, G_PHYSICAL_MAP]});
  
  	if	(showGoogleEarthOption)
  	{
    	map.addMapType(G_SATELLITE_3D_MAP);
    }
  
	map.addControl(new GLargeMapControl());
 	map.addControl(new GMapTypeControl());
	map.addControl(new GScaleControl()); //new 2011-01-23
  	return map;
}


function resizemap()
{
	if	(map == null)
	{
		return;
	}
	
	sizes = getAvailableArea();

	var mapDiv = document.getElementById("map"); 	     
	     
	// Put the loading message underneath the tiles
	document.getElementById("map").style.backgroundImage = "url(images/loading.jpg)";

	//mapDiv.style.height = (sizes[1] - 10) + "px";
	//mapDiv.style.width  = (sizes[0] - 10) + "px";
	//mapDiv.style.margin = "10px";

	if	(showtoggle)
	{
		var toggleDiv = document.getElementById("togglepanel"); 
		toggleDiv.style.left = (sizes[0] - 10) - 174 - 15 + "px";
		toggleDiv.style.top =  (sizes[1] - 60) + "px";
	
		toggleDiv.innerHTML = '<img src="http://www.essexwalks.com/images/os24.gif" style="vertical-align: middle; margin-right: 4px;"/>OS Map View';
		toggleDiv.onclick = toggleOSMap;
		toggleDiv.title = "Click to switch to Ordnance Survey Map";
		toggleDiv.style.display = "block";
		toggleDiv.style.fontFamily='Arial';
	    toggleDiv.style.fontSize='12px';
		toggleDiv.style.background='#E9E9E9';
	}
	
	map.checkResize();	
}


function addMarker(lat, lon, pointName, sym, pointText) 
{
	var p = new GLatLng(lat, lon);
	
	
        var newIcon = new GIcon(G_DEFAULT_ICON);
        newIcon.iconSize = new GSize(32, 32);
        newIcon.shadowSize = new GSize(48,32);
        newIcon.iconAnchor = new GPoint(16,32);
 	newIcon.infoWindowAnchor = new GPoint(16,1);       
	newIcon.image = 'icons/blank.png';
	newIcon.transparent = 'icons/phototransparent.png';
	newIcon.printShadow = 'icons/printShadownull.gif';  //over-rides messy print shadow on IE 
	
	// newIcon.shadow = 'icons/shadow.png';
	// newIcon.iconSize = new GSize(32,32);
	// newIcon.shadowSize = new GSize(48,32);
	// newIcon.iconAnchor = new GPoint(16,32);
	// newIcon.printImage = 'icons/printImage.gif';
	// newIcon.mozPrintImage = 'icons/mozPrintImage.gif';
	// newIcon.printShadow = 'icons/printShadow.gif';
	// newIcon.transparent = 'icons/transparent.png';
	
	// imagemap from trans.png - generalised all-purpose clickable area 30px wide 
	newIcon.imageMap = [25,0,26,1,27,2,28,3,29,4,30,5,30,6,30,7,30,8,30,9,30,10,30,11,30,12,30,13,30,14,30,15,30,16,30,17,30,18,30,19,30,20,30,21,30,22,29,23,28,24,27,25,26,26,25,27,24,28,23,29,22,30,21,31,11,31,10,30,9,29,7,28,4,27,1,26,1,25,1,24,1,23,1,22,1,21,1,20,1,19,1,18,1,17,1,16,1,15,1,14,1,13,1,12,1,11,1,10,1,9,1,8,1,7,1,6,1,5,1,4,1,3,2,2,3,1,4,0];
        newIcon.image = "http://www.essexwalks.com/icons/" + sym +".png";
 	newIcon.printImage = "http://www.essexwalks.com/icons/" + sym +".gif";
 	newIcon.mozPrintImage = "http://www.essexwalks.com/icons/" + sym +".gif";
 	newIcon.shadow = "http://www.essexwalks.com/icons/" + sym +"sh.png";
                
// Set up GMarkerOptions object
pointIcon = newIcon;
        
	var marker; 
	
	if	(pointName && pointName.length > 0)
	{
		marker = new GMarker(p, {title: pointName, draggable:false, icon:pointIcon});
	}
	else
	{
		marker = new GMarker(p, {draggable:false, icon:pointIcon});
	}
	


	if	(pointText && pointText.length > 0)
	{
		GEvent.addListener(marker, "click", function() 
		{
			marker.openInfoWindowHtml(pointText);
		});
	}
			
	map.addOverlay(marker);
}
 
 
function toggleOSMap()
{
	var mapstyle;

	var currentmaptype = map.getCurrentMapType();

	if	(currentmaptype == G_PHYSICAL_MAP)
	{
		mapstyle = "P";
	}	
	else if (currentmaptype == G_SATELLITE_MAP)
	{
		mapstyle = "S";
	}	
		else if (currentmaptype == G_HYBRID_MAP)
	{
		mapstyle = "H";
	}	
	else if (currentmaptype == G_SATELLITE_3D_MAP)
	{	
		mapstyle = "E";
	}
	else
	{	
		mapstyle = "M";
	}

	var bounds = map.getBounds();

	writeCookies(cookiemapid, bounds.getSouthWest().lng(), bounds.getSouthWest().lat(), bounds.getNorthEast().lng(), bounds.getNorthEast().lat(), mapstyle);

	window.location.href = toggleLink + linkParms;
}



function writeCookies(mapid, minx, miny, maxx, maxy, mapstyle)
{
	setCookie("mapid", escape(mapid));
	setCookie("minx", minx);
	setCookie("miny", miny);
	setCookie("maxx", maxx);
	setCookie("maxy", maxy);
	setCookie("gmapstyle", mapstyle);
}



function getcookiebounds()
{
	var mapid = unescape(getCookie("mapid"));
	 
	deleteCookie("mapid");

	if	(!mapid || mapid != cookiemapid)
	{
		return false;
	}
	
	var osbounds = new Object();	
	
	osbounds.minx = parseFloat(getCookie("minx"));	
	osbounds.miny = parseFloat(getCookie("miny"));	
	osbounds.maxx = parseFloat(getCookie("maxx"));	
	osbounds.maxy = parseFloat(getCookie("maxy"));	
	
	osbounds.centrex = (osbounds.maxx + osbounds.minx) / 2;	
	osbounds.centrey = (osbounds.maxy + osbounds.miny) / 2;	
	
	osbounds.mapstyle = getCookie("gmapstyle"); 
	
	return osbounds;
}	


function error(msg)
{
	errmsg += '<li>' + msg + '</li>\n';
	var errDiv = document.getElementById('error');
	errDiv.innerHTML = '<h4>Error!</h4><ul>' + errmsg + '</ul>' ;
	errDiv.style.display = 'block';
}

