<!-- ============================================================================== -->
<!-- Google Maps API V2                                              -->
<!-- ============================================================================== -->
document.write('<script type="text/javascript" src="textualZoomControl.js" ></script>');
document.write('<script type="text/javascript" src="progressbarcontrol.js" ></script>');
document.write('<script type="text/javascript" src="cookies.js" ></script>');


// Google map.
var _map = null;

var overarchingArea = null;
var overarchingAreaZoom = null;

// Clusterers
var _clustererTaxi12 = null;
var _clustererTaxi24 = null;
var _clustererBlueBadge = null;
var _clustererWhizzGo = null;
var _clustererCarPark = null;
var _clustererBusStation = null;
var _clustererCctv = null;
var _clustererHacctv = null;
var _clustererRoadworks = null;

var miniMap = null;

// markers to display on map, populated from XML files
var _markers = null;

// location data for markers
var _locations = null;

//progress control
var _progressControl = null;

// current tooltip to display
var _tooltip = document.createElement("div");

// text to display on infowindow
var _text = '';

var _minimumZoomLevel = 9; //the minimum level the user can zoom out to. (i.e. out the way)

var mapBounds = new GLatLngBounds(new GLatLng(50.71056752191916,-0.9598281932566091),new GLatLng(51.176944200854386,0.04850040620971988));
    
var _cookie = "";
//default timescale (0=current)
var _timescale = 0;

//var found;

  
<!-- ============================================================-->
<!-- initMap                                                     -->
<!-- this is called by the map_tab.jsp to show the map. 	     -->   
<!-- if ID is null it is an overview map showing ALL events, if  -->
<!-- ID is not null we are displaying an event on the map	     -->
<!-- ============================================================-->
function initMap(doc, lat, lon, zoom, id, timescale, evtFocus) 
{
    //load icon cookie
    loadIconCookie();
	
    _markers = new Array();
    _locations = new Array();
    
    //found = false;
    
    //timescale
    _timescale = timescale;       
    setTimescaleDropdown(timescale);
    setTownDropdownFromCookie();
      
    var opacity=0.25;
    var n_buttonText="Map"; //Text that shows up on the button for the custom layer (n=normal, s=sa
    var s_buttonText="Satellite";
    
    // add a copyright logo to the map
    var copyright = new GCopyright(1,
                              new GLatLngBounds(new GLatLng(-90, -180),
                                                new GLatLng(90, 180)),
                              0,
                              "<a href=\"http://www.mottmac.com\">Mott MacDonald</a>");
                                                            
    var copyrightCollection = new GCopyrightCollection("");
    copyrightCollection.addCopyright(copyright); 
        
    // show the map
    _map = new GMap2(doc.getElementById("map"));
    
    // forces the module to be loaded without actually displaying anything.
    // Introduced as a bug fix for the infoWindow minimap (see createMarker onclick method)
    _map.getInfoWindow().show();
    
    createClusters()

    var zoomInt = parseInt(zoom);
    var longInt = parseFloat(lon);
    var latInt = parseFloat(lat);
	
    //if no targeted event focus set map focus to user defined default settings
    if(new Boolean(evtFocus)==false){
		//Check for user defined and saved map focus and zoom level
		var c_mapfocus = getCookie('mapfocusstate');
		if(c_mapfocus.length > 0){
		//if cookie exists - split it
			var c_array = c_mapfocus.split(":", 3)
			latInt = parseFloat(c_array[0]);
			longInt = parseFloat(c_array[1]);
			zoomInt = parseInt(c_array[2]);
		}
	}


	  
    //Otherwise set to default
    _map.setCenter(new GLatLng(latInt, longInt), zoomInt);

    _map.addControl(new GOverviewMapControl(new GSize(150,150)));
    _map.addControl(new TextualZoomControl());
    _map.addControl(new GLargeMapControl());
    _map.addControl(new GMapTypeControl());
    
    _map.enableDoubleClickZoom();
    
    //Add a click listener to clear ajax timeout on infowindow close
    GEvent.addListener(_map, "infowindowclose", function(){
    	minimiseImage();
       	clearImgRefreshInterval();
       	clearHanetImgRefreshInterval();
       	clearCarparkInfoRefreshCycle();
    });
    
    //initialise incident/accident/event/vms refresh timer
    trafficDataAjaxCycle = setTimeout(function(){doTrafficDataRefresh()}, trafficDataAjaxCycleRate);

    showSearchToolBar();

    if (!id)
    {
        zoom_town();
    }

    // and load the markers
    loadMarkers(id);
    
}

<!-- ====================================-->
<!-- Shows a google search bar at        -->
<!-- bottom left on the map.             -->
<!-- ====================================-->
function showSearchToolBar()
{
    _map.enableGoogleBar();

    var uiOptions = _map.getDefaultUI();
    uiOptions.controls.scalecontrol = false;
    uiOptions.controls.maptypecontrol = false;
    uiOptions.controls.smallzoomcontrol3d = false;
	uiOptions.controls.largemapcontrol3d = false;
    _map.setUI(uiOptions);

}

<!-- ====================================-->
<!-- removeEvents                        -->
<!-- Removes events on the map           -->
<!-- ====================================-->
function removeEvents(typeOfEvent)
{
	_map.closeInfoWindow();

	// first remove all the event markers
	for (var i=0; i <_markers.length; i++) 
	{	
		if (_markers[i].type == typeOfEvent)
		{
			//_map.removeOverlay(_markers[i] );
			removeNormalOrClusteredOverlay(typeOfEvent, _markers[i]);
		}
	}
	
}

<!-- ====================================-->
<!-- removeEvents                        -->
<!-- Removes events on the map           -->
<!-- ====================================-->
function removeAllEvents()
{
	_map.closeInfoWindow();

	// first remove all the event markers
	for (var i=0; i <_markers.length; i++) 
	{
		//_map.removeOverlay(_markers[i] );
		removeNormalOrClusteredOverlay(_markers[i].type, _markers[i]);
	}

}

<!-- ==================================-->
<!-- addEvents                         -->
<!-- Adds events to the map            -->
<!-- ==================================-->
function addEvents(typeOfEvent)
{	
	_timescale = parseInt(dwr.util.byId('timescalelist').value);

	for (var i=0; i <_markers.length; i++) 
	{	
		if (_markers[i].type == typeOfEvent)
		{
			
			//show appropriate timescale
			var m_tscale = _markers[i].timescale;

			if(m_tscale!=null){
				if(_timescale >= m_tscale){
					//_map.addOverlay(_markers[i] );
					addNormalOrClusteredOverlay(typeOfEvent, _markers[i]);
				}				
			}
		
		}
	}
}

<!-- =======================================================-->
<!-- showEvents                                             -->
<!-- Shows events on the map by using the overlay           -->
<!-- =======================================================-->
function showEvents()
{
   _map.closeInfoWindow();
		
   if (_markers != null)
   {

	//createRoadworkCluster();
	// first remove all the event markers
	for (var i=0; i <_markers.length; i++) 
	{
		if (_markers[i].type == 'Roadworks' || _markers[i].type == 'Accidents' || _markers[i].type == 'Incidents' || _markers[i].type == 'Events')
		{
			removeNormalOrClusteredOverlay(_markers[i].type, _markers[i]);
		}
	}
	
	var tmpArray = new Array();
	var tmpType1 = "";


var timeScale = parseInt(dwr.util.byId('timescalelist').value);

	for (var i=0; i <_markers.length; i++) 
	{
		
		//show appropriate timescale
		var m_tscale = _markers[i].timescale;
		if(m_tscale!=null)
		{
			//GLog.write('m_tscale ' + m_tscale);
			if(timeScale >= m_tscale)
			{
				if (_markers[i].type == 'Roadworks' && roadworks.valueOf() == 'on') 
				{
					//_map.addOverlay(_markers[i] );
					addNormalOrClusteredOverlay('Roadworks', _markers[i]);
				}
				else if (_markers[i].type == 'Accidents' && accidents.valueOf() == 'on') 
				{
					//_map.addOverlay(_markers[i] );
					addNormalOrClusteredOverlay('Accidents', _markers[i]);
				}
				else if (_markers[i].type == 'Incidents' && incidents.valueOf() == 'on') 
				{
					//_map.addOverlay(_markers[i] );
					addNormalOrClusteredOverlay('Incidents', _markers[i]);
				}

				else if (_markers[i].type == 'Events' && events.valueOf() == 'on') 
				{
					//_map.addOverlay(_markers[i] );
					addNormalOrClusteredOverlay('Events', _markers[i]);
				}
			}				
		}
	}
   }
}

<!-- ============================================================-->
<!-- restrictZoomLevel                                           -->
<!-- Restricts the user from zooming out too far                  -->
<!-- ============================================================-->
function restrictZoomLevel()	
{
	// ====== Restricting the range of Zoom Levels =====
    // Get the list of map types      
    var mt = _map.getMapTypes();
    // Overwrite the getMinimumResolution() and getMaximumResolution() methods
    for (var i=0; i<mt.length; i++) {
        mt[i].getMinimumResolution = function() {return _minimumZoomLevel;}
    }
}

<!-- ============================================================-->
<!-- loadMarkers                                                -->
<!-- Load the map markers into memory from the XML files         -->
<!-- ============================================================-->
/*function loadMarkers(id)
{
	// load all the markers
	if (roadworks.valueOf() == 'on')
	{
    	loadMapXML(_URL_HOST_SITE+"/data/roadworks.xml", _map, id, 'Roadworks');
	}    
	if (parking.valueOf() == 'on')
	{
		loadMapXML(_URL_HOST_SITE+"/data/carParks.xml", _map, id, 'Carparks');
	}
	if (trains.valueOf() == 'on')
	{
 		loadMapXML(_URL_HOST_SITE+"/data/trains.xml", _map, id, 'Trains');
	}	
	if (busStations.valueOf() == 'on')
	{
 	   	loadMapXML(_URL_HOST_SITE+"/data/busstations.xml", _map, id, 'BusStations');	
	}
	if (airports.valueOf() == 'on')
	{
 	   	loadMapXML(_URL_HOST_SITE+"/data/airports.xml", _map, id, 'Airports');	
	}
	if (vms.valueOf() == 'on')
	{
 	   	loadMapXML(_URL_HOST_SITE+"/data/vms.xml", _map, id, 'Vms');
	}	
	if (disabled.valueOf() == 'on')
	{
  	 	 loadMapXML(_URL_HOST_SITE+"/data/disabledParking.xml", _map, id, 'Disabled');	
	}
	if (whizzgo.valueOf() == 'on')
	{
  	 	 loadMapXML(_URL_HOST_SITE+"/data/whizzgo.xml", _map, id, 'Whizzgo');	
	}
	
	if (accidents.valueOf() == 'on')
	{
		loadMapXML(_URL_HOST_SITE+"/data/accidents.xml", _map, id, 'Accidents');
	}
	if (events.valueOf() == 'on')
	{
 		loadMapXML(_URL_HOST_SITE+"/data/events.xml", _map, id, 'Events');
	}
	if (incidents.valueOf() == 'on')
	{
		loadMapXML(_URL_HOST_SITE+"/data/incidents.xml", _map, id, 'Incidents');
	}	
	if (taxis12.valueOf() == 'on')
	{
 	   	loadMapXML(_URL_HOST_SITE+"/data/taxirank12.xml", _map, id, 'TaxiRank12');	
	}
	if (taxis24.valueOf() == 'on')
	{
 	   	loadMapXML(_URL_HOST_SITE+"/data/taxirank24.xml", _map, id, 'TaxiRank24');	
	}
	if (parkandride.valueOf() == 'on')
	{
 	   	loadMapXML(_URL_HOST_SITE+"/data/parkandride.xml", _map, id, 'ParkAndRide');	
	}
	if (cctv.valueOf() == 'on')
	{
 	   	loadMapXML(_URL_HOST_SITE+"/data/cctv.xml", _map, id, 'CCTV');
	}
	if (hacctv.valueOf() == 'on')
	{
		//loadMapXML(_URL_HOST_SITE+"/data/hacctv.xml", _map, id, 'HACCTV');
	}	
	if (airquality.valueOf() == 'on')
	{
 	   	loadMapXML(_URL_HOST_SITE+"/data/airquality.xml", _map, id, 'AirQuality');	
	}

}*/


<!-- ============================================================-->
<!-- loadMapXML                                                 -->
<!-- Load the map markers into memory from the XML files         -->
<!-- ============================================================-->
/*function loadMapXML(url, ctrl, id, type) 
{
    // IE is caching the xml file instead of reloading it.  
    // add random numbers to the url, to force IE to reload.
    GDownloadUrl(url + "?r=" + Math.random(), function(data, responseCode) 
    {   
		// we only want to return from the loadMapXML routine when
        // we know the file has been downloaded fully.
        
        var xml = GXml.parse(data);
        processMapXML(xml, ctrl, type);
        
        showMarker(id);
                
    });
}*/

function loadMarkers(id)
{
	// load all the markers
	    
	// Create an array of the urls to the feeds for map data   
	var urlArray = new Array();  
 
	if (roadworks.valueOf() == 'on')
	{
    	//urlArray.push({url : _URL_HOST_SITE+"/data/roadworks.xml", id : id, type : 'Roadworks'});
    	
    	loadMapXML(_URL_HOST_SITE+"/data/roadworks.xml", _map, id, 'Roadworks');
	}
	if (parking.valueOf() == 'on')
	{
		// add the parking url to the array of feeds to load in loadMapXML
		//urlArray.push({url : _URL_HOST_SITE+"/data/carParks.xml", id : id, type : 'Carparks'});	
		
		loadMapXML(_URL_HOST_SITE+"/data/carParks.xml", _map, id, 'Carparks');
	}
	if (trains.valueOf() == 'on')
	{
 		//urlArray.push({url : _URL_HOST_SITE+"/data/trains.xml", id : id, type : 'Trains'});
 		
 		loadMapXML(_URL_HOST_SITE+"/data/trains.xml", _map, id, 'Trains');
	}	
	if (busStations.valueOf() == 'on')
	{
		//urlArray.push({url : _URL_HOST_SITE+"/data/busstations.xml", id : id, type : 'BusStations'});
	
 	   	loadMapXML(_URL_HOST_SITE+"/data/busstations.xml", _map, id, 'BusStations');	
	}
	if (airports.valueOf() == 'on')
	{
 	   	//urlArray.push({url : _URL_HOST_SITE+"/data/airports.xml", id : id, type : 'Airports'});
 	   	
 	   	loadMapXML(_URL_HOST_SITE+"/data/airports.xml", _map, id, 'Airports');	
	}
	if (vms.valueOf() == 'on')
	{
 	   	//urlArray.push({url : _URL_HOST_SITE+"/data/vms.xml", id : id, type : 'Vms'});
 	   	
 	   	loadMapXML(_URL_HOST_SITE+"/data/textOnlyVms.xml", _map, id, 'Vms');
	}
	// and always load the pictogram VMS XML
   	loadMapXML(_URL_HOST_SITE+"/data/vms.xml", _map, id, 'ControlledVms');
	
	if (disabled.valueOf() == 'on')
	{
  	 	 //urlArray.push({url : _URL_HOST_SITE+"/data/disabledParking.xml", id : id, type : 'Disabled'});
  	 	 
  	 	 loadMapXML(_URL_HOST_SITE+"/data/disabledParking.xml", _map, id, 'Disabled');	
	}
	if (whizzgo.valueOf() == 'on')
	{
  	 	 //urlArray.push({url : _URL_HOST_SITE+"/data/whizzgo.xml", id : id, type : 'Whizzgo'});
  	 	 
  	 	 loadMapXML(_URL_HOST_SITE+"/data/whizzgo.xml", _map, id, 'Whizzgo');	
	}
	
	
	if (accidents.valueOf() == 'on')
	{
		//urlArray.push({url : _URL_HOST_SITE+"/data/accidents.xml", id : id, type : 'Accidents'});
		
		loadMapXML(_URL_HOST_SITE+"/data/accidents.xml", _map, id, 'Accidents');
	}
	if (events.valueOf() == 'on')
	{
 		//urlArray.push({url : _URL_HOST_SITE+"/data/events.xml", id : id, type : 'Events'});
 		
 		loadMapXML(_URL_HOST_SITE+"/data/events.xml", _map, id, 'Events');
	}
	if (incidents.valueOf() == 'on')
	{
		//urlArray.push({url : _URL_HOST_SITE+"/data/incidents.xml", id : id, type : 'Incidents'});
		
		loadMapXML(_URL_HOST_SITE+"/data/incidents.xml", _map, id, 'Incidents');
	}	
	if (taxis12.valueOf() == 'on')
	{
 	   	//urlArray.push({url : _URL_HOST_SITE+"/data/taxirank12.xml", id : id, type : 'TaxiRank12'});
 	   	
 	   	loadMapXML(_URL_HOST_SITE+"/data/taxirank12.xml", _map, id, 'TaxiRank12');	
	}
	if (taxis24.valueOf() == 'on')
	{
 	   	//urlArray.push({url : _URL_HOST_SITE+"/data/taxirank24.xml", id : id, type : 'TaxiRank24'});
 	   	
 	   	loadMapXML(_URL_HOST_SITE+"/data/taxirank24.xml", _map, id, 'TaxiRank24');	
	}
	if (parkandride.valueOf() == 'on')
	{
 	   	//urlArray.push({url : _URL_HOST_SITE+"/data/parkandride.xml", id : id, type : 'ParkAndRide'});
 	   	
 	   	loadMapXML(_URL_HOST_SITE+"/data/parkandride.xml", _map, id, 'ParkAndRide');	
	}
	if (cctv.valueOf() == 'on')
	{

 	   	//urlArray.push({url : _URL_HOST_SITE+"/data/cctv.xml", id : id, type : 'CCTV'});
 	   	
 	   	loadMapXML(_URL_HOST_SITE+"/data/cctv.xml", _map, id, 'CCTV');
	}
	if (hacctv.valueOf() == 'on')
	{
		//urlArray.push({url : _URL_HOST_SITE+"/data/hacctv.xml", id : id, type : 'HACCTV'});
		
		loadMapXML(_URL_HOST_SITE+"/data/hacctv.xml", _map, id, 'HACCTV');
	}	
	if (airquality.valueOf() == 'on')
	{
 	   	//urlArray.push({url : _URL_HOST_SITE+"/data/airquality.xml", id : 'xxxxx', type : 'AirQuality'});
 	   	
 	   	loadMapXML(_URL_HOST_SITE+"/data/airquality.xml", _map, id, 'AirQuality');	
	}

	if (busstop.valueOf() == 'on')
	{
				
		//urlArray.push({url : getBusUrl(), id : 'xxx', type : 'Busstop'});
		//loadMapXML(getBusUrl(), _map, id, 'Busstop');
loadBusMapXML();	
	}

	GEvent.addListener(_map, "dragend", loadBusMapXMLifMoved);
	GEvent.addListener(this._map, "zoomend", loadBusMapXMLifMoved);


	
	//loadMapXML(urlArray);

}

function getBusUrl()
{
// work out the current bounds
   		var ne = _map.getBounds().getNorthEast();
   		var sw = _map.getBounds().getSouthWest();
   		
   		// get a new area which is a bit bigger (25%) so we don't always request
   		// stops on every move
   		var deltaX = Math.abs(ne.lng() - sw.lng()) * 0.25;
   		var deltaY = Math.abs(ne.lat() - sw.lat()) * 0.25;
   	
   		var newsw = new GLatLng(sw.lat() - deltaY, sw.lng() - deltaX);
   		var newne = new GLatLng(ne.lat() + deltaY, ne.lng() + deltaX);

   		// store globally so we can use for comparison when we move
   		overarchingArea = new GLatLngBounds(newsw, newne);	
		overarchingAreaZoom = _map.getZoom();
	
		var temp = _URL_HOST_SITE+"../feed/busFeed.xml?zoom="+ _map.getZoom() + 
			"&swLat="  + overarchingArea.getSouthWest().lat() + 
			"&swLng=" + overarchingArea.getSouthWest().lng() + 
			"&neLat=" + overarchingArea.getNorthEast().lat() + 
			"&neLng=" + overarchingArea.getNorthEast().lng();


return temp;


}

function loadBusMapXML()
{
if (dwr.util.byId('busstopSwitch').checked)
{
	removeEvents('Busstop');
	// Take the last element in the array [length-1], process its contents and remove from the array.
	    // IE is caching the xml file instead of reloading it.  
	    // add random numbers to the url, to force IE to reload.
	    GDownloadUrl(getBusUrl(), function(data, responseCode) 
	    {   
		 if(responseCode == 200) 
		 {
	        	var xml = GXml.parse(data);
	        	processMapXML(xml, _map, 'Busstop');       	        
		 }
	    });
}

}

// only load the bus stops if the user has moved from the last arae.
function loadBusMapXMLifMoved() 
{	
   if (overarchingAreaZoom != _map.getZoom() || !overarchingArea.containsBounds(_map.getBounds()))
   {
      loadBusMapXML();	    
   }
}



<!-- ============================================================-->
<!-- loadMapXML                                                 -->
<!-- Load the map markers into memory from the XML files         -->
<!-- ============================================================-->
/*function loadMapXML(feedArray) 
{


	if(feedArray.length > 0)
	{
		
		// Take the last element in the array [length-1], process its contents and remove from the array.
	    // IE is caching the xml file instead of reloading it.  
	    // add random numbers to the url, to force IE to reload.
	    GDownloadUrl(feedArray[(feedArray.length)-1].url, function(data, responseCode) 
	    {   
		
			// we only want to return from the loadMapXML routine when
	        // we know the file has been downloaded fully.
	        
	        var xml = GXml.parse(data);

	        processMapXML(xml, _map, feedArray[(feedArray.length)-1].type);
        
	        showMarker(feedArray[(feedArray.length)-1].id);
	        
	        if(feedArray.length > 0)
	        {
	        	// take the last element off of the array and loop back around again.
	        	feedArray.pop();

	        	loadMapXML(feedArray);
	        }
	    });

	}
}*/

<!-- ============================================================-->
<!-- loadMapXML                                                 -->
<!-- Load the map markers into memory from the XML files         -->
<!-- ============================================================-->
function loadMapXML(url, ctrl, id, type) 
{

    // IE is caching the xml file instead of reloading it.  
    // add random numbers to the url, to force IE to reload.
    GDownloadUrl(url + "?r=" + Math.random(), function(data, responseCode) 
    {   
		// we only want to return from the loadMapXML routine when
        // we know the file has been downloaded fully.        
        var xml = GXml.parse(data);
        processMapXML(xml, ctrl, type);
        
        showMarker(id);
                
    });
}



<!-- ============================================================-->
<!-- showMarker                                                  -->
<!-- Show a marker on the map         							 -->
<!-- ============================================================-->
function showMarker(id)
{
    var found = false;
    var index = 0;

  try
  {   
    // find the ID in the list of markers
    while (!found && index<_markers.length)
    {
    	// does the ID exist in the location XML
        if (_locations[index].getAttribute("id")==id)
        {	
				
        	_markers[index].id = id;



        	// yes, display the info window for this ID
			GEvent.trigger(_markers[index],'click');
            found = true;		
        }
        index++;
    }

  } 
  catch (e) 
  {
     // do nothing.
  }

 

}

<!-- =============================================================-->
<!-- processMapXML                                                -->
<!-- Creates the markers and adds them to the map        		  -->
<!-- =============================================================-->
function processMapXML(xmlDoc, ctrl, type)
{ 
    var locations = xmlDoc.documentElement.getElementsByTagName("location");
    var _timescale = 0;
    _timescale = parseInt(dwr.util.byId('timescalelist').value);

    if (locations == null)
    {
		return;
    }
  
    var amount = _markers.length;


    
    for (var i=0; i <locations.length; i++) 
    {

        var marker = createMarker( locations[i], i, type );     
      
       	//show appropriate timescale
		var m_tscale = marker.timescale;
		if(m_tscale!=null){
			if(_timescale >= m_tscale){				
				addNormalOrClusteredOverlay(type, marker);			
			}
		}
        
        _markers[amount] = marker;
        _locations[amount] = locations[i];
	 	amount++;
    }
    
    if(_cookie.length > 0){
    	restoreMapIconState(type);
    }

}




function addNormalOrClusteredOverlay(type, marker)
{
	
	switch(type){
		case "TaxiRank12":
			_clustererTaxi12.AddMarker(marker, marker.description);
		break;
		case "TaxiRank24":
			_clustererTaxi24.AddMarker(marker, marker.description);
		break;
		case "Disabled":
			_clustererBlueBadge.AddMarker(marker, marker.description);
		break;
		case "Whizzgo":
			_clustererWhizzGo.AddMarker(marker, marker.description);				
		break;
		case "Carparks":
			_clustererCarPark.AddMarker(marker, marker.description);				
		break;
		case "BusStations":
			_clustererBusStation.AddMarker(marker, marker.description);				
		break;
		case "CCTV":
			_clustererCctv.AddMarker(marker, marker.description);				
		break;
		case "HACCTV":
			_clustererHacctv.AddMarker(marker, marker.description);				
		break;
		//case "Roadworks":
		//	GLog.write('Adding to cluster ' + marker.description);
		//	_clustererRoadworks.AddMarker(marker, marker.description);				
		//break;



		default :
			//add by normal method
			_map.addOverlay(marker);
		break;						
	}

}

function removeNormalOrClusteredOverlay(type, marker){
	
	switch(type){
		case "TaxiRank12":
			_clustererTaxi12.RemoveMarker(marker);
		break;
		case "TaxiRank24":
			_clustererTaxi24.RemoveMarker(marker);
		break;
		case "Disabled":
			_clustererBlueBadge.RemoveMarker(marker);
		break;
		case "Whizzgo":
			_clustererWhizzGo.RemoveMarker(marker);				
		break;
		case "Carparks":
			_clustererCarPark.RemoveMarker(marker);				
		break;
		case "BusStations":
			_clustererBusStation.RemoveMarker(marker);				
		break;
		case "CCTV":
			_clustererCctv.RemoveMarker(marker);				
		break;
		case "HACCTV":
			_clustererHacctv.RemoveMarker(marker);				
		break;
		//case "Roadworks":
		//	GLog.write('Removing from cluster');
		//	_clustererRoadworks.RemoveMarker(marker);				
		//break;

		default :
			//remove by normal method
			_map.removeOverlay(marker);
		break;						
	}
	
}

<!-- ===============================================================-->
<!-- showTooltip                                               		-->
<!-- Dsiplays a tooltip for a given marker       		  			-->
<!-- ===============================================================-->
function showTooltip(marker) 
{
    _tooltip.innerHTML = marker.tooltip;	
	var point=_map.getCurrentMapType().getProjection().fromLatLngToPixel(_map.fromDivPixelToLatLng(new GPoint(0,0),true),_map.getZoom());
	var offset=_map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),_map.getZoom());
	var anchor=marker.getIcon().iconAnchor;
	var width=marker.getIcon().iconSize.width;
	var height=_tooltip.clientHeight;
	var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width, offset.y - point.y -anchor.y -height)); 
	pos.apply(_tooltip);
	_tooltip.style.visibility="visible";
}

<!-- ===============================================================-->
<!-- showClusteredTooltip                                           -->
<!-- Dsiplays a tooltip for a given clustered marker       		  	-->
<!-- ===============================================================-->
function showClusteredTooltip(marker)
{
	var markup = "This is a cluster of locations.<br/>Click for more information, or zoom in to resolve individual locations.";
	
    _tooltip.innerHTML = '<div class="tooltip"><div style="text-align:left;width:300px;padding:5px;font-size:10pt;">' + markup + '</div></div>';
    
	var point=_map.getCurrentMapType().getProjection().fromLatLngToPixel(_map.fromDivPixelToLatLng(new GPoint(0,0),true),_map.getZoom());
	var offset=_map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),_map.getZoom());
	var anchor=marker.getIcon().iconAnchor;
	var width=marker.getIcon().iconSize.width;
	var height=_tooltip.clientHeight;
	var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width, offset.y - point.y -anchor.y -height)); 
	pos.apply(_tooltip);
	_tooltip.style.visibility="visible";
}

function createMiniMap(marker)
{
	//var minimap = new GMap2(dwr.util.byId("newmap"));
	var element = dwr.util.byId("newmap");
	
	var minimap = new GMap2(element);		
	minimap.setCenter(marker.getPoint(), 17);			
  	minimap.addOverlay(new GMarker(marker.getPoint()));					
	minimap.addControl(new GSmallZoomControl());	
}

<!-- ===============================================================-->
<!-- createMarker                                              		-->
<!-- Creates and returns a marker.			     		  			-->
<!-- ===============================================================-->
function createMarker(location, i, type) 
{    
    var line1 = '';
    var line2 = '';
    var line3 = '';
    var line4 = '';
    var message = '';
    var timescale = '0';

    var divLine = '';

    nodes = location.getElementsByTagName("line1");
    if (nodes != null && nodes[0] != null)
    {
	 if (nodes[0].firstChild != null)
	 {
            line1 = nodes[0].firstChild.nodeValue;
	     divLine = "<div style=\"text-align:left;width:300px;padding:5px;font-size:10pt;\">"+line1+"<br>";
	     
	 	if(type=='Roadworks' || type=='Incidents' || type=='Accidents' || type=='Events' || type=='Vms' || type=='ControlledVms'){
	 		divLine += "<hr style='margin:1px;color:#000000;height:1px;'></hr>";
	 	}
	 
	 }
    }
    
    if(type=='Carparks'){
    	divLine += "<div id='"+location.getAttribute("id")+"_popupinfo'>";
    }

    nodes = location.getElementsByTagName("line2");
    if (nodes != null && nodes[0] != null)
    {
	 if (nodes[0].firstChild != null)
	 {

        	line2 = nodes[0].firstChild.nodeValue;
	 		divLine += line2+"<br>";
	 		
	 		if(type=='Roadworks' || type=='Incidents' || type=='Accidents' || type=='Events'){
	 			divLine += "<hr style='margin:1px;color:#000000;height:1px;'></hr>";
	 		}
	 }
    }

    nodes = location.getElementsByTagName("line3");
    if (nodes != null && nodes[0] != null)
    {
        line3 = nodes[0].firstChild.nodeValue;
        if (line3 != 'No Contact Details')
        {
	    	divLine += line3+"<br>";
        }
    }

    nodes = location.getElementsByTagName("line4");
    if (nodes != null && nodes[0] != null)
    {
        line4 = nodes[0].firstChild.nodeValue;
		divLine += line4+"<br>";
    }
    nodes = location.getElementsByTagName("message");
    if (nodes != null && nodes[0] != null)
    {
        message = nodes[0].firstChild.nodeValue;
	 	divLine += message+"<br>";
    }
    
    nodes = location.getElementsByTagName("timescale");
    if (nodes != null && nodes[0] != null)
    {
        timescale = nodes[0].firstChild.nodeValue;
    }
    
    if(type=='Carparks'){
    	divLine += "</div>";
    }

    divLine += "</div>";

	// get the xml for the infoWindow
    var tablenodes = location.getElementsByTagName("table");    

    // depending on the browser, get the xml from the tablenodes node.
    var markup = '';

    if (navigator.appName.indexOf('Microsoft') != -1)
    {
		var xmlDocument = new ActiveXObject('Microsoft.XMLDOM');
		xmlDocument.appendChild(tablenodes[0]);
		// serialize
    	markup = xmlDocument.xml;
    }
    else
    {
		var xmlSerializer = new XMLSerializer();
      	markup = xmlSerializer.serializeToString(tablenodes[0]);
    }

    // --------------------       
    var points = location.getElementsByTagName("point");
    var lng = parseFloat( points[0].getAttribute( "lng" ));
    var lat = parseFloat( points[0].getAttribute( "lat" ));
    var point = new GPoint( lng, lat );
    
    var icon = location.getElementsByTagName("icon");
    var iconImage = icon[0].getAttribute("image");
    
    var icon = new GIcon( baseIcon );
    icon.image = _URL_HOST_SITE+iconImage;
    var marker = new GMarker( point, icon );
    marker.type = type;
    marker.id = location.getAttribute("id");
    marker.timescale = parseInt(timescale);
    
    //set marker description for icon clustering   
    marker.description = "<a href='javascript:_map.setCenter( new GLatLng(" + lat + "," + lng + "),17);'>" + line1 + "</a>";
    
    marker.tooltip = '<div class="tooltip">'+divLine+'</div>';

    _map.getPane(G_MAP_FLOAT_PANE).appendChild(_tooltip);
    
	// create infowindow tabs
    GEvent.addListener( marker, "click", function() 
    {	    	
		var infoTabs = new Array();
		
		// basic details
		infoTabs[0] = new GInfoWindowTab("Details", markup);

		// mini map....
		infoTabs[1] = new GInfoWindowTab("Location", '<div id="newmap" name="newmap" style="width:300px;height:230px;border:1px solid #999;" ></div>');
    	   
    	// if we have a car park, display an additional information tab (opening times etc) 	
        if (marker.type == 'Carparks')
        {                          	    					
			infoTabs[2] = new GInfoWindowTab("Additional", '<IFRAME HEIGHT=230 width="100%" id="cpdwr_moreinfo" Style="font-size: 50%; font-family: Verdana" SCROLLING=AUTO FRAMEBORDER=0 SRC="../jsp/carParkInfoAdditionalWindow.jsp?systemCodeNumber=' + marker.id + '"></IFRAME>');   						
        }
        
        marker.openInfoWindowTabsHtml(infoTabs);
        
        /* Infowindow support has been moved into an external module that only
		gets loaded after the first time that you make an infowindow call. That
		loading is asynchronous.
		
		The upshot is that your '<div id="newmap"></div>' doesn't get
		processed instantly when you open the first infowindow, so you can't
		perform document.getElementById("newmap") on it. */
        //_map.getInfoWindow().show();
        
        createMiniMap(marker);	
        
        
        //refresh cctv image
        if(marker.type == 'CCTV'){
        	clearImgRefreshInterval();
     		var cctvimgtag = location.getElementsByTagName("cctvimg");
    		var cctvimg = cctvimgtag[0].getAttribute("image");     
        	doImageRefresh(cctvimg);
        }
        
        //refresh HANET cctv image
        if(marker.type == 'HACCTV'){
        	clearHanetImgRefreshInterval();
     		var cctvimgtag = location.getElementsByTagName("cctvimg");
    		var cctvimg = cctvimgtag[0].getAttribute("image");     
        	doHanetImageRefresh(cctvimg);
        }
        
        //onclick carpark ajax call
        if(marker.type == 'Carparks'){
			doCarparkInfoRefresh(marker.id);
        }
        
           	
    });

	//marker mouseover events
	switch(marker.type){
		case 'Carparks':
		
			carparkDataArray[marker.id] = new Array();
			carparkMarkerArray.push(marker);
	
			//onmouseover carpark ajax call
	    	GEvent.addListener(marker,"mouseover", function(){
        		showTooltip(marker);
        		doCarparkTooltipRefresh(marker.id);
    		}); 
       
    		GEvent.addListener(marker,"mouseout", function(){
				_tooltip.style.visibility="hidden"
				clearCarparkTooltipRefreshCycle();
    		});
    		
    	break;
		default:
	
    		GEvent.addListener(marker,"mouseover", function(){
        		showTooltip(marker);
    		}); 
       
    		GEvent.addListener(marker,"mouseout", function(){
				_tooltip.style.visibility="hidden"
    		});
    		
    	break;
    	
    }
    
    //traffic data marker arrays
    switch(marker.type){
    	case 'Incidents':
    		incidentMarkerArray.push(marker);
    	break;
    	case 'Accidents':
    		accidentMarkerArray.push(marker);
    	break;
    	case 'Events':
    		eventMarkerArray.push(marker);
    	break;
    	case 'Roadworks':
    		roadworkMarkerArray.push(marker);
    	break;
    	case 'Vms':
    		vmsMarkerArray.push(marker);
    	break;
    	case 'ControlledVms':
    		controlledVmsMarkerArray.push(marker);
    	break;
    }
   
    return marker;
}

<!-- ===============================================================-->
<!-- doImageRefresh													-->
<!-- CCTV Image Refresh                                             -->
<!-- ===============================================================-->
var imgRefreshIntvl = 0;
var imgRefreshRate = 1 * (90 * 1000); //90 secs

function doImageRefresh(imgPath){

	try{
		var tmp = new Date();
    	tmp = "?" + tmp.getTime();	
		dwr.util.byId('activecctvimage').src = imgPath + tmp;
		
			//maximised image
			if(maxImagePopup !=null && !maxImagePopup.closed){
				maxImagePopup.document.getElementById('maxImage').src = imgPath + tmp;
			}		
		
		imgRefreshIntvl = setTimeout(function(){doImageRefresh(imgPath)}, imgRefreshRate);
	}
	catch(err){
		clearImgRefreshInterval();
	}
	
}

function clearImgRefreshInterval(){
	clearTimeout(imgRefreshIntvl);
	imgRefreshIntvl = 0;
}

<!-- ===============================================================-->
<!-- doHanetImageRefresh											-->
<!-- HANET CCTV Image Refresh                                       -->
<!-- ===============================================================-->
var hanetImgRefreshIntvl = 0;
var hanetImgRefreshRate = 1 * (60 * 1000); //60 secs

function doHanetImageRefresh(imgPath){

	try{
		var tmp = new Date();
    	tmp = "?" + tmp.getTime();	
		dwr.util.byId('activecctvimage').src = imgPath + tmp;	
		
		hanetImgRefreshIntvl = setTimeout(function(){doHanetImageRefresh(imgPath)}, hanetImgRefreshRate);
	}
	catch(err){
		clearHanetImgRefreshInterval();
	}
	
}

function clearHanetImgRefreshInterval(){
	clearTimeout(hanetImgRefreshIntvl);
	hanetImgRefreshIntvl = 0;
}

<!-- ===============================================================-->
<!-- doTrafficDataRefresh 									        -->
<!-- AJAX dynamic data refresh									    -->
<!-- Incidents/Accidents/Events/VMS/Carpark  						-->
<!-- ===============================================================-->
var trafficDataAjaxCycle = 0;
var trafficDataAjaxCycleRate = 1 * (120 * 1000); //120 secs
//hold traffic data markers
var incidentMarkerArray = new Array();
var accidentMarkerArray = new Array();
var eventMarkerArray = new Array();
var roadworkMarkerArray = new Array();
var vmsMarkerArray = new Array();
var controlledVmsMarkerArray = new Array();
//holds carpark markers
var carparkMarkerArray = new Array();
//holds dynamic carpark data
var carparkDataArray = new Array();

function doTrafficDataRefresh(){

	progressMessage.setText("<p>Refreshing Map Data...</p>");
	
	_timescale = parseInt(dwr.util.byId('timescalelist').value);

	try{
		//do ajax call
		DynamicDataRefresh.doTrafficDataRefresh(function(data) {
		
			//assign traffic data
			var incidentRefreshArray = null;
			var accidentRefreshArray = null;
			var eventRefreshArray = null;
			var roadworkRefreshArray = null;
			var vmsRefreshArray = null;
			var controlledVmsRefreshArray = null;
			
			incidentRefreshArray = data.incidentsList;
			accidentRefreshArray = data.accidentsList;
			eventRefreshArray = data.eventsList;
			roadworkRefreshArray = data.roadworksList;
			vmsRefreshArray = data.vmsList;
			controlledVmsRefreshArray = data.controlledVmsList;
			//assign carpark data
			carparkDataArray = null;
			carparkDataArray = new Array();
			eval(data.carparkData);
			
			//update carpark marker icons
			for(var i=0; i<carparkMarkerArray.length; i++){
			
				var marker = carparkMarkerArray[i];
				var image;
			
				switch(carparkDataArray[marker.id]['spaces'].toUpperCase()){
					case 'NO LIVE INFORMATION AVAILABLE':
						image = "../images/parking-grey.gif";
					break;
					case 'FULL':
						image = "../images/parking-red.gif";
					break;
					case 'CLOSED':
						image = "../images/parking-red.gif";
					break;
					default:
						image = "../images/parking-blue.gif";
					break;
				}
				
				try{
					marker.setImage(_URL_HOST_SITE + image);
				}
				catch(err){}
				
			}
			
			//remove tooltip
			_tooltip.style.visibility="hidden";
			
			//remove incident markers
			for(var i=0; i<incidentMarkerArray.length; i++){
				//remove marker from map
				_map.removeOverlay(incidentMarkerArray[i]);

				//remove from all markers array
				for(var x=0; x<_markers.length; x++){
					if(incidentMarkerArray[i].id == _markers[x].id && incidentMarkerArray[i].type == 'Incidents'){
						_markers.splice(x,1);
					}
				}						
			}
			
			//clear array
			incidentMarkerArray = null;
			incidentMarkerArray = new Array();
			
			//add incident markers
			for(var i=0; i<incidentRefreshArray.length; i++){
				var marker = createNewTrafficDataMarker(incidentRefreshArray[i]);
				if(incidents=="on" && (_timescale >= marker.timescale)){
					//add marker to map
       	 			_map.addOverlay(marker);
       	 		}
       	 		//add to incident marker array
       	 		incidentMarkerArray.push(marker);
       	 		//add to all markers array
       	 		_markers.push(marker);
			}			
			
			//remove accident markers
			for(var i=0; i<accidentMarkerArray.length; i++){
				//remove marker from map
				_map.removeOverlay(accidentMarkerArray[i]);

				//remove from all markers array
				for(var x=0; x<_markers.length; x++){
					if(accidentMarkerArray[i].id == _markers[x].id && accidentMarkerArray[i].type == 'Accidents'){
						_markers.splice(x,1);
					}
				}						
			}
			
			//clear array
			accidentMarkerArray = null;
			accidentMarkerArray = new Array();
			
			//add accident markers
			for(var i=0; i<accidentRefreshArray.length; i++){
				var marker = createNewTrafficDataMarker(accidentRefreshArray[i]);
				if(accidents=="on" && (_timescale >= marker.timescale)){
					//add marker to map
       	 			_map.addOverlay(marker);
       	 		}
       	 		//add to accident marker array
       	 		accidentMarkerArray.push(marker);
       	 		//add to all markers array
       	 		_markers.push(marker);
			}			
			
			//remove event markers
			for(var i=0; i<eventMarkerArray.length; i++){
				//remove marker from map
				_map.removeOverlay(eventMarkerArray[i]);

				//remove from all markers array
				for(var x=0; x<_markers.length; x++){
					if(eventMarkerArray[i].id == _markers[x].id && eventMarkerArray[i].type == 'Events'){
						_markers.splice(x,1);
					}
				}						
			}
			
			//clear array
			eventMarkerArray = null;
			eventMarkerArray = new Array();
			
			//add event markers
			for(var i=0; i<eventRefreshArray.length; i++){
				var marker = createNewTrafficDataMarker(eventRefreshArray[i]);
				if(events=="on" && (_timescale >= marker.timescale)){
					//add marker to map
       	 			_map.addOverlay(marker);
       	 		}
       	 		//add to event marker array
       	 		eventMarkerArray.push(marker);
       	 		//add to all markers array
       	 		_markers.push(marker);
			}			
			
			//remove roadwork markers
			for(var i=0; i<roadworkMarkerArray.length; i++){
				//remove marker from map
				_map.removeOverlay(roadworkMarkerArray[i]);

				//remove from all markers array
				for(var x=0; x<_markers.length; x++){
					if(roadworkMarkerArray[i].id == _markers[x].id && roadworkMarkerArray[i].type == 'Roadworks'){
						_markers.splice(x,1);
					}
				}						
			}
			
			//clear array
			roadworkMarkerArray = null;
			roadworkMarkerArray = new Array();
			
			//add roadwork markers
			for(var i=0; i<roadworkRefreshArray.length; i++){
				var marker = createNewTrafficDataMarker(roadworkRefreshArray[i]);
				if(roadworks=="on" && (_timescale >= marker.timescale)){
					//add marker to map
       	 			_map.addOverlay(marker);
       	 		}
       	 		//add to roadwork marker array
       	 		roadworkMarkerArray.push(marker);
       	 		//add to all markers array
       	 		_markers.push(marker);
			}			
			
			//remove vms markers
			for(var i=0; i<vmsMarkerArray.length; i++){
				//remove marker from map
				_map.removeOverlay(vmsMarkerArray[i]);

				//remove from all markers array
				for(var x=0; x<_markers.length; x++){
					if(vmsMarkerArray[i].id == _markers[x].id && vmsMarkerArray[i].type == 'Vms'){
						_markers.splice(x,1);
					}
				}						
			}
			
			//clear array
			vmsMarkerArray = null;
			vmsMarkerArray = new Array();

			//add vms markers
			for(var i=0; i<vmsRefreshArray.length; i++){
				var marker = createNewTrafficDataMarker(vmsRefreshArray[i]);
				if(vms=="on" && (_timescale >= marker.timescale)){
					//add marker to map
       	 			_map.addOverlay(marker);
       	 		}
       	 		//add to vms marker array
       	 		vmsMarkerArray.push(marker);
       	 		//add to all markers array
       	 		_markers.push(marker);
			}
			
			//remove controlled vms markers
			for(var i=0; i<controlledVmsMarkerArray.length; i++){
				//remove marker from map
				_map.removeOverlay(controlledVmsMarkerArray[i]);

				//remove from all markers array
				for(var x=0; x<_markers.length; x++){
					if(controlledVmsMarkerArray[i].id == _markers[x].id && controlledVmsMarkerArray[i].type == 'ControlledVms'){
						_markers.splice(x,1);
					}
				}						
			}
			
			//clear array
			controlledVmsMarkerArray = null;
			controlledVmsMarkerArray = new Array();

			//add vms markers
			for(var i=0; i<controlledVmsRefreshArray.length; i++){
				var marker = createNewTrafficDataMarker(controlledVmsRefreshArray[i]);
				//add marker to map
       	 		_map.addOverlay(marker);
       	 		//add to vms marker array
				controlledVmsMarkerArray.push(marker);
       	 		//add to all markers array
       	 		_markers.push(marker);
			}
			
			progressMessage.setText("");

		});
		
		trafficDataAjaxCycle = setTimeout(function(){doTrafficDataRefresh()}, trafficDataAjaxCycleRate);
	}
	catch(err){
		clearTrafficDataAjaxCycle();
		clearCarparkInfoRefreshCycle();
		clearCarparkTooltipRefreshCycle();
		progressMessage.setText("<p>Error Refreshing Map Data</p>");
	}
	
}

function clearTrafficDataAjaxCycle(){
	clearTimeout(trafficDataAjaxCycle);
	trafficDataAjaxCycle = 0;
}

function createNewTrafficDataMarker(obj){

    var lng = parseFloat(obj.long);
    var lat = parseFloat(obj.lat);
    var point = new GPoint(lng,lat);
    
    var iconImage = obj.icon;
    
    var icon = new GIcon( baseIcon );
    icon.image = _URL_HOST_SITE + iconImage;
    var marker = new GMarker( point, icon );
    marker.type = obj.type;
    marker.id = obj.id;
    marker.timescale = parseInt(obj.timescale);
    
    var markup = "<table class='gmapInfoWindowTableHeader' border='1'>";
	markup += "<tr><th colspan='2'><B>" + (obj.location).toUpperCase() + "</B></th></tr>";
	if(obj.type == "Vms"){
		
		if(obj.message != null && obj.message != undefined && obj.message != "Custom Graphic") {
			markup += "<tr><td><b>MESSAGE</b></td><td>" + obj.message + "</td></tr>";
		}
		markup += "<tr><td><b>LAST UPDATED</b></td><td>" + obj.lastupdated + "</td></tr>";
		markup += "<tr><td><b>LANTERNS</b></td><td>" + obj.lanterns + "</td></tr>";
		
		if(obj.imageUrl != null && obj.imageUrl != undefined) {
			markup += "<tr style=\"height: 102px\"><td colspan='2'><center><img style='padding-top: 3px; padding-bottom: 3px;' src='" + obj.imageUrl + "?time=" + new Date().getTime() + "' /></center></td></tr>";
		}
	}
	else if(obj.type == "ControlledVms"){
		
		if(obj.message != null && obj.message != undefined && obj.message != "Custom Graphic") {
			markup += "<tr><td><b>MESSAGE</b></td><td>" + obj.message + "</td></tr>";
		}
		
		markup += "<tr><td><b>LAST UPDATED</b></td><td>" + obj.lastupdated + "</td></tr>";
		markup += "<tr><td><b>LANTERNS</b></td><td>" + obj.lanterns + "</td></tr>";
		
		if(obj.imageUrl != null && obj.imageUrl != undefined) {
			markup += "<tr style=\"height: 102px\"><td colspan='2'><center><img style='padding-top: 3px; padding-bottom: 3px;' src='" + obj.imageUrl + "?time=" + new Date().getTime() + "' /></center></td></tr>";
		}
	}
	else{
		if(obj.type == "Roadworks"){
			markup += "<tr><td><b>START TIME</b></td><td>" + obj.start + "</td></tr>";
			markup += "<tr><td><b>END TIME</b></td><td>" + obj.end + "</td></tr>";
		}
		else{
			markup += "<tr><td><b>APPROX. START TIME</b></td><td>" + obj.start + "</td></tr>";
			markup += "<tr><td><b>ESTIMATED END TIME</b></td><td>" + obj.end + "</td></tr>";
		}
		
		markup += "<tr><td colspan='2'>" + obj.description + "</td></tr>";
		
		if(obj.effectontraffic){
			markup += "<tr><td colspan='2'>" + obj.effectontraffic + "</td></tr>";
		}
		if(obj.organiser){
			markup += "<tr><td colspan='2'>" + obj.organiser + "</td></tr>";
		}
		if(obj.contractor){
			markup += "<tr><td colspan='2'>" + obj.contractor + "</td></tr>";
		}
		
		if(obj.src){
			markup += "<tr class='gmapInfoWindowDataSource'><td colspan='2'>" + obj.src + "</td></tr>";
		}
		
	}
	markup += "<tr><td colspan='2'><a href='javascript:_map.setCenter( new GLatLng(" + obj.lat + "," + obj.long + "),17);' title='Zoom in for closer view'>Zoom in</a> | <a href='javascript:_map.setZoom(11);' title='Zoom out to overview'>Zoom out</a></td></tr>";
	markup += "</table>";
    
    // create infowindow tabs
    GEvent.addListener( marker, "click", function(){
		var infoTabs = new Array();
		
		// basic details
		infoTabs[0] = new GInfoWindowTab("Details", markup);

		// mini map....
		infoTabs[1] = new GInfoWindowTab("Location", '<div style="width:300px;height:200px;border:1px solid #999;" id="newmap"></div>');
        
        marker.openInfoWindowTabsHtml(infoTabs);			
		createMiniMap(marker);
           	
    });
    
    var divLine = "<div style='text-align:left;width:300px;padding:5px;font-size:10pt;'>";
    divLine += obj.location;
   	divLine += "<hr style='margin:1px;color:#000000;height:1px;'></hr>";
    if(obj.type == "Vms"){
    	divLine += obj.message;
    }
    else if(obj.type == "ControlledVms"){
    	divLine += obj.message;
    }
    else{
    	divLine += obj.description;
    	divLine += "<hr style='margin:1px;color:#000000;height:1px;'></hr>";
    	divLine += "Severity: " + obj.severity;
    }
    divLine += "</div>";
    
    marker.tooltip = '<div class="tooltip">'+divLine+'</div>';
    _map.getPane(G_MAP_FLOAT_PANE).appendChild(_tooltip);
    
	GEvent.addListener(marker,"mouseover", function(){
		showTooltip(marker);
	}); 
       
	GEvent.addListener(marker,"mouseout", function(){
		_tooltip.style.visibility="hidden"
	});
      		
   	return marker;

}


<!-- ===============================================================-->
<!-- CarparkRefresh										    		-->
<!-- Carpark info and popup window data Refresh                  	-->
<!-- ===============================================================-->
var carparkInfoRefreshCycle = 0;
var carparkTooltipRefreshCycle = 0;
var carparkRefreshCycleRate = 1000; //1 sec

//carpark info window
function doCarparkInfoRefresh(carparkId){
	try{
		if(carparkDataArray[carparkId].spaces!=null){
			dwr.util.setValue(carparkId + "_spaces", carparkDataArray[carparkId].spaces);
		}
		if(carparkDataArray[carparkId].percentfull!=null){
			dwr.util.setValue(carparkId + "_percentfull", carparkDataArray[carparkId].percentfull);
		}
		if(carparkDataArray[carparkId].trend!=null){
			dwr.util.setValue(carparkId + "_trend", carparkDataArray[carparkId].trend);
		}
		if(carparkDataArray[carparkId].lastupdated!=null){
			dwr.util.setValue(carparkId + "_updated", carparkDataArray[carparkId].lastupdated);
		}
		carparkInfoRefreshCycle = setTimeout(function(){doCarparkInfoRefresh(carparkId)}, carparkRefreshCycleRate);
	}
	catch(err){
		clearCarparkInfoRefreshCycle();
	}
}

function clearCarparkInfoRefreshCycle(){
	clearTimeout(carparkInfoRefreshCycle);
	carparkInfoRefreshCycle = 0;
}

//carpark  popup window
function doCarparkTooltipRefresh(carparkId){
	try{
		if(carparkDataArray[carparkId].tooltipinfo!=null){
			dwr.util.byId(carparkId + "_popupinfo").innerHTML = carparkDataArray[carparkId].tooltipinfo;
		}	
		carparkTooltipRefreshCycle = setTimeout(function(){doCarparkTooltipRefresh(carparkId)}, carparkRefreshCycleRate);
	}
	catch(err){
		clearCarparkTooltipRefreshCycle();
	}
}

function clearCarparkTooltipRefreshCycle(){
	clearTimeout(carparkTooltipRefreshCycle);
	carparkTooltipRefreshCycle = 0;
}

<!-- ===============================================================-->
<!-- zoomTo                                            				-->
<!-- Zooms to an area on the map									-->
<!-- ===============================================================-->
function zoomTo(lon, lat, zoom) 
{
	_map.setCenter(new GLatLng(lat, lon), zoom);
}

////////////////////////////////////////////////////////////////////////////////
// Show events on the map. The vents show will either be the information
// parameter passed in or the current selected value in the information drop down
////////////////////////////////////////////////////////////////////////////////
function disp_text(tscale)
{
	_timescale = parseInt(tscale);
   	showEvents();
}

var roadworks="on";
var events="on";
var accidents="on";
var incidents="on";
var bbc="on";
var trains="on";
var busStations="on";
var airports="on";
var parking="on";
var disabled="on";
var whizzgo="on";
var busstop="on";
var vms="on";
var taxis12="on";
var taxis24="on";
var parkandride="on";
var cctv="on";
var hacctv="on";
var airquality="on";
var cyclepaths="off";

function switchRoadworksOn()
{
	roadworks="on";
	dwr.util.byId('roadworksSwitch').checked=true;
	addEvents('Roadworks');
}

function switchRoadworksOff()
{
	roadworks="off";
	dwr.util.byId('roadworksSwitch').checked=false;
	_clustererRoadworks.RemoveAllMarkers();
	removeEvents('Roadworks');
}

function toggleRoadworksOnMap(){   
	if (roadworks.valueOf() == 'on'){
		switchRoadworksOff();
	}
	else{
		switchRoadworksOn();
	}
}

function switchEventsOn()
{
	events="on";
	dwr.util.byId('eventsSwitch').checked=true;
	addEvents('Events');
}

function switchEventsOff()
{
	events="off";
	dwr.util.byId('eventsSwitch').checked=false;
	removeEvents('Events');
}

function toggleEventsOnMap()
{
	if (events.valueOf() == 'on')
	{
		switchEventsOff();
	}
	else
	{
		switchEventsOn();	
	}
}

function switchAccidentsOn()
{
	accidents="on";
	dwr.util.byId('accidentsSwitch').checked=true;
	addEvents('Accidents');
}

function switchAccidentsOff()
{
	accidents="off";
	dwr.util.byId('accidentsSwitch').checked=false;
	removeEvents('Accidents');
}

function toggleAccidentsOnMap()
{
	if (accidents.valueOf() == 'on')
	{
		switchAccidentsOff();
	}
	else
	{
		switchAccidentsOn();	
	}
}

function switchIncidentsOn()
{
	incidents="on";
	dwr.util.byId('incidentsSwitch').checked=true;
	addEvents('Incidents');	
}

function switchIncidentsOff()
{
	incidents="off";
	dwr.util.byId('incidentsSwitch').checked=false;
	removeEvents('Incidents');
}

function toggleIncidentsOnMap()
{
	if (incidents.valueOf() == 'on')
	{
		switchIncidentsOff();
	}
	else
	{
		switchIncidentsOn();
	}
}

function switchTrainsOn()
{
	trains="on";
	dwr.util.byId('trainsSwitch').checked=true;
	addEvents('Trains');
}

function switchTrainsOff()
{
	trains="off";
	dwr.util.byId('trainsSwitch').checked=false;
	removeEvents('Trains');
}

function toggleTrainsOnMap()
{
	if (trains.valueOf() == 'on')
	{
		switchTrainsOff();
	}
	else
	{
		switchTrainsOn();	
	}
}

function switchBusStationsOn()
{
	busStations="on";
	dwr.util.byId('busStationsSwitch').checked=true;
	addEvents('BusStations');
}

function switchBusStationsOff()
{
	busStations="off";
	dwr.util.byId('busStationsSwitch').checked=false;

       _clustererBusStation.RemoveAllMarkers();
	removeEvents('BusStations');
}

function toggleBusStationsOnMap()
{
	if (busStations.valueOf() == 'on')
	{
		switchBusStationsOff();
	}
	else
	{
		switchBusStationsOn();	
	}
}

function switchAirportsOn()
{
	airports="on";
	dwr.util.byId('airportsSwitch').checked=true;
	addEvents('Airports');
}

function switchAirportsOff()
{
	airports="off";
	dwr.util.byId('airportsSwitch').checked=false;
	removeEvents('Airports');
}

function toggleAirportsOnMap()
{
	if (airports.valueOf() == 'on')
	{
		switchAirportsOff();
	}
	else
	{
		switchAirportsOn();	
	}
}

function switchParkingOn()
{
	parking="on";
	dwr.util.byId('carparkSwitch').checked=true;
	addEvents('Carparks');
}

function switchParkingOff()
{
	parking="off";
	dwr.util.byId('carparkSwitch').checked=false;

	_clustererCarPark.RemoveAllMarkers();

	removeEvents('Carparks');
}

function toggleParkingOnMap()
{
	if (parking.valueOf() == 'on')
	{
		switchParkingOff();
	}
	else
	{
		switchParkingOn();
	}
}

function switchDisabledOn()
{
	disabled="on";
	dwr.util.byId('disabledSwitch').checked=true;
	addEvents('Disabled');
}

function switchDisabledOff()
{
	disabled="off";
	dwr.util.byId('disabledSwitch').checked=false;
	
	_clustererBlueBadge.RemoveAllMarkers();
	
	removeEvents('Disabled');
}

function toggleDisabledOnMap()
{
	if (disabled.valueOf() == 'on')
	{
		switchDisabledOff();
	}
	else
	{
		switchDisabledOn();
	}
}

function switchVmsOn()
{
	vms="on";
	dwr.util.byId('vmsSwitch').checked=true;
	addEvents('Vms');
}

function switchVmsOff()
{
	vms="off";
	dwr.util.byId('vmsSwitch').checked=false;	
	removeEvents('Vms');
}

function toggleVmsOnMap()
{
	if (vms.valueOf() == 'on')
	{
		switchVmsOff();
	}
	else
	{
		switchVmsOn();
	}
}

function switchWhizzgoOn()
{
	whizzgo="on";
	dwr.util.byId('whizzgoSwitch').checked=true;	
	addEvents('Whizzgo');
}

function switchWhizzgoOff()
{
	whizzgo="off";
	dwr.util.byId('whizzgoSwitch').checked=false;
	
	_clustererWhizzGo.RemoveAllMarkers();
	
	removeEvents('Whizzgo');
}

function toggleWhizzgoOnMap()
{
	if (whizzgo.valueOf() == 'on')
	{
		switchWhizzgoOff();
	}
	else
	{
		switchWhizzgoOn();
	}
}

function switchBusstopOn()
{
	busstop="on";
	dwr.util.byId('busstopSwitch').checked=true;	

	loadBusMapXML(); 
	//addEvents('Busstop');
}

function switchBusstopOff()
{
	busstop="off";
	dwr.util.byId('busstopSwitch').checked=false;
		
	removeEvents('Busstop');
}

function toggleBusstopOnMap()
{
	if (busstop.valueOf() == 'on')
	{
		switchBusstopOff();
	}
	else
	{
		switchBusstopOn();
	}
}

function switchTaxis12On()
{
	taxis12="on";
	dwr.util.byId('taxi12Switch').checked=true;	
	addEvents('TaxiRank12');
}

function switchTaxis12Off()
{
	taxis12="off";
	dwr.util.byId('taxi12Switch').checked=false;
	
	_clustererTaxi12.RemoveAllMarkers();
	
	removeEvents('TaxiRank12');
}

function toggleTaxis12OnMap()
{
	if (taxis12.valueOf() == 'on')
	{
		switchTaxis12Off();
	}
	else
	{
		switchTaxis12On();	
	}
}

function switchTaxis24On()
{
	taxis24="on";
	dwr.util.byId('taxi24Switch').checked=true;	
	addEvents('TaxiRank24');
}

function switchTaxis24Off()
{
	taxis24="off";
	dwr.util.byId('taxi24Switch').checked=false;
	
	_clustererTaxi24.RemoveAllMarkers();
	
	removeEvents('TaxiRank24');
}

function toggleTaxis24OnMap()
{
	if (taxis24.valueOf() == 'on')
	{
		switchTaxis24Off();
	}
	else
	{
		switchTaxis24On();	
	}
}

function switchParkAndRideOn()
{
	parkandride="on";
	dwr.util.byId('parkandrideSwitch').checked=true;
	addEvents('ParkAndRide');
}

function switchParkAndRideOff()
{
	parkandride="off";
	dwr.util.byId('parkandrideSwitch').checked=false;
	removeEvents('ParkAndRide');
}

function toggleParkAndRideOnMap()
{
	if (parkandride.valueOf() == 'on')
	{
		switchParkAndRideOff();
	}
	else
	{
		switchParkAndRideOn();	
	}
}

function switchCamerasOn()
{
	cctv="on";
	dwr.util.byId('cctvSwitch').checked=true;
	addEvents('CCTV');
}

function switchCamerasOff()
{
	cctv="off";
	dwr.util.byId('cctvSwitch').checked=false;

	_clustererCctv.RemoveAllMarkers();
	removeEvents('CCTV');
}

function toggleCamerasOnMap()
{
	if (cctv.valueOf() == 'on')
	{
		switchCamerasOff();
	}
	else
	{
		switchCamerasOn();	
	}
}

function switchHanetCamerasOn()
{
	if(dwr.util.byId('haCctvSwitch')){
		hacctv="on";
		dwr.util.byId('haCctvSwitch').checked=true;
		addEvents('HACCTV');
	}
}

function switchHanetCamerasOff()
{
	if(dwr.util.byId('haCctvSwitch')){
		hacctv="off";
		dwr.util.byId('haCctvSwitch').checked=false;
		_clustererHacctv.RemoveAllMarkers();
		removeEvents('HACCTV');
	}
}

function toggleHanetCamerasOnMap()
{
	if (hacctv.valueOf() == 'on')
	{
		switchHanetCamerasOff();
	}
	else
	{
		switchHanetCamerasOn();	
	}
}

function switchAirQualityOn()
{
	airquality="on";
	dwr.util.byId('airqualitySwitch').checked=true;
	addEvents('AirQuality');
}

function switchAirQualityOff()
{
	airquality="off";
	dwr.util.byId('airqualitySwitch').checked=false;
	removeEvents('AirQuality');
}

function toggleAirQualityOnMap()
{
	if (airquality.valueOf() == 'on')
	{
		switchAirQualityOff();
	}
	else
	{
		switchAirQualityOn();	
	}
}

function switchRoadworksOn()
{
	roadworks="on";
	dwr.util.byId('roadworksSwitch').checked=true;
	addEvents('Roadworks');
}

function switchRoadworksOff()
{
	roadworks="off";
	dwr.util.byId('roadworksSwitch').checked=false;
	removeEvents('Roadworks');
}


function switchCyclepathsOn()
{
	cyclepaths="on";
	dwr.util.byId('cyclepathsSwitch').checked=true;
	
	//turn extra icons off
	switchAccidentsOff();
	switchAirQualityOff();
	switchCamerasOff();
	switchDisabledOff();
	switchEventsOff();
	switchIncidentsOff();	
	switchParkingOff();
	switchRoadworksOff();
	switchTaxis12Off();
	switchTaxis24Off();
	switchVmsOff();
	switchWhizzgoOff();
	switchBusstopOff();
}

function switchCyclepathsOff()
{
	cyclepaths="off";
	dwr.util.byId('cyclepathsSwitch').checked=false;
}

function toggleCyclepathsOnMap(){ 
	if (cyclepaths.valueOf() == 'on'){
		switchCyclepathsOff();
	}
	else
	{		
		switchCyclepathsOn();
	}
	redraw();
	refreshPage();
}

////////////////////////////////////////////////////////////////////////////////
// Called when the user clicks the refresh button.
//
////////////////////////////////////////////////////////////////////////////////
function refreshPage()
{

	_timescale = parseInt(dwr.util.byId('timescalelist').value);

	//removeAllEvents();
	loadIconCookie();

	//loadMarkers("");

	showEvents();
}

if (GBrowserIsCompatible()) 
{
    // Create a base icon for all of our markers that specifies the shadow, icon
    // dimensions, etc.
    var baseIcon = new GIcon();
    //baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
    baseIcon.iconSize = new GSize(23, 42);
    //baseIcon.shadowSize = new GSize(37, 37);
    baseIcon.iconAnchor = new GPoint(9, 37);
    baseIcon.infoWindowAnchor = new GPoint(9, 2);
    //baseIcon.infoShadowAnchor = new GPoint(18, 25);
}
else 
{	
    alert( "gmaps not compatible with this browser, sorry" );
}

////////////////////////////////////////////////////////////////////////////////
// Cookie stuff
//
////////////////////////////////////////////////////////////////////////////////

function saveMapFocus(){

	var center = _map.getCenter();
	var lat = new String(center.y);
	var lng = new String(center.x);
	var zoom = _map.getZoom();
	
	var c_string = lat.substring(0,10) + ":" + lng.substring(0,10) + ":" + zoom;
	
	setFocusCookie('mapfocusstate',c_string,365);
	
	persistMapFocusState(c_string);

}

function setFocusCookie(c_name,str,expiredays){
	var exdate = new Date()
	exdate.setDate(exdate.getDate() + expiredays)
	document.cookie = c_name + "=" + str + ((expiredays==null) ? "" : ";expires=" + exdate.toGMTString());
}

function resetMapFocus(){
	//delete cookie
	if(getCookie('mapfocusstate').length > 0){
		var c_date = new Date();
  		c_date.setTime(c_date.getTime() - 1);
  		document.cookie = "mapfocusstate=; expires=" + c_date.toGMTString();
  		persistMapFocusState("");
	}
	//reset map position to default
	_map.setCenter(new GLatLng(53.805922, -1.544266), 11);
}

function setIconCookie(c_name,arr,expiredays){
	var c_string = "";
	for(var i=0; i<arr.length; i++){
		c_string += arr[i];
	}
	var exdate = new Date()
	exdate.setDate(exdate.getDate() + expiredays)
	document.cookie = c_name + "=" + c_string + ((expiredays==null) ? "" : ";expires=" + exdate.toGMTString());
	
	persistMapIconState(c_string);

}

function loadIconCookie(){
	//get icon cookie value onload
	_cookie = getCookie('mapiconstate'); 
} 

function getCookie(c_name){

	var _c = "";

	//determine if fetch user defined map data from database or from cookie
	if(userLoggedIn){
		
		switch(c_name){
			case 'mapfocusstate':
			 	if(trimCookie(mapFocusState).length>0){
			 		_c = mapFocusState;
			 	}			
			break;
			case 'mapiconstate':
			 	if(trimCookie(mapIconState).length>0){
			 		_c = mapIconState;
			 	}
			break;	
		}
			
	}
	else{
		//get data from cookie if exists
		if (document.cookie.length > 0){
	
  			var c_start = document.cookie.indexOf(c_name + "=");
  		
  			if (c_start!=-1){ 
  		
    			c_start = c_start + c_name.length + 1;
    			var c_end = document.cookie.indexOf(";", c_start);
    		
    			if (c_end == -1){
    				c_end = document.cookie.length;
    			}
    		
    			_c = document.cookie.substring(c_start, c_end);
    			
    		} 
  		}
  	
  	}

	return _c;

}

function trimCookie(str){
  return str.replace(/^\s+|\s+$/g, '');
}

function restoreMapIconState(type){

	switch(type){
		case "Roadworks":
			if(_cookie.charAt(0)==0){
				switchRoadworksOff();
			}
		break;
		case "Events":
			if(_cookie.charAt(1)==0){
				switchEventsOff();
			}
		break;
		case "Accidents":
			if(_cookie.charAt(2)==0){
				switchAccidentsOff();
			}
		break;
		case "Incidents":
			if(_cookie.charAt(3)==0){
				switchIncidentsOff();
			}
		break;
		case "Trains":
			if(_cookie.charAt(4)==0){
				switchTrainsOff();
			}
		break;
		case "BusStations":
			if(_cookie.charAt(5)==0){
				switchBusStationsOff();
			}
		break;
		case "Airports":
			if(_cookie.charAt(6)==0){
				switchAirportsOff();
			}
		break;
		case "Carparks":
			if(_cookie.charAt(7)==0){
				switchParkingOff();
			}
		break;
		case "Disabled":
			if(_cookie.charAt(8)==0){
				switchDisabledOff();
			}
		break;
		case "Whizzgo":
			if(_cookie.charAt(9)==0){
				switchWhizzgoOff();
			}
		break;
		case "Vms":
			if(_cookie.charAt(10)==0){
				switchVmsOff();
			}
		break;
		case "TaxiRank12":
			if(_cookie.charAt(11)==0){
				switchTaxis12Off();
			}
		break;
		case "TaxiRank24":
			if(_cookie.charAt(12)==0){
				switchTaxis24Off();
			}
		break;
		case "ParkAndRide":
			if(_cookie.charAt(13)==0){
				switchParkAndRideOff();
			}
		break;
		case "CCTV":
			if(_cookie.charAt(14)==0){
				switchCamerasOff();
			}
		break;
		case "AirQuality":
			if(_cookie.charAt(15)==0){
				switchAirQualityOff();
			}
		break;
		case "HACCTV":
			if(_cookie.charAt(16)==0){
				switchHanetCamerasOff();
			}
		break;
		case "Busstop":
			if(_cookie.charAt(17)==0){
				switchBusstopOff();
			}
		break;
		default:
		break;
	}
}


//function converts button off/on state to integer value 0/1
//resulting string records button states and is placed in cookie or database
function generateIconCookie(type){

	//array storing button state
	var tmpArray = new Array('roadworks','events','accidents','incidents','trains','busStations','airports','parking','disabled','whizzgo','vms','taxis12','taxis24','parkandride','cctv','airquality','hacctv','busstop');
	
	//cookie array - stores layer state (1=on,0=off)
	var c_array = new Array(tmpArray.length);
	for(var i=0; i<tmpArray.length; i++){
		
		switch(eval(tmpArray[i])){
			case 'on':
				c_array[i] = 1;
				if(type==tmpArray[i]){
					c_array[i] = 0;
				}
			break;
			case 'off':
				c_array[i] = 0;
				if(type==tmpArray[i]){
					c_array[i] = 1;
				}
			break;
		}

	}
	
	//all traffic
	if(type == 'allTrafficOn' || type == 'allTrafficOff'){
		//events array
		var evtsArray = new Array('roadworks','events','accidents','incidents','vms','parking','cctv','airquality','hacctv');
		for(var i=0; i<tmpArray.length; i++){
			for(var x=0; x<evtsArray.length; x++){
				if(evtsArray[x]==tmpArray[i]){
					
					switch(type){
						case 'allTrafficOn':
							c_array[i] = 1;
						break;
						case 'allTrafficOff':
							c_array[i] = 0;
						break;
					}	
						
					break;
				}
			}		
		}
	}
	
	//all transport
	if(type == 'allTransportOn' || type == 'allTransportOff'){
		//info array
		var infoArray = new Array('trains','busStations','airports','disabled','whizzgo','taxis12','taxis24','parkandride','busstop');
		for(var i=0; i<tmpArray.length; i++){
			for(var x=0; x<infoArray.length; x++){
				if(infoArray[x]==tmpArray[i]){
					
					switch(type){
						case 'allTransportOn':
							c_array[i] = 1;
						break;
						case 'allTransportOff':
							c_array[i] = 0;
						break;
					}	
						
					break;
				}
			}		
		}
	}
	
	return c_array;
	
}

function toggleIcon(type,state){

	setIconCookie('mapiconstate',generateIconCookie(type),365);

	switch(type){
		case "roadworks":
			toggleRoadworksOnMap();
		break;
		case "events":
			toggleEventsOnMap();
		break;
		case "accidents":
			toggleAccidentsOnMap();
		break;
		case "incidents":
			toggleIncidentsOnMap();
		break;
		case "trains":
			toggleTrainsOnMap();
		break;
		case "busStations":
			toggleBusStationsOnMap();
		break;
		case "airports":
			toggleAirportsOnMap();
		break;
		case "parking":
			toggleParkingOnMap();
		break;
		case "disabled":
			toggleDisabledOnMap();
		break;
		case "whizzgo":
			toggleWhizzgoOnMap();
		break;
		case "busstop":
			toggleBusstopOnMap();
		break;
		case "vms":
			toggleVmsOnMap();
		break;
		case "taxis12":
			toggleTaxis12OnMap();
		break;
		case "taxis24":
			toggleTaxis24OnMap();
		break;
		case "parkandride":
			toggleParkAndRideOnMap();
		break;
		case "cctv":
			toggleCamerasOnMap();
		break;
		case "hacctv":
			toggleHanetCamerasOnMap();
		break;
		case "airquality":
			toggleAirQualityOnMap();
		break;
		case "cyclepaths":
			toggleCyclepathsOnMap();			
		break;
		default:
		break;
	}
}

function allTrafficOn(){

	setIconCookie('mapiconstate',generateIconCookie('allTrafficOn'),365);

	if (roadworks.valueOf() == 'off'){
		switchRoadworksOn();	
	}
	if (events.valueOf() == 'off'){
		switchEventsOn();	
	}
	if (accidents.valueOf() == 'off'){
		switchAccidentsOn();	
	}
	if (incidents.valueOf() == 'off'){
		switchIncidentsOn();
	}
	if (vms.valueOf() == 'off'){
		switchVmsOn();
	}
	if (parking.valueOf() == 'off'){
		switchParkingOn();
	}
	if (cctv.valueOf() == 'off'){
		switchCamerasOn();
	}
	if (hacctv.valueOf() == 'off'){
		switchHanetCamerasOn();
	}
	if (airquality.valueOf() == 'off'){
		switchAirQualityOn();
	}
}

function allTrafficOff(){

	setIconCookie('mapiconstate',generateIconCookie('allTrafficOff'),365);

	if (roadworks.valueOf() == 'on'){
		switchRoadworksOff();
	}
	if (events.valueOf() == 'on'){
		switchEventsOff();
	}
	if (accidents.valueOf() == 'on'){
		switchAccidentsOff();
	}
	if (incidents.valueOf() == 'on'){
		switchIncidentsOff();
	}
	if (vms.valueOf() == 'on'){
		switchVmsOff();
	}
	if (parking.valueOf() == 'on'){
		switchParkingOff();
	}
	if (cctv.valueOf() == 'on'){
		switchCamerasOff();
	}
	if (hacctv.valueOf() == 'on'){
		switchHanetCamerasOff();
	}
	if (airquality.valueOf() == 'on'){
		switchAirQualityOff();
	}
}

function allTransportOn(){

	setIconCookie('mapiconstate',generateIconCookie('allTransportOn'),365);

	if (trains.valueOf() == 'off'){
		switchTrainsOn();	
	}
	if (busStations.valueOf() == 'off'){
		switchBusStationsOn();	
	}
	if (airports.valueOf() == 'off'){
		switchAirportsOn();	
	}
	if (disabled.valueOf() == 'off'){
		switchDisabledOn();
	}
	if (whizzgo.valueOf() == 'off'){
		switchWhizzgoOn();
	}
	if (busstop.valueOf() == 'off'){
		switchBusstopOn();
	}
	if (taxis12.valueOf() == 'off'){
		switchTaxis12On();
	}
	if (taxis24.valueOf() == 'off'){
		switchTaxis24On();
	}
	if (parkandride.valueOf() == 'off'){
		switchParkAndRideOn();
	}
}

function allTransportOff(){

	setIconCookie('mapiconstate',generateIconCookie('allTransportOff'),365);

	if (trains.valueOf() == 'on'){
		switchTrainsOff();
	}
	if (busStations.valueOf() == 'on'){
		switchBusStationsOff();
	}
	if (airports.valueOf() == 'on'){
		switchAirportsOff();
	}
	if (disabled.valueOf() == 'on'){
		switchDisabledOff();
	}
	if (whizzgo.valueOf() == 'on'){
		switchWhizzgoOff();
	}
	if (busstop.valueOf() == 'on'){
		switchBusstopOff();
	}
	if (taxis12.valueOf() == 'on'){
		switchTaxis12Off();
	}
	if (taxis24.valueOf() == 'on'){
		switchTaxis24Off();
	}
	if (parkandride.valueOf() == 'on'){
		switchParkAndRideOff();
	}
}

/**
 * Display a progress message when loading data 
 */
function showProgressControl()
{
    _progressControl = new ProgressControl();
    _map.addControl(this._progressControl);
    
} // showProgressControl


function createClusters()
{
	//create the marker clusterers
	//taxi 12
    _clustererTaxi12 = new Clusterer(_map);
    _clustererTaxi12.SetMaxVisibleMarkers(5);
    _clustererTaxi12.SetMinMarkersPerCluster(5);
    var clustererTaxi12Icon = new GIcon(baseIcon);
    clustererTaxi12Icon.image = _URL_HOST_SITE + "../images/taxirank12_cluster.gif";
    _clustererTaxi12.SetIcon(clustererTaxi12Icon);
    
    //taxi24
	_clustererTaxi24 = new Clusterer(_map);
	_clustererTaxi24.SetMaxVisibleMarkers(5);
	_clustererTaxi24.SetMinMarkersPerCluster(5);
	var clustererTaxi24Icon = new GIcon(baseIcon);
	clustererTaxi24Icon.image = _URL_HOST_SITE + "../images/taxirank24_cluster.gif";
    _clustererTaxi24.SetIcon(clustererTaxi24Icon);
    
    //blue badge
    _clustererBlueBadge = new Clusterer(_map);
    _clustererBlueBadge.SetMaxVisibleMarkers(5);
    _clustererBlueBadge.SetMinMarkersPerCluster(5);
    var clustererBlueBadgeIcon = new GIcon(baseIcon);
    clustererBlueBadgeIcon.image = _URL_HOST_SITE + "../images/disabled_cluster.gif";
    _clustererBlueBadge.SetIcon(clustererBlueBadgeIcon);
    
    //whizz go
    _clustererWhizzGo = new Clusterer(_map);
    _clustererWhizzGo.SetMaxVisibleMarkers(5);
    _clustererWhizzGo.SetMinMarkersPerCluster(5);
    var clustererWhizzGoIcon = new GIcon(baseIcon);
    clustererWhizzGoIcon.image = _URL_HOST_SITE + "../images/whizzgo_cluster.gif";
    _clustererWhizzGo.SetIcon(clustererWhizzGoIcon);
    

    _clustererCarPark = new Clusterer(_map);
    _clustererCarPark.SetMaxVisibleMarkers(2);
    _clustererCarPark.SetMinMarkersPerCluster(2);
    var clustererCarParkIcon = new GIcon(baseIcon);
    clustererCarParkIcon.image = _URL_HOST_SITE + "../images/parking_cluster.gif";
    _clustererCarPark.SetIcon(clustererCarParkIcon);

    _clustererBusStation = new Clusterer(_map);
    _clustererBusStation.SetMaxVisibleMarkers(5);
    _clustererBusStation.SetMinMarkersPerCluster(2);
    var clustererBusStationIcon = new GIcon(baseIcon);
    clustererBusStationIcon.image = _URL_HOST_SITE + "../images/busstation_cluster.gif";
    _clustererBusStation.SetIcon(clustererBusStationIcon );

    _clustererCctv = new Clusterer(_map);
    _clustererCctv.SetMaxVisibleMarkers(5);
    _clustererCctv.SetMinMarkersPerCluster(2);
    var clustererCctvIcon = new GIcon(baseIcon);
    clustererCctvIcon.image = _URL_HOST_SITE + "../images/cctv_cluster.gif";
    _clustererCctv.SetIcon(clustererCctvIcon);

    _clustererHacctv = new Clusterer(_map);
    _clustererHacctv.SetMaxVisibleMarkers(5);
    _clustererHacctv.SetMinMarkersPerCluster(2);
    var clustererHacctvIcon = new GIcon(baseIcon);
    clustererHacctvIcon.image = _URL_HOST_SITE + "../images/hacctv_cluster.gif";
    _clustererHacctv.SetIcon(clustererHacctvIcon);

    createRoadworkCluster();
}

function createRoadworkCluster()
{
    _clustererRoadworks = new Clusterer(_map);
    _clustererRoadworks.SetMaxVisibleMarkers(5);
    _clustererRoadworks.SetMinMarkersPerCluster(2);
    var clustererRoadworksIcon = new GIcon(baseIcon);
    clustererRoadworksIcon.image = _URL_HOST_SITE + "../images/roadworks_cluster.gif";
    _clustererRoadworks.SetIcon(clustererRoadworksIcon);

	
}

// Sets the map dropdown to the timsacle value passed in.
function setTimescaleDropdown(timescale)
{
    var tsSelect = dwr.util.byId('timescalelist');
    for(var i=0; i<tsSelect.length; i++)
    {
    	if(timescale==tsSelect[i].value)
       {
    	    tsSelect.options[i].selected = true;
    	    break;
    	}
    }
}

// Sets the map town drop down to the last saved cookie, if no cookie
// is set will default it to all.
function setTownDropdownFromCookie()
{
    var townSelect = dwr.util.byId('townList');

    for(var i=0; i<townSelect.length; i++)
    {
    	if(getTheCookie('town')==townSelect[i].value)
       {
    	   townSelect.options[i].selected = true;
    	   break;
    	}
    }
}


