	//21a - development, modified for parksmart formatted car park data
	//On/off switches for various datatypes
	var showCongestion=true;var showTrafficCameras=true;var showCarParks=true;var showSpeedCameras=false;var showRailNet=true;var showPOI=true;var showMobileCameras=false;var showHighwaysAgency=true;var showVmsNotts=false;var showJourneyTimes=false;var showElginRoadworks=false;var showStreetView=true;var showSearchBox=false;
	//Page timing variables
	var mapWait=8000;var mapInitialTimeout=3000;var pageReloadTimeout=240;var tm=pageReloadTimeout; //Counter variable
	//Map variables
	var map;var svc;var map2=[];var gdir;var gdir2;var gMarkers=[];var gLines=[];var mArray=[];var sArray=[];var mIndex=0;var lIndex=0;var sIndex=0;var mapLocationStart;var mapState=false;var isIE=true;var cpReload=true;var panoClient;var panoLatLng;var myPano;var panoCurrentDiv;var mapInitialLat=52.9549467310722;var mapInitialLng=-1.149444580078125;var mapInitialZoom=13;var panoLoaded=false;
	//HTML to inject
	var highwaysDropdownContent='<div>Incidents&nbsp;<img src="/images/googlemap_icons/mIconTri.gif" /><input type="checkbox" id="ue" onclick="javascript:checkChange(\'ue\');LoadUnload(\'ue\');" /></div><div>Future works&nbsp;<img src="/images/googlemap_icons/mIconRed.gif" /><input type="checkbox" id="fr" onclick="checkChange(\'fr\');LoadUnload(\'fr\');" /></div><div>Current works&nbsp;<img src="/images/googlemap_icons/mIconTriRed.gif" /><input type="checkbox" id="cr" onclick="checkChange(\'cr\');LoadUnload(\'cr\');" /></div><div>Events<img src="/images/googlemap_icons/mIconGreen.gif" /><input type="checkbox" id="cp" onclick="checkChange(\'cp\');LoadUnload(\'cp\');" /></div><div>VMS/Matrix&nbsp;<img src="/images/googlemap_icons/mIconPink.gif" /><input type="checkbox" id="vms" onclick="checkChange(\'vms\');LoadUnload(\'vms\');checkChange(\'matrix\');LoadUnload(\'matrix\');" /></div><div>Delays&nbsp;<img src="/images/googlemap_icons/mIconTime.gif" /><input type="checkbox" id="ts" onclick="checkChange(\'ts\');LoadUnload(\'ts\');" /></div>';;
	var highwaysEmptyContent='';
	//ajax loader...
	var globalLoadBox='<img src="/images/ajaxload/355b8f-on-transparent.gif" alt="Loading" />';
	//icons
	var iconArrow;var iconRWks;var iconPR;var iconPRFull;var iconcarpark;var iconcarparkFull;var iconIncs;var iconTram;
	//elements
	var mapElement;var consoleElement;var infoElement;var rhElement;var haHeaderElement;var haDropdownElement;var loadBoxElement;var panoElement;
	//Directions
	var globalDir='';var s=', Nottinghamshire, UK';var ww=false;	var printClearDirections='<div><a href="javascript:printWindow();">View printable summary</a></div><div><a href="javascript:clearDirections();">Clear these directions</a></div>';
	//Function called from page body/JQuery	
	function onLoad(lat,lng,z) {
		mapElement=document.getElementById('map');
		infoElement=document.createElement('div');
		debugElement=document.getElementById('debug');
		setTimeout(function(){initialise(mapInitialLat,mapInitialLng,mapInitialZoom)},mapInitialTimeout);
	}
	//Setup function
	function initialise(lt,ln,z) {
		setupNgIcon(28,36,"/images/googlemap_icons/blank.gif",document.all);
		infoElement.id="infopane";
		if(GBrowserIsCompatible()){
			map=new GMap2(mapElement, {draggingCursor: 'pointer'});
			map.setCenter(new GLatLng(lt,ln),z,G_NORMAL_MAP);
			// Fix for modular code in GMaps backend - show a dummy infowindow so the dimensions of internal map are correct.
			map.getInfoWindow().show();
			//Geocoding...
			geocoder=new GClientGeocoder();
			geocoder.setBaseCountryCode('GB');
			gdir=new GDirections(map, infoElement);
			gdir2=new GDirections();
			setupDirections();//remove local scoping issues & multiple listeners
			//Set up street view: Create a dummy div, add a panorama and wait for an infowindow to be opened.
			if(showStreetView){
				panoClient=new GStreetviewClient();			
				panoElement=document.createElement("div");
				panoElement.style.width="200px";
				panoElement.style.height="200px";
				panoCurrentDiv=panoElement;
				myPano = new GStreetviewPanorama(panoElement);
				GEvent.addListener(myPano, "error", function(e){panoCurrentDiv.innerHTML="Oh no! Something went wrong... please reopen the caption box :(<br >Error "+e;});
		    }
			//Map controls: set up standard Google controls first
			map.addControl(new GLargeMapControl3D(),new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7,107)));
			map.addControl(new GScaleControl(),new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(100,3)));
			map.addControl(new GMapTypeControl(),new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7,37)));
			map.removeMapType(G_SATELLITE_MAP);
			map.enableContinuousZoom();
			map.enableDoubleClickZoom();
			map.enableScrollWheelZoom();
			//Custom controls: Highways Agency dropdown
			if(showHighwaysAgency){
				var hdb=new twInfoBox(map,'haHeader',170,33);
				map.addControl(hdb,new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7,214)));
				haHeaderElement=document.getElementById('haHeader');
				haHeaderElement.innerHTML="<div onmouseover=\"javascript:haDropdown();\"><span>National Data</span><img onmouseover=\"javascript:haDropdown();\" id=\"haicon\" src=\"/images/icon/ha-sm1.png\" onclick=\"javascript:showAllHighwaysData()\"></img></div>";
				
				var hda=new twInfoBox(map,'haDropdown',170,130);
				map.addControl(hda,new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7,248)));
				haDropdownElement=document.getElementById('haDropdown');
				haDropdownElement.style.zIndex=1000;
				haDropdownElement.innerHTML=highwaysDropdownContent;

			}
			//Custom controls: Search box
			if(showSearchBox){
				var sba=new twInfoBox(map,'searchBox',170,33);
				map.addControl(sba,new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7,253)));
				searchBoxElement=document.getElementById('searchBox');
				searchBoxElement.innerHTML="<div onmouseover=\"\"><span>Search</span><img onmouseover=\"\" id=\"sbicon\" src=\"/images/icon/ha-sm1.png\" onclick=\"\"></img></div>";
			}
			//Custom controls: News ticker
			map.addControl(new twInfoBox(map,'tickerbox',500,20,'','','#fff'),new GControlPosition(G_ANCHOR_TOP_LEFT, new
GSize(6,7)));
			document.getElementById('tickerbox').innerHTML='<a href="#" style="margin-left:5px;" id="ticker"></a>';
			setTimeout(tickergate, 500);
			//Custom controls: Console
			var consoley=200;
			if(showElginRoadworks){consoley+=40};
			consoleElement=document.createElement('div');
			map.addControl(new twInfoBox(map,'console',170,consoley,'','','#fff'),new GControlPosition(G_ANCHOR_TOP_RIGHT, new
GSize(7,7)));
			var console=document.getElementById('console');
			var ce="<div><span>Congestion</span><img id=\"congicon\" src=\"/images/icon/congestion-icon-sm2.png\" onclick=\"checkChange('cong');LoadUnload('cong');\" /></div>";
			ce+="<div><span>Traffic cameras</span><img id=\"cctvicon\" src=\"/images/icon/cctv-sm1.png\" onclick=\"checkChange('CCTV');LoadUnload('CCTV');\" /></div>";
			ce+="<div><span>Parking</span><img id=\"parkicon\" src=\"/images/icon/park-sm1.png\" onclick=\"checkChange('carpark');checkChange('PKSMRT');LoadUnload('carpark');LoadUnload('PKSMRT');\"/></div>";
			ce+="<div><span>Rail and NET</span><img id=\"neticon\" src=\"/images/icon/bluetram-sm1.png\" onclick=\"checkChange('net');checkChange('netstops');checkChange('nr');LoadUnload('net');LoadUnload('netstops');LoadUnload('nr');\" /></div>";
			ce+="<div><span>Places of interest</span><img id=\"landmarkicon\" src=\"/images/icon/landmark-sm1.png\" onclick=\"checkChange('Landmark');checkChange('cycle');LoadUnload('Landmark');LoadUnload('cycle');\" /></div>";
			if(showVmsNotts){ce+="<div><span>Variable message signs</span><img id=\"vmsicon\" src=\"/images/icon/vms-sm1.png\" onclick=\"checkChange('svms');LoadUnload('svms');\" /></div>"};
			if(showElginRoadworks){ce+="<div><span>Roadworks (Elgin)</span><img id=\"worksicon\" src=\"/images/icon/works-sm1.png\" onclick=\"checkChange('works');LoadUnload('works');\" /></div>"};
			consoleElement.innerHTML=ce;
			console.appendChild(consoleElement);	
			//Set up the autoreload
			xtimer=setInterval(countdown,1000);
			//Set up listeners
			GEvent.addListener(map,'infowindowclose',function(){reset();}); 
			GEvent.addListener(map,'dragend',function(){mapLocationStart=map.getCenter();}); 
			GEvent.addDomListener(map,'click',function(){clearDropdowns();});
			GEvent.addDomListener(map,'mouseover',function(){clearDropdowns();});
			GEvent.addDomListener(map,'mouseout',function(){clearDropdowns();});
			//Go!
			setTimeout(Reload, 1);
		}else{	
			document.location.href='/access/index/'; //needs work. Maps Static API
		}
    }
	function countdown(){
		if(tm>0){var timeStr=60%tm;var r=tm % 60;if(r<10){var fr="0"+r}else{fr=r};tm--;}else{	tm=pageReloadTimeout;Reload();}
	}
	function LoadUnload(mtype) {
		if (popArray[mtype][3]){
			load(mtype,popArray[mtype][0]);
		}else{
			var mtotal=mArray[mtype].length;
			for (var j=0; j<mtotal; j++){ 
				map.removeOverlay(mArray[mtype][0]);
				mArray[mtype].shift();       	
			}
		}
	}
    function createMarker(point,info,type,label,subtype,switchvalue,d,lineId){
		//debugElement.innerHTML+=info;
		switch(type)
		{
			case 'RWks':
				var marker=new GMarker(point, {icon:iconRWks,title:label});
			break; 
			case 'CCTV':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/cc.png");
			break; 
			case 'carpark':
				switch(parseInt(switchvalue)){
					case 1:
						var marker=new ngIcon(point,label,"/images/googlemap_icons/p.png");
					break;
					case 2:
						var marker=new ngIcon(point,label,"/images/googlemap_icons/pa.png");
					break;
					case 3:
						var marker=new ngIcon(point,label,"/images/googlemap_icons/pf.png");
					break;
					case 4:
						var marker=new ngIcon(point,label,"/images/googlemap_icons/pc.png");
					break;
					case 10:
						var marker=new ngIcon(point,label,"/images/googlemap_icons/pnd.png");
					break;
					default:
						var marker=new ngIcon(point,label,"/images/googlemap_icons/p.png");
				}
			break;   
			case 'Speed': 	
				switch(subtype){
					case 'SPECS':
						var marker=new ngIcon(point,label,"/images/googlemap_icons/sc-g.png");
					break;
					case 'Fixed':
						var marker=new ngIcon(point,label,"/images/googlemap_icons/sc-y.png");
					break;
					case 'Mobile':
						var marker=new ngIcon(point,label,"/images/googlemap_icons/sc-b.png");
					break;
					case 'Redlight':
						var marker=new ngIcon(point,label,"/images/googlemap_icons/sc-r.png");
					break;
					default:
						alert('oops!');
				}
			break;
			case 'netstops':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/nt.png");
			break;
			case 'nr':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/nr.png");
			break;		
			case 'Landmark':
				switch(subtype){
					case 'sports':
						var marker=new ngIcon(point,label,"/images/googlemap_icons/lm-r.png");
					break;
					case 'hospital':
						var marker=new ngIcon(point,label,"/images/googlemap_icons/lm-p.png");
					break;			
					case 'heritage':
						var marker=new ngIcon(point,label,"/images/googlemap_icons/lm-y.png");
					break;
					case 'park':
						var marker=new ngIcon(point,label,"/images/googlemap_icons/lm-y.png");
					break;
					case 'transport':
						var marker=new ngIcon(point,label,"/images/googlemap_icons/lm-g.png");
					break;
					default:
						var marker=new GMarker(point);
				}
			break;
			case 'matrix':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/mIcon.gif",10,10);
			break;
			case 'vms':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/mIconPink.gif",10,10);
			break;
			case 'cr':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/mIconTriRed.gif",10,10);
			break;
			case 'fr':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/mIconRed.gif",10,10);
			break;
			case 'ue':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/mIconTri.png",10,10);
			break;
			case 'cp':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/mIconGreen.gif",10,10);
			break;
			case 'ts':
				var marker=new numberIcon(point, label, info, subtype, lineId);
			break;
			case 'vmsnotts':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/vms.png");
			break;
			case 'incident':
				var marker=new ngIcon(point,label,"/images/googlemap_icons/inc.png");
			break;
			case 'works':
				switch(subtype)
				{
					case '0':
						var marker=new ngIcon(point, label,"/images/googlemap_icons/rw-g.png");
					break;
					case '1':
						var marker=new ngIcon(point, label,"/images/googlemap_icons/rw-g.png");
					break;
					case '2':
						var marker=new ngIcon(point, label,"/images/googlemap_icons/rw-y.png");
					break;
					case '3':
						var marker=new ngIcon(point, label,"/images/googlemap_icons/rw-r.png");
					break;
					default:
				}
			break;
			default:
				var marker=new GMarker(point, {icon:G_DEFAULT_ICON,title:label});
			break;
		}
		var mCopy=marker.copy();
		var infoDiv=document.createElement('div');
		infoDiv.innerHTML=info;
		if(type!='matrix'||type!='vms'){
			var directionsDiv=document.createElement('div');
			directionsDiv.className='mapinfo';
			GEvent.addListener(marker, 'click', function(){
				mapLocationStart=map.getCenter();
				//Minimap and overview
				var minimapDiv=document.createElement('div');
				var rn='id' + getRandoms(98654);
				var m2=document.createElement('div');
				m2.className='mapinternal';
				m2.style.width='370px';
				m2.style.height='160px';
				minimapDiv.appendChild(m2);
				m2.innerHTML=globalLoadBox;
				var minimapTab = new GInfoWindowTab('Overview',minimapDiv);
				var minfo=document.createElement('div');
				minfo.className='minfo';
				minimapDiv.appendChild(minfo);
				//Manipulate tabs for CCTV
				if(type=='CCTV'){
					var directionsTab = new GInfoWindowTab('CCTV Image',directionsDiv);directionsDiv.innerHTML=info;	minfo.innerHTML='<div class="minimaptext"><h1>'+label+'</h1></div>';
				}else{
					var directionsTab = new GInfoWindowTab('Directions',directionsDiv);directionsDiv.innerHTML=d;minfo.innerHTML=info;
				}
				
				//create Panorama
				if(showStreetView){
					var panoDiv=document.createElement("div");
					panoCurrentDiv=panoDiv;
					panoDiv.className='panodiv';
					var rn2="id" + getRandoms(98654);
					panoDiv.style.width='370px';
					panoDiv.style.height='320px';
					var streetviewTab = new GInfoWindowTab('Street View',panoDiv);
					panoClient.getNearestPanorama(point,function(pd){
						if (pd.code != 200){//Streetview could not be located
							if(!d){marker.openInfoWindowTabs([minimapTab]);}else{marker.openInfoWindowTabs([minimapTab,directionsTab]);}
						}else{//Streetview present
							myPano.setLocationAndPOV(pd.location.latlng);
							myPano.setContainer(panoDiv);
							panoLoaded=true;
							if(!d){marker.openInfoWindowTabs([minimapTab,streetviewTab]);}else{marker.openInfoWindowTabs([minimapTab,directionsTab,streetviewTab]);}
						}
					});
				}else{
					if(!d){marker.openInfoWindowTabs([minimapTab]);}else{marker.openInfoWindowTabs([minimapTab,directionsTab]);}
				}
				setTimeout(function(){
					map2[mIndex]=new GMap2(m2, {draggingCursor: 'pointer'});
					map2[mIndex].setCenter(point,17,G_HYBRID_MAP); 
					map2[mIndex].addOverlay(mCopy);
				},3000);
			});	
		}
		//alert(type);
		mArray[type].push(marker);       
		gMarkers[mIndex]=marker;
		mIndex++;
		return marker;
	}
	function arrowHead(points,density,width,label,html,type,op) {
		var colour;var image;var p0=points[0];var p1=points[1];var dir=bearing(p1,p0);dir=Math.round(dir/3) * 3;while (dir >= 120){dir-=120;}
		switch(density){
			case '3':image="/arrows/red/dirred_"+dir+".png";colour="red";break;
			case '2':image="/arrows/blue/dir_"+dir+".png";colour="blue";break;
			case '1':image="/arrows/green/dirgren_"+dir+".png";colour="green";break;
			default:image="/arrows/red/dirred_"+dir+".png";colour="red";
		}
		var marker=new ngIcon(p0,label,image,24,24,12,12);
		var mCopy=new ngIcon(p0,label,image,24,24,12,12);
		var poly2=new GPolyline(points,colour,width,op);
		var infoDiv=document.createElement("div");
		infoDiv.innerHTML=html;
		mArray[type].push(marker);       
		gMarkers[mIndex]=marker;
		mIndex++;
		map.addOverlay(marker);
		if(!op){op=0.4};
		//polyline trail
		var polyLine=new GPolyline(points,colour,width,op);
		mArray[type].push(polyLine);       
		gLines[lIndex]=polyLine;
		lIndex++;
		map.addOverlay(polyLine);
		var onClick=function(){
			mapLocationStart=map.getCenter();
			//Minimap and overview
			var minimapDiv=document.createElement("div");
			var rn="id" + getRandoms(98654);
			var m2=document.createElement('div');
			m2.className="mapinternal";
			m2.style.width='368px';
			m2.style.height='160px';
			minimapDiv.appendChild(m2);
			m2.innerHTML=globalLoadBox;
			var minfo=document.createElement('div');
			minfo.className='minfo';
			minfo.innerHTML=html;
			minimapDiv.appendChild(minfo);
			var minimapTab = new GInfoWindowTab('Overview',minimapDiv);
			//create Panorama
			var panoDiv=document.createElement("div");
			panoCurrentDiv=panoDiv;
			panoDiv.className='panodiv';
			var rn2="id" + getRandoms(98654);
			panoDiv.style.width='370px';
			panoDiv.style.height='320px';
			if(showStreetView){
				var streetviewTab = new GInfoWindowTab('Street View',panoDiv);
				panoClient.getNearestPanorama(p0,function(pd){
					if (pd.code != 200){
						marker.openInfoWindowTabs([minimapTab]);
					}else{
						myPano.setLocationAndPOV(pd.location.latlng);
						myPano.setContainer(panoDiv);
						panoLoaded=true;
						marker.openInfoWindowTabs([minimapTab,streetviewTab]);
					}
				});
			}else{
				marker.openInfoWindowTabs([minimapTab]);
			}
			setTimeout(function(){
				map2[mIndex]=new GMap2(m2, {draggingCursor: 'pointer'});
				map2[mIndex].setCenter(p0,17,G_HYBRID_MAP); 
				map2[mIndex].addOverlay(mCopy);
				map2[mIndex].addOverlay(poly2);
			},3000);
		};
		GEvent.addListener(marker,"click",onClick);
		GEvent.addListener(polyLine,"click",onClick);
    }
	function createPolyline(pts,epts,elvls,colour,width,opacity,infos,ztype,show){
		if(epts){
			var polyLine=new GPolyline.fromEncoded({
			color: colour,
			weight: width,
			opacity: opacity,
			points: epts,
			zoomFactor: 2,
			levels: elvls,
			numLevels: 18
			});
		}else{
			var polyLine=new GPolyline(pts,colour,width,opacity);
		}
		var f=formatPolyline(infos,ztype);
		GEvent.addListener(polyLine, "click", function(pts) {
			mapLocationStart=map.getCenter();
			map.openInfoWindowHtml(pts,f);
		});
		mArray[ztype].push(polyLine);       
		gLines[lIndex]=polyLine;
		lIndex++;
		if(show){map.addOverlay(polyLine)};
	}
	function formatPolyline(i,t){
		var f='';
		f+='<div style="width:250px;height:120px;">';
		f+='<div class="infobox-content">';
		switch(t){
			case 'net':
				f+= '<img src="/images/links.gif" /><br />'
			break;
			case 'cycle':
				f+='<div class="embolden" style="padding:4px;">The Big Track</div><div style="margin-top:4px;text-align:center;"><a href="http://www.thebigwheel.org.uk/" target="_blank"><img src="/images/infoWindow/bigwheel.gif" /></a></div>';
			default:
			}
		f+=i+'</div></div>';
		return f;
	}
	function createPolygon(epts,elvls,colour,infobox){
		var polygon = new GPolygon.fromEncoded({
			polylines: [{points:epts,levels:elvls,color:colour,opacity:0.5,weight:1,numLevels:18,zoomFactor: 2}],
			fill:true,color:colour,opacity:0.2,outline:true
		});
		return polygon;
	}
	function checkChange(m){
		popArray[m][3]=!popArray[m][3];
		showSelected(m,true,popArray[m][3]);
	}
	function showSelected(which,auto,tf){
		var truefalse;
		if(auto){truefalse=tf;}else{truefalse=!popArray[which][3]};
		switch(which){
			case 'cong':
				obj=document.getElementById('congicon');
				if(truefalse){
					obj.src='/images/icon/congestion-icon-sm1.png';
					obj.alt='Congestion information - selected - click to remove';
				}else{
					obj.src='/images/icon/congestion-icon-sm2.png';
					obj.alt='Congestion information not selected - click to add';
				}
			break;
			case 'RWks':
				obj=document.getElementById('roadicon');
				if(truefalse){
					obj.src='/images/icon/icon-roadworksclick-sm.png';
					obj.alt='Road works information - selected - click to remove';
				}else{
					obj.src='/images/icon/icon-roadworks-sm.png';
					obj.alt='Road works information not selected - click to add';
				}
			break;
			case 'CCTV':
				obj=document.getElementById('cctvicon');
				if(truefalse){
					obj.src='/images/icon/cctv-sm.png';
					obj.alt='CCTV information - selected - click to remove';
				}else{
					obj.src='/images/icon/cctv-sm1.png';
					obj.alt='CCTV information not selected - click to add';
				}
			break;	
			case 'carpark':
				if(showCarParks){
					obj=document.getElementById('parkicon');
					if(truefalse){
						obj.src='/images/icon/park-sm.png';
						obj.alt='Parking information - selected - click to remove';
					}else{
						obj.src='/images/icon/park-sm1.png';
						obj.alt='Parking information not selected - click to add';
					}
				}
			break;
			case 'PIPS':
				if(showJourneyTimes){
					obj=document.getElementById('journeyicon');
					if(truefalse){
						obj.src='/images/icon/journeytimes-sm.png';
						obj.alt='Journey time information - selected - click to remove';
					}else{
						obj.src='/images/icon/journeytimes-sm1.png';
						obj.alt='Journey time information not selected - click to add';
					}
				}
			break;
			case 'net':
				obj=document.getElementById('neticon');
				if(truefalse){
					obj.src='/images/icon/bluetram-sm.png';
					obj.alt='NET line and stop information - selected - click to remove';
				}else{
					obj.src='/images/icon/bluetram-sm1.png';
					obj.alt='NET line and stop information not selected - click to add';
				}
			break;
			case 'Landmark':
				obj=document.getElementById('landmarkicon');
				if(truefalse){
					obj.src='/images/icon/landmark-sm.png';
					obj.alt='Landmark information - selected - click to remove';
				}else{
					obj.src='/images/icon/landmark-sm1.png';
					obj.alt='Landmark information not selected - click to add';
				}
			break;
			case 'cr':
				if(showHighwaysAgency){
					obj=document.getElementById('haicon');
					if(truefalse){
						obj.src='/images/icon/ha-sm.png';
						obj.alt='Highways Agency information - selected - click to remove';
					}else{
						obj.src='/images/icon/ha-sm1.png';
						obj.alt='Highways Agency information not selected - click to add';
					}
				}
			break;
			case 'exit':
				if(showExternalLinks){
					obj=document.getElementById('exiticon');
					if(truefalse){
						obj.src='/images/icon/ex-sm.png';
						obj.alt='Traffic information websites - selected - click to remove';
					}else{
						obj.src='/images/icon/ex-sm1.png';
						obj.alt='Other traffic information websites not selected - click to add';
					}
				}
			break;
			case 'vmsnotts':
				if(showVmsNotts){
					obj=document.getElementById('vmsnottsicon');
					if(truefalse){
						obj.src='/images/icon/vms-sm.png';
						obj.alt='Variable Message Signs - selected - click to remove';
					}else{
						obj.src='/images/icon/vms-sm1.png';
						obj.alt='Variable Message Signs not selected - click to add';
					}
				}
			break;
			default:
		}
		obj.title=obj.alt;
	}
    function load(object,xmldb) {    
		var request=GXmlHttp.create();
		var r=getRandoms(999);
		var nocacheXML=xmldb + "?" + r;
		request.open("GET", nocacheXML, true);
		request.onreadystatechange=function(){
			if (request.readyState == 4) {
				var xmlDoc=request.responseXML;
				//polygons
				var shapes=xmlDoc.documentElement.getElementsByTagName("shape");
				//read each shape
				for (var i=0;i<shapes.length;i++) {
					var ztype=shapes[i].getAttribute("type");
					if (ztype==object) {         
						//line attributes
						var colour=shapes[i].getAttribute("colour");
						var width=parseFloat(shapes[i].getAttribute("width"));
						var epts=GXml.value(shapes[i].getElementsByTagName("epoints")[0]);
						var elvls=GXml.value(shapes[i].getElementsByTagName("elevels")[0]);
						var infobox=GXml.value(shapes[i].getElementsByTagName("infobox")[0]);
						var polygon=createPolygon(epts,elvls,colour,infobox);
						mArray[ztype].push(polygon);
						map.addOverlay(polygon);
						sIndex++;
					}  
				}
				var markers=xmlDoc.documentElement.getElementsByTagName("marker");
				for (var i=0; i < markers.length; i++){
					var ztype=markers[i].getAttribute("type");
					if (ztype==object) {  
						var lat=parseFloat(markers[i].getAttribute("lat"));
						var lng=parseFloat(markers[i].getAttribute("lng"));
						var point=new GLatLng(lat,lng);
						var label=markers[i].getAttribute("label"); 
						var subtype=markers[i].getAttribute("subtype");
						var switchvalue=markers[i].getAttribute("switchvalue");
						var d;//variable to show/hide directions tab
						switch(ztype){
							/**case 'carpark':
								if(lat){
									var carpark=markers[i].getAttribute("name");// + markers[i].getAttribute("location");
									var parked=markers[i].getAttribute("occupancy");
									var spaces=markers[i].getAttribute("spaces");
									var filling=markers[i].getAttribute("fillrate");
									var lastmod=markers[i].getAttribute("lastupdated");
									var override=parseInt(markers[i].getAttribute("override"));
									var state=markers[i].getAttribute("state");
									var stateid=markers[i].getAttribute("stateid");switchvalue=stateid;
									var location=markers[i].getAttribute("location");
									var nodata=markers[i].getAttribute("nodata");
									var data=true;
									//uncomment to remove the non-data car parks
									if(nodata>0){data=false;state='No live data available';switchvalue=10;};
									label=carpark+': '+state;
									var content=formatcarpark(carpark,parked,spaces,filling,lastmod,lat,lng,i,state,data,location);
									d=formatDirectionsObject(carpark + ' car park',lat,lng);
								}
							break;**/
							case 'incident':
								var rdnum=markers[i].getAttribute("roadnumber");
								var rdname=markers[i].getAttribute("roadname");
								var start=markers[i].getAttribute("start");
								var finish=markers[i].getAttribute("finish");
								var description=markers[i].getAttribute("description");
								var advice=markers[i].getAttribute("advice");
								var locale=markers[i].getAttribute("locale");
								d=false;
								var content=rdnum+": "+rdname+", "+locale+"<br />"+advice+"<br />"+description;
								label="Incident: "+rdnum+": "+rdname;
							break;
							case 'CCTV':
								var locations=markers[i].getElementsByTagName("location");
								var lox=[];
								for(var n=0;n<locations.length;n++){
									lox[n]=GXml.value(locations[n]);
								}
								var camimage=markers[i].getAttribute("image");
								var id=markers[i].getAttribute("id");
								d=true;
								switchvalue=false;
								var content=formatCCTV(id,lox,camimage,lat,lng,i);
							break;
							case 'Speed':
								var dat=markers[i].getAttribute("startdate");
								var subtype=markers[i].getAttribute("camtype");
								var spd=markers[i].getAttribute("limit");
								var mfr=markers[i].getAttribute("mfr");
								var dir=markers[i].getAttribute("direction");
								var ref=markers[i].getAttribute("ref");
								var content=formatSpeed(label,dat,subtype,spd,mfr,dir,ref,lat,lng,i);
								d=false;
							break;
							case 'netstops':
								var sh=markers[i].getAttribute("linkname");
								var content=formatNetstops(label,sh);
								d=formatDirectionsObject(label + ' NET stop',lat,lng);
							break;
							case 'nr':
								var id=markers[i].getAttribute("id");
								var content=formatRail(label,id);
								d=formatDirectionsObject(label + ' station',lat,lng);
							break;
							case 'Landmark':
								var link=markers[i].getAttribute("link");
								var content=formatLandmarks(label,i,subtype,link);
								d=formatDirectionsObject(label + '',lat,lng);
							break;
							case 'vms':
								var aspect=markers[i].getAttribute("legend");
								var key=markers[i].getAttribute("key");
								var name=markers[i].getAttribute("name");
								var carriageway=markers[i].getAttribute("carriageway");
								var cols=markers[i].getAttribute("cols");
								var rows=markers[i].getAttribute("rows");
								var label=name;
								var content=formatMatrices(aspect,key,name,carriageway,cols,rows);
								d=false;
							break;
							case 'matrix':
								var carriageway=markers[i].getAttribute("carriageway");
								var aspect=markers[i].getAttribute("aspect");
								var key=markers[i].getAttribute("key");
								var name=markers[i].getAttribute("name");
								var label=name;
								var content=formatMatrices(aspect,key,name,carriageway,4,1);
								d=false;
							break;
							case 'cr':
								var ld=markers[i].getElementsByTagName("location");
								var com=GXml.value(markers[i].getElementsByTagName("comment")[0]);
								var st=GXml.value(markers[i].getElementsByTagName("startTime")[0]);
								var ft=GXml.value(markers[i].getElementsByTagName("endTime")[0]);
								var loc=ld[0].getAttribute("loc");
								lat=ld[0].getAttribute("lat");
								lng=ld[0].getAttribute("lng");
								var pn=new GLatLng(lat,lng);
								var label=subtype + ": " + loc;
								var content=formatNTCC(loc,false,st,com,"",i,ft,"");
								d=false;
							break;
							case 'fr':
								var ld=markers[i].getElementsByTagName("location");
								var com=GXml.value(markers[i].getElementsByTagName("comment")[0]);
								var st=GXml.value(markers[i].getElementsByTagName("startTime")[0]);
								var ft=GXml.value(markers[i].getElementsByTagName("endTime")[0]);
								var loc=ld[0].getAttribute("loc");
								lat=ld[0].getAttribute("lat");
								lng=ld[0].getAttribute("lng");
								var pn=new GLatLng(lat,lng);
								var label=subtype + ": " + loc;
								var content=formatNTCC(loc,false,st,com,"",i,ft,"");
								d=false;
							break;
							case 'ue':
								var ld=markers[i].getElementsByTagName("location");
								var com=GXml.value(markers[i].getElementsByTagName("comment")[0]);
								var st=GXml.value(markers[i].getElementsByTagName("startTime")[0]);
								var ft=GXml.value(markers[i].getElementsByTagName("endTime")[0]);
								var loc=ld[0].getAttribute("loc");
								var dir=ld[0].getAttribute("dir");
								lat=ld[0].getAttribute("lat");
								lng=ld[0].getAttribute("lng");
								var pn=new GLatLng(lat,lng);
								var label=subtype + ": " + loc;
								var content=formatNTCC(loc,dir,st,com,"",i,ft,"");
								d=false;
							break;
							case 'cp':
								var ld=markers[i].getElementsByTagName("location");
								var com=GXml.value(markers[i].getElementsByTagName("comment")[0]);
								var st=GXml.value(markers[i].getElementsByTagName("startTime")[0]);
								var ft=GXml.value(markers[i].getElementsByTagName("endTime")[0]);
								var loc=ld[0].getAttribute("loc");
								var dir=ld[0].getAttribute("dir");
								lat=ld[0].getAttribute("lat");
								lng=ld[0].getAttribute("lng");
								var pn=new GLatLng(lat,lng);
								var label=subtype + ": " + loc;
								var content=formatNTCC(loc,dir,st,com,"",i,ft,"");
								d=false;
							break;
							case 'works':
								var dat=markers[i].getAttribute("startdate");
								subtype=markers[i].getAttribute("severity");
								label=markers[i].getAttribute("location") + ": " + markers[i].getAttribute("auth");
								content=markers[i].getAttribute("description") + "<br />" + markers[i].getAttribute("location");
								content+="<br />Start: "+markers[i].getAttribute("startTime") + "<br />End: " + markers[i].getAttribute("endTime") + '<br />Area:' + markers[i].getAttribute("area") +'<br />Locale:' + markers[i].getAttribute("locale") +'<br />Name:' + markers[i].getAttribute("roadname") + '<br />Type:' + markers[i].getAttribute("consequence");
								d=false;
							break;
							case 'svms':
								var content='';
								var vmsfront='';
								var bankname=vmsbanks[v].getAttribute('bank_label');
								var signtext=vmsbanks[v].getAttribute('text_string');
								//var banktimetable=vmsbanks[v].getAttribute('f8');
								//var bankstd=vmsbanks[v].getAttribute('f5');
								var bankset=vmsbanks[v].getAttribute('set_time');
								var bankid=vmsbanks[v].getAttribute('sign_name');
								//var bankorder=vmsbanks[v].getAttribute('f1');
								var bankrows=vmsbanks[v].getAttribute('bank_rows');
								var bankcols=vmsbanks[v].getAttribute('bank_cols');
								//var bankstatus=parseInt(vmsbanks[v].getAttribute('f9'));
								//var signtext='';
								/**switch(bankstatus){
									case 162:
										signtext+=bankoverride;
									break;
									case 128:
										signtext+=banktimetable;
									break;
									default:
										signtext+=bankstd;
								}**/
								//debugElement.innerHTML+="bankcols="+bankcols+"<br />";
								//debugElement.innerHTML+="bankrows="+bankrows+"<br />";
								if(bankrows>1){
									for(var t=0;t<bankrows;t++){
										var bct=bankcols*t;
										var tmq=signtext.substring(bct,(parseInt(bct)+parseInt(bankcols)));
										if(t>0){cf+='<br />'};
										cf+=tmq;
										vmsfront+=tmq;
									}
									cf+="<br />Last update: "+bankset;
								}else{
									var tmq=signtext.substring((bankorder-1)*bankcols,(bankorder-1)*bankcols+parseInt(bankcols));
									cf+=bankname+" - ";
									cf+=tmq+"<br />Last update: "+bankset+"<br />";
									vmsfront+=tmq+"<br />";
								}
								content = formatNTCC("Variable Message Sign "+bankid,'','','',cf,0,'','',"Location:<br />"+banklabel)
								var marker=createMarker(point,content,ztype,vmsfront,loc,false,false);
								map.addOverlay(marker);
							break;
							default:
						}
					}else{};
					if(isNaN(lat)==false){
						if(pn){
							var marker=createMarker(pn,content,ztype,label,subtype,switchvalue,d);
							map.addOverlay(marker);	
						}else{
							if(ztype!='Speed'||(showMobileCameras||subtype!='Mobile')){
								var marker=createMarker(point,content,ztype,label,subtype,switchvalue,d);
								map.addOverlay(marker);	
							}
						}
					}
				}
				//Polylines
				var lines=xmlDoc.documentElement.getElementsByTagName("line");
				for (var a=0; a < lines.length; a++) {
					var ztype=lines[a].getAttribute("type");
					if (ztype==object) {         
						var sta=lines[a].getAttribute("status");
						var nam=lines[a].getAttribute("name");
						var epts=GXml.value(lines[a].getElementsByTagName("epoints")[0]);
						var elvls=GXml.value(lines[a].getElementsByTagName("elevels")[0]);
						var phase=lines[a].getAttribute("phase");
						if(phase){
							var inf='NET phase ' + phase + ': '+ nam;
							inf+= '<br />Status: ' + sta;
							var colour='#11635c'; //hard-wired to the NET colours
						}else{
							//this is the Big Track - fudge
							var colour='#9973a6';//big wheel colour
							var inf='Car-free cycle loop';
						}
						var opacity=0.8;
						if(sta=='proposed'){opacity=0.4;};
						var width =4;
						if(!epts){//if there aren't any encoded points values then load, otherwise save some memory...
							var points=lines[a].getElementsByTagName("point");
							var pts=[];
							for (i=0; i < points.length; i++) {
								pts[i]=new GLatLng(parseFloat(points[i].getAttribute("lat")),parseFloat(points[i].getAttribute("lng")));
							}
						}
						createPolyline(pts,epts,elvls,colour,width,opacity,inf,ztype,true);
					}  
				}
				// Snakes
				var snakes=xmlDoc.documentElement.getElementsByTagName("snake");
				for (a=0; a < snakes.length; a++) {
					ztype=snakes[a].getAttribute("type");
					if (ztype==object) {         
         
						colour=snakes[a].getAttribute("colour");
						width =parseFloat(snakes[a].getAttribute("width"));
						label=snakes[a].getAttribute("label");
						points=snakes[a].getElementsByTagName("point");
						var density="";
						switch (colour){
						case '3':
							density="above average";
							break;
						case '2':
						density="average";
							break;
						default:
							density="Error...";
						}
						var xmls=formatCong(GXml.value(snakes[a].getElementsByTagName("location")[0]),GXml.value(snakes[a].getElementsByTagName("trend")[0]),density,parseFloat(points[0].getAttribute("lat")),parseFloat(points[0].getAttribute("lng")),mIndex,a);
						var pts=[];
						var nq=false;
						//hack to fix issues with A609 detector loop
						for (i=0; i < points.length; i++) {
							if(points[i].getAttribute("lat")!=""){
								nq=true;
								pts[i]=new GLatLng(parseFloat(points[i].getAttribute("lat")),parseFloat(points[i].getAttribute("lng")));
							}
						}
						if(nq){arrowHead(pts,colour,width,label,xmls,ztype)};
						
					} 
				} // end of snakes loop
				//NTCC time sections
				var time=xmlDoc.documentElement.getElementsByTagName("timesection");
				for(var a=0;a<time.length;a++){
					var width ='6';
					var to=new GLatLng(parseFloat(time[a].getElementsByTagName("to")[0].getAttribute("lat")),parseFloat(time[a].getElementsByTagName("to")[0].getAttribute("lng")));
					var from=new GLatLng(parseFloat(time[a].getElementsByTagName("from")[0].getAttribute("lat")),parseFloat(time[a].getElementsByTagName("from")[0].getAttribute("lng")));
					var valid=time[a].getAttribute("valid");
					var actual=time[a].getAttribute("actual");
					var expected=time[a].getAttribute("expected");
					var name=time[a].getAttribute("name");
					var carriageway=time[a].getAttribute("carriageway");
					var wn=new Date(s2d(actual).getTime()-s2d(expected).getTime());
					var wt=wn.getTime();
					od="+"+s2t(wt/1000)
					var pts=[];
					pts[1]=to;
					pts[0]=from;
					createPolyline(pts,false,false,'#FFFF00',4,0.8,name+' '+actual,'ts',false);
					var llb=gLines[lIndex-1].getBounds();
					var marker=createMarker(llb.getCenter(),formatNTCC(name,carriageway,valid,'','DELAY: '+od+'<br />Average time '+s2t(actual)+'<br />Expected '+s2t(expected)+'',0,'','',''),"ts",name+' - Journey time '+s2t(actual),od,false,false,lIndex-1);
					map.addOverlay(marker);
				} // end of NTCC Timesection loop
				//Parksmart & zones
				var zone=xmlDoc.documentElement.getElementsByTagName("zone");
				//alert(type);
				for(var a=0;a<zone.length;a++){
					//alert(type);
						var zonename=zone[a].getAttribute("name");
						var carparks=zone[a].getElementsByTagName("carpark");
						for(var b=0;b<carparks.length;b++){
							var lat=parseFloat(carparks[b].getAttribute("lat"));
							var lng=parseFloat(carparks[b].getAttribute("lng"));
							var latlng=new GLatLng(lat,lng);
							var carparkname=carparks[b].getAttribute("name");
							var capacity=carparks[b].getAttribute("capacity");
							var occupancy=carparks[b].getAttribute("occupancy");
							var fillrate=carparks[b].getAttribute("fillrate");
							var nodata=carparks[b].getAttribute("nodata");
							//alert(carparkname+": "+nodata);
							var state=carparks[b].getAttribute("state");
							var stateid=carparks[b].getAttribute("stateid");
							var data=true;//for use if we need to remove the nodata car parks
							if(nodata>0){data=false;state='No live data available';stateid=10;};
							var lastupdated=carparks[b].getAttribute("lastupdated");
							var detailobj=carparks[b].getElementsByTagName("carparkdetails")[0];
							d=formatDirectionsObject(carparkname+' car park',lat,lng);
							if(detailobj){
								var carparktype=detailobj.getAttribute("type");
								var tel=detailobj.getAttribute("tel");
								var address=detailobj.getAttribute("address");
								var operator=detailobj.getAttribute("operator");
								var specialclosures=detailobj.getAttribute("specialclosures");
								var url=detailobj.getAttribute("url");
								var openingweekdays=sb(detailobj.getAttribute("openingweekdays"));
								var closingweekdays=sb(detailobj.getAttribute("closingweekdays"));
								var openingsaturdays=sb(detailobj.getAttribute("openingsaturdays"));
								var closingsaturdays=sb(detailobj.getAttribute("closingsaturdays"));
								var openingsundays=sb(detailobj.getAttribute("openingsundays"));
								var closingsundays=sb(detailobj.getAttribute("closingsundays"));
								var prices=detailobj.getAttribute("prices");
								//createMarker(point,info,type,label,subtype,switchvalue,d,lineId)
								var marker=createMarker(latlng,formatParksmart(zonename,carparkname,capacity,occupancy,fillrate,data,state,lastupdated,carparktype,tel,address,operator,specialclosures,url,openingweekdays,closingweekdays,openingsaturdays,closingsaturdays,openingsundays,closingsundays,prices),"carpark",carparkname+": "+state+" ("+zonename+")","",stateid,"",d);
							}else{
								var marker=createMarker(latlng,formatParksmart(zonename,carparkname,capacity,occupancy,fillrate,nodata,state,lastupdated,carparktype,"","","","unknown","","unknown","","unknown","","unknown","","unknown"),"carpark",carparkname+": "+state+" ("+zonename+")","",stateid,"",d);
							}
							map.addOverlay(marker);
						}
					
				} // end of Parksmart loop
				//Siespace VMS signs
				var vmsnotts=xmlDoc.documentElement.getElementsByTagName("sign");
				for (var a=0; a < vmsnotts.length; a++) {
					var ztype=vmsnotts[a].getAttribute("type");
					if (ztype==object) {         
						var point=new GLatLng(parseFloat(vmsnotts[a].getAttribute("f3")),parseFloat(vmsnotts[a].getAttribute("f4")));
						var content='';
						var vmsfront='';
						var vid=vmsnotts[a].getAttribute('f1');
						var loc=vmsnotts[a].getAttribute('f2');
						var vmsbanks = vmsnotts[a].getElementsByTagName("bank");
						var cf='';
						for(var v=0;v<vmsbanks.length;v++){
							var bankname=vmsbanks[v].getAttribute('f2');
							var bankoverride=vmsbanks[v].getAttribute('f7');
							var banktimetable=vmsbanks[v].getAttribute('f8');
							var bankstd=vmsbanks[v].getAttribute('f5');
							var bankset=vmsbanks[v].getAttribute('f6');
							var bankid=vmsbanks[v].getAttribute('f0');
							var bankorder=vmsbanks[v].getAttribute('f1');
							var bankrows=vmsbanks[v].getAttribute('f3');
							var bankcols=vmsbanks[v].getAttribute('f4');
							var bankstatus=parseInt(vmsbanks[v].getAttribute('f9'));
							var signtext='';
							switch(bankstatus){
								case 162:
									signtext+=bankoverride;
								break;
								case 128:
									signtext+=banktimetable;
								break;
								default:
									signtext+=bankstd;
							}
							debugElement.innerHTML+="bankcols="+bankcols+"<br />";
								debugElement.innerHTML+="bankrows="+bankrows+"<br />";
							if(bankrows>1){
								for(var t=0;t<bankrows;t++){
									var bct=bankcols*t;

									var tmq=signtext.substring(bct,(parseInt(bct)+parseInt(bankcols)));
									if(t>0){cf+='<br />'};
									cf+=tmq;
									vmsfront+=tmq;
								}
								cf+="<br />Last update: "+bankset;
							}else{
								var tmq=signtext.substring((bankorder-1)*bankcols,(bankorder-1)*bankcols+parseInt(bankcols));
								cf+=bankname+" - ";
								cf+=tmq+"<br />Last update: "+bankset+"<br />";
								vmsfront+=tmq+"<br />";
							}
						}
						content = formatNTCC("Variable Message Sign "+vid,'','','',cf,0,'','',"Location:<br />"+loc)
						var marker=createMarker(point,content,ztype,vmsfront,loc,false,false);
						map.addOverlay(marker);
					}  
				}
			}
		};
		request.send(null); 
	}// end of load function...
    function Reload(){
		map.clearOverlays();
		gMarkers=null;
		gLines=null;
		mArray=null;
		gMarkers=[];
		gLines=[];
		mArray=[];
		mIndex=0;
		for (var c=0;c<popItems.length;c++) 
		{
			var item=popItems[c];
			var xmldb=popArray[item][0];
			mArray[item]=[];
			if (popArray[item][3]){
				load(item,xmldb);showSelected(item,true,true);
			}else{
				showSelected(item,true,false);
			}
		}
		if(cpReload){
			infoElement.innerHTML=globalLoadBox;
			setTimeout(function(){pop(currentPane);pop('incident');},mapInitialTimeout);
		}
	}
	function setupDirections(){
		GEvent.addListener(gdir, "error", function(){
			if(!ww){
				ww=true;
				getDirections();
			}else{
				var code=gdir.getStatus().code;
				var reason="Code "+code;
				alert("Couldn't find directions here :(\n"+reason);
				ww=false;
			}
		});
		GEvent.addListener(gdir,"load",function(origin){
			ww=false;//reset to default upon success
			infoElement.innerHTML=printClearDirections;
			var pd=gdir.getPolyline();
			var bd= pd.getBounds();
			var route=gdir.getRoute(0);
			var r=pd.getVertexCount()%2; //vertex mod 2
			var q=(pd.getVertexCount()-r)/2;
		    q=Math.floor(q);
			var geostart=route.getStartGeocode();
			var geoend=route.getEndGeocode();
			var tmp=globalDir.split('@');
			var out='<div style="font-size:8pt;text-align:center;font-weight:bold;">From: ';
			out+=geostart.address+'<br />to '+geoend.address+'</div>';
			out+='<div style="font-size:8pt;text-align:center;">'+route.getSummaryHtml();
			out+=printClearDirections+'</div>';
			map.openInfoWindowHtml(pd.getVertex(q),out);
			var pdt=pd;
			GEvent.addListener(pdt,"click",function(point){
				map.openInfoWindowHtml(point,out);
			});
		});
	}
	function getDirections(){
		var origin=document.getElementById("origin").value;
		var daddr=document.getElementById("daddr").value;
		if(!ww){globalDir="from: "+origin+s+" to: "+daddr;}else{globalDir="from: "+origin+" to: "+daddr;}
		gdir.load(globalDir);
	}
	function clearDirections(){
		map.closeInfoWindow();
		gdir.clear();
	}
	function printWindow(){
		window.open('/printmap.asp?str=' + escape(globalDir),'_blank','toolbar=yes,directories=yes,location=no,status=no,menubar=yes,resizable=yes,scrollbars=yes, width=750, height=600');
	}
	//Format: trivial(ie non-size related attributes) need to be classed.
	function formatCong(loc,tre,den,lat,lng,id,a){
		var out='<h1>'+loc+'</h1>';
		out+='<div>Trend [last 5 minutes]: <span class="'+tre+'">'+tre+'</span></div>';
		out+='<div>Traffic density is '+den+' for the current time period.</div></div>';
		return out;
	}
	function formatCCTV(id,str,camimage,lat,lng,i){
		//This fits in the whole window, not the minimap text container
		var out='<div class="fulltext"><h1>';var pass='';
		for(var n=0;n<str.length;n++){
			if(n>0){out+=' / ';pass+=' / ';};
			out+=str[n];
			pass+=str[n];
		}
		out+= '</h1>';
		out+='<img id="cam'+id+'" style="height:240px;width:320px;" src="../' + camimage + '?rnd='+getRandoms(9999)+'"></img>';
		out+='<br /><a href="#" onclick="javascript:refreshImage(\''+id+'\',\''+camimage+'\');">Reload</a>&nbsp;&nbsp;&nbsp;<a href="#" onclick="javascript:openWindow(\''+camimage+'\',\''+pass+'\')">Open in separate window</a>'
		out+= '</div>';
		return out;
	}
	function formatcarpark(carpark,parked,spaces,filling,lastmod,lat,lng,i,state,data,location){
		var tmpstr='';var out='<div>';
		if(data){
			if(filling>0){tmpstr='Filling at the rate of ';}else{tmpstr='Emptying at the rate of ';filling *= (-1);}
			out+='<h1>'+carpark+': '+state+'</h1>';
			out+='<div>'+location+'</div>';
			out+= '<div>Vehicles parked: '+parked+'</div>';
			out+= '<div>Spaces remaining: '+spaces+'</div>';
			out+=tmpstr+filling+' vehicles/hour.</div>';			
		}else{
			out+='<h1>'+carpark+'</h1>'
			out+='<div>'+location+'</div>';
			out+='No live data available.</div>';
		}
		return out;
	}
	function formatParksmart(zone,carparkname,capacity,occupancy,fillrate,data,state,lastupdated,type,tel,address,operator,specialclosures,url,openingweekdays,closingweekdays,openingsaturdays,closingsaturdays,openingsundays,closingsundays,prices){
		var tmpstr='<div>';var out='<div>';
		if(fillrate>0){tmpstr='Filling at the rate of ';}else{tmpstr='Emptying at the rate of ';fillrate *= (-1);}
		out+='<h1>'+carparkname+' - '+zone+'</h1>';
		out+='<div>'+address+'</div>';
		out+='<div>'+tel+'</div>';
		out+='<h2>'+state+'</h2>';
		out+= '<div>Last updated: '+lastupdated+'</div>';
		if(data){out+= '<div>Vehicles parked: '+occupancy+'</div>';out+= '<div>Spaces remaining: '+(parseInt(capacity)-parseInt(occupancy))+'</div>';out+=tmpstr+fillrate+' vehicles/hour.</div>';};
		out+='<div>Operated by: '+operator+'</div>';
		out+='<h2>Opening times</h2><ul>';
		out+='<li>Weekdays: '+openingweekdays+'-'+closingweekdays+'</li>';
		out+='<li>Saturdays: '+openingsaturdays+'-'+closingsaturdays+'</li>';
		out+='<li>Sundays: '+openingsundays+'-'+closingsundays+'</li>';
		out+='<li>Special closures: '+specialclosures+'</li></ul>';
		out+='<h2>Prices</h2>';
		out+='<div>'+prices+'</div>';
		out+='</div>';
		return out;
	}
	function sb(time){
		if(time.charAt(8)=="."){return time.substr(0,5)}else{return time};
	}
	function formatNetstops(label,stop){
		var info='<div class="minimaptext"><h1>Nottingham Express Transit</h1><img src="/images/links.gif" />';
		info+= '<div>NET Phase 1 stop: '+label+'</div>';
		info+= '<div><a href="http://www.thetram.net/times/timetable_stops_full.asp?FromStop='+stop+'" target="_blank">Get tram times from this stop...</a></div></div>';
		return info;
	}
	function formatRail(label,id){
		var info='<div class="minimaptext"><h1>National Rail network</h1>';
		info+='<div>'+ label+'</div>';
		info+='<div><a href="http://www.livedepartureboards.co.uk/ldb/station.aspx?T='+id+'" target="_blank">View live departure board</a> (opens in external window)</div>';
		return info;
	}
	function formatLandmarks(label,index,subtype,link){
		var info='<div class="minimaptext"><h1>'+label+'</h1>';
		info+= '<div>Note that this marker has been chosen to represent the road entrance and/or car parking facility for directional purposes.<div>';
		if(link){info+='<div><a href="'+link+'" target="_blank">Open link to official website</a></div>'};
		info+='</div>';
		return info;
	}
	function formatMatrices(legend,key,name,carriageway,cols,rows){
		var info='<div class="minimaptext">';
		info+= '<h1>'+name+'</h1>';
		info+= '<div class="matrix">';
		cols-=1;
		for(var a=0;a<rows;a++){
			info+=legend.substr(a*cols,cols)+'<br />';
		}
		info+= '</div><div>';
		info+= carriageway + ' carriageway.';
		info+= '<br />Reason: ' + key;
		info+= '<br />Rows, cols: ' + rows + "," + cols;
		info+= '</div></div>';
		return info;
	}
	function formatNTCC(location,carriageway,valid,reason,aspect,index,until,description,addenda){
		var info='<div class="minimaptext">';
		info+= '<h1>'+location+'</h1>';
		if(aspect){info+= '<div class="matrix">'+aspect+'</div>'};
		if(reason){info+= '<div>'+reason+'</div>'};
		if(description){info+='<div>'+description+'</div>'};
		if(carriageway){info+='<div>'+carriageway + ' carriageway.</div>'};
		if(valid){info+='<div>Valid from: '+valid+'</div>'};
		if(until){info+= '<div>Expected finish: '+until+'</div>'};
		if(addenda){info+=addenda};
		info+= '</div>';
		return info;
	}
function formatRoadworks(id,dClass,dType,rNumber,rName,locale,ntwAreas,lDescription,aDescription,starts,finishes,wHours,dWeek,lat,lng,sev,source,cName,cPhone,j){
		var out='<h1>';
		out+= aDescription;
		out+= '</h1><div style="text-align:center;font-size:9pt;font-weight:bold;">' + rName + ', ' + locale + '<br />Severity: ' + sev;
		out+= '</div><div style="text-align:center;font-size:8pt;color:#000;">';
		out+= dType;
		out+= '<div style="text-align:center;font-size:8pt;color:#008;">';
		out+= 'Starting:' + formatDate(returnDates(starts)) + ' Finishing: ' + formatDate(returnDates(finishes)) + '</div>';
		out+= '<div>Works untertaken by: ';
		out+= source;
		out+= '<div>Long description: ' + lDescription + '</div><div>Days: ' + dWeek + '</div><div>Working hours: ' + wHours + '</div>';
		return out;
	}

//var e=['Radford blvd','Long Eaton','Cheese ln, Dorset','Arnold','NG7','Derby','SE5'];
	function formatDirectionsObject(where,lat,lng){
		//var nm=getRandoms(e.length-1);
		var out='<div class="fulltext"><h1>'+where+'</h1>';
		out+='<form action="javascript:cDirections('+lat+','+lng+')"><table style="margin-left:auto;margin-right:auto;margin-top:5px;"><tr><td><input type="radio" name="rt" id="road" value="road" checked="checked" /></td><td colspan="2" class="s" style="padding-bottom:5px;text-align:left;">Directions by Road: For accurate results, please use a place name, road name, or postal code. <b>Postal code accuracy varies, so please try place name first.</b></td></tr>';
		out+='<tr><td><input type="radio" name="rt" id="public" value="public" /></td><td colspan="2" class="s" style="padding-bottom:5px;text-align:left;">Directions by <i>Local</i> public transport: For accurate results, please use a full postcode.</td></tr>';
		out+='<tr><td><input type="radio" name="rt" id="national" value="national" /></td><td colspan="2" class="s" style="padding-bottom:5px;text-align:left;">Directions by <i>National</i> Public transport: This uses public transport timetable links (including National Rail) throughout the country, and is best suited for distance travel. Please use a full postcode.</td></tr>';
		out+='<tr><td class="s" style="text-align:right;font-weight:bold;">Origin: </td><td class="s">' + '<input type="text" size="20" name="origin" id="origin" value="Arnold" style="padding-left:4px;color:#666;" />' + '</td><td class="s"><input value="Go" type="submit"><input type="hidden" id="daddr" value="'+where+'@'+ lat + ',' + lng + '"/><input type="hidden" id="destination" value="'+where+'" /></td></tr></td></tr></table></form></div>';
		return out;
	}
	/**End of formatting section**/
	function cDirections(lat,lng){
		if(document.getElementById('road').checked){
			getDirections();
		}else if(document.getElementById('public').checked){
			sendTT();
		}else{
			sendTDInfo(lat,lng);
		}
	}
	function sendTDInfo(lat,lng){
		var wgs84=new GT_WGS84();
		wgs84.setDegrees(lat,lng);	
		osgb=wgs84.getOSGB();
		var origin=document.getElementById("origin").value;
		var daddr=document.getElementById("destination").value;
		var today=new Date();
		var query="http://www.transportdirect.info/transportdirect/en/journeyplanning/jplandingpage.aspx?";
		query+= "id=http://www.nottinghamtravelwise.org.uk/";
		query+= "&do=en"; //This reads: destination object=easting/northing
		query+= "&dn=" + daddr;
		query+= "&d=" + osgb.eastings + "," + osgb.northings; 
		query+= "&oo=p&o=" + origin; //set as postcode
		query+= "&p=1";
		var newWindow=window.open(query,'_blank','','');
	}	
	function tM(n){
		GEvent.trigger(gMarkers[n],'click');
	}
	function reset(){
		if(mapLocationStart){
			map.panTo(mapLocationStart);
		}
	}
	function go(num){
		if(num!=null){
			if(isIE){
				setTimeout(function(){tM(num)},100);
			}else{
				setTimeout(tM,100,num);
			}
		}
	}
	function go2(lat,lng,num,zoom){
		if(!num){
			map.setCenter(new GLatLng(lat,lng),zoom);
		}else{
			go(num);
		}
	}
	function smb(id){
		map.showMapBlowup(gMarkers[id].getLatLng());
	}
	var dt=true;
	function fill(which){
		if(which.length>0){
			infoElement.innerHTML='';
			for(var a=0;a<which.length;a++){
				if(which[a]!='undefined'){
					infoElement.innerHTML+= which[a];
				}
			}
		}
	}
	function pop(xt){
		if(popArray[xt][1]){
			if(!popArray[xt][3]){
				checkChange(xt);
				load(xt,popArray[xt][0]);
			}
			setTimeout(function(){fill(popArray[xt][2])},mapWait);
		}else{
			if(!popArray[xt][3]){
				checkChange(xt);
				load(xt,popArray[xt][0]);
			}
		}
		currentPane=xt;
	}
	function haDropdown(){
		if(showHighwaysAgency){haDropdownElement.style.display='block'};
	}
	function clearDropdowns(){
		if(showHighwaysAgency){haDropdownElement.style.display='none'};
	}
	function showAllHighwaysData(){
		checkChange('vms');LoadUnload('vms');checkChange('matrix');LoadUnload('matrix');checkChange('fr');LoadUnload('fr');checkChange('cr');LoadUnload('cr');checkChange('ue');LoadUnload('ue');checkChange('cp');LoadUnload('cp');checkChange('ts');LoadUnload('ts');
		var q=['vms','cr','fr','ue','cp','ts'];
		for(var p=0;p<q.length;p++){document.getElementById(q[p]).checked=!document.getElementById(q[p]).checked;};
	}
	function showPolyLine(i){
		map.addOverlay(gLines[i]);
	}
	function hidePolyline(i){
		map.removeOverlay(gLines[i]);
	}
	function refreshImage(id,camimage){
		document.getElementById('cam'+id).src='/images/ajaxload/loaderlarge.gif';
		document.getElementById('cam'+id).src='../'+camimage+'?rnd='+getRandoms(999);
	}
	function openWindow(camimage,locations){
		var nw=window.open('/cam.asp?image='+camimage+'&locations='+locations,'_blank','height=300,width=300,location=no');//+camimage
	}
	function createPanorama(target){
		var pan=newGStreetViewPanorama(panoElement);
		pan.setLocationAndPOV(getNearestPanoramaLatLng(target));
	}