

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);
		var fillPat = areaFillBase+'blackdiagonal.gif';
		
		// 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(legendParentId, Url, opVal)
{
	//if(!document.getElementById(legendParentId)) {alert('Legend DIV not yet present'); return;}
	if(!document.getElementById(legendParentId)){return;}
	var parentDiv = document.getElementById(legendParentId);
	
	if (opVal == null)
	{
		// Add bruid for caching if required
		var parts = Url.split("?bruid");
		var cacheUrl = Url;
		if(parts.length <= 1){ cacheUrl = Url+"?bruid="+new Date().getTime();}
		if (!getSldInfo(cacheUrl))	{alert ("Returning False"); return false;}
		
		// kill off any existing Laegend
		checkRemoveObject('legHolder');
		
		// create a new Legend holder
		legendDiv = document.createElement('div');
		legendDiv.style.width='220px'; 
		legendDiv.style.height='auto';
		legendDiv.id = 'legHolder';
		legendDiv.setAttribute("id", 'legHolder');

		// create the title of the Ddrape
		legendName = document.createElement('div');
		//legendName.className='whiteSunkenBox';
		legendName.style.width='100%'; 
		legendName.style.height='auto';
		legendName.style.textAlign='center';
		legendName.style.fontSize='12px';
		legendName.style.fontWeight='bold';
		legendName.value = sldAbstract;
		legendName.id = 'legendTitle';
		legendName.setAttribute("id", 'legendTitle');
		var text = document.createTextNode(nameData);	
		legendName.appendChild(text);
		bindEvent(legendName, 'mouseover', showObjectValue, 'false');
		legendDiv.appendChild(legendName);
		
		// Create the Table Object 
		var table = document.createElement("table");
		table.setAttribute("id", 'legTable');
		table.id='legTable';
		table.style.width='200px'; 
		table.style.height='auto'; 
		table.style.margin='10px';
		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");
		numOfRules = sldRules.length;
		
		
		// Loop through all the rules in the SLD file and build legend rows for each
		for (var i = 0; i < numOfRules ; i++)
		{	
			// get the render rules for each rule
			getSldRenderRules(sldRules[i]);
				
			// set up the Table Body node and the TR node
			var tdIdbox="tdBox:"+i;
			var tdIdBoxDiv = "tdBoxIn:"+i;
			var tdIdtext="tdText:"+i;
			var trId="tr"+i;
			
			// Set up the legend box TD node with appropriate color		
			var trNode = document.createElement("tr");
								
			// first cell is the polygon symbology box
			var tdNode1 = document.createElement("td");
			tdNode1.style.width='30px'; 
			tdNode1.style.height='15px';
			//tdNode1.style.backgroundColor='#ECE9D8'; 
			tdNode1.style.borderCollapse='collapse';
			//tdNode1.style.margin='5px';
			tdNode1.className = 'unselectedItem';
			tdNode1.id = tdIdbox;
			tdNode1.setAttribute("id", tdIdbox);
			
				var divNode = document.createElement("div");
				divNode.id = tdIdBoxDiv;
				divNode.setAttribute("id", tdIdBoxDiv);
				divNode.style.width='28px'; 
				divNode.style.height='12px'; 
				divNode.style.margin='1px';
							
				// 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 and just add ontop
				if (fillPat != null)
				{
					var divNode2 = document.createElement("div");
					divNode2.style.width='28px'; 
					divNode2.style.height='12px'; 
					divNode2.style.margin='1px'; 
					//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.paddingLeft='10px';
				//tdNode2.style.fontWeight='bold';
				tdNode2.style.width='190px'; 
				tdNode2.style.height='100%';
				if (ruleName != '')
				{	var textNode = document.createTextNode(ruleName);
					tdNode2.appendChild(textNode);
				}
				// set up the mouseover for metadata about Rule against name of rule
				var desc = ruleAbstract;
				if(desc == ''){desc = ruleTitle;}
				if(desc == ''){desc = ruleName;}
				tdNode2.value=desc;
				tdNode2.id = tdIdtext;
				tdNode2.setAttribute('id', tdIdtext);
				tdNode2.className = 'unselectedItem';
				bindEvent(tdNode2, 'mouseover', selectObjectValue, 'false');
				bindEvent(tdNode2, 'mouseout',  unselectObjectValue, 'false');
			
				// 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);
		legendDiv.appendChild(table);
		parentDiv.appendChild(legendDiv);

	}
	else // just adjust the opacity of the table cells
	{	
		//alert('num again = '+num)
		var opacity = parseFloat(opVal)
		for (var i = 0; i < numOfRules ; i++)
		{
			var tdIdBoxDiv="tdBoxIn:"+i;
			var obj = document.getElementById(tdIBoxDiv);
			var fillNumber = Math.abs(Number(opacity)*100);
			setOpacity(obj, fillNumber);
		}
	}	
}

function showObjectValue(evt)
{
	var id = getThisId(evt);
		var sldabstract = document.getElementById(id).value;
		MochaUI.notification(sldabstract);
		new Event(evt).stop();
}
function selectObjectValue(evt)
{
	var id = getThisId(evt);
	var row = id.split(":")[1];
	var sldabstract = document.getElementById(id).value;
	MochaUI.notification(sldabstract);
	document.getElementById(id).className='selectedItem';
	document.getElementById('tdBox:'+row).className = 'selectedItem';
	new Event(evt).stop();
}
function unselectObjectValue(evt)
{
	var id = getThisId(evt);
	var row = id.split(":")[1];
	var sldabstract = document.getElementById(id).value;
	document.getElementById(id).className = 'unselectedItem';
	document.getElementById('tdBox:'+row).className = 'unselectedItem';
	new Event(evt).stop();
}
// 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;	}
	
	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 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
		{
			// add bruid for caching if required
			var query = '';
			var parts = sldfileUrl.split("?bruid");
			if(parts.length <= 1){ query = "?bruid="+new Date().getTime();}
			
			// remove any applicationRoot string so it is added only once
			sldfileUrl = sldfileUrl.replace(applicationRoot, '')

			//alert('in getSldInfo = '+applicationRoot+sldfileUrl+query)
			ajaxRequest = loadXml(applicationRoot+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 buildTemporarySld(layerName,name,title,attName,abstract,filter,colorFill,fillOpac,colorBdy,lineWeight,fillPatt,fillPattForm,labelName,solidBorder)
{
	//alert(filter)
	var pieces = filter.split(',');
	var length = pieces.length;
	//alert('labelName = '+labelName)
	
	// write the first part of the SLD
	//rec="<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ";
	rec="<StyledLayerDescriptor version='1.0.0' ";
	rec+="xmlns='http://www.opengis.net/sld' ";
	rec+="xmlns:sld='http://www.opengis.net/sld' ";
	rec+="xmlns:ogc='http://www.opengis.net/ogc' ";
	rec+="xmlns:xlink='http://www.w3.org/1999/xlink' ";
	rec+="xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' ";
	rec+="xsi:schemaLocation='http://www.opengis.net/sld http://schemas.cubewerx.com/schemas/sld/1.0.0-cw/StyledLayerDescriptor.xsd'> ";
	rec+=" <NamedLayer> ";
	 rec+="<Name>"+layerName+"</Name> ";
	 rec+="<UserStyle> ";
	 rec+="<Name>"+name+"</Name> ";
	 rec+="<Title>"+title+"</Title> ";
	 if(abstract != ''){ rec+="<Abstract>"+abstract+"</Abstract> ";  }
	 rec+="<FeatureTypeStyle> ";
	 

	 // ----------------------- Write out a new rule for a collection  --------------------------
	 rec+="<Rule> ";
	// rec+="<MaxScaleDenominator>4000000</MaxScaleDenominator> ";  
	 rec+="<Filter> ";
	  
	 if(length == 1)
	 { rec+="<SqlExpression>"+attName+" = '"+filter+"'</SqlExpression> "; }
	 else if(length > 1)
	 { rec+="<Or> ";
	 
	  // Now write out the filter rules in batches of 50 as here...
	  // <SqlExpression>ILOC_CODE IN('ILOC2001301','ILOC2003101','ILOC2001501'....)</SqlExpression>
	  for (i=0; i<length; i=i+500)
	  {
	   string = attName+" IN(";
	   for (j=i; j<i+500; j++)
	   {
		if(j < length-1 && j < i+499)
		{
		 string = string+"'"+pieces[j]+"',";
		}
		else
		{
		 string = string+"'"+pieces[j]+"')";
		 if(j == length-1){break;}
		}    
	   }   
	   rec+="<SqlExpression>"+string+"</SqlExpression> ";  
	  }
	  rec+="</Or> "; 
	 }
	 rec+="</Filter> ";
	  

	 // ------------------------ Add Area Fill ---------------------------
	 if(colorFill != 'transparent' && !solidBorder)
	 {
	  rec+="<PolygonSymbolizer> ";
	  rec+="<Fill> "; 
	  rec+="<CssParameter name='fill'>"+colorFill+"</CssParameter> "; 
	  rec+="<CssParameter name='fill-opacity'>"+fillOpac+"</CssParameter> "; 
	  rec+="</Fill> "; 
	  rec+="</PolygonSymbolizer> ";
	 }
	 else if(colorFill != 'transparent' && solidBorder)
	 {
	  rec+="<PolygonSymbolizer> ";
	  rec+="<Stroke> "; 
	  rec+="<CssParameter name='stroke'>"+colorBdy+"</CssParameter> "; 
	  rec+="<CssParameter name='stroke-width'>5</CssParameter> ";
	  rec+="</Stroke> "; 
	  rec+="</PolygonSymbolizer> ";   
	  rec+="<PolygonSymbolizer> ";
	  rec+="<Fill> "; 
	  rec+="<CssParameter name='fill'>"+colorFill+"</CssParameter> "; 
	  rec+="<CssParameter name='fill-opacity'>1</CssParameter> "; 
	  rec+="</Fill> "; 
	  rec+="</PolygonSymbolizer> "; 
	 }
	 else if(colorFill == 'transparent' && !solidBorder)
	 {
	  rec+="<PolygonSymbolizer> "; 
	  rec+="<Fill> "; 
	  rec+="<CssParameter name='fill'>transparent</CssParameter> "; 
	  rec+="</Fill> "; 
	  rec+="</PolygonSymbolizer> "; 
	 }
	 else if(colorFill == 'transparent' && solidBorder)
	 {
	  rec+="<PolygonSymbolizer> "; 
	  rec+="<Stroke> "; 
	  rec+="<CssParameter name='stroke'>"+colorBdy+"</CssParameter> "; 
	  rec+="<CssParameter name='stroke-width'>5</CssParameter> "; 
	  rec+="</Stroke> ";
	  rec+="</PolygonSymbolizer> ";   
	  rec+="<PolygonSymbolizer> "; 
	  rec+="<Fill> "; 
	  rec+="<CssParameter name='fill'>transparent</CssParameter> "; 
	  //rec+="<CssParameter name='fill-opacity'>1</CssParameter> ";
	  rec+="</Fill> ";
	  rec+="</PolygonSymbolizer> ";
	 }


	 // ------------------------- Add Pattern Fill
	 if(fillPatt != '' && fillPattForm != '')
	 {
	  rec+="<PolygonSymbolizer> "; 
	  rec+="<Fill> "; 
	  rec+="<GraphicFill> "; 
	  rec+="<Graphic> "; 
	  rec+="<ExternalGraphic> "; 
	  rec+="<OnlineResource xlink:href='"+fillPatt+"' /> "; 
	  rec+="<Format>"+fillPattForm+"</Format> "; 
	  rec+="</ExternalGraphic> "; 
	  rec+="</Graphic> ";
	  rec+="</GraphicFill> "; 
	  rec+="</Fill> "; 
	  rec+="</PolygonSymbolizer> "; 
	 }

	 // -------------------------- Add the Border line Symbolizer
	 if(lineWeight != '' && lineWeight != 0 && colorBdy != '' && colorBdy != 'transparent' && !solidBorder)
	 {
	  rec+="<PolygonSymbolizer> "; 
	  rec+="<Stroke> "; 
	  rec+="<CssParameter name='stroke'>"+colorBdy+"</CssParameter> "; 
	  rec+="<CssParameter name='stroke-width'>"+lineWeight+"</CssParameter> "; 
	  rec+="</Stroke> "; 
	  rec+="</PolygonSymbolizer> "; 
	 }

	 // ------------------------- Add Text Symbilizer
	 
	 if(labelName != null && labelName != '')
	 {
	  rec+="<TextSymbolizer> "; 
	  rec+="<Geometry> "; 
	  rec+="<PropertyName>GEOMETRY</PropertyName> ";
	  rec+="</Geometry> "; 
	  rec+="<Label> "; 
	  rec+="<PropertyName>"+labelName+"</PropertyName> "; 
	  rec+="</Label> "; 
	  rec+="<Font> "; 
	  rec+="<CssParameter name='font-family'>Verdana</CssParameter> "; 
	  rec+="<CssParameter name='font-size'>12</CssParameter> "; 
	  rec+="<CssParameter name='font-weight'>bold</CssParameter> "; 
	  rec+="</Font> "; 
	  rec+="<Fill> "; 
	  rec+="<CssParameter name='fill'>#000000</CssParameter> "; 
	  rec+="</Fill> "; 
	  rec+="<Halo> "; 
	  rec+="<CssParameter name='fill'>#FFFFFF</CssParameter> "; 
	  rec+="</Halo> "; 
	  rec+="</TextSymbolizer> "; 
	 } 
	 
	 //------------------------ close off the Rule
	 rec+="</Rule> ";    
	 rec+="</FeatureTypeStyle> ";  
	 rec+="</UserStyle> ";  
	 rec+="</NamedLayer> ";  
	 rec+="</StyledLayerDescriptor>";
	 return rec;
}

// 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(drapeId)
	// 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);			
		DemoDrape.destroy();

		// turn off the Mocha popup Window legend
		MochaUI.closeWindow($('legend'));
		
		// rebuild the tree
		buildTheDrapePickaTree();
		legendSld='';
		previousId=null;
		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 --------//

	// pop the styleEditor control button and set the current drape
	if(document.getElementById('editDDIn')){normalDiv('editDDIn'); }
	//alert(drapeId)
	//	alert(drapeWmslayer)
	
	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 = applicationRoot +  njsSldDir + layFile;
	currentStyle = layStyle;

	// if requires 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')) 
	{	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();
	setTimeout("MochaUI.legendWindow()",200);
 }



// -------- this is the Drape create and display function --------
function displayNewSld(currentSldFile, drapeId, accessible)
{
	// kill off existing the DDrape layers each time
	if(DemoDrape != null)		{	DemoDrape.destroy();		}

	// get the Sld Resource
	sldUrl = ''; legendSld = ''; resource = '';
	sldUrl  = currentSldFile;	
	legendSld = sldUrl;
	//alert(legendSld)
	
	// 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
	if(layStyle != '' &&  layStyle != 'default' && drapeWmslayer != '' && drapeId != '' && !accessible)
	{	
		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);	
		DemoDrape.setZIndex(map.Z_INDEX_BASE['Popup'] -9000);
	}

	// -------------- 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);	
		DemoDrape.setZIndex(map.Z_INDEX_BASE['Popup'] -9000);
	}
	// now create a highlight layer for later
	
	// build the DDrape legend
	fadeLayer = DemoDrape;

	// update Mocha legend from sld file if div is available
	if ($('numaLegendDiv'))
	{
		MochaUI.updateContent({'element':  $('legend'),'url':'pages/numaLegend.html'});
	}
	
	// or this is for a Style's getlegend graphic
	else if(resource == 'style' && legendSld == 'getlegendgraphic')
	{
		// create a legend from a getlegendgraphic request
		//alert('legend STYLE = '+layStyle+ ' legend layer = '+drapeWmslayer);
		getLegendGraphicLegend("application", drapeWmslayer, layStyle, drapeId);
		document.getElementById('legendDD').title='show legend';
		showHideLegend('legendDD');
		manageLegendControls();
	}

	// reset the DDrape opacity slider of Mocha
	if(mySlider){	mySlider.set(10);	}
	
	// reset all layers to default order
	resetZlevels();

	// setup the click control here
	activateGfiClickControl();
}


function showHideLegend(id)
{
	// if the legend is not yet created them make it
	//if(!legend){legendBuilder("mapSurround",  sldUrl,  null,  dvbdy1,  dvhdr1)}
	
	// manage the interface now
	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;
	alert('in getSldResource legendSld = '+legendSld)

	// 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  = applicationRoot + njsResourceDir + 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();

	// attach 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
	//alert(Url+query)
	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;
}


