 // JavaScript Document
/* Create sections to hold different parts of the javascript for the mashup

Some of the main parts are
1.  Variables used in the map
		Seperate vars for arrays, Latitude, Longitude, Markers, layers etc
		Booleans for layers
		
2.	The main map build area this is called by the <body onload="onLoad()" call
		addFullMarker - to contain infopanel information
		addLiteMarker - just the basic marker overlay
		movemap - centers the map, opens the infowindow and zooms
		Icons builder
		
3. m  AJAX stuff  to use the XML

4.  Layer functions which include
		a.  select boolean based on boxed selected
		b. addMarkers based on layer selected
		
5.  button and hyperlink processing;
		
6.  Other stuff or testing such as dynamic XML (needs server side scripting)
		*/
		
//===========================Section 1 Set vars==============================================================
//create a set of boolens to hold the current values of the icon links

  var upState;
  var downState;
  var layerState = false;
  var layerName;
  var layers =[];
  
  //===================================
  var map; //Name of Map Object
  var infopanel;  //Name of Dynamic Information Panel Object
  var loading;
  var xmlDoc; //DOM Parsing for building DOM Tree
  var theXMLDoc;
  var currentDoc;
  var xmlDocName;
  var xmlDocs = []; //holds array of parsed xml documents
  var xmlhttp;
  var currentImage;
  
  var lat;  //latitude
  var lng;  //longitude
  var mPoint;
  var points = [];// array to hold the lat/lng points from  GLatLng(lat,lng)
  var type;
 // var marker; //Map marker object
  var markers = []; //array of Markers
 // var markerType; //used in markerArrays to classify marker according to layer
 var polyline = [];
 var miles = [];
  
  var index = 0; //used to give index numbers to the markers
  //var point;
  
  var icon = 0; //Number of the icon
  var currentIcon;
  var xmlIcon;
  var theIcon;
  var icName;
  var icons = []; //array to hold all the icons
  //==============================================
  var mkTitle;
  var mkHtml;
  var mkLat;
  var mkLng;
  var mkIcon;
   

  
  //-------- set layer vars ------------------
  
  var infWinLge = "<table width='250px'><tr><td>XML</td></tr></table>";//used as part of InfoWindowHTML
  var infWinSml = "<table width='250px'><tr><td>XML</td></tr></table>"; //used as part of InfoWindowHTML
  
  var stationLayer = false;
  var eatLayer = false;
  var sleepLayer = false;
  var shopLayer = false;
  var parkLayer = false;
  var vantLayer = false;
  var tellLayer = false;
  var fullLayer = false;
  var funLayer = false;
  var outLeg = true;
  var returnLeg = true;
  
  //need to keep record of xml documents loaded use boolean and only load when clicked and false
  var routeXML = false; //contains information on Stations and mile markers
  var waterXML = false;
  var spongeXML= false;
  var wcXML = false;
  var shopXML = false;
  var sleepXML = false;
  var eatXML = false;
  var firstMarkerXML = false;
  var parkXML = false;
  var vantXML = false;
  
  var allXMLDocs = new Array("fullRoute","shop","sleep","eat","park","vant")
  var allXMLSize = allXMLDocs.length -1;
  var allXMLStart = 0;
//==========================Section 2 Main Functions ========================================================

  /*
  *  Function onLoad fired when the page loads
  *  this loads the basic googleMap and connects to goolge googleMap
  *  for the key.
  */
  function onLoad()
    {
    try{
		setMap(); //Initialise the map
		loadIcons();//Load all Icons into memory
		makeLayerLinks();
		//loadMarkers("firstMarker","flag");
		//getXMLDocs("fullRoute",null);
		getXMLDocs("firstMarker","flag");//load all XML docs into memory
		
       }catch (e) {
         GLog.write("Err-115.128.  there is a problem creating Google googleMap. Error:- " + e.message);
       }   
    }
	
	function setMap()
	{
    try{
        infopanel = document.getElementById("infopanel");
		loading = document.getElementById("loading");
		//displayLoad();
		
		//problem creating GMap2 object here 
        map = new GMap2(document.getElementById("map"));
       
		//possible problems continue
		map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
		map.addControl(new GScaleControl ());
		map.addControl(new GOverviewMapControl());
        //setCenter three variables (coordinates, zoom level, googleMap Style)
		var point = new GLatLng(50.3662013285106,-4.139957427978516);
        map.setCenter(point, 15);
		//map.setMapType(G_SATELLITE_MAP);
       }catch (e) {
         GLog.write("Err-130.148.  there is a problem creating Google googleMap. Error:- " + e.message);
       }  
	}
	
  /*
  *  function getIcons
  *  This sets the basic icons used in the googleMap
  */
  function loadIcons()
  {
      try{
      var filePath = "images/map/icons/";
		  makeIcon(filePath + "coldmarker.png","http://www.google.com/mapfiles/shadow50.png","blue"); //blue pin
		  makeIcon(filePath + "flag.png",filePath + "flagShadow.png","flag");//flag icon
		  makeIcon(filePath + "wc.png",filePath + "shadow01.png","wc");//toilets
		  makeIcon(filePath + "water.png",filePath + "shadow01.png","water");//water
		  makeIcon(filePath + "sponge.png",filePath + "shadow01.png","sponge");//sponge
		  makeIcon(filePath + "eat.png",filePath + "shadow01.png","eat");//eat
		  makeIcon(filePath + "sleep.png",filePath + "shadow01.png","sleep");//sleep
		  makeIcon(filePath + "shop.png",filePath + "shadow01.png","shop");//shop
		  makeIcon(filePath + "park.png",filePath + "shadow01.png","park");//parking
		  makeIcon("http://maps.google.com/mapfiles/kml/pal3/icon21.png","none","car");
		  makeIcon(filePath + "vant.png",filePath + "shadow01.png","vant");
		  for (var i=0; i< 13 ;i++)
		  {
			  var icName ="mile" + (i+1) ;
			  //load the mile marker icons
			  var url = filePath + icName +".png";
			  makeMileIcons(url,icName);
		  }
		  
     }catch(e){
        GLog.write("Err-154.180.  Problem creating Flag Icon:  Error:- " + e.message);
      }
  }
  
  /*
  * function getNewIcon(filename, shadowName, xSize, ySize)
  *  used to create bespoke icons
  */
   function makeIcon(url,shadow,icName)
  {
      try{
      // get flag icon
      var newIcon = new GIcon();
      newIcon.image = url;
	  if (shadow != "none")
	  {
      newIcon.shadow = shadow;
      newIcon.shadowSize = new GSize(41,35);
	  }
      newIcon.iconSize = new GSize(41,35);
      newIcon.iconAnchor = new GPoint(0,25);
      newIcon.infoWindowAnchor = new GPoint(0,35);
      newIcon.infoShadowAnchor = new GPoint(0,35);
      icons.push(new entityicon(newIcon,icName));
      }catch(e){
        GLog.write("Err-186.205  Problem creating newIcon Icon:  Error:- " + e.message);
      }
  } 
  
  
  //build milemarkers from XML Document
  function makeMileIcons(url,icName){
  try{
      // get flag icon
      var newIcon = new GIcon();
      newIcon.image = url;
      newIcon.iconSize = new GSize(23,35);
      newIcon.iconAnchor = new GPoint(11,35);
      icons.push(new entityicon(newIcon,icName));
      }catch(e){
        GLog.write("Err-209.220 Problem creating newIcon Icon:  Error:- " + e.message);
      }	  
  }
  
  function entityicon(theIcon,icName)
  {
	try{
		this.theIcon = theIcon;
		this.icName = icName;
	}catch(e){
	  GLog.write("err-222.230.  Error creating entityicon line 169 :- " + e.message);	
	}
  }
  /*  
  entitymarker is loaded into array of markers.  
  */
  	function entitymarker(x,y,t,m,i,p) 
	{
		try{
			this.lat = x;
			this.lng = y;
			this.title = t;
			this.marker = m;
			this.info = i;
			this.type = p;
			this.mPoint = new GLatLng(x,y);
		}catch(e){
			GLog.write("Err-234.247 :- "+ e.message);
		}
	}
	
	function layer(upState,downState,layerName,layerState)
	{
	try{
	  this.upState = upState;
	  this.downState = downState;
	  this.layerName = layerName;
	  this.layerState = layerState;

		}catch(e){
			GLog.write("Err-249.260 :- "+ e.message);
		}
	}
	
	function makeLayerLinks()
	{
	  try{
	 // var f = document.Forms[0];
	  var imgs = document.images;
	  for (var i=0; i<imgs.length;i++)
	    {
		  if (imgs[i].name.length >1)
		  {
		  	var us = "images/map/icons/"+ imgs[i].name + "_up.png" ;
		  	var ds = "images/map/icons/"+ imgs[i].name + ".png" ;
		    layers.push(new layer(us,ds,imgs[i].name,false));
		   }
		}
	  }catch(e){
			GLog.write("Err-262.279:- "+ e.message);
	}
	}
 
     /*
     *  function addmarker(x,y,html,title,icon)
     *  Used to add a new marker to the current googleMap
     *  x = Latitude
     *  y = Longitude
     *  html = html Formated text (currently not using GXslt)
     *  title = text which appears in infopanel
     *  icon = this is the icon ie icons[2] created in getIcon() and getNewIcon()
     */  
    function addFullmarker(x,y,html,title,type)
    {
    try{
        var point = new GLatLng(x,y);
        points.push(point);
        var marker = new GMarker(point, currentIcon);
		GEvent.addListener(marker, 'click', function(){marker.openInfoWindowHtml(html); });
		markers.push(new entitymarker(x,y,title,marker,html,type));
		return marker;
            
       }catch(e){
            GLog.write("err-290.306.  there is a problem Adding marker to googleMap. Error:- " + e.message);
       }
    }
	
	function buildInfoPanel()
	{
	  try{
	    //cler the infopanel
		infopanel.innerHTML = "";
		//loop through markers
		for (var n in markers)
		{
		  infopanel.innerHTML = infopanel.innerHTML + 
		'<a href="#" onClick="javascript:movemap(' + n + ')";>' +  n + ".  " + markers[n].title +  '</a><br/><br/>';
		}
	  }catch(e)
	  {
	    GLog.write("err-309.320  there is a problem Adding information to infopanel. Error:- " + e.message);
	  }
	}
	
	function addMileMarkers(x,y)
	{
	  try{
	  	  var point = new GLatLng(x,y);
		  miles.push(new GMarker(point, currentIcon));
		  marker = miles[(miles.length-1)] ;
		  return marker;
	  }catch(e)
	  {
		  GLog.write("err-308.319.  there is a problem Adding marker to googleMap. Error:- " + e.message);
	  }
	}
	
function recenterandzoom()
{
  try{
  	var latpoints = [];
	var lngpoints = [];
	var midLat=0;
	var midLng=0;
	
	for (var i=0;i<markers.length;i++)
	{
	  latpoints.push(markers[i].lat);
	  lngpoints.push(markers[i].lng);
	}
	
	latpoints.sort(function(x,y){return x-y;});
	lngpoints.sort(function(x,y){return x-y;});
	
	midLat = Math.floor(latpoints.length /2 );
	midLng = Math.floor(lngpoints.length /2);
	var newlat = latpoints[midLat];
	var newlng = lngpoints[midLng];
	var bounds = new GLatLngBounds;
	if (markers.length > 2)
	{
		for (var i=0; i<markers.length; i++) 
		{
			 bounds.extend(markers[i].mPoint);
		}
		map.panTo(new GLatLng(newlat,newlng),15);
	}
	else
	{
	map.panTo(new GLatLng(50.3662013285106,-4.139957427978516),15);
	}
	
	
  }catch(e){
    GLog.write("Error moving map err-320.372 :-  " + e.message);
  }
}

function movemap(ind)
{
	try{
		 map.panTo(points[ind],14);
		 markers[ind].marker.openInfoWindowHtml(markers[ind].info);
	}catch(e){
		GLog.write("Eror moving map err-362.370 :-  " + e.message);
	}
}

function centermap(x,y,level)
{
	try{
		 map.panTo(new GLatLng(x,y));
		 map.setZoom(level);
	}catch(e){
		GLog.write("Err-386.392:-  " + e.message);
	}
}

function clearmarkers(mType)
{
  try{
  var keeplist = [];
  for (var n in markers)
    {
  		if(markers[n].type == mType)
		{
		  map.removeOverlay(markers[n].marker);
		  //also need to remove from infopanel
		  infopanel.innerHTML = "";
		}else{
		  keeplist.push(markers[n]);
		}
    }
	markers = [];
	for (var m in keeplist)
	{
	  markers.push(keeplist[m]);
	  infopanel.innerHTML = infopanel.innerHTML + 
	  '<a href="#" onClick="javascript:movemap(' + m + ')";>' +  keeplist[m].title +  '</a><br/><br/>';
	}
   buildInfoPanel();
   recenterandzoom();
  }catch(e)
  {
    GLog.write("Err-382.410 :-  " + e.message);
  }
}

function moveToTell()
{
  try{
  if(tellLayer)
  {
  	clearmarkers("tell");
  }else{
	  for (var n in markers)
	  {
		if (markers[n].title =="Tell")
		{
			movemap(n);
			tellLayer = true;
		}
	  }
	}  
  }catch(e)
  {
	  GLog.write("Error Moving to Tell Location err-411.444 " + e.message);  
  }
}
//==========================Section 3 AJAX  ==========================================================
//Load xml Documents into memory ; 
function getXMLDocs(xmlDocument,xmlIcon)
{
  try{
	  currentDoc = xmlDocument;
	  this.xmlIcon = xmlIcon;
	  loadXMLDoc("xml/" + xmlDocument + ".xml");  
	}catch(e){
    GLog.write("err-434.443.  Error retiriveing XML Documents :- " +e.message);
  }
}

  function entityXMLDoc(theXMLDoc,xmlDocName)
  {
	try{
		this.theXMLDoc = theXMLDoc;
		this.xmlDocName = xmlDocName;
	}catch(e){
	  GLog.write("err-450-437.  Error creating entityicon line 169 :- " + e.message);	
	}
  }
  
function loadXMLDoc(url)
{
	
	
	try{
	xmlhttp=null;
	// code for Mozilla, IE7 etc.
	if (window.XMLHttpRequest)
		{
		    //GLog.write("XMLHttpRequest OK");
			xmlhttp=new XMLHttpRequest();
		}
		// code for IE5 IE6
		else if (window.ActiveXObject)
			{
		  		//GLog.write("ActiveXObject) OK");
				xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
	
	if (xmlhttp!=null)
		{
			xmlhttp.onreadystatechange=state_Change;
			xmlhttp.open("GET",url,true);
			xmlhttp.send(null);
		}
		else
		{
			GLog.write("Your browser does not support XMLHTTP.")
		}
	}catch(e)
	{
	  GLog.write("Error Loading XML Document Err-480.501:-  " + e.message);	
	}
}


function state_Change()
{
  try{
		// if xmlhttp shows "loaded"
		if (xmlhttp.readyState==4)
		  {
		  // if "OK"
		  if (xmlhttp.status==200)
			{
			 var xmlDoc = xmlhttp.responseXML.documentElement; //root
			 if (currentDoc =="fullRoute")
				{
					routeNodeLoad(xmlDoc);
				}else
				{
			 		xmlDocs.push(new entityXMLDoc(xmlDoc,currentDoc));
				}
			var z = allXMLDocs[allXMLStart];
			//GLog.write ("Loading doc ;- " + z);
			if (allXMLStart < allXMLDocs.length)
			  {
			    getXMLDocs(z,z);
			  }
			allXMLStart++;
			//GLog.write("allXMLStart Number = " + allXMLStart);
			}else
			{
				GLog.write("Problem retrieving XML data")
			}
			
		  }
		  	
	}catch(e){
	  GLog.write("err-520.536  Error in XML State :- " +e.message);
	}
}

function routeNodeLoad(xmlDoc)
{
  try{
	  //Find the different Nodes using childNodes.nodeName.
	var x = xmlDoc.childNodes;
	//loop through the child nodes disreguarding whitespaces (firefox)
	for(var i=0;i<x.length;i++)
	  {
		if ((x[i].nodeType!=3)&&(x[i].nodeType!=8))
		  {
			//test nodename if NOT placemark then get next level of children
			var nName = x[i].nodeName ;
			if (nName =="Route")
			{
			  var r = x[i].childNodes;
			  for(var j=0;j<r.length;j++)
			  {
				if ((r[j].nodeType!=3)&&(r[j].nodeType!=8))
				{
					nName = r[j].nodeName;
					if ((nName == "run")&&(r[j].getAttribute("id") == "funRun"))
					{
						xmlDocs.push(new entityXMLDoc(r[j],"funRun"));
					}
					if ((nName == "run")&&(r[j].getAttribute("id") == "fullRun"))
					{
						xmlDocs.push(new entityXMLDoc(r[j],"fullRun"));
					}
				}
			  }
			}
			//Load stations
			if (nName == "Station")
			{
				var s = x[i].childNodes;
				for(var k=0;k<s.length;k++)
				{
				  if ((s[k].nodeType!=3)&&(s[k].nodeType!=8))
					{
					  nName = s[k].nodeName;
					  if (nName == "water")
					  {
						  xmlDocs.push(new entityXMLDoc(s[k],"water"));
					  }
					  
					  if (nName =="sponge")
					  {
						   xmlDocs.push(new entityXMLDoc(s[k],"sponge"));
					  }
					  
					  if (nName == "wc")
					  {
						   xmlDocs.push(new entityXMLDoc(s[k],"wc"));
					  }
					}
				}
			}
			//Load Mile Markers
			if (nName == "Mile")
			{
				 xmlDocs.push(new entityXMLDoc(x[i],"mile"));
			}
		  }
	  }
 }catch(e)
  {
	GLog.write("Error loading Rout Nodes Err532.598 :- " + e.message);  
  }
}

//=============================Section 4 Layer Functions =======================================================
function loadXML(xmlName, type)
{
  try{
  //retrieve the xmlDocument from the array
  for (var x in xmlDocs)
    {
  		if( xmlDocs[x].xmlDocName == xmlName)
		{
		  for (var n in icons)
		  {
			if (icons[n].icName == xmlIcon)
			{
			  currentIcon = icons[n].theIcon;	
			}
		  }
		  xmlDoc = xmlDocs[x].theXMLDoc;
		  
		  if (type != null)
		  {
			  //GLog.write(type);
			  if(type == "mile")
			  {
				loadMileLayer();
				if(xmlIcon == "mile")
				{
				 loadRouteLayer("funRun", 0)
				}else{
				 loadRouteLayer("fullRun", 0)
				}
			  }else if (type == "station")
			  {
				 loadStationLayer(); 
			  }
		  }else 
		  {
			  loadLayer();
		  }
		}
    }
  }catch(e){
    GLog.write("error loading first marker err607.651 :- " + e.message);
  }
}

function loadLayer()
{
  try{
	//loop through the children untill we reach placemark as nodeName
	mkHtml = "<h2>Description not set</h2>";
	var x = xmlDoc.childNodes;
	//loop through the child nodes disreguarding whitespaces (firefox)
	for(var i=0;i<x.length;i++)
	  {
		if ((x[i].nodeType!=3)&&(x[i].nodeType!=8))
		  {
			//test nodename if NOT placemark then get next level of children
			var nName = x[i].nodeName ;
			if (nName == "Document")
			  {
			    var placeTags = x[i].getElementsByTagName("Placemark");
				for (var j =0; j<placeTags.length; j++)
				  {
				    //build the marker v ariables
					if ((placeTags[j].nodeType!=3)&&(placeTags[j].nodeType!=8))
					  {
					    var nameTags = placeTags[j].getElementsByTagName("name");
						for (var k=0;k<nameTags.length;k++)
						  {
						    if ((nameTags[k].nodeType!=3)&&(nameTags[k].nodeType!=8))
							  {
							    mkTitle = nameTags[k].firstChild.nodeValue;
							  }
						  }
						 var descTags =  placeTags[j].getElementsByTagName("description");
						 for (var k=0;k<descTags.length;k++)
						  {
						    if ((descTags[k].nodeType!=3)&&(descTags[k].nodeType!=8))
							  {
							    mkHtml = descTags[k].firstChild.nodeValue;
							  }
						  }
						 var latTags = placeTags[j].getElementsByTagName("coordinates");
						 for (var k=0;k<latTags.length;k++)
						  {
						    if ((latTags[k].nodeType!=3)&&(latTags[k].nodeType!=8))
							  {
							    var coords = latTags[k].firstChild.nodeValue.split(",");
								mkLat = coords[1];
								mkLng = coords[0];
								
							  }
						  }
					  }
					  //replace the mkHTML and place in table
					  mkHtml = infWinLge.replace("XML",mkHtml);
					  var marker = addFullmarker(mkLat,mkLng,mkHtml,mkTitle,xmlIcon);
					 map.addOverlay(marker);
				  }
			  }
		  }
	  }
   }catch(e)
  {
    GLog.write("Error loading layer err653.719 :- " +e.message);
  }
}

function loadStationLayer()
{
  try{
	mkHtml = "<h2>Description not set</h2>";
	var x = xmlDoc.childNodes;
	//loop through the child nodes disreguarding whitespaces (firefox)
	for(var i=0;i<x.length;i++)
	  {
		 if ((x[i].nodeType!=3)&&(x[i].nodeType!=8))
		  {
			//test nodename if NOT placemark then get next level of children
			var nName = x[i].nodeName ;
			//GLog.write(nName);
			var coordTag = x[i].getElementsByTagName("gml:coordinates");
			var htmlTag = x[i].getElementsByTagName("bodyText");
			var browser=navigator.appName;
			//there is a problem with mozilla type browsers that reads whitespace as part of DOM
			//We know the location of the node we need but this wont work if we try using getElementById
			if (browser == "Netscape"){
			   coordTag = x[i].childNodes[3].childNodes;
			   //GLog.write(x[i].childNodes[3].childNodes[1].nodeName);
			}


			for (var t=0; t<coordTag.length;t++)
			{
				if ((coordTag[t].nodeType!=3)&&(coordTag[t].nodeType!=8))
				 {
					 var coords = coordTag[t].firstChild.nodeValue.split(",");
					 mkLat = coords[0];
					 mkLng = coords[1];
				 }
			}
			
			for (var s= 0; s<htmlTag.length;s++)
			{
				if ((htmlTag[s].nodeType!=3)&&(htmlTag[s].nodeType!=8))
				 {
					 mkHtml = htmlTag[s].firstChild.nodeValue;
				 }
			}

			mkTitle = xmlIcon + " Station"; 
			mkHtml = infWinSml.replace("XML",mkHtml);
		    var marker = addFullmarker(mkLat,mkLng,mkHtml,mkTitle,xmlIcon);
			map.addOverlay(marker);
		  }
	  }
  }catch(e)
  {
	GLog.write("Error Loading StationLayer err721.779 " +e.message);  
  }
}

function loadMileLayer()
{
   try
   {
	mkHtml = "<h2>Description not set</h2>";
	var x = xmlDoc.childNodes;
	//loop through the child nodes disreguarding whitespaces (firefox)
	for(var i=0;i<x.length;i++)
	  {
		 if ((x[i].nodeType!=3)&&(x[i].nodeType!=8))
		  {
			  var attr = x[i].getAttribute("id");
			  //set the correct icon
			  var aName = "mile" + attr;
			  for (var n in icons)
		  		{
					if (icons[n].icName == aName)
					{
			  		currentIcon = icons[n].theIcon;	
					}
		 		 }
				 //build Description
			  var sx = x[i].getElementsByTagName("marker")[0].firstChild.nodeValue;
			  mkHtml = "Mile Marker 1 at :- " + sx;
			  
			  //Build coordinates

				  var coordTag = x[i].getElementsByTagName("gml:coordinates");
				  //firefox has a problem with this tag to do with whitespace so we need
				  //to specify the tag directly
				  var browser=navigator.appName;
				  if (browser == "Netscape"){
			   		coordTag = x[i].childNodes[3].childNodes;
					}
				  
				  for (var t=0; t<coordTag.length;t++)
					{
					 if ((coordTag[t].nodeType!=3)&&(coordTag[t].nodeType!=8))
					  {
						 var coords = coordTag[t].firstChild.nodeValue.split(",");
						 mkLat = coords[0];
						 mkLng = coords[1];
					  }
					}
					  
			mkTitle = "Mile Marker "; 
			mkHtml = infWinSml.replace("XML",mkHtml);
		    var marker = addMileMarkers(mkLat,mkLng);
			map.addOverlay(marker);
		  }
	  }
   }catch(e)
  {
	 GLog.write("Error loading Mile Markers err781.825 : " + e.message);  
  }	
}
 //Route type is either fullRun or funRun, leg value 0 = all, 1=out,2=return
 function loadRouteLayer(routeType, legValue)
 {
	try{
		//alert(routeType + "  " + legValue);
		// this area creates an overlay for the map this does not require Icons or Markers but still uses map.addOverlay
		//first retrieve the correct route from the xmlDocs array, already stored when we loaded the fullRoute.xml
		for (var x in xmlDocs)
    	{
  		  if(xmlDocs[x].xmlDocName == routeType)
		  {
			  xmlDoc = xmlDocs[x].theXMLDoc; //this will be RUN tag
			  var y = xmlDoc.childNodes;
			  var polygon = "";
			  for(var i=0;i<y.length;i++)
	  			{
				 if ((y[i].nodeType!=3)&&(y[i].nodeType!=8))
		  			{
						if(y[i].nodeName == "gml:LineString")
						{
						  var z = y[i].childNodes;
						  for (var j=0;j<z.length;j++)
						  {
							  if ((z[j].nodeType!=3)&&(z[j].nodeType!=8))
							  {
								  if(z[j].nodeName == "outLeg")
								  {
									var leg = z[j].childNodes;
									for ( var k=0; k<leg.length;k++)
									{
										if((leg[k].nodeType!=3)&&(leg[k].nodeType!=8))
										{
										  polygon = polygon + " " + leg[k].firstChild.nodeValue;	
										}
									}
					               addRoute(polygon, "#00FF00");
								   polygon = "";
								  }else 
								  if(z[j].nodeName == "returnLeg")
								  {
									var leg = z[j].childNodes;
									for ( var k=0; k<leg.length;k++)
									{
										if((leg[k].nodeType!=3)&&(leg[k].nodeType!=8))
										{
										  polygon = polygon + " " + leg[k].firstChild.nodeValue;	
										}
									}
								   addRoute(polygon, "#0000FF");
								  }
							  }
						  }
						}

					}
				}
		  }
		}

	}catch(e){
		GLog.write("Error loading Route err843.909: " + e.message);
	}
 }
 
 function addRoute(polygon, legValue)
{
  try{
  //seperate the pairs and push into route[]
  /* Interesting firefox/IE difference
    Th firefox DOM parser only allows a maximum 4096 bytes to be parsed so all polylines must be smaller
	therefor it may be worthwhile to use an extra googlemaps encode in the XML file
  */
  var poly = polygon.split(" ");
  //loop through the array and build route
  var route = [];
  for (i=0; i<poly.length;i++)
    {  
    var coords = poly[i].split(",");
       route.push(new GLatLng(coords[0],coords[1]));
     }
     //if route length is odd number we need to double the last ord
	 polyline .push(new GPolyline(route, legValue));
    map.addOverlay(polyline[(polyline.length-1)]);
  }catch(e){
  GLog.write("error creating route. Err913.937:- " +e.message);  
  }
}

  function tellMarker()
  {
	  try{
  //onlyMarkers();
  //resetVars();
  var html = "<div class=\"title\">Tell Systems Ltd.</div>" +
                "<div Tamar Science park, Derriford, Plymouth, PL6 8BQ</div>" +
				"<div >01752 762424  <a href='http://www.tellonline.co.uk' target='blank'>Tellonline.com</a></div>"+
				"<div><object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0\" width=\"173\" height=\"129\" id=\"001\" align=\"middle\">"+
				"<param name=\"allowScriptAccess\" value=\"sameDomain\" />"+
				"<param name=\"movie\" value=\"mapVideo/001.swf\" /><param name=\"quality\" value=\"high\" /><param name=\"bgcolor\" value=\"#000000\" /><embed src=\"mapVideo/001.swf\" quality=\"high\" bgcolor=\"#000000\" width=\"173\" height=\"129\" name=\"001\" align=\"middle\" allowScriptAccess=\"sameDomain\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" /> "+
				"</object></div>" +
                "<img src='http://www.plymouthhalfmarathon.co.uk/images/logos/tell.jpg' />";
	var marker = addFullmarker("50.4180080964104","-4.108949945958031",html,"Tell", "tell");
	map.addOverlay(marker);
    moveToTell(); 
	  }catch(e)
	  {
		   GLog.write("error setting tell marker  err-943.963 " + e.message);
	  }
  }


//=============================Section 5 Other ================================================================
function resetVars()
{
  try{
	resetClicks();
	map.clearOverlays();
	markers =[];
	index = 0;
	infopanel.innerHTML =""; 
  }catch(e){
	  GLog.write("error resetting variables Err967.978 " + e.message);
  }
}


function getMarkers(nme)
{
	
try{
   var lType;
   xmlIcon = nme;
	
	if ((nme == "water") ||(nme == "sponge")||(nme=="wc"))
	{//-------------------------------------//
	  lType = "station";
	  
	}else 
	{
	  lType == null;
	}
	
	setIconState(nme,lType);
	currentImage = nme;
	buildInfoPanel();
	recenterandzoom();
 }catch(e)
  {
  	GLog.write("Err-981.1040 " + e.message);
  }
}

function setFunRoute()
{
try{ //clear the route?
	  clearRoutes();

	if (funLayer==false)
	{
	  funLayer = true;
	  fullLayer = false;
	  loadRouteLayer("funRun", 0);
	  document["fun"].src = "images/map/icons/fun_up.png";
	  document["full"].src = "images/map/icons/full.png";
	  map.setCenter(new GLatLng(50.3651166666667,-4.14278333333333),15);
	}else{
	  funLayer = false;
	  document["fun"].src = "images/map/icons/fun.png";
	  }
	}catch(e){
       GLog.write("Erroe setting icon State err-1044.1066 " + e.message);
	}
}

function setFullRoute()
{
 //displayLoad();
try{ 
  clearRoutes();
  if (fullLayer == false)
  {	
	  funLayer = false;
	  fullLayer = true;
	  loadRouteLayer("fullRun", 0);
	  //addMileMarkers
	  loadXML("mile","mile");
	  
	  document["full"].src = "images/map/icons/full_up.png";
	  document["fun"].src = "images/map/icons/fun.png";
	map.setCenter(new GLatLng(50.37114060004464,-4.107869742166905),13);
	}else{
	  fullLayer = false;
	  document["full"].src = "images/map/icons/full.png";
	}
	}catch(e){
       GLog.write("Erroe setting icon State err-1068.1091 " + e.message);
	}
}

function setIconState(iName, iType)
{
	try{
		//loop through layers and pull out the correct layer
		for (var n in layers)
		{
		  if (layers[n].layerName == iName)
		  {
		    if(layers[n].layerState)
			{
			  //set Layerstate false and change the image
			  layers[n].layerState = false;
			  var lName = layers[n].layerName;
			  document[lName].src = layers[n].downState;
			  clearmarkers(iName);
			}else
			{
			  layers[n].layerState = true;
			  var lName = layers[n].layerName;
			  document[lName].src = layers[n].upState;
			  xmlIcon = iName;
		      loadXML(iName, iType);
			}
		  }
		}
 	}catch(e){
		GLog.write("Erroe setting icon State err-1094.1123 " + e.message);
	}
}
function clearRoutes()
{
	  for(var n in polyline)
	    {
	      map.removeOverlay(polyline[n]);
	    }
		
     for(var n in miles)
	 {		
		map.removeOverlay(miles[n]);
	 }
}

function CheckForm(form)
{
	var FormOK = false;
		if ((form.name.value == '') || (form.contactDetail.value == '') || (form.comments.value == ''))
	{
		FormOK = false;
		alert('Please fill in your name, contact and comment');
	}

return FormOK;
}
