		
// set global variables
		activeLayer = null;
		LayerObj	= new Array();
		LabelObj	= new Array();
		Theme =  new Array();
		Abstract = new Array();
		Security = new Array();
		User = new Array();
		Pass = new Array();
		Url = new Array();
		Name = new Array();
		Srs = new Array();
		Sld =  new Array();
		SldLabels =  new Array();
		Opac = new Array();
		Ogc = new Array();
		TitleText = new Array();
		Vis = new Array();
		Labels = new Array();
		Leg = new Array();
		Style = new Array();
		Zindex = new Array();
		selectedStyle = new Array();
		Gfi = new Array();
		Status = new Array();
		Plotted = new Array();
		layNames =  new Array();
		Format = new Array();
		MinzmLayers = new Array();
		MaxzmLayers =  new Array();
		MinzmLabels = new Array();
		MaxzmLabels =  new Array();
		LayerAbstract = new Array();
		sldLayerName = new Array();
		LayerBbox = new Array();
		LayerBounds = new Array();
		LayerType = new Array();
		LayerTiled =  new Array();
		Attribution = new Array();

function swapBase(newBaseLayer)
{
	//alert('swapping to = '+newBaseLayer)
	//alert('googleMap = '+googleMap)
	//if(map) {map.destroy(); alert('map killed off');}

	//alert(loadIT)
	if (newBaseLayer == 'googleMap' )
	{			
		if( googleMap == null)
		{
			googleMap = new OpenLayers.Layer.Google( "GoogleMaps" , {type: G_NORMAL_MAP, sphericalMercator:spMerc} );
			googleMap.addOptions({isBaseLayer: true, wrapDateLine: true, buffer: buff,  minZoomLevel:4, numZoomLevels:20, maxZoomLevels:20, maxResolution: res });
			map.addLayer(googleMap);
			map.setBaseLayer(googleMap);
			document.getElementById('gm').checked=true;
			if(loadIT){registerLoadWheel(googleMap,  'baseLoadWheel');}
		}
		else {	map.setBaseLayer(googleMap);	}
	}
	if (newBaseLayer == 'googleSat' )
	{	
		if(googleSat == null)
		{
			googleSat = new OpenLayers.Layer.Google( "GoogleSat" , {type: G_SATELLITE_MAP, sphericalMercator:spMerc} );
			googleSat.addOptions({isBaseLayer: true, wrapDateLine: true, buffer: buff, minZoomLevel: 4, numZoomLevels:20, maxZoomLevels:20, maxResolution: res });
			map.addLayer(googleSat);
			map.setBaseLayer(googleSat);
			document.getElementById('gs').checked=true;
			if(loadIT){registerLoadWheel(googleSat,  'baseLoadWheel');}
		}
		else {	map.setBaseLayer(googleSat);	}
	}
	if (newBaseLayer == 'googleDem' ) 
	{	
		if(googleDem == null)
		{
			googleDem = new OpenLayers.Layer.Google( "GoogleHills" , {type: G_PHYSICAL_MAP, sphericalMercator:spMerc} );
			googleDem.addOptions({isBaseLayer: true, wrapDateLine: true, buffer: buff, minZoomLevel: 4, numZoomLevels:18, maxZoomLevel: 18, maxResolution: res});
			map.addLayer(googleDem);
			map.setBaseLayer(googleDem);
			document.getElementById('gd').checked=true;
			if(loadIT){registerLoadWheel(googleDem,  'eventsLogID');}
		}
		else {	map.setBaseLayer(googleDem);	}
	}	
		
	if (newBaseLayer == 'googleHyb' )
	{
		if(googleHyb == null)
		{	
			googleHyb = new OpenLayers.Layer.Google( "GoogleHybrid" , {type: G_HYBRID_MAP, sphericalMercator:spMerc} );
			googleHyb.addOptions({isBaseLayer: true, wrapDateLine: true, buffer: buff, minZoomLevel: 4, numZoomLevels:20, maxZoomLevels:20 , maxResolution: res });
			map.addLayer(googleHyb);
			map.setBaseLayer(googleHyb);
			document.getElementById('gh').checked=true;
			if(loadIT){registerLoadWheel(googleHyb,  'eventsLogID');}
		}
		else {	map.setBaseLayer(googleHyb);	}
	}
	if (newBaseLayer == 'numaps')
	{	
		if(numaps == null)
		{
			numapsBasemapUrl = applicationBase+'inc/sld/mb/numapsBasemap.xml?';
			numaps = new OpenLayers.Layer.WMS( "NuMaps" , numapsService, { sld:numapsBasemapUrl, sphericalMercator: spMerc, format: drapeImage, quality:'BEST', transparent:true} );
			numaps.addOptions({isBaseLayer: true, wrapDateLine: true, buffer: buff, opacity:".3", maxResolution: res, tileSize: new OpenLayers.Size(tileSize,tileSize)});
			map.addLayer(numaps);
			map.setBaseLayer(numaps);
			document.getElementById('nm').checked=true;
			if(loadIT){registerLoadWheel(numaps,  'baseLoadWheel');}
		}
		else{  	map.setBaseLayer(numaps);	}
	}
	if (newBaseLayer == 'nearmap' )
	{
		if(nearmap == null)
		{
		   proj = srs; dproj = "EPSG:4326";
		   if (srs == 'EPSG:900913')
			{
				spMerc=true; 
				xStart = 12899000.0; yStart= -3763455.0; res = 156543.0399; units ='m'; 
				bounds = new OpenLayers.Bounds(-20037508.3427892,-20037508.3427892,20037508.3427892,20037508.3427892);
			}
			else if(srs == "EPSG:4326" )						
			{
				spMerc=false; 
				xStart = 138.54; yStart= -34.9; res = 0.703125,  units='degrees';
				bounds = new OpenLayers.Bounds(104.94141,  -44.96480,  180.0,  0.0);
			}
			
			nearmap = new OpenLayers.Layer.TMS
			(
				"NearMap",
				"http://www.nearmap.com/maps/",
				{
					type: 'png' 
					,getURL: get_my_url			// this gets the urls
					//,displayOutsideMaxExtent: true
					,sphericalMercator:spMerc
				}
			);
			nearmap.addOptions(
			{	
				attribution: 'Image Base Map from Nearmap',
				//scales: [50000000,20000000,5000000,1000000,500000,250000,100000,50000,25000,10000,5000,2500,1000,500],
				isBaseLayer: true,
				buffer: buff,
				maxExtent: bounds,
				maxResolution: res, 
				units: units, 
				projection: new OpenLayers.Projection(proj),
				displayProjection: new OpenLayers.Projection(dproj),
				opacity: 1,
				minZoomLevel: 4, numZoomLevels:22, numZoomLevels:22,
				reproject: false
			});

			map.addLayer(nearmap);
			map.setBaseLayer(nearmap);
			map.setCenter(map.getCenter(), map.getZoom());
			if(document.getElementById('near')){document.getElementById('near').checked=true;}
			if(loadIT){registerLoadWheel(nearmap,  'baseLoadWheel');}
		}
		else {	map.setBaseLayer(nearmap);	}
	}
	
	if (newBaseLayer == 'OpenStreetMap'  )
	{
      	if(osmap == null)
		{
			spMerc=true; 
			xStart = 14881372.0; yStart= -3003669.0; 
			res = 156543.0399; 
			units ='m'; 
			proj = 'EPSG:900913'; 
			dproj = "EPSG:4326"; 
			//bounds = new OpenLayers.Bounds(-20037508.3427892,-20037508.3427892,20037508.3427892,20037508.3427892);
			
			map = new OpenLayers.Map ("map", 
				{
				   // controls:[
				   //     new OpenLayers.Control.Navigation(),
				   //     new OpenLayers.Control.PanZoomBar(),
				   //     new OpenLayers.Control.Attribution()],
					maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
					maxResolution: res,
					numZoomLevels: 19,
					units: units,
					projection: new OpenLayers.Projection(proj),
					displayProjection: new OpenLayers.Projection(dproj)
				} );
			
			
			// Define the map layer
			 // Other defined layers are OpenLayers.Layer.OSM.Mapnik, OpenLayers.Layer.OSM.Maplint and OpenLayers.Layer.OSM.CycleMap
			osmap = new OpenLayers.Layer.OSM.Osmarender("OpenStreetMap");
			//osmap.addOptions({isBaseLayer: true, opacity:"0.8"});
			map.addLayer(osmap);
			map.setBaseLayer(osmap)

			//osmap = new OpenLayers.Layer.OSM.Osmarender("Osmarender");
			//map.addLayer(osmap);

			//if(map) {map.destroy;}
			//osmap = new OpenLayers.Layer.OSM("OpenStreetMap (Tiles@Home)", "http://tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png"  );
			//map.addLayer(osmap);
			map.setCenter(map.getCenter(), map.getZoom());
			if(document.getElementById('osm')){document.getElementById('osm').checked=true;}
			//if(loadIT){registerLoadWheel(osmap,  'baseLoadWheel');}
		}
		else { map.setBaseLayer(osmap);	}	
	}
	else { map.setBaseLayer(osmap);	}
	
	if (newBaseLayer == 'bingShaded' ) 
	{  
		if(bingShaded == null)
		{
			//shaded = new OpenLayers.Layer.VirtualEarth("BingShaded", { type: VEMapStyle.Shaded      });
			bingShaded = new OpenLayers.Layer.VirtualEarth( "BingShaded" , {type: VEMapStyle.Shaded} );
			//bingShaded.addOptions({isBaseLayer: true, wrapDateLine: true, buffer: buff, minZoomLevel:3, maxZoomLevel: 18 });
			map.addLayer(bingShaded);
			map.setBaseLayer(bingShaded);
			//registerEvents(googleDem);
		}
		else{	map.setBaseLayer(bingShaded);	}
	}
	//map.setBaseLayer(window[newBaseLayer]);
}
// this will get the Tile Urls based on AOI
function get_my_url (bounds) 
{
	var res = this.map.getResolution();
	//alert(res)
	//alert(bounds)
	var x = Math.round ((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
	var y = Math.round ((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
	var z = this.map.getZoom();

	// this is an eg of a nearmap url >> http://www.nearmap.com/?hl=en&x=53852&y=38914&z=16&nml=Vert&s=Galileo
	//var path = z + "/" + x + "/" + y + "." + this.type;
	//var path = "msps/x=" + x + "&y=" + y + "&z="+z + "&hl=en&nml=Vert&s=Galileo" ; 
	var path = "x=" + x + "&y=" + y + "&z="+z + "&hl=en&nml=Vert&s=Galileo" ; 
	var url = this.url;
	if (url instanceof Array) 
	{
		url = this.selectUrl(path, url);
	}
	//alert(url + path);
	return url + path;

	
}

/*
function osm_getTileURL(bounds) 
{
	var res = this.map.getResolution();
	var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
	var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
	var z = this.map.getZoom();
	var limit = Math.pow(2, z);

	if (y < 0 || y >= limit) {
		return OpenLayers.Util.getImagesLocation() + "404.png";
	} else {
		x = ((x % limit) + limit) % limit;
		//var path = z + "/" + x + "/" + y + "." + this.type;
		var path = "?hl=en&z="+z + "&x=" + x + "&y=" + y + "&nml=Vert&s=Galile" ; 
		var newurl = this.url + path;
		//alert(newurl)
			return newurl;
	}
}
*/
function getBboxes(url)
{
	// do a get capabilitioes request on this URL
	query='&request=getcapabilities';
	//alert(url+query)
	ajaxRequest = loadXml(url, query, false);
	if(ajaxRequest.responseXML.getElementsByTagName('WMS_Capabilities').length > 0);
	{
		// first get the Capabilities tag
		var wmsCapabilities = ajaxRequest.responseXML.getElementsByTagName('WMS_Capabilities');
		var capability = wmsCapabilities[0].getElementsByTagName("Capability");
		var layers = capability[0].getElementsByTagName("Layer");

		// now step though all the layer tags looking for each layer 
		for (var i=0; i<layers.length ; i++ )
		{
			//alert("layer count = "+i)
			if(layers[i].getElementsByTagName("EX_GeographicBoundingBox") && layers[i].getElementsByTagName("Name"))
			{
				var bboxTag = layers[i].getElementsByTagName("EX_GeographicBoundingBox");
				var fullLayerName = layers[i].getElementsByTagName("Name")[0].firstChild.nodeValue;
				
				// now look for a Match on layername in layer arrays
				for (var j=0; j<numLayers ; j++)
				{
					if(fullLayerName == Name[j]) 
					{
						// get the BBox for tis layer
						var lleftx = bboxTag[0].getElementsByTagName("westBoundLongitude")[0].firstChild.nodeValue;
						var trightx = bboxTag[0].getElementsByTagName("eastBoundLongitude")[0].firstChild.nodeValue;
						var llefty = bboxTag[0].getElementsByTagName("southBoundLatitude")[0].firstChild.nodeValue;
						var trighty = bboxTag[0].getElementsByTagName("northBoundLatitude")[0].firstChild.nodeValue;
						
						// now make a new bounds object for this layer
						LayerBounds[j] = new OpenLayers.Bounds(lleftx, llefty, trightx, trighty);
						//alert(fullLayerName+" = "+LayerBounds[j]);
					}
				}
			}
		}
	}
	
}

// main function to load all the Layer definitions in holdingDiv and as defined in inputFile
function buildLayers(inputFile, holdingDiv)
{
	// check if holding div exists
	//alert(inputFile)
	if(!document.getElementById(holdingDiv)){alert ('Layers holding Div not available'); return;}
	var holdDiv = document.getElementById(holdingDiv);

	// check to see if the file is present
	var request = applicationBase + inputFile;
	ajaxRequest = loadXml(request, '' );
	if(!ajaxRequest) {alert('Could not get the inputFile off server'); return;}
	var k=0;
	
	var layers= ajaxRequest.responseXML.getElementsByTagName("Layers");
	//alert ('number of Layers tags = '+layers.length);
	// get layers data from DOM into arrays for easier use
	var themes = layers[0].getElementsByTagName("Theme");
	//alert ('number of Themes tags = '+themes.length);
	
	for (l=0; l<themes.length; l++)
	{
		var themeName=themes[l].getAttribute ("theme");
		var themeAbstract = themes[l].getAttribute("abstract");
		var themeSecurity = themes[l].getAttribute("security");
		var themeUser = themes[l].getAttribute("user");
		var themePass = themes[l].getAttribute("pass");
		//alert (themeAbstract)
		var xml = themes[l].getElementsByTagName("Layer");
		//alert (xml.length);
		if (xml.length == 0){alert ("Sorry no layer tags in "+url); return false;}
		// step through each Layer tag getting all the attribute elements
		for (i=0; i<xml.length; i++)
		{
			//alert('Theme No = '+l+" Layer No in this theme = "+i)
			//alert(xml[i].getAttribute("url"));
			LayerObj[k]		= null;
			LabelObj[k]		= null;
			Theme[k]		= themeName;
			Abstract[k]		= themeAbstract; 
			Security[k]		= themeSecurity;
			User[k]			= themeUser;
			Pass[k]			= themePass;
			
			TitleText[k]	= xml[i].getAttribute("title");		// this is what gets displayed as Layer Name in panel
			Leg[k]			= xml[i].getAttribute("ledg");		// flag set to 'sld' or 'glg'
			Name[k]			= xml[i].getAttribute("name");		// this is the layername
			SldLabels[k]	= xml[i].getAttribute("sldLabels");
			Opac[k]			= xml[i].getAttribute("opac");
			
			MinzmLayers[k]	= xml[i].getAttribute("minzm");
			MaxzmLayers[k]	= xml[i].getAttribute("maxzm");
			Zindex[k]		= xml[i].getAttribute("zindex");
			
			
			MinzmLabels[k]	= '';
			MaxzmLabels[k]	= '';
			sldLayerName[k] = '';
			LayerAbstract[k]= '';
			Status[k] = 'off';
			Plotted[k]='no';
			
			// get optional parameters
			Gfi[k] = 'text/xml; subtype="bxfs/0.0.2"';
			if(xml[i].getAttribute("gfi")) {Gfi[k]	= xml[i].getAttribute("gfi");}		// schema for getfeatureinfo requets

			// get Attribution if available
			Attribution[k] = 'NuMaps';
			if(xml[i].getAttribute('attribution')) {Attribution[k] = xml[i].getAttribute('attribution');}

			Vis[k] = 'false'
			if(xml[i].getAttribute("vis")) {Vis[k]	= xml[i].getAttribute("vis");}
			if (Vis[k] =='true'){Status[k] = "on";}
			
			Url[k] = meshBlocksBase;
			if (xml[i].getAttribute("url")) {Url[k]	= xml[i].getAttribute("url");}
			
			Ogc[k] = "1.1.3";
			if(xml[i].getAttribute("ogc")) {Ogc[k]	= xml[i].getAttribute("ogc"); }
			
			Format[k] = 'image/gif';
			if(xml[i].getAttribute("form")) {Format[k]	= xml[i].getAttribute("form"); }
						
			Style[k] = '';
			if(xml[i].getAttribute("style")) {Style[k]	= xml[i].getAttribute("style"); }
			if (Style[k] != '')
			{ 
				var styles=Style[k].split(",");
				selectedStyle[k]=styles[0];
			}
			Sld[k] = 'none';
			if(xml[i].getAttribute("sld") !='none' && xml[i].getAttribute("sld") !='' && xml[i].getAttribute("sld") != null)
			{
				Sld[k]	= xml[i].getAttribute("sld");
				//alert('sld = '+Sld[k])	
				getSldInfo(Sld[k]);
				//alert('SLD Abstract = '+sldAbstract);
				//alert('SLD Layer Name = '+layerName);
				LayerAbstract[k] = sldAbstract;
				sldLayerName[k] = layerName;
			}
			if(xml[i].getAttribute("bbox") !='none' && xml[i].getAttribute("bbox") !='' && xml[i].getAttribute("bbox") != null)
			{
				LayerBbox[k] = xml[i].getAttribute("bbox");
				var points = LayerBbox[k].split(' ');
				//alert("X = "+points[0]+" Y = "+points[1]);
				var leftparts = points[0].split(',');
				var rightparts = points[1].split(',');
				
				// convert to Sperical mercator if needed
				// transform geogs to spherical coords if required
				if (srs == 'EPSG:900913') 
				{
					// first LL point
					//var p1 = new OpenLayers.LonLat(leftparts[0],leftparts[1]);
					//alert(p1)
					var point = geogs2google(leftparts);
					p1 = decodePoint(point);
					//alert(p1)

					// second TR point
					//var p2 = new OpenLayers.LonLat(rightparts[0],rightparts[1]);
					var point = geogs2google(rightparts);
					p2 = decodePoint(point);
					//alert (p2)
					
					// create the new layer Bounds object
					LayerBounds[k] = new OpenLayers.Bounds(p1[0],p1[1],p2[0],p2[1]);
				}
				else
				{
					LayerBounds[k] = new OpenLayers.Bounds(leftparts[0],leftparts[1],rightparts[0],rightparts[1]);
				}
				//alert(LayerBounds[k]);
			}
			else
			{	
				LayerBounds[k] = null;
			}

			// get the layer type if present
			if(xml[i].getAttribute("type") != '')
			{
				LayerType[k]=xml[i].getAttribute("type");
			}
			// get the layer type if present
			if(xml[i].getAttribute("tiled") != '')
			{
				LayerTiled[k]=xml[i].getAttribute("tiled");
			}
			
			k = k +1;
			//alert ('k = '+k)
			
		}
	}
	numLayers=k;
	genLoadStatus('Building Layer Control ....', true)
	//alert('number of layers  = '+numLayers);

	// do a getcapabilities for the NuMaps site and get the BBox for each layer in the list
	var urlLast = '';
	//getBboxes(meshBlocksBase);
	//alert('now list all BBoxes');
	//for(var i=0; i<numLayers; i++)
	//{		
	//	alert('check on layer bounds array = '+ Name[i]+" == "+LayerBounds[i]);	
	//}

	// build the holder Form for Other Layers
	var layerForm = document.createElement('form');
	layerForm.style.width='100%';
	layerForm.style.height='160px'; 
	layerForm.style.overflowX='hidden'; 
	layerForm.style.overflowY='auto';  
	layerForm.style.position='absolute';
	layerForm.style.top='0px'; 
	layerForm.style.left='0px';  
	layerForm.style.borderTop='1px solid gray';
	layerForm.style.borderLeft='1px solid gray';
	layerForm.style.borderRight='1px solid white';
	layerForm.style.borderBottom='1px solid white';

		// build the Table within the Form
		var layerTable = document.createElement('table');
			var layerTableBody = document.createElement('tbody');
			layerTableBody.style.color='#000000'; 
			layerTableBody.style.position='absolute'; 
			layerTableBody.style.top='0px'; 
			layerTableBody.style.left='0px'; 
			layerTableBody.style.paddingTop='0px'; 
			layerTableBody.style.paddingBottom='2px'; 
			layerTableBody.style.height='60px'; 
			layerTableBody.style.borderCollapse='collapse'; 
			layerTableBody.style.fontWeight='bold'; 
			layerTableBody.style.fontSize='9px'; 
			layerTableBody.style.backgroundColor='#FFFFFF';

			// for each layer in the array setup the table row
			for(var i=0; i < numLayers ; i++)
			{
				if(SldLabels[i] != 'none' && SldLabels[i] != '' && SldLabels[i] != null)
				{
					// get the label rules for the checkboxes 
					ajaxRequest = loadXml(SldLabels[i], '' );
					var sldRules = ajaxRequest.responseXML.getElementsByTagName("Rule");
					getSldRenderRules(sldRules[0]);				// this only picks off the first rule
					MinzmLabels[i]=minScale;
					MaxzmLabels[i]=maxScale;
				}

				if(Sld[i] != 'none' && Sld[i] != '')
				{
					// get the render rules for the checkboxes 
					//alert(Sld[i])
					ajaxRequest = loadXml(Sld[i], '' );
					var sldRules = ajaxRequest.responseXML.getElementsByTagName("Rule");
					getSldRenderRules(sldRules[0]);			// this only picks off the first rule
					MinzmLayers[i]=minScale;
					MaxzmLayers[i]=maxScale;
					//alert(maxScale)
				}
				
				// what is the current scaleDenominator
				if(map)
				{	
					scaleDenom = map.getScale();
					zoomLevel = map.getZoom();
				}
				else
				{
					zoomLevel = startZoom;
					scaleDenom = startScale;
				}
				//alert(MinzmLayers[i]+"  -  "+scaleDenom+"  -  "+MaxzmLayers[i]);
				//
				// set up a new row in table
				var row = document.createElement('tr');
				row.style.height='15px';
				//row.style.backgroundColor=backColor;
				row.className='unselectedItem';
				row.title='Click here to make this layer the Active layer';
				row.setAttribute('id','arow:'+i);
				row.id='arow:'+i;

					// the first cell contains the layer visibility check box
					var cell = document.createElement('td');
					cell.style.width='15px';

						// create the Input checkbox for Layer selection
						var box = document.createElement('input');
						box.setAttribute('type','checkbox');
						//box.setAttribute('value',TitleText[i]);
						box.setAttribute('id','layers:'+i);
						box.id='layers:'+i;
						//box.style.backgroundColor='transparent';
	
						if (scaleDenom < MinzmLayers[i] || scaleDenom > MaxzmLayers[i] || !loadMe(i))
						{	box.disabled = true; box.checked=false;		}
						else
						{	box.disabled = false; box.checked=false;	}
						box.title='Check this box to overlay '+TitleText[i]+ ' Boundaries';
						
						bindEvent(box, 'click', showHideLayer, 'false');
						//if(browser == 'msie'){bindEvent(box, 'click', blurAfter, 'false');}
						//if(browser == 'firefox'){bindEvent(box, 'change', showHideLayer, 'false')}
						//else {bindEvent(box, 'click', blurAfter, 'false');}
						
					cell.appendChild(box);
				row.appendChild(cell);

					// the second cell contains the labels check box
					var cell = document.createElement('td');
					cell.style.width='15px';

						// create the Input checkbox
						var box = document.createElement('input');
						box.setAttribute('type','checkbox');
						//box.setAttribute('value',TitleText[i]);
						box.setAttribute('id','label:'+i);
						box.id='label:'+i;
						if (scaleDenom < MinzmLabels[i] || scaleDenom > MaxzmLabels[i] || !loadMe(i))
						{	box.disabled = true; box.checked=false;		}
						else
						{	box.disabled = false; box.checked=false;		}
						box.style.backgroundColor='transparent';
						box.title='Check this box to overlay '+TitleText[i]+' Labels';
						bindEvent(box, 'click', showHideLabels, 'false');
						//if(browser == 'msie'){bindEvent(box, 'click', blurAfter, 'false');}
						
					cell.appendChild(box);				
				row.appendChild(cell);

					// the third cell contains the legend cell
					var cell = document.createElement('td');
					cell.style.width='15px';

						// create the Input checkbox
						var box = document.createElement('div');
						box.setAttribute('id','lagend:'+i);
						box.id='legend:'+i;
						box.style.height='12px';
						box.style.width='12px';
						box.style.marginLeft='auto';
						box.style.marginRight='auto';
						box.style.backgroundColor='transparent';
						//box.style.border='1px solid blue';
						//box.style.verticalAlign='middle';

						// set up symbology as per SLD file
						if(Sld[i] != 'none')
						{
							// handle the line type layer first
							if(LayerType[i] == 'line' && strokeWidth != '' && strokeColr != '')
							{
								//alert('stroke = '+strokeWidth)
								// create a line across middle of box
								var line = document.createElement('div');
								box.appendChild(line);
								//line.style.position ='absolute';
								var top = 6 - Math.ceil(strokeWidth/2); 
								//var wdth = 12 - Math.ceil(strokeWidth/2)
								//alert('top = '+top)
								line.style.position = 'relative';								
								line.style.top = top+'px';
								line.style.left = '0px';
								line.style.width = '100%';
								line.style.height = '1px';
								//box.style.border='1px solid red';
								line.style.borderTop = strokeWidth+'px solid '+strokeColr;
							}
							// handle the polygon type layer
							else if(LayerType[i] == 'polygon')
							{
								if(strokeWidth != '' && strokeColr != '')	
								{	box.style.border = strokeWidth+'px solid '+strokeColr;}
								if(fillColr != '') 
								{	box.style.backgroundColor=fillColr;	}			
								if(fillOpac != '')
								{
									var opacity = parseFloat(fillOpac)
									var fillNumber = Math.abs(Number(opacity)*100);
									setOpacity(box, fillNumber);
								}
								if(fillPat != '') 
								{	box.style.backgroundImage='url('+fillPat+')';}

								
							}
							// handle a polygon type with legend
							else if(LayerType[i] == 'legend')
							{
								box.style.borderRight='1px solid gray';
								box.style.borderBottom='1px solid gray';
								box.style.borderTop = '1px solid #c3c3c3';
								box.style.borderRight = '1px solid #c3c3c3';
								box.style.backgroundColor='transparent';
								box.style.zIndex='5000';
								box.style.height='18px';
								box.style.width='20px';
								box.style.cursor='pointer';
								box.title = 'legend';
								box.style.borderStyle='none';
								box.style.backgroundColor='transparent';
								
								// add in the button image
								var img = document.createElement('img');
									img.src='images/legend.jpg';
									img.style.position='relative';
									img.style.top='2px';
									img.style.left='2px';
									img.style.zIndex='5001';
									img.setAttribute('id','legendInner:'+i);
									img.id='legendInner:'+i;
								box.appendChild(img);
								bindEvent(box, 'click', showHideLayerLegend, 'false');
								//bindEvent(box1, 'mousedown', mousedownEvt, 'false');
								//bindEvent(box1, 'mouseup', mouseupEvt, 'false');
							}
							// handle the point type layer
							else if(LayerType[i] == 'point' && pointPat != '')	
							{	
								//alert(pointPat)
								var symbol = document.createElement('img');
								symbol.src = pointPat;
								symbol.style.height = '12px';
								box.appendChild(symbol);
								//box.style.backgroundPosition='center';  
								//box.style.backgroundRepeat='no-repeat';
								box.style.position.verticalAlign='middle';
							}
						}
					cell.appendChild(box);				
				row.appendChild(cell);

					// the fourth cell contains the layerName
					var cell = document.createElement('td');
					cell.style.width='110px';
					cell.style.height='15px';
					cell.id='title:'+i;
					cell.style.cursor='pointer';
					cell.setAttribute('id','title:'+i);
					//if(LayerAbstract[i] != ''){cell.title = LayerAbstract[i];}
					cell.title = 'Click here to make this layer the Active layer';
					var textNode = document.createTextNode(TitleText[i]);
					bindEvent(cell, 'click', setCurrentLayer, 'false');
					cell.appendChild(textNode);
				
				row.appendChild(cell);

					// the fourth cell contains the loader wheel
					var cell = document.createElement('td');
					cell.style.width='15px';
					cell.style.height='15px';

						// holder Div for image
						var cellDiv = document.createElement('div');
						cellDiv.id='loadWheel:'+i;
						cellDiv.setAttribute('id','loadWheel:'+i);
						cellDiv.style.display='none';
												
							// create a center tag
							var center = document.createElement('center');

								// create the image element
								var image = document.createElement('img');
								image.src = 'images/loader.gif';

							center.appendChild(image);
						cellDiv.appendChild(center);
					cell.appendChild(cellDiv);
				row.appendChild(cell);
			layerTableBody.appendChild(row);
			//layerTable.appendChild(layerTableBody);
			//layerForm.appendChild(layerTable);

		//holdDiv.appendChild(layerForm);

		}	
		layerTable.appendChild(layerTableBody);
	layerForm.appendChild(layerTable);
holdDiv.appendChild(layerForm);
//alert('Other layers now loaded');

}
function blurAfter(evt)	// for firefox to handle onchange of a checkbox
{
	//alert('clicked registered')
	var thisEvent = getThisId(evt);
	var type = thisEvent.split(':');
	//alert('type = '+type[0])
	document.getElementById(thisEvent).blur();
	if (type[0] == 'layer')
	{	showHideLayer(evt); }
	else if(type[0] == 'label')
	{	showHideLabels(evt); }
	else if(type[0] == 'summit')
	{	saveSummit(evt); }
	//else if(type[0] == 'info')
	//{	showHideAttributes(evt); }
	Event.stop(evt);
}
function setCurrentLayer(evt)
{
	// decode the layer id info
	var eleId = getThisId(evt);
	var layNo = eleId.split(':')
	layerNumber = layNo[1];
	setCurrentLayerByNumber(layerNumber);
	Event.stop(evt);
}

function setCurrentLayerByNumber(layerNumber)
{
	if(layerNumber < 0){return;}
	
	// remove any previous report
	checkRemoveObject('simpleReport');

	// if the selected layer is already the active layer turn it off 
	if(activeLayer == layerNumber)	
	{	
		document.getElementById('arow:'+layerNumber).className = 'unselectedItem';
		document.getElementById('title:'+layerNumber).title = 'Click here to make this layer the Active layer';
		layLineSld = '';
		layWmslayer='';
		activeLayerName = '';
		activeLayer = null
		pickMode=false;
		//exitPolypika();
		// remove the active layer
		turnOffActiveLayer();
	}
	else
	{
		// first get rid of current active layer
		turnOffActiveLayer();

		// Set up for the new active layer	
		layLineSld = applicationBase+Sld[layerNumber];
		activeLayerName = Name[layerNumber].split(":")[0];
		dataStore = Name[layerNumber].split(":")[1];
		getSldInfo(layLineSld);
		layWmslayer = layerName;
		activeLayer = layerNumber;
		
		rad = 5; 
		count = 20;
		infoForm = Gfi[layerNumber];
		pickMode = true;

		// now display the layer
		document.getElementById('layers:'+layerNumber).checked = 'checked';
		manipulateLayer(layerNumber);
		activateGfiClickControl();
		var numb='';
		//showHideLayer(evt);
/*
		// now do a getFeature request against this layer to get a total number of features
		genLoadStatus('GetFeature Request ...', true);
		request='getFeature';
		type = 'WFS';
		gfiFilter = ''
		outFormat = 'BXFS';
		uri = numapsService;

		// calculate bounding box of display window
		zoom = false;
		ozBoxGeog = getBboxOfView(zoom, srs)
		//alert(ozBoxGeog)
		
		// set up the BBox filter
		loXX = ozBoxGeog[0];
		loYY = ozBoxGeog[1];
		hiXX = ozBoxGeog[2];
		hiYY = ozBoxGeog[3];
		
		// calculate centre of box
		//centX = (parseFloat(loXX) + parseFloat(hiXX)) / 2.0;
		//centY = (parseFloat(loYY) + parseFloat(hiYY)) / 2.0;
		
		// get the vertices of polygon into real world arrays
		allX = new Array();
		allY = new Array();
		allX[0] = loXX;	allY[0] = loYY;
		allX[1] = loXX;	allY[1] = hiYY;
		allX[2] = hiXX;	allY[2] = hiYY;
		allX[3] = hiXX;	allY[3] = loYY;
		allX[4] = loXX;	allY[4] = loYY;

		// build up the filter linestring
		for (var i=0; i < allX.length ; i++ )
		{
			//alert(allX[i]+", "+allY[i])
			if(i==0){lineString = allX[i]+","+allY[i];}
			else{lineString = lineString+" "+allX[i]+","+allY[i];}
		}

		//other options = Equals, Touches, Within, Overlaps, Crosses, Intersects, Contains
		var gfiFilter = "<Filter><Intersects><PropertyName>GEOMETRY</PropertyName><Polygon xmlns:gml='http://www.opengis.net/gml'><outerBoundaryIs><LinearRing><coordinates decimal='.' cs=',' ts=' '>" +lineString+ "</coordinates></LinearRing></outerBoundaryIs></Polygon></Intersects></Filter>";
		//alert(gfiFilter);

		// build up the request
		gfiParams = '';
		gfiParams += "request="+request;
		gfiParams += "&service="+type;
		gfiParams += "&srs="+srs;
		gfiParams += "&dataStore="+dataStore;
		gfiParams += "&typeName="+activeLayerName;
		gfiParams += "&outFormat="+outFormat;
		gfiParams += "&Filter="+gfiFilter;
	
		// launch the getFeature request
		ajaxRequest = proxyRequest(uri, gfiParams, '', 'POST');

		if(ajaxRequest.status != 200){	alert('unable to fetch this many objects'); }
		else
		{	// Find out how many features in XML
			var features = ajaxRequest.responseXML.getElementsByTagName("gml:featureMember");
			//alert('number of features = '+features.length);
			numb = '('+features.length+')';
		}
*/
		// make sure all layer rows are set to unselected and highligh the new active layer
		for(var j=0; j<numLayers ;j++)
		{		
			if(layerNumber != j)
			{	document.getElementById('arow:'+j).className= 'unselectedItem';		}
			else
			{
				document.getElementById('arow:'+j).className='selectedItem';
				document.getElementById('title:'+j).title='Click here to make this layer'+numb+' NOT the Active layer';
			}
		}
	
	}
	
	// if in polypika mode then update polypika Panel name
	if(activeLayerName != '' && polypikaMode)
	{	enablePolypika();	}
	genLoadStatus('', false);
}

function turnOffActiveLayer()
{
	// remove the active layer
	if(LayerObj[activeLayer])
	{
		map.removeLayer(LayerObj[activeLayer]);
		LayerObj[activeLayer] = null;

		// do same if labels are active
		if(LabelObj[activeLayer])
		{	map.removeLayer(LabelObj[activeLayer]);
			LabelObj[activeLayer] = null;
		}

		// now clean up the active layer row
		document.getElementById('layers:'+activeLayer).checked=false;
		document.getElementById('label:'+activeLayer).checked=false;
		document.getElementById('arow:'+activeLayer).className = 'unselectedItem';
		//resetZlevels();
	}
}	
function swapActiveLayer()
{
	// get the selected Active Layer from select control
	var selectObject = document.getElementById('actLayOptions');
	activeLayerName = selectObject.options[selectObject.selectedIndex].value;

	// set the active layer to Cyan in Layer Panel
	var layerNumber = parseInt(selectObject.selectedIndex) -1 ;
	//alert('layer number = '+layerNumber)
	if(parseInt(layerNumber) >= 0 )
	{
		setCurrentLayerByNumber(layerNumber);
		
		// push the name into the polypika panel and turn on the polypika editing buttons
		//activateTerritoryControls();
		//alert('territory controls on?')
		//textDisplay('activeLayerTerr', activeLayerName);
	}
	else
	{
		//alert('deactivating')
		turnOffActiveLayer();
		deactivateTerritoryControls();
		
	}
	//alert('activeLayer = '+activeLayerName);
	//alert('territoryActive = '+territoryActive);
}

function loadMe(layerNumber)
{	
	if(LayerBounds[layerNumber] == null) 
	{	//alert('No Load '+Name[layerNumber]); 
		return true;
	}
	// check if there is an intersection in bounds
	bounds = map.getExtent();
	//alert(bounds)
	return bounds.intersectsBounds(LayerBounds[layerNumber]);
}
function attributionOn(attribution)
{
	if(attribution == ''){return;}
	if(attribution != 'NuMaps' && document.getElementById(attribution).style.display == 'none') 
	{	document.getElementById(attribution).style.display='block';}
}
function attributionOff(attribution)
{
	if(attribution == '' || !document.getElementById(attribution)){return;}
	if(attribution != 'NuMaps' && document.getElementById(attribution).style.display == 'block') 
	{	document.getElementById(attribution).style.display='none';}
}
function showHideLayer(evt)
{
	// get element's id and then layer number
	var eleId = getThisId(evt);
	var layNo = eleId.split(':')
	layerNumber = layNo[1];
	//alert('layer number = '+layerNumber +" & ActiveLayer = "+activeLayer)
	manipulateLayer(layerNumber);
	//alert('done')
	activateGfiClickControl();
	//alert("zIndex is : "+LayerObj[layerNumber].getZIndex());
}

function manipulateLayer(layNum)
{
	// if this layer is out of viewport bounds just return
	//alert(loadMe(layNum));
	if(loadMe(layNum) || loadMe(layNum) == 'true') 
	{
		// Check to see what the status of this checkbox is
		if(document.getElementById('layers:'+layNum).checked)
		{	
			// Create the layer inside Openlayers if not already present
			//attributionOn(Attribution[layerNumber]);
			if (!LayerObj[layNum])	
			{		
				if(Sld[layNum] != 'none')		// with an SLD
				{	var Bdys = applicationBase+Sld[layNum];
					
					// for UnTiled requests
					if(LayerType[layNum] == 'point' || LayerTiled[layNum] == 'false')
					{
						LayerObj[layNum] = new OpenLayers.Layer.WMS.Untiled
						( 
							TitleText[layNum], 
							meshBlocksBase, 
							{	sld: Bdys,  
								format: drapeImage, 
								version: Ogc[layNum],  
								quality: quality, 
								reaspect: false, 
								transparent: true ,
								opacity: Opac[layNum]
							}, 
							{ tileSize: new OpenLayers.Size(512,512), reproject: true, buffer: 1}
						);
					}
					else
					{
						// normal Tiled request
						LayerObj[layNum] = new OpenLayers.Layer.WMS
						( 
							TitleText[layNum], 
							meshBlocksBase, 
							{	sld: Bdys,  
								format: drapeImage, 
								version: Ogc[layNum],  
								quality: quality, 
								reaspect: false, 
								transparent: true,
								opacity: Opac[layNum]
							}, 
							{ tileSize: new OpenLayers.Size(512,512), reproject: true, buffer: 1}
						);
					}
				}
				else	// without an SLD
				{	
					if(Style[layNum] != 'default' && Style[layNum] != 'none' && Style[layNum] != '')
					{
						if(LayerType[layNum] == 'point' || LayerTiled[layNum] == 'false')
						{
							// for UnTiled requests
							LayerObj[layNum] = new OpenLayers.Layer.WMS.Untiled
							( 
								TitleText[layNum], 
								meshBlocksBase, 
								{	layers: Name[layNum],
									styles: Style[layNum],
									format: drapeImage, 
									version: Ogc[layNum],  
									quality: quality, 
									reaspect: false, 
									transparent: true,
									opacity: Opac[layNum]
								}, 
								{ tileSize: new OpenLayers.Size(512,512), reproject: true}
							);
						}
						else
						{
							// normal Tiled request
							LayerObj[layNum] = new OpenLayers.Layer.WMS
							( 
								TitleText[layNum], 
								meshBlocksBase, 
								{	layers: Name[layNum],
									styles: Style[layNum],
									format: drapeImage, 
									version: Ogc[layNum],  
									quality: quality, 
									reaspect: false, 
									transparent: true,
									opacity: Opac[layNum]
								}, 
								{ tileSize: new OpenLayers.Size(512,512), reproject: true}
							);
						}
					}
					else
					{
						 // for UnTiled requests
						if(LayerType[layNum] == 'point' || LayerTiled[layNum] == 'false')
						{
							LayerObj[layNum] = new OpenLayers.Layer.WMS.Untiled
							( 
								TitleText[layNum], 
								meshBlocksBase, 
								{	layers: Name[layNum],
									format: drapeImage, 
									version: Ogc[layNum],  
									quality: quality, 
									reaspect: false, 
									transparent: true,
									opacity: Opac[layNum]
								}, 
								{ tileSize: new OpenLayers.Size(512,512), reproject: true}
							);
						}
						else
						{
							// normal Tiled requests
							LayerObj[layNum] = new OpenLayers.Layer.WMS
							( 
								TitleText[layNum], 
								meshBlocksBase, 
								{	layers: Name[layNum],
									format: drapeImage, 
									version: Ogc[layNum],  
									quality: quality, 
									reaspect: false, 
									transparent: true,
									opacity: Opac[layNum]
								}, 
								{ tileSize: new OpenLayers.Size(512,512), reproject: true}
							);
						}
					}
				}
				
				LayerObj[layNum].addOptions({isBaseLayer: false,  buffer:1, visibility: false});
				map.addLayer(LayerObj[layNum]);

				var zindex = 6000 +  parseInt(layNum);
				LayerObj[layNum].setZIndex(map.Z_INDEX_BASE['Popup'] -zindex);
				//map.setLayerZIndex(LayerObj[layNum], zindex);
			}

			// Now just make the loaded layer visible 
			var wheelId = 'loadWheel:'+layNum;
			registerLoadWheel(LayerObj[layNum] , wheelId);	
			LayerObj[layNum].setVisibility(true);
		}
		else // turn loaded layer off but if it is the active layer de-actiate it
		{	
			if (LayerObj[layNum]) 
			{		
				//attributionOff(Attribution[layNum])
				LayerObj[layNum].setVisibility(false);
				map.removeLayer(LayerObj[layNum]);
				LayerObj[layNum] = null;
				if(activeLayer == layNum)
				{
					//var backColor = '#FFFFFF';
					//if(evenCheck (layNum)) {backColor = '#FFFFD4';}
					document.getElementById('arow:'+layNum).className='unselectedItem';
					lineSld = null;
					infoForm = null;
				}
			}
		}
		
		// make this layer the top layer for selection puposes
		//bringToTop(LayerObj[layNum]);
		resetZlevels();
	}
	// check if myElectorate is set and make sure the booths layer is in sync
	if(myElectFlag)
	{	
		// look for the booth layer number
		layNum = -1;
		for (var i=0; i<Name.length; i++)
		{	if(Name[i] == 'CED_BOOTHS:ABS')	{	layNum = i; break;	}	}
		
		if(i >= 0)
		{
			//alert(document.getElementById('layers:'+layNum).checked);
			document.getElementById('boothsControl').checked = document.getElementById('layers:'+i).checked;		
		}
	}

	
}

function showHideLayerLegend(evt)
{
	var eleId = getThisId(evt);
	var layNo = eleId.split(':')
	layerNumber = layNo[1];
	//alert(layerNumber)
	
	// activate the legend
	if (Sld[layerNumber] != 'none' && Sld[layerNumber] != '')
	{
		legendBuilder("mapSurround", Sld[layerNumber], null, dvbdy1, dvhdr1, false);
		document.getElementById('legHolder').style.display='block'; // turn on this legend
	}
	Event.stop(evt)
}

function showHideLabels(evt)
{
	var eleId = getThisId(evt);
	var layNo = eleId.split(':')
	layerNumber = layNo[1];
	manipulateLabels(layerNumber);
}

function manipulateLabels(layerNumber)
{
	// process each checked labels layer
	var load = loadMe(layerNumber);
	if(document.getElementById('label:'+layerNumber).checked && load)
	{	
		if (!LabelObj[layerNumber])
		{
			// also create the labels layer at the same time
			//var Labels = applicationBase+SldLabels[layerNumber]+'?'+new Date().getTime();
			var Labels = applicationBase+SldLabels[layerNumber];
			LabelObj[layerNumber] = new OpenLayers.Layer.WMS.Untiled
			( 
				TitleText[layerNumber]+' (labels)', 
				meshBlocksBase, 
				{
					sld: Labels,  
					format: drapeImage, 
					quality: 'BEST', 
					reaspect: false, 
					transparent: true
				}, 
				{ tileSize: new OpenLayers.Size(512,512)}
			);
			
			LabelObj[layerNumber].addOptions({isBaseLayer: false,  buffer:0, visibility: false, reproject:true});		
			map.addLayer(LabelObj[layerNumber]);
			var zindex = 5000 + parseInt(layerNumber);
			//LayerObj[layerNumber].setZIndex(zindex);
			LabelObj[layerNumber].setZIndex(map.Z_INDEX_BASE['Popup'] -zindex);
			//map.setLayerZIndex(LabelObj[layerNumber], zindex);
		}
		var wheelId = 'loadWheel:'+layerNumber;
		registerLoadWheel(LabelObj[layerNumber] , wheelId);	
		LabelObj[layerNumber].setVisibility(true);
		
	}
	else	// simply turn loaded layer off
	{		
		if (LabelObj[layerNumber] )
		{	LabelObj[layerNumber].setVisibility(false);		}
	}
	// make this layer the top layer for selection puposes
	//bringToTop(LabelObj[layNum]);
}

function controlLayerVisibility()
{
	var scaleDenom = map.getScale();
	
	var numLayers=LayerObj.length;
	for (var j=0; j<numLayers; j++)
	{	
		// get the chechbox objects for each layer
		var layerCheckbox = document.getElementById('layers:'+j);
		var labelCheckbox = document.getElementById('label:'+j);
		layerCheckbox.disabled = false;
		labelCheckbox.disabled = false;

		var load = true; 
		var loadLabels = true;
		if(scaleDenom < MinzmLayers[j] || scaleDenom > MaxzmLayers[j] || !loadMe(j)) {  load=false;	}
		if(scaleDenom < MinzmLabels[j] || scaleDenom > MaxzmLabels[j] || !loadMe(j)) {  loadLabels = false;}
		
		// if previously loaded and able to be seen, just turn on layer
		if(load && LayerObj[j])
		{
			LayerObj[j].setVisibility(layerCheckbox.checked);
			registerLoadWheel(LayerObj[j] , 'loadWheel:'+j);
			registerLoadWheel(LayerObj[j], 'loadWheelDrape');
		}
		else 
		{
			if(load){ layerCheckbox.disabled = false;	}
			else {	layerCheckbox.disabled = true;	}
		}
		
		// now do the labels for this layer
		if(loadLabels && LabelObj[j])
		{
			//alert(Name[j]+' = '+layerCheckbox.checked)
			LabelObj[j].setVisibility(labelCheckbox.checked);
			registerLoadWheel(LabelObj[j] , 'loadWheel:'+j);
			registerLoadWheel(LabelObj[j], 'loadWheelDrape');
		}
		else 
		{
			if(loadLabels){	labelCheckbox.disabled = false;	}
			else {	labelCheckbox.disabled = true;	}
		}
	}
	if(boundary){registerLoadWheel(boundary, 'loadWheelDrape');}
	//resetZlevels();
}
function moveEvent()
{
	map.events.register('moveend', null, function(evt) 
	{
		controlLayerVisibility();
		//activateControls('moveEvent');
		Event.stop(evt);
    });
}

function zoomEvent()
{
	map.events.register('zoomend', null, function(evt) 
	{
		controlLayerVisibility();
		//activateControls('zoomEvent');
		Event.stop(evt);
    });
}



