/*
//-------------------- function to bind an event to an object ------------------------
function bindEvent(object, event, fnct, status)
{
	if (status) status=false;
	if (object.addEventListener)
	{	object.addEventListener(event, fnct, status);  }// for FF 
	else 
	{	object.attachEvent("on"+event, fnct); }// for IE
} 

function getThisId(evt)
{
	// cross browser tool to determine objects ID from an event trigger
	var e_out;
	var ie_var = "srcElement";
	var moz_var = "target";
	var prop_id = "id";
	// "target" for Mozilla, Netscape, Firefox et al. ; "srcElement" for IE
	evt[moz_var] ? e_out = evt[moz_var][prop_id] : e_out = evt[ie_var][prop_id];
	return e_out;
}
*/

function getNewSldName(oldSld)
{
	// Now create a new SLD for this particular LGA boundary
	var parts = oldSld.split('/');
	var fileParts = parts[parts.length-1].split('.')
	newTempSldFile = 'newSld_'+fileParts[0]+'_'+new Date().getTime()+'.xml';
	var filePath = oldSld.replace(fileParts[0]+'.xml', "");
	newTempSldPath = filePath.replace(/inc\//, "");
	//alert('newfile in getNewSldName = '+newTempSldPath+newTempSldFile);
}


function closeLegend(evt)
{
	// close the legend
	document.getElementById('legHolder').style.display="none";
	
	// now check if there is a legend control button and change its status
	if(document.getElementById('legendDD'))
	{
		var imgObj = document.getElementById('legendDD');
		//imgObj.src="images/leg_off.jpg";	
		imgObj.setAttribute('title','show legend');
		//showHideLegend('legendDD');
		normalDiv('legendDD');
	}
	Event.stop(evt);
}

// build a getlegendgrapghic legend
//-----------------------------------------------------------------------------------------------
function getLegendGraphicLegend(holder, layName, layStyle, drapeId)
{
	var parentDiv = document.getElementById(holder);
	// to be certain turn off the SLD legend
	//if(document.getElementById("legend")){document.getElementById("legend").className='legendOff';}
	
	// get the holding Div and remove any existing legend
		var parentDiv = document.getElementById(holder);
		
		// if legend is already there get it's screen position otherwise set the default coord
		var legTop ='350px'; 
		var legLeft ='50px';
		if(document.getElementById('legHolder'))
		{
			legTop = document.getElementById('legHolder').style.top;
			legLeft =document.getElementById('legHolder').style.left;
			checkRemoveObject('legHolder');
		}
		
		// create a new Legend holder
		legendDiv = document.createElement('div');
		legendDiv.style.display='none';
		legendDiv.style.position='absolute';
		legendDiv.style.top=legTop; 
		legendDiv.style.left=legLeft;
		legendDiv.style.width='200px'; 
		legendDiv.style.height='auto';
		legendDiv.style.zIndex='6100';
		legendDiv.style.cursor='move';
		legendDiv.id = 'legHolder';
		legendDiv.setAttribute("id", 'legHolder');
		
			// create the banner div
			var legendBanner = document.createElement('div');
			legendBanner.style.backgroundImage='url('+blueBanner.src+')';
			legendBanner.style.position='absolute';
			legendBanner.style.top='0px';
			legendBanner.style.left='0px';
			legendBanner.style.height="24px"; 
			legendBanner.style.width="200px";
			legendBanner.style.fontFamily='Verdana, Geneva, Arial, Helvetica, sans-serif'; 
			legendBanner.style.color='#FFFFFF';
			legendBanner.style.fontWeight='bold';
			legendBanner.style.cursor='move';
			legendBanner.style.fontSize='12px';
			legendBanner.id = 'legHeader';
			legendBanner.setAttribute("id", 'legHeader');
			
				// create the numaps logo symbol image tag
				var symbolImg = document.createElement('img');
				symbolImg.src='images/logo_symbol_small.gif';
				symbolImg.style.position='absolute';
				symbolImg.style.top='7px'; 
				symbolImg.style.left='4px';
				legendBanner.appendChild(symbolImg);
			
				// now add the title in the Banner
				var spanTag = document.createElement('span');
				spanTag.style.position='absolute';
				spanTag.style.top='4px';
				spanTag.style.left='30px';
				var bannerText = document.createTextNode('Legend');	
				spanTag.appendChild(bannerText);
				legendBanner.appendChild(spanTag);
			
				// create the close me button
				var symbolImg = document.createElement('img');
				symbolImg.src='images/close.gif';
				symbolImg.setAttribute('height','15');
				symbolImg.setAttribute('width','15')
				symbolImg.style.cursor='pointer';
				symbolImg.style.position='absolute';
				symbolImg.style.top='4px'; 
				symbolImg.style.right='4px';
				bindEvent(symbolImg, 'click', closeLegend, 'false');
				legendBanner.appendChild(symbolImg);
			legendDiv.appendChild(legendBanner);
		
			// build up the legendBackground Div
			var legendBackground = document.createElement('Div')
			legendBackground.style.fontFamily='Verdana, Geneva, Arial, Helvetica, sans-serif'; 
			legendBackground.style.height='300px';
			legendBackground.style.position='absolute';
			legendBackground.style.top='21px';
			legendBackground.style.left='0px';
			legendBackground.style.width="196px";
			legendBackground.style.overflow='auto';
			legendBackground.style.backgroundColor="#ECE9D8";
			legendBackground.style.color='#000000';
			legendBackground.style.fontSize='10px';
			legendBackground.style.border='2px solid #0000D6';
			
				// build up the internal Legend Title Div
				var legend = document.createElement('div');
				legend.style.width='174px'; 
				legend.style.height='auto';
				legend.style.position='absolute';
				legend.style.left='10px'; 
				legend.style.top='10px';
				legend.style.borderTop='1px solid gray';
				legend.style.borderLeft='1px solid gray';
				legend.style.borderRight='1px solid white';
				legend.style.borderBottom='1px solid white';
				legend.style.backgroundColor='white'; 
				legend.id='legend';
				legend.setAttribute('id','legend');
				
				// Create the Legend Title Text node 
				var ltit = document.createElement("div")
				ltit.id='legTitle';
				ltit.setAttribute('id','legTitle');
				ltit.title=nameData;
				//if (nameData >'') {var title= nameData;} // use sldName if available
				//else { var  title= sldTitleData}
				var textNode = document.createTextNode(layStyle);
				ltit.appendChild(textNode);
				ltit.style.textAlign='center';
				ltit.style.width='170px'; 
				ltit.style.height='auto'; 
				ltit.style.fontSize='11px';
				ltit.style.fontWeight='bold';
				ltit.style.padding='2px';
				//ltit.setAttribute("title", "header=["+title+"] cssbody=[dvbdy1] cssheader=[dvhdr1] body=["+sldAbstract+"]");
				//ltit.title="header=["+title+"] cssbody=[dvbdy1] cssheader=[dvhdr1] body=["+sldAbstract+"]";
				//ltit.style.zIndex='10000';
				legend.appendChild(ltit);

				// create the GetLegendGraphic request
				var glgRequest = meshBlocksBase;
				glgRequest += "SERVICE=WMS";
				glgRequest += "&VERSION=1.3.2";
				glgRequest += "&REQUEST=GetLegendGraphic";
				glgRequest += "&FORMAT=image/png";
				glgRequest += "&LAYER="+layName;
				glgRequest += "&STYLE="+layStyle;
				glgRequest += "&TRANSPARENT=true";
				if(account!= '' )
				{	glgRequest += "&accCode="+account;}	
				//alert('getLegendGraphicLegend drapeId = '+drapeId)
				if(drapeId != '')
				{
					var drapeNumber = drapeId.split(":");
					glgRequest += "&drapeId="+drapeNumber[1];
				}
				
				// this is bens version
				//http://www.numaps.com.au/nuserv.cfm?request=getNumaSLD&drapeId=999
				//http://www.numaps.com.au/nuserv.cfm?request=getNumaSLD&drapeId=521

				//alert(glgRequest)
				//var request = 'http://poc.numaps.com.au/cf/nuserv.cfm?CONFIG=numaps&SERVICE=WMS&VERSION=1.3.2&LANGUAGE=en&REQUEST=GetLegendGraphic&LAYER=MESHBLOCKS%3AABS&STYLE=Dwellings+(MB)&FORMAT=image%2Fpng&TRANSPARENT=TRUE';
				
				// create new image node
				var legImage = document.createElement('img');
				// assign the getlegendgraphic to the image node
				legImage.src=glgRequest;
				legImage.style.position='absolute';
				legImage.style.top='40px';
				legImage.style.left='-5px';
				legImage.style.width='180px';
				legend.appendChild(legImage);
			legendBackground.appendChild(legend);
		legendDiv.appendChild(legendBackground)
	parentDiv.appendChild(legendDiv);
	
// activate the legend
legendDiv.style.display='block';
Drag.init(document.getElementById("legHeader"),document.getElementById("legHolder"))
}

//--------------------------------------------------------------------------------//
// the new legend Builder function replaces buildlegend
function legendBuilder(application, Url, opVal, dvbdy1, dvhdr1, print, mode)
{
	//alert('legendBuilder '+Url)

	if (opVal == null)
	{
		// get the SLD file into the DOM
		var parts = Url.split("?bruid");
		var cacheUrl = Url;
		if(parts.length <= 1){ cacheUrl = Url+"?bruid="+new Date().getTime();}
		//alert(cacheUrl)
		if (!getSldInfo(cacheUrl))	{alert ("Returning False"); return false;}
		//alert ("SLD Data = "+layerName+" : "+sldTitleData+" : "+nameData+" : "+opValue+"\n"+sldAbstract);
		
		// get the holding Div and remove any existing legend
		if(print){parentDiv = winmap.document.getElementById(application);}
		else {parentDiv = document.getElementById(application);}
		
		// if legend is already there get it's screen position otherwise set the default coord
		var legTop ='0px'; 
		var legLeft ='0px';	
		if(!print)
		{	
			legTop ='350px'; 
			legLeft ='50px';
			if(document.getElementById('legHolder'))
			{
				legTop = document.getElementById('legHolder').style.top;
				legLeft =document.getElementById('legHolder').style.left;
			}
		}
		//alert("1 "+ document.getElementById('legendDD').title)
		// create a new Legend holder
		checkRemoveObject('legHolder');
		legendDiv = document.createElement('div');
		if(!print) {legendDiv.style.display='none';}else{legendDiv.style.display='block';}
		legendDiv.style.position='absolute';
		legendDiv.style.top=legTop; 
		legendDiv.style.left=legLeft;
		legendDiv.style.width='200px'; 
		legendDiv.style.height='auto';
		legendDiv.style.zIndex='61000';
		legendDiv.style.cursor='move';
		legendDiv.id = 'legHolder';
		legendDiv.setAttribute("id", 'legHolder');
		
			// create the banner div
			var legendBanner = document.createElement('div');
			legendBanner.style.backgroundImage='url('+blueBanner.src+')';
			legendBanner.style.position='absolute';
			legendBanner.style.top='0px';
			legendBanner.style.left='0px';
			legendBanner.style.height="24px"; 
			legendBanner.style.width="200px";
			legendBanner.style.fontFamily='Verdana, Geneva, Arial, Helvetica, sans-serif'; 
			legendBanner.style.color='#FFFFFF';
			legendBanner.style.fontWeight='bold';
			legendBanner.style.fontSize='12px';
			legendBanner.id = 'legHeader';
			legendBanner.setAttribute("id", 'legHeader');
			
				// create the numaps logo symbol image tag
				var symbolImg = document.createElement('img');
				symbolImg.src='images/logo_symbol_small.gif';
				symbolImg.style.position='absolute';
				symbolImg.style.top='7px'; 
				symbolImg.style.left='4px';
				legendBanner.appendChild(symbolImg);
			
				// now add the title in the Banner
				var spanTag = document.createElement('span');
				spanTag.style.position='absolute';
				spanTag.style.top='4px';
				spanTag.style.left='30px';
				var bannerText = document.createTextNode('Legend');	
				spanTag.appendChild(bannerText);
				legendBanner.appendChild(spanTag);
			
				// create the close me button
				var symbolImg = document.createElement('img');
				symbolImg.src='images/close.gif';
				symbolImg.setAttribute('height','15');
				symbolImg.setAttribute('width','15')
				symbolImg.style.cursor='pointer';
				symbolImg.style.position='absolute';
				symbolImg.style.top='4px'; 
				symbolImg.style.right='4px';
				bindEvent(symbolImg, 'click', closeLegend, 'false');
				legendBanner.appendChild(symbolImg);
			legendDiv.appendChild(legendBanner);
		
			// build up the legendBackground Div
			var legendBackground = document.createElement('Div')
			legendBackground.style.fontFamily='Verdana, Geneva, Arial, Helvetica, sans-serif'; 
			legendBackground.style.height='auto';
			legendBackground.style.position='absolute';
			legendBackground.style.top='21px';
			legendBackground.style.left='0px';
			legendBackground.style.width="196px";
			legendBackground.style.backgroundColor="#ECE9D8";
			legendBackground.style.color='#000000';
			legendBackground.style.fontSize='10px';
			legendBackground.style.border='2px solid #0000D6';	
		// build up the internal Legend Title Div
		var legend = document.createElement('div');
		legend.style.width='174px'; 
		legend.style.height='auto';
		legend.style.position='absolute';
		legend.style.left='10px'; 
		legend.style.top='10px';
		if(!print)
		{
			legend.style.borderTop='1px solid gray';
			legend.style.borderLeft='1px solid gray';
			legend.style.borderRight='1px solid white';
			legend.style.borderBottom='1px solid white';
			legend.style.backgroundColor='white'; 
		}
		legend.id='legend';
		legend.setAttribute('id','legend');
		
		// Create the Legend Title Text node
		var ltit = document.createElement("div")
		ltit.id='legTitle';
		ltit.setAttribute('id','legTitle');
		ltit.title=nameData;
		if (nameData >'') {var title= nameData;} // use sldName if available
		else { var  title= sldTitleData;}
		title = title.replace(/_/g,' ');
		// if in config mode then add type to title
		if(mode == 'config')
		{
			var type	= getSelectedRadioValue('themeType');
			if(type != '')	{	title = title+"\n("+type+")"};
		}

		// build and style the title node
		var textNode = document.createTextNode(title);
		ltit.appendChild(textNode);
		ltit.style.textAlign='center';
		ltit.style.width='170px'; 
		ltit.style.height='auto'; 
		ltit.style.fontSize='11px';
		ltit.style.fontWeight='bold';
		ltit.style.padding='2px';
		ltit.setAttribute("title", "header=["+title+"] cssbody=[dvbdy1] cssheader=[dvhdr1] body=["+sldAbstract+"]");
		ltit.title="header=["+title+"] cssbody=[dvbdy1] cssheader=[dvhdr1] body=["+sldAbstract+"]";
		//ltit.style.zIndex='10000';
		legend.appendChild(ltit);
		
		// Create the Table Object 
		var table = document.createElement("table");
		table.setAttribute("id", 'legTable');
		table.id='legTable';
		table.style.width='170px'; 
		table.style.height='auto'; 
		table.style.position='absolute'; 
		table.style.top='40px'; 
		table.style.left='5px';
		var tbody=document.createElement("tBody");	
		// Set up the FOR loop for all the Rules in the XML SLD file
		var sldRules = ajaxRequest.responseXML.getElementsByTagName("Rule");
		num = sldRules.length;
		//alert ('num = '+num)
	
		//alert("opacity Value ="+opVal)
	
		// now set the height of the legend background
		var ht = parseInt((num * 25) + 35)
		if (ht <120){ht='120px'}
		else {ht = ht+"px";}
		// should interrogate height set in styles for table rows
		legendBackground.style.height=ht;
		//alert (ht)
		
		// Loop through all the rules in the SLD file and build legend rows for each
		for (var i = 0; i < num ; i++)
		{	
			// get the render rules for each rule
			getSldRenderRules(sldRules[i]);
		/*	
			alert("Rule Name = "+ruleName)
			alert("Rule Title = "+ruleTitle)
			alert("Rule Abstract = "+ruleAbstract)
			alert("fillColr = "+fillColr)
			alert("fillOpac = "+fillOpac)
			alert("fillPat = "+fillPat)
			alert("fillPatForm = "+fillPatForm)
			alert("strokeColr = "+strokeColr)
			alert("strokeWidth = "+strokeWidth)
			alert("strokeOpac = "+strokeOpac)
			alert("strokeDash = "+strokeDash)
	*/		
			// overwrite the zoom level viewer controls with SLD min/max SacleDenominator
			//MinzmLayers[i]		= minScale;
			//MaxzmLayers[k]		= maxScale;
				
			
			// set up the Table Body node and the TR node
			var tdIdbox="tdBox"+i;
			var tdIdtext="tdText"+i;
			var trId="tr"+i;
			
			// Set up the legend box TD node with appropriate color		
			var trNode = document.createElement("tr");
			
			// set up the boxover for metadata about Rule for whole row
			var desc = ruleAbstract;
			if(desc == ''){desc = ruleTitle;}
			if(desc == ''){desc = ruleName;}
			var boxover ='"header=['+ruleName+'] cssbody=[dvbdy1] cssheader=[dvhdr1] body=['+desc+']"';
			trNode.setAttribute("title", boxover);
			trNode.title=boxover;
						
			// first cell is the polygon symbology box
			var tdNode1 = document.createElement("td");
			tdNode1.style.width='30px'; 
			tdNode1.style.height='10px';
			tdNode1.style.backgroundColor='#ECE9D8'; 
			tdNode1.style.borderCollapse='collapse';
			tdNode1.style.margin='10px';
			
				var divNode = document.createElement("div");
				divNode.id = tdIdbox;
				divNode.setAttribute("id", tdIdbox);
				divNode.style.width='30px'; 
				divNode.style.height='10px'; 
							
				// set up borders if required
				if (strokeWidth == null || strokeWidth == '')
				{	divNode.style.border="0px";	}
				else
				{	divNode.style.border = strokeWidth+"px solid "+strokeColr;	}
					
				// fill in color if required
				if (fillColr != 'transparent' && fillColr != null && fillColr != '')
				{	
					divNode.style.backgroundColor = fillColr;
					var op=Number(fillOpac);
					var fillNumber = Math.abs(op*100);
					setOpacity(divNode, fillNumber);
				}
	
				// now check for fill patterns
				if (fillPat != null)
				{
					var divNode2 = document.createElement("div");
					divNode2.style.width='30px'; 
					divNode2.style.height='10px'; 
					divNode2.style.backgroundImage= "url("+fillPat+")";
					divNode2.style.backgroundRepeat='repeat';
					var fillNumber = Math.abs(op*100);
					setOpacity(divNode, fillNumber);
					divNode.appendChild(divNode2);
				}
							
				// append TD node with legend symbol box to TR node 
				tdNode1.appendChild(divNode);
				trNode.appendChild(tdNode1);
						
				// Now generate the Text node in the second column of the table row
				var tdNode2 = document.createElement("td"); 
				tdNode2.style.color='#000000';
				tdNode2.style.fontFamily='Verdana, Geneva, Arial, Helvetica, sans-serif'; 
				tdNode2.style.textAlign='left'; 
				tdNode2.style.fontSize='10px';
				tdNode2.style.margin='10px';
				tdNode2.style.fontWeight='bold';
				tdNode2.style.width='130px'; 
				tdNode2.style.height='10px';
				if (ruleName != '')
				{	var textNode = document.createTextNode(ruleName);
					tdNode2.appendChild(textNode);
				}
				// append TD node with legend text to TR node 
				trNode.appendChild(tdNode2);
			tbody.appendChild(trNode);	
		}
		// append the tbody note to the Table element
		table.appendChild(tbody);
		legend.appendChild(table);
		legendBackground.appendChild(legend);

		if(print)
		{	parentDiv.appendChild(legendBackground);
			//parentDiv.className='whiteBox';
		}
		else
		{
			legendDiv.appendChild(legendBackground)
			parentDiv.appendChild(legendDiv);
			Drag.init(document.getElementById("legHeader"),document.getElementById("legHolder"))
		}
		//alert("2 " + document.getElementById('legendDD').title)
		return true;
	}
	else // just adjust the opacity of the table cells
	{	
		//alert('num again = '+num)
		var opacity = parseFloat(opVal)
		for (var i = 0; i < num ; i++)
		{
			var tdIdbox="tdBox"+i;
			var obj = document.getElementById(tdIdbox);
			var fillNumber = Math.abs(Number(opacity)*100);
			setOpacity(obj, fillNumber);
		}
	}
	
}

// function to extract the Rendering rules for a single rule object passed in
function getSldRenderRules(ruleObj)
{
	fillColr = "";
	fillOpac = "";
	fillPat = "";
	fillPatForm = "";
	strokeOpac = "";
	strokeDash = "";
	strokeColr = "";
	strokeWidth = "";
	ruleName = "";
	ruleTitle = "";
	ruleAbstract = "";
	minScale = 1;
	maxScale = 50000000;
	pointPat = "";
	pointPatForm = "";
	
	// get the rule MetaData for Mouseover feature
	//alert(ruleObj.getElementsByTagName("Name")[0].firstChild.nodeValue)

	if(ruleObj.getElementsByTagName("Name")[0] )
	{	ruleName = ruleObj.getElementsByTagName("Name")[0].firstChild.nodeValue;	
		ruleName = ruleName.toString();
		ruleName = ruleName.replace(/-/, "to");
	}
	
	if( ruleObj.getElementsByTagName("Title")[0] )
	{	ruleTitle = ruleObj.getElementsByTagName("Title")[0].firstChild.nodeValue; 	}
	
	if(ruleObj.getElementsByTagName("Abstract")[0]  )
	{	ruleAbstract = ruleObj.getElementsByTagName("Abstract")[0].firstChild.nodeValue;	}

	
	//alert(ruleName+" : "+ruleTitle+" : "+ruleAbstract)			
	
	// look for minScaleDenominator tag
	if (ruleObj.getElementsByTagName("MinScaleDenominator")[0] != null) 
	{	minScale = parseInt(ruleObj.getElementsByTagName("MinScaleDenominator")[0].firstChild.nodeValue);	}
	if (ruleObj.getElementsByTagName("MaxScaleDenominator")[0] != null) 
	{	maxScale = parseInt(ruleObj.getElementsByTagName("MaxScaleDenominator")[0].firstChild.nodeValue);	}
	//alert('min : '+minScale+'  -  max : '+maxScale)

	// Look for a polygon symboliser tag
	if (ruleObj.getElementsByTagName("PolygonSymbolizer").length > 0)
	{		
		var polygonSymbolizer = ruleObj.getElementsByTagName("PolygonSymbolizer");
		var numPsym = polygonSymbolizer.length;
		
		//alert('number of PolygonSymbolizers = '+numPsym)
	
		// precess each polygon symboliser tag
		for (var ii=0 ; ii<numPsym ; ii++ )
		{	
			var sldFill = polygonSymbolizer[ii].getElementsByTagName("Fill");
			if (sldFill.length > 0) // check to see if we have any Fills first
			{
				// find out how many CssParameter tags there are
				var sldFillCss = sldFill[0].getElementsByTagName("CssParameter");
					
				// if we have a regulat solid fill process here
				if (sldFillCss.length > 0 )
				{
					fillColr = ""; 
					// process each Fill CssParemeter attribute	
					for (var j=0; j<sldFillCss.length ; j++)
					{
						var fillAtt = sldFillCss[j].getAttribute("name");
						if (fillAtt == "fill") 
						{
							fillColr = sldFill[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;
							if (fillColr == ''){fillColr='transparent'}
						}
						if (fillAtt == "fill-opacity")
						{			
							fillOpac = sldFill[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;
							//if (fillOpac == '' || fillOpac == null || fillOpac == 'undefined')
							//fillOpac = 0;
							//if (opVal != null) {fillOpac = parseFloat(fillOpac)*parseFloat(opVal);} // this adopts the input opacity when interactively adjusting layer 
						}
					}
				}
				else if(sldFill[0].getElementsByTagName("GraphicFill"))
				{
					// we now have a graphic fill so get the data for inclusion in legend fill
					var graphicFill = sldFill[0].getElementsByTagName("GraphicFill");
					var graphic = graphicFill[0].getElementsByTagName("Graphic");
					var externalGraphic = graphic[0].getElementsByTagName("ExternalGraphic");
					var onlineResource = externalGraphic[0].getElementsByTagName("OnlineResource")
					fillPat = onlineResource[0].getAttribute("xlink:href"); 
					//alert ("source = "+fillPat);
					fillPatForm = externalGraphic[0].getElementsByTagName("Format")[0].firstChild.nodeValue;
					//alert ("format = "+fillPatForm)
				}
			}
			//alert("fill = "+fillColr)
			// find out how many Stroke Rule nodes
			if(ruleObj.getElementsByTagName("Stroke"))
			{
				var sldStroke = ruleObj.getElementsByTagName("Stroke");
				if (sldStroke.length > 0)
				{
					var sldStrokeCss = sldStroke[0].getElementsByTagName("CssParameter");
					
					//alert ("sldStrokeCss = "+sldStrokeCss.length)
							
					if(sldStrokeCss.length > 0)
					{
				
						// process each Stroke CssParemeter attribute				
						for (var j=0; j<sldStrokeCss.length ; j++)
						{
							var strokeAtt = sldStrokeCss[j].getAttribute("name");
							if (strokeAtt == "stroke") 
							{
								strokeColr = sldStroke[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;		
							}
							if (strokeAtt == "stroke-width")
							{
								strokeWidth = sldStroke[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;
							}
							if (strokeAtt == "stroke-opacity")
							{
								strokeOpac = sldStroke[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;
							}
							if (strokeAtt == "stroke-dasharray")
							{
								strokeDash = sldStroke[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;
							}
						}
					}
				}
			}
		}
	}
	if(ruleObj.getElementsByTagName("PointSymbolizer").length > 0)
	{
		var PointSymbolizer = ruleObj.getElementsByTagName("PointSymbolizer");
		var numPsym = PointSymbolizer.length;
		//alert("number of Point Symbolizers = "+numPsym);
		
		for (var ii=0 ; ii<numPsym ; ii++ )
		{	
			var graphic = PointSymbolizer[ii].getElementsByTagName("Graphic");
			if (graphic.length > 0) // check to see if we have any symbol images
			{
				// we now have a graphic fill so get the data for inclusion in legend fill
				var externalGraphic = graphic[0].getElementsByTagName("ExternalGraphic");
				var onlineResource = externalGraphic[0].getElementsByTagName("OnlineResource")
				pointPat = onlineResource[0].getAttribute("xlink:href"); 
				//alert ("source = "+pointPat);
				pointPatForm = externalGraphic[0].getElementsByTagName("Format")[0].firstChild.nodeValue;
				//alert ("format = "+pointPatForm)
			}
		}

	}
}


function getSldByDrapeId(drapeId)
{
	var appsUrl = applicationBase+'inc/proxyCall.php?';	// php version
	//var appsUrl = applicationBase+'cf/proxycall.cfm?';			// coldfusion version
	var query  = 'url='+ meshBlocksBase.split('?')[0]+'&request=getnumasld&drapeId='+drapeId;
	if(account != ''){query += '&accCode='+account;}
	//alert('url in getSldByDrapeId = '+appsUrl+query);
	ajaxRequest = fetchXml(appsUrl, query, false);
	if (ajaxRequest.status != 200) {alert('error with SLD by drapeId'); return ajaxRequest;}
	return ajaxRequest;
}

function getSldInfo(sldfileUrl)				
//--------------------------------------------- getSldInfo -----------------------------------------------
// sldfileUrl can be either a URL of an SLD e.g. http://demos.numaps.com.au/inc/sld/mb/landuse.xml  
// or, sldfileUrl can be a URL with a DrapeID appended e.g. http://demos.numaps.com.au/inc/sld/mb/DID:624
// note you camn also simply have DID:624 as the DrapeID.
//--------------------------------------------------------------------------------------------------------
{
	//alert('inside getSldInfo = '+sldfileUrl)
	if(sldfileUrl !='')
	{
		sldAbstract = '';
		layerName = '';
		titleData = '';
		nameData = '';
		opValue = '';
		themeData = '';
		
		// get the SLD file into the DOM 
		var query = '';
		var parts = sldfileUrl.split('DID:');
		if(parts.length > 1) 
		{
			// get the SLD into DOM from DrapeId
			//alert('by DrapeId')
			ajaxRequest = getSldByDrapeId(parts[1]);
			if (ajaxRequest.status != 200) {return false;}
		}
		else
		{
			// get the SLD into the DOM	from the file
			var query = '';
			var parts = sldfileUrl.split("?bruid");
			if(parts.length <= 1){ query = "?bruid="+new Date().getTime();}
			//alert(sldfileUrl+query)
			ajaxRequest = loadXml(sldfileUrl, query, false);
			if (ajaxRequest.status != 200) {return false;}
		}
	}
	else
	{	return false;	}
	//alert('status = '+ajaxRequest.status)
	
	// now get NamedLayer header elements from DOM
	var sldNamedLayer = ajaxRequest.responseXML.getElementsByTagName("NamedLayer");
	layerName = sldNamedLayer[0].getElementsByTagName("Name")[0].firstChild.nodeValue;
	
	// get UserStyle header elements
	var sldTitle = ajaxRequest.responseXML.getElementsByTagName("UserStyle");
	
	if(sldTitle[0].getElementsByTagName("Theme")[0])
	{	themeData = sldTitle[0].getElementsByTagName("Theme")[0].firstChild.nodeValue;}

	if(sldTitle[0].getElementsByTagName("Title")[0])
	{	titleData = sldTitle[0].getElementsByTagName("Title")[0].firstChild.nodeValue;}
	
	if(sldTitle[0].getElementsByTagName("Name")[0])
	{	nameData = sldTitle[0].getElementsByTagName("Name")[0].firstChild.nodeValue;}
	
	if(sldTitle[0].getElementsByTagName("Abstract")[0])
	{	sldAbstract = sldTitle[0].getElementsByTagName("Abstract")[0].firstChild.nodeValue;}
		
	var sldCss = ajaxRequest.responseXML.getElementsByTagName("CssParameter");
	//alert(sldCss.length)
	if(sldCss.length >0)
	{
		for (var i=0 ; i<sldCss.length ; i++)
		{
			if (sldCss[i].getAttribute("name")) 
			{ 
					
				//alert(sldCss[i].getAttribute("name") + " = "+ sldCss[i].firstChild.nodeValue);
				if(sldCss[i].getAttribute("name") == "fill-opacity")
				{	
					opValue = sldCss[i].firstChild.nodeValue;
					//alert('DONE & opValue = '+opValue)
					break ;
				}
			}
		}
	}
	

	//alert(layerName+" - "+titleData+" - "+nameData+" - "+themeData+" - "+opValue+"\n"+sldAbstract)
	return true;
}
// ---------------- Set opacity for different Browsers -------------------//
function setOpacity(obj, opacity) 
{
// obj = object that is to have aopacity set for
// opacity =  integer between 0 & 100
	//alert("opacity = "+opacity)
	opacity = (opacity == 100)?99.999:opacity;

  // IE/Win
	obj.style.filter="alpha(opacity="+ opacity + ")";

  // Safari<1.2, Konqueror
	obj.style.KHTMLOpacity = opacity/100;

  // Older Mozilla and Firefox
	obj.style.MozOpacity = opacity/100;

  // Safari 1.2, newer Firefox and Mozilla, CSS3
	obj.style.opacity = opacity/100;
}

// ---------------- Set opacity for different Browsers -------------------//
function getOpacity(obj) 
{
	// IE/Win
	if(browser == 'msie')
	{	var opacityIE  = obj.style.filter;
		var parts = opacityIE.split('=')
		var opacity = parts[1].split(')');
		return Math.round(opacity[0]);
	}
	
	// Safari<1.2, Konqueror
	if(browser == 'konqueror')
	{	return parseint((obj.style.KHTMLOpacity *100)+0.5);	}
	
 
	// Safari 1.2, newer Firefox and Mozilla, CSS3
	if(browser == 'firefox' || browser == 'safari' )
	{	return parseInt((obj.style.opacity * 100)+0.5);}
	//obj.style.opacity = opacity/100;

	// Older Mozilla and Firefox
	return parseInt((obj.style.MozOpacity * 100)+0.5);
}

function getLayerOpacity(sldUrl)
{
	//var opValue=1;
	//var query="?"+new Date().getTime();
	var query="";
	ajaxRequest=loadXml(sldUrl, query, false)
	if(ajaxRequest)
	{	
		var sldRules = ajaxRequest.responseXML.getElementsByTagName("Rule");
		if (sldRules[0].getElementsByTagName("Fill"))
		{
			var sldFill = sldRules[0].getElementsByTagName("Fill");
			if (sldFill[0].getElementsByTagName("CssParameter"))
			{
				var sldFillCss = sldFill[0].getElementsByTagName("CssParameter");
				if(sldFillCss.length >0)
				{
					for (var i=0 ; i<sldFillCss.length ; i++)
					{
						if (sldFillCss[i].getAttribute("name")) 
						{ 
							if(sldFillCss[i].getAttribute("name") == "fill-opacity")
							{	opValue = sldFillCss[i].firstChild.nodeValue;
								break;
							}
						}
					}
				}
			}
		}
	}
	//alert("SLD Layer Opacity value =" +opValue);
	return opValue;
}
/*
function createNewSld(file, colorBdy, lineWeight, colorFill, fillOpac, patternFill, update, solidBorders)
{
	//alert('filter in createNewSld = '+filter)
	// Set up the file header information and create file stubb
	var query = "?file="+file;
	query+= "&layer="+layerName;
	query+= "&title="+titleData;
	query+= "&name="+nameData;
	query+= "&filter="+filter;
	query+= "&att="+attName;
	query+= "&label="+labelName;
	query+= "&bcol="+colorBdy;
	query+= "&fcol="+colorFill;
	query+= "&opac="+fillOpac;
	query+= "&line="+lineWeight;
	query+= "&update="+update;
	query+= "&solid="+solidBorders;
	if(patternFill != '' )
	{
		var pFormat = patternFill.split('.');
		query+= "&patt="+areaFillBase+patternFill;
		query+= "&form=image/"+pFormat[1];
	}

	// send this request off to the server to create a new header section in a new SLD file
	// create a new temporary Highlighting SLD
	var request = applicationBase + "inc/makeNewSldFile_new.php";
	//var aquery = query.split('?')[1];
	//alert(request+query)
	makeFile(request, query,  false, 'POST')
	//loadXml(url, query, false);
	//alert('new Sld = '+file)
	return true;
}
*/
// function to read through Datts array to find the Drape and determine if its editable
function checkIfEditable(drapeid)
{
	for (var i=0; i<Datts.length ; i++)
	{
		var atts = Datts[i].split('|');
		if(atts.length > 0)
		{
			if(atts[12] == drapeid)
			{return atts[13];}
		}
	}
}


 //----------------------- main function to change DemographicDrapes --------------------------//
 function swapSld(ind, style, type, drapeId, accessible, gfiDoubleClick)
 {
	//alert(accessible)
	// check for permission to edit and set flags
	isEditable = false;
	if(drapeId!= '') {isEditable = checkIfEditable(drapeId);}
	putStyles = false;
	if(style != '' && style!='default'){putStyles = true;}
	
	// check to see if its a 'none' option to turnoff the DDrape layer
	if (ind == '' && style == '')
	{
		// make the DemoDrape layer invisible
		DemoDrape.setVisibility(false);				
		
		// turn off the legend
		normalDiv('legendDD');
		document.getElementById('legHolder').style.display='none'; 
		document.getElementById('legendDD').style.title='show legend';

		// make sure we switch attribution for Koalas if required
		if(document.getElementById('akf'))	{	document.getElementById('akf').style.display='none';		}
		fadeLayer='';
		deleteSelection();				// from gfiUtils.js
		
		// initialise the Drape Builder
		newSldOpen=false;
		if(document.getElementById('editDDIn'))
		{
			checkRemoveObject('drapeBuilder');	
			document.getElementById('editDDIn').style.title='SHOW DrapeBuilder';
			normalDiv('editDDIn');
			checkRemoveObject('spanit');
			document.getElementById('earsButtons').style.display='none';
		}
		return;
	}

	// check for a request that is not permitted for this user
	if (type == 'unsubscribed') 
	{
		alert("This DemographicDrape is available under subscription.\nPlease contact NuMaps if you wish to subscribe to this DemographicDrape.");
		
		// turn off the legend
		normalDiv('legendDD');
		document.getElementById('legHolder').style.display='none'; 
		document.getElementById('legendDD').style.title='show legend';
		
		// initialise the Drape Builder
		newSldOpen=false;
		if(document.getElementById('editDDIn'))
		{	checkRemoveObject('drapeBuilder');
			document.getElementById('editDDIn').style.title='SHOW DrapeBuilder';
			normalDiv('editDDIn');
			checkRemoveObject('spanit');
			document.getElementById('earsButtons').style.display='none';
		}
		return;
	}

	// check for a requested DDrape that is not available right now
	if (type =='coming' )
	{
		alert("This DemographicDrape is currently not available but is planned.");
		
		// turn off the legend
		normalDiv('legendDD');
		document.getElementById('legHolder').style.display='none'; 
		document.getElementById('legendDD').style.title='show legend';
		
		// initialise the Drape Builder
		newSldOpen=false;
		if(document.getElementById('editDDIn'))
		{	checkRemoveObject('drapeBuilder');
			document.getElementById('editDDIn').style.title='SHOW DrapeBuilder';
			normalDiv('editDDIn');
			checkRemoveObject('spanit');
			document.getElementById('earsButtons').style.display='none';
		}
		return;
	}

	// -------- all is well proceed with the swap --------//

	// kill off existing the DDrape layers each time
	if(DemoDrape != null)		{	DemoDrape.destroy();DemoDrape = null;		}
	if(DrapeHighlight != null)	{	DrapeHighlight.destroy(); DrapeHighlight=null;	}

	
	// pop the styleEditor control button and set the current drape
	if(document.getElementById('editDDIn')){normalDiv('editDDIn'); }
	currentDrapeId = drapeId;
	currentDrapeStyle = style;
	currentDrapeLayer = drapeWmslayer

	// should only execute when they select a new sld half way thru editing one
	if(oldTempCache != '')
	{
		var sldCacheGroup = newFileName.split('sld/');	// trim off leading sld/
		var cacheGroup = sldCacheGroup[1].split('.') ;	// trim off trailing .xml
		drapeCache = cacheGroup[0] ;
		clearCache(drapeCache, drapeId)
		oldTempCache='';
	}
	// Now apply the new SLD or Style
	if(newSldOpen && type == 'apply')
	{
		// applying a new SLD here
		oldTempCache = newFileName;
		if(ind != '' )
		{
			// apply the new submitted SLD to the current layer
			var cleanFile = ind.split('sld/');
			
			// cleanup any lingering date stamps
			cleanFile = cleanFile[1].split('?');
			
			// strip out the sld/ from file	
			layFile = cleanFile[0];
			layStyle = '';
		}
		else if (style != '' )
		{
			// setup the Style for swapping
			layFile ='';
			layStyle = style;
		}
	}
	else
	{
		// now initialise the Drape Builder just in case they need to edit the SLD
		newSldOpen=false;
		checkRemoveObject('drapeBuilder');
		if(document.getElementById('drapeButt'))
		{	document.getElementById('drapeButt').src='images/open.gif';}
		
		// find all the attributes of the newly selected DDrape
		// assume sld source of DDrape
		if(ind !== '')	{	ptr = 6;  compare = ind;	}
		if(drapeId != ''){	ptr=12; compare = drapeId;}
		else if(ind == '' || ind == 'getLegendGraphic' ) { ptr = 7;	compare = style; }
		
	   // parse the DDatts array
		for (var i=0; i<Datts.length; i++)
		{
			// separate each DDatts row into its component parts
			var components = Datts[i].split('|');
			for (var m=0; m<components.length ; m++)
			{
				// search DDatts row to find this selected DDrape sld/style
				if (components[ptr] == compare)
				{
					drapeWmslayer = components[0]; 
					theme = components[1];
					themeTitle = components[2];
					themeDir = components[3];	
					themeLayer = components[4];
					layName = components[5];
					layFile = components[6];	// this is Dfile which is the DDrape's SLD file from the database
					layStyle = components[7];
					layType = components[8];
					layTitle = components[9];
					layOp = components[10];
					laySldLoc = components[11];
					drapeId = components[12];
					//alert('drapeId when loading a new sld = '+drapeId)
					currentSld = layFile;
					break; break;
				}
			}
		}
	}

	// now that SLD is swapped go ahead and make it active
	defs = [];
	content = [];
	currentSldFile = applicationBase+'inc/sld/'+layFile;
	currentStyle = layStyle;

	// if required set up the double click event and reporting
	if(gfiDoubleClick) 
	{ 
		dblClickGetFeatureInfo();
		getSldInfo(currentSldFile);	
		if(layerName ==''){alert(currentSldFile+ '\nSLD does not exist on this server!'); return;}
		loadAllAttributes();
	}
	
	//alert ('swapSld new drape Id 7 = '+drapeId)	
	// ind should be the sld path (theme) and filename of the target Sld
	//				e.g. mb/landuse.xml
	// cleanup any lingering date stamps
	if(ind != '')
	{
		var cleanFile = ind.split('?');
		ind = cleanFile[0];
	}
	fadeLayer='';

	// now if this is an editable SLD turn on the 'EARS' buttons
	if(document.getElementById('earsButtons')) 
	{	//alert('layFile = '+layFile)
		var ears = document.getElementById('earsButtons'); 
		var purge = document.getElementById('killCache');
		if(layFile !='' ) //&& layStyle == ''
		{	
			ears.style.display='block';	
			purge.style.display='block';
		}
		else
		{
			ears.style.display='none';
			purge.style.display='none';
		}
	 }

	// now go and intialize/display the new DDrape	
	currentDrape = theme;
	displayNewSld(currentSldFile, drapeId, accessible);
	//resetZlevels();
 }


// -------- this is the Drape create and display function --------
function displayNewSld(currentSldFile, drapeId, accessible)
{
	//alert('displayNewSld darpeId = '+drapeId);
	//alert('displayNewSld currentSldFile = '+currentSldFile);
	// remove any legend that is currently active	
	//checkRemoveObject(legendTable);
	
	// kill off existing the DDrape layers each time
	if(DemoDrape != null)		{	DemoDrape.destroy();	DemoDrape = null;	}
	if(DrapeHighlight != null)	{	DrapeHighlight.destroy(); DrapeHighlight = null;	}

	// get the Sld Resource
	sldUrl = ''; legendSld = ''; resource = '';
	sldUrl  = currentSldFile;	
	legendSld = sldUrl;
	
	// set buff to defaultjust in case its not set already
	if(buff == null){buff=1;}

	// ------------- Drape Loading section from styles ----------- //
	// first load layer via database style if available
		/*alert('drapeId = '+drapeId)
		alert('layStyle = '+layStyle)
		alert('drapeWmslayer = '+drapeWmslayer)
		alert('sldUrl = '+sldUrl)
		alert('layName = '+layName)
		alert('layFile = '+layFile)*/
	if(layStyle != '' &&  layStyle != 'default' && drapeWmslayer != '' && drapeId != '' && !accessible)
	//if(drapeId != '' && layStyle != '' && drapeWmslayer != '')
	{	
		//alert('styles')
		//alert('putstyles = '+putStyles)
		DemoDrape = new OpenLayers.Layer.WMS(layName, numapsService, {layers: drapeWmslayer,  styles: layStyle,  format: drapeImage, version:'1.1.3', quality: quality, reaspect: false, transparent:'true' });
		DemoDrape.addOptions({isBaseLayer: false, visibility: true, wrapDateLine: true, buffer: buff, reproject: true, tileSize: new OpenLayers.Size(tileSize,tileSize)  });
		registerLoadWheel(DemoDrape, 'loadWheelDrape');
		map.addLayer(DemoDrape);	
		//map.setLayerZIndex(DemoDrape, 0);
		DemoDrape.setZIndex(map.Z_INDEX_BASE['Popup'] -9000);
		
		var highlightName=layName+'Highlight';	
		DrapeHighlight = new OpenLayers.Layer.WMS.Untiled( highlightName, numapsService, {layers: drapeWmslayer, styles: layStyle, format: drapeImage, version:'1.1.3', quality: quality, reaspect: false, transparent:'true' });
		DrapeHighlight.addOptions({isBaseLayer: false, visibility: false, wrapDateLine: true, buffer: buff, reproject: true });
		registerLoadWheel(DrapeHighlight, 'loadWheelDrape');
		map.addLayer(DrapeHighlight);
		//map.setLayerZIndex(DrapeHighlight, 180);
		DrapeHighlight.setZIndex(map.Z_INDEX_BASE['Popup'] -8800);
	}

	// -------------- or load layer from the SLD file ----------- //
	else 
	{
		//DemoDrape.mergeNewParams({rand: Math.random()});
		//if this is a temp SLD the do not reset the putStyles
		var parts = sldUrl.split('/newSld_');
		if(parts > 1){	putStyles=false;	}
		//alert('sld')

		DemoDrape = new OpenLayers.Layer.WMS(layName, numapsService, {SLD: sldUrl,  format: drapeImage, version:'1.1.3',   quality: 'BEST', reaspect: false, transparent:'true'});		
		DemoDrape.addOptions({isBaseLayer: false, visibility: true, wrapDateLine: true, buffer: buff, reproject: true, tileSize: new OpenLayers.Size(tileSize,tileSize) });
		registerLoadWheel(DemoDrape, 'loadWheelDrape');
		map.addLayer(DemoDrape);	
		//map.setLayerZIndex(DemoDrape, 0);
		DemoDrape.setZIndex(map.Z_INDEX_BASE['Popup'] -9000);
		
		var highlightName=layName+'Highlight';
		DrapeHighlight = new OpenLayers.Layer.WMS.Untiled( highlightName, numapsService, {sld: sldUrl, format: drapeImage, version:'1.1.3', quality: 'BEST', reaspect: false, transparent:'true'});
		DrapeHighlight.addOptions({isBaseLayer: false, visibility: false, wrapDateLine: true, buffer: buff, reproject: true });
		registerLoadWheel(DrapeHighlight, 'loadWheelDrape');
		map.addLayer(DrapeHighlight);
		//map.setLayerZIndex(DrapeHighlight, 180);
		DrapeHighlight.setZIndex(map.Z_INDEX_BASE['Popup'] -8800);
	}
		
	// set up the starting opacity control for this drape
	opValue = 1.0;
	//if(resource == 'file'){	getSldInfo(legendSld);	}
	//DemoDrape.setOpacity(opValue);
	myslider.setPosition(opValue);
	//	alert('laySldLoc = '+laySldLoc)
	//	alert(resource)
	//	alert(layStyle)
	//	alert(drapeWmslayer)
	//  alert(sldUrl2)
	
	// build the DDrape legend
	fadeLayer = DemoDrape;
	//alert(fadeLayer)
	//alert('legendSld = '+legendSld)
	if(legendSld != '')
	{
		// create legend from sld file if available
		legendBuilder("mapSurround", legendSld, null, dvbdy1, dvhdr1, false, 'tree');
		document.getElementById('legendDD').title = 'show legend';
		//alert('last ' +document.getElementById('legendDD').title)
		showHideLegend('legendDD');	
		manageLegendControls();
	}
	else if(resource == 'style' && legendSld == 'getlegendgraphic')
	{
		// create a legend from a getlegendgraphic request
		//alert('legend STYLE = '+layStyle+ ' legend layer = '+drapeWmslayer);
		getLegendGraphicLegend("mapSurround", drapeWmslayer, layStyle, drapeId);
		document.getElementById('legendDD').title='show legend';
		//highlightDiv('legendDD');
		showHideLegend('legendDD');
		manageLegendControls();
	}
	else{	alert('not enough information to build a Legend');	}

	// reset the zIndexs for all layers 
	resetZlevels();
	
	// stick the DDrape Name into the Current Drape window
	var drapeWindow = document.getElementById('selectedDrape');
	checkRemoveObject('spanit');
	var span = document.createElement('span');
	span.id='spanit'; span.setAttribute('id','spanit');
	span.style.fontSize='10px';
	span.style.paddingLeft='3px';
	var text = document.createTextNode(layName);
	span.appendChild(text);
	drapeWindow.appendChild(span);
	// make sure marker controls are set
	//activateControls();
	return;
}
function showHideLegend(id)
{
	// if the legend is not yet created them make it
	//alert (DemoDrape)
	if(DemoDrape == null){return;}
	//alert(legend)
	//alert(fadeLayer)
	if(!legend){legendBuilder("mapSurround",  sldUrl,  null,  dvbdy1,  dvhdr1, false, 'tree')}
	
	// manage the interface now
	if(document.getElementById('legHolder'))
	{
		var status =  document.getElementById(id).title;
		//alert (status)
		if (status == 'show legend' ) 
		{ 
			//alert('activating legend')
			//document.getElementById(id).src="images/leg_on.jpg";
			depressedDiv(id);
			document.getElementById('legHolder').style.display='block'; // turn on the legend
			var imgObj = document.getElementById(id);
			imgObj.setAttribute('title', 'hide legend');
		}
		else
		{
			//alert('deactivating legend')
			//document.getElementById(id).src="images/leg_off.jpg";
			normalDiv(id);
			document.getElementById('legHolder').style.display='none'; // turn off the legend
			document.getElementById(id).title ='show legend';
		}
	}
}
function manageLegendControls()
{
	// set legend control button
	if(document.getElementById('drapeButt'))
	{	
		document.getElementById('drapeButt').title ='SHOW DrapeBuilder';
		document.getElementById('editDD').src='images/open.gif';
	}
	
	// if the new SLD is the Koala data set then activate the water mark
	if(theme == 'Koala Habitats' && document.getElementById('akf') )
	{	document.getElementById('akf').style.display='block'}
	else
	{	if(document.getElementById('akf'))
		{	document.getElementById('akf').style.display='none';		}
	}
}
// ------- function to get the approriate sld resource location -------
function getSldResource(layFile, drapeId)
{
	//alert('layFile = '+layFile)
	//alert('drape Wmslayer = '+drapeWmslayer)
	//alert('drapeId = '+drapeId)
	// determine the type of resource submitted
	var parts = drapeId.split('ID:')
	resource = null;
	legSource = null;
	legendSld = layFile;

	// for a database drapeId based request
	if( parts.length == 2 )
	{	
		drapeId = parts[1];
		sldReq = sldLocations+'nuserv.cfm?'+'request=getNumaSLD&DrapeID='+drapeId;
		ajaxRequest = fetchXml(sldReq, '', false);
		resource='style';
		legendSld  = sldUrl;	
	}

	// use the supplied SLD file
	else 
	{	
		sldUrl  = applicationBase +"inc/sld/"+layFile;	
		resource='file';
		legendSld = sldUrl;
	}
	
	return;
}

//-------------------------------------------------------------------------------------------------------------
// function to read a SLD file (XML) and extract the title, each rule and build a Legend for screen display
function getSldRuleData(Url)  
{
	// make sure all rule arrays are initialised
	initRulesArrays();

	// attache Bruid for browsaer caching if required
	var query = '';
	var parts = Url.split("?bruid");
	if(parts.length <= 1){ query = "?bruid="+new Date().getTime();}
	
	// get all rule details into arrays
	Request = loadXml(Url, query, false);
	var sldRules = Request.responseXML.getElementsByTagName("Rule");
	num = sldRules.length;
	//alert('num = '+num);
	var strokeColr = ""; 
	var strokeWidth = "";
	var fillColr = ""; 
	var fillOpac = 1.0;
	
	// Loop through all the rules in the SLD file and build legend rows for each
	for (var i = 0; i < num ; i++)
	{	
		var fillColr = null
		var fillOpac = null
		var fillPat = null
		var fillPatForm = null;
		var strokeOpac = null;
		var strokeDash = null;
		var strokeColr = null;
		var strokeWidth = null;
				
		// get the heading data for each Rule
		RuleName[i]=''; RuleTitle[i]='';  RuleAbstract[i]='';
		if(sldRules[i].getElementsByTagName("Name")[0])
		{	RuleName[i]= sldRules[i].getElementsByTagName("Name")[0].firstChild.nodeValue;	}
		if(sldRules[i].getElementsByTagName("Title")[0])
		{	RuleTitle[i]= sldRules[i].getElementsByTagName("Title")[0].firstChild.nodeValue;	}
		if(sldRules[i].getElementsByTagName("Abstract")[0])
		{	RuleAbstract[i]= sldRules[i].getElementsByTagName("Abstract")[0].firstChild.nodeValue;}
		//alert("rule Name = "+RuleName[i]);
		//alert("rule Title = "+RuleTitle[i]);
		//alert("rule Abstract = "+RuleAbstract[i]);

		// get the scale denominators if present
		if(sldRules[i].getElementsByTagName("MinScaleDenominator")[0])
		{	ruleMinScale[i]= sldRules[i].getElementsByTagName("MinScaleDenominator")[0].firstChild.nodeValue;	}
		if(sldRules[i].getElementsByTagName("MaxScaleDenominator")[0])
		{	ruleMaxScale[i]= sldRules[i].getElementsByTagName("MaxScaleDenominator")[0].firstChild.nodeValue;	}
		//alert("rule MinScale = "+ruleMinScale[i]);
		//alert("rule MaxScale = "+ruleMaxScale[i]);

		// get the rendering information for each rule
		if (sldRules[i].getElementsByTagName("PolygonSymbolizer"))
		{	
			var polygonSymboliser = sldRules[i].getElementsByTagName("PolygonSymbolizer");
			var numPsym = polygonSymboliser.length;
			// precess each polygon symboliser tag
			for (var ii=0 ; ii<numPsym ; ii++ )
			{
				var sldFill = polygonSymboliser[ii].getElementsByTagName("Fill");
				if (sldFill.length > 0) // check to see if we have any Fills first
				{
					// find out how many CssParameter tags there are
					var sldFillCss = sldFill[0].getElementsByTagName("CssParameter");
					
					// if we have a regulat solid fill process here
					if (sldFillCss.length > 0 )
					{
						var fillColr = ""; 
						//var fillOpacity = opacityValue;
						// process each Fill CssParemeter attribute	
						for (var j=0; j<sldFillCss.length ; j++)
						{
							var fillAtt = sldFillCss[j].getAttribute("name");
							if (fillAtt == "fill") 
							{
								fillColr = sldFill[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;
								if (fillColr == ''){fillColr='transparent'}
							}
							if (fillAtt == "fill-opacity")
							{			
								fillOpac = sldFill[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;
							}
						}
					}
					else if(sldFill[0].getElementsByTagName("GraphicFill"))
					{
						// we now have a graphic fill so get the data for inclusion in legend fill
						var graphicFill = sldFill[0].getElementsByTagName("GraphicFill");
						var graphic = graphicFill[0].getElementsByTagName("Graphic");
						var externalGraphic = graphic[0].getElementsByTagName("ExternalGraphic");
						var onlineResource = externalGraphic[0].getElementsByTagName("OnlineResource")
						var fillPat = onlineResource[0].getAttribute("xlink:href"); 
						//alert ("source = "+fillPat);
						var fillPatForm = externalGraphic[0].getElementsByTagName("Format")[0].firstChild.nodeValue;
						//alert ("format = "+fillPatForm)
					}
				}
				//alert("fill = "+fillColr)
				// find out how many Stroke Rule nodes
				if(sldRules[i].getElementsByTagName("Stroke"))
				{
					var sldStroke = sldRules[i].getElementsByTagName("Stroke");
					if (sldStroke.length > 0)
					{
						var sldStrokeCss = sldStroke[0].getElementsByTagName("CssParameter");
						
						//alert ("sldStrokeCss = "+sldStrokeCss.length)
						
						if(sldStrokeCss.length > 0)
						{
							
							// process each Stroke CssParemeter attribute				
							for (var j=0; j<sldStrokeCss.length ; j++)
							{
								var strokeAtt = sldStrokeCss[j].getAttribute("name");
								if (strokeAtt == "stroke") 
								{
									strokeColr = sldStroke[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;		
								}
								if (strokeAtt == "stroke-width")
								{
									strokeWidth = sldStroke[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;
								}
								if (strokeAtt == "stroke-opacity")
								{
									strokeOpac = sldStroke[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;
								}
								if (strokeAtt == "stroke-dasharray")
								{
									strokeDash = sldStroke[0].getElementsByTagName("CssParameter")[j].firstChild.nodeValue;
								}
							}
						}
					}
				}
			}
		}
		/*
		alert("fillColr = "+fillColr)
		alert("fillOpac = "+fillOpac)
		alert("fillPat = "+fillPat)
		alert("fillPatForm = "+fillPatForm)
		alert("strokeColr = "+strokeColr)
		alert("strokeWidth = "+strokeWidth)
		alert("strokeOpac = "+strokeOpac)
		alert("strokeDash = "+strokeDash)
		*/
		// store all rule rendering values into arrays
		fillColor[i] = fillColr;
		fillOpacity[i] = fillOpac; 
		fillPattern[i] = fillPat;
		lineWeight[i] = strokeWidth;
		lineColor[i] = strokeColr;
		lineOpacity[i] = strokeOpac;
		lineDash[i] = strokeDash;
		
		// now get the Filter information for each rule if present
		if (sldRules[i].getElementsByTagName("Filter")[0])
		{
			//alert ("this rule has a filter")
			var sldFilter = sldRules[i].getElementsByTagName("Filter");
			// get the concatination rules
			var conRule = ',';
		
			concatRule = sldFilter[0].getElementsByTagName("And");
			if (concatRule.length > 0)
			{	conRule='AND,'; }
			else 
			{ 
				concatRule = sldFilter[0].getElementsByTagName("Or");
				if (concatRule.length > 0)
				{	conRule='OR,';	}
			}

			// Now get the SqlExpression Object
			if (concatRule.length > 0)
			{	var sqlExpress = concatRule[0].getElementsByTagName("SqlExpression");	}
			else
			{	var sqlExpress = sldFilter[0].getElementsByTagName("SqlExpression");	}
			//alert ("number of SQLs = "+sqlExpressions.length);
			
			// store the sqlExpressions into an associated array
			if(sqlExpress.length > 0)
			{
				for (var g=0; g < sqlExpress.length ; g++ )
				{
					var sqlExpression = sqlExpress[g].firstChild.nodeValue;
					//alert('before = '+sqlExpression)

					// look for the condition expression
					sqlExpression = insertPipes(sqlExpression);
					sqlExpression = insertSpaces(sqlExpression);
				 /*
					// replace the spaces around the operators with | for use later
					sqlExpression = sqlExpression.replace(/ /, "|")
						//alert(sqlExpression)
					sqlExpression = sqlExpression.replace(/ /, "|")
				*/
					//alert('after = '+sqlExpression)
					if(g == 0){sqlExp[i] = sqlExpression;}
					else {sqlExp[i]+= ','+conRule+sqlExpression;}
					//alert(sqlExp[i])
				}
			}
			else
			{	sqlExp[i]='';}
		}
	}
}
function insertPipes(sqlExpression)
{
	for (var i=0; i<optionAlias.length ; i++ )
	{
		var test = ' '+optionAlias[i]+' ';
		var parts = sqlExpression.split(test);
		if(parts.length	 > 1) {sqlExpression=parts[0]+'|'+optionAlias[i]+'|'+parts[1]; return sqlExpression;}
	}
}


function insertSpaces(sqlExpression)
{
	// now replace all +, *, -, / with :
	sqlExpression = sqlExpression.replace(/\+/g, " + ");
	sqlExpression = sqlExpression.replace(/\-/g, " - ");
	sqlExpression = sqlExpression.replace(/\//g, " / ");
	sqlExpression = sqlExpression.replace(/\*/g, " * ");
	sqlExpression = sqlExpression.replace(/  /g, " ");
	return sqlExpression;
}

