function Layer()
{
	this.Name;
	this.Type; // Image/Feature
	this.DefaultVisible = false;
	this.LayerGroupName;
	this.MinScale;
	this.MaxScale;
	this.LayerPostion;
	this.IsVisible = false;
	this.UserChanged = false;
	this.Hyperlink;
	this.SymbolField;
	this.SpatialFilter = new SpatialFilter();
	this.QueryList = new Array();
	
	// properties
	this.XmlReqLoadLayers; // XMLHttpRequest object
	this.XmlReqSearchLayers; // XMLHttpRequest object
	this.XmlReqSearchFields; // XMLHttpRequest object
	this.XmlReqLayerNames;
	
	//Methods
	this.loadLayerList = loadLayerList;
	this.processLayerList = processLayerList;
	this.getSearchableLayers = getSearchableLayers;
	this.getSearchableFields = getSearchableFields;
	this.getLayerNames = getLayerNames;
	this.processGetLayerNames = processGetLayerNames;
	this.updateLabel = updateLabel;
	
	function loadLayerList()
	{
		url = server + "LayerService.asmx/LoadLayers";
		
		if( window.ActiveXObject )
		{
			// activex use; ie
			self.XmlReqLoadLayers = new ActiveXObject("Microsoft.XMLHTTP");
			
			if( self.XmlReqLoadLayers )
			{
				self.XmlReqLoadLayers.onreadystatechange = processLayerList;
				self.XmlReqLoadLayers.open("GET", url, true);
				self.XmlReqLoadLayers.send();
			}
		}
	}

	function processLayerList()
	{
		if( self.XmlReqLoadLayers.readyState == 4 )
		{
			if( self.XmlReqLoadLayers.status == 200 )
			{
				var layer;
				var layerArrayCnt = 0;
				var response = self.XmlReqLoadLayers.responseXML.documentElement;
				var layerGroups = response.getElementsByTagName('LAYERGROUP');
				var layerHtml = "<table id=\"tblLayers\" cellpadding=\"2\" border=\"0\" width=\"100%\" cellspacing=\"0\">";
				
				for( var i = 0; i < layerGroups.length; i++ )
				{
					if( layerGroups[i].childNodes.length > 0 )
					{
						var layerGroupName = layerGroups[i].attributes.getNamedItem('name').value;
						var layerGroupHyperlink = layerGroups[i].attributes.getNamedItem('hyperlink').value;
						
						layerHtml += "<tr><td id=grp" + layerGroupName + " class=\"layerGroup\"><img class=\"collapseImage\" src=\"images/minus.gif\" onmousedown=\"collapseLayerGroup('" + layerGroupName + "');\">" + layerGroupName + "</td></tr>";
						
						for( var x = 0; x < layerGroups[i].childNodes.length; x++ )
						{
							// add each layer to the JS array
							layer = new Layer();
							layer.Name = layerGroups[i].childNodes[x].attributes.getNamedItem('name').value;
							layer.Type = layerGroups[i].childNodes[x].attributes.getNamedItem('type').value;
							layer.Hyperlink = layerGroups[i].childNodes[x].attributes.getNamedItem('hyperlink').value;
							
							if( layerGroups[i].childNodes[x].attributes.getNamedItem('default').value == 'True' )
								layer.DefaultVisible = true;
							else
								layer.DefaultVisible = false;
								
							layer.LayerGroupName = layerGroupName; // layer_group_name
							layer.MinScale = layerGroups[i].childNodes[x].attributes.getNamedItem('minscale').value;
							layer.MaxScale = layerGroups[i].childNodes[x].attributes.getNamedItem('maxscale').value;
							layer.LayerPosition = layerGroups[i].childNodes[x].attributes.getNamedItem('position').value;
							
							//alert("Adding: " + layer.Name + " - " + layer.LayerGroupName);
							layerArray[layerArrayCnt] = layer;
							layerArrayCnt++;
							
							// continue building HTML for UI
							if( layer.Type == 'feature' )
								layerHtml += "<tr><td id=lyr" + layer.LayerPosition + " class=\"layerNormal\" onMouseDown=\"setActiveLayer('" + layer.LayerPosition + "');event.cancelBubble = true;\"><input id=chk" + layer.LayerPosition + " type=checkbox onClick=\"changeLayerVisible('" + layer.Name + "');\"";
							else
								layerHtml += "<tr><td id=lyr" + layer.LayerPosition + " class=\"layerNormal\"><input id=chk" + layer.LayerPosition + " type=checkbox onClick=\"changeLayerVisible('" + layer.Name + "');\"";
							
							if( layer.DefaultVisible == true )
							{
								layerHtml += " checked";
								
								// set as being currently visible
								layer.IsVisible = true;
							}
							else
							{
								layer.IsVisible = false;
							}
							
							layerHtml += ">" + layer.Name;
							
							if( layer.Hyperlink != null && layer.Hyperlink != '' )
								layerHtml += " - <a href=\"" + layer.Hyperlink + "\" target=\"_new\" onmousedown=\"event.cancelBubble = true;\">Link</a>";
								
							layerHtml += "</td></tr>";
						}
					}
				}
				
				layerHtml += "</table>";
				divLayersList.innerHTML = layerHtml;
				
				// calculate new scale size
				calcScale();
				
				// check to see if layers "can be" activated or not
				checkVisScale();
				
				//set active layer
				setActiveLayerNoClick(activeLayer);
				
				var feat = new Feature();
				feat.checkForZoomToFeature();
			}
		}
	}
	
	function getSearchableLayers()
	{
		url = server + "LayerService.asmx/GetSearchableLayers";
		
		if( window.ActiveXObject )
		{
			self.XmlReqSearchLayers = new ActiveXObject("Microsoft.XMLHTTP");
			
			if( self.XmlReqSearchLayers )
			{
				self.XmlReqSearchLayers.onreadystatechange = processGetSearchableLayers;
				self.XmlReqSearchLayers.open("GET", url, true); //async call
				self.XmlReqSearchLayers.send();
			}
		}
	}
	
	function processGetSearchableLayers()
	{	
		if( self.XmlReqSearchLayers.readyState == 4 )
		{
			if( self.XmlReqSearchLayers.status == 200 )
			{
				var layer;
				var response = XmlReqSearchLayers.responseXML.documentElement;
				var layers = response.getElementsByTagName('layer');
				
				document.getElementById("selectSearchLayer").options[0] = new Option("", "", false, false);
			
				for( var i = 0; i < layers.length; i++ )
				{
					var name = layers[i].getElementsByTagName('name')[0].firstChild.data;
										
					document.getElementById("selectSearchLayer").options[i + 1] = new Option(name, name, false, false);
				}
			}
		}
	}
	
	function getSearchableFields(layerName)
	{
		url = server + "FieldService.asmx/GetSearchableFields?layerId=" + layerName;
		
		if( window.ActiveXObject )
		{
			self.XmlReqSearchFields = new ActiveXObject("Microsoft.XMLHTTP");
			
			if( self.XmlReqSearchFields )
			{
				self.XmlReqSearchFields.onreadystatechange = processGetSearchableFields;
				self.XmlReqSearchFields.open("GET", url, true); //async call
				self.XmlReqSearchFields.send();
			}
		}
	}
	
	function processGetSearchableFields()
	{
		if( self.XmlReqSearchFields.readyState == 4 )
		{
			if( self.XmlReqSearchFields.status == 200 )
			{
				var response = self.XmlReqSearchFields.responseXML.documentElement;
				var html = "<table id=\"tblFindFeature\" cellpadding=\"2\" cellspacing=\"0\" border=\"0\" width=\"100%\">";
				
				var fields = response.getElementsByTagName('FIELD');
				
				for( var i = 0; i < fields.length; i++ )
				{
					var name = fields[i].attributes.getNamedItem('name').value;
					
					html += "<tr>";
					html += "<td class=\"fieldOdd\" align=\"right\">" + name + ": </td><td class=\"fieldValueOdd\" align=\"left\"><input id=\"findLayer" + i + "\" class=\"inputText\" type=\"text\"></td>";
					html += "</tr>";
				}
				
				html += "<tr class=\"trInfo\">";
				html += "<td align=\"center\">";
				html += "<input type=\"button\" class=\"buttonNormal\" value=\"Clear\" onmouseover=\"this.className='buttonActive';\" onmouseout=\"this.className='buttonNormal';\">";
				html += "</td><td align=\"center\">";
				html += "<input type=\"button\" class=\"buttonNormal\" value=\"Go\" onmouseover=\"this.className='buttonActive';\" onmouseout=\"this.className='buttonNormal';\" onclick=\"var find = new Find(); find.findLayer();\">";
				html += "</td></tr>";
				html += "</table>";
				divFindFeatureList.innerHTML = html;
			}
		}
	}
	
	function getLayerNames()
	{
		url = server + "LayerService.asmx/GetLayerNames";
		
		if( window.ActiveXObject )
		{
			// activex use; ie
			self.XmlReqLayerNames = new ActiveXObject("Microsoft.XMLHTTP");
			
			if( self.XmlReqLayerNames )
			{
				self.XmlReqLayerNames.onreadystatechange = processGetLayerNames;
				self.XmlReqLayerNames.open("GET", url, true);
				self.XmlReqLayerNames.send();
			}
		}
	}
	
	function processGetLayerNames()
	{
		// use selectLayerLabels drop down
		if( self.XmlReqLayerNames.readyState == 4 )
		{
			if( self.XmlReqLayerNames.status == 200 )
			{
				var response = self.XmlReqLayerNames.responseXML.documentElement;
				var layers = response.getElementsByTagName('layer');
				var cnt = 0;
				
				document.getElementById("selectLayerLabels").options[0] = new Option("", "", false, false);
			
				for( var i = 0; i < layers.length; i++ )
				{
					var name = layers[i].getElementsByTagName('name')[0].firstChild.data;
					
					if( name != 'Interstates' && name != 'VBMP Imagery' && name != 'Counties' )
						document.getElementById("selectLayerLabels").options[cnt++ + 1] = new Option(name, name, false, false);
				}
			}
		}
	}
	
	function updateLabel(doClearLabel)
	{
		// search the 'group1' radio button group for the checked item.  also find the selected layer from the 'selectLayerLabels' drop down.
		// using these values, update the layer in the 'layerArray' with the field to symbolize on.
		
		var layer = document.getElementById("selectLayerLabels").value;
		var field = '';
		var len = document.frmLayerLabels.group1.length;
		
		// find field value
		for( var i = 0; i < len; i++ )
		{
			if( document.frmLayerLabels.group1[i].checked )
			{
				if( doClearLabel )
					document.frmLayerLabels.group1[i].checked = false;
				else
					field = document.frmLayerLabels.group1[i].value;
				break;
			}
		}
		
		// find layer in layerArray, and set its symbol field
		for( var x = 0; x < layerArray.length; x++ )
		{
			if( layerArray[x].Name == layer )
			{
				if( doClearLabel )
					layerArray[x].SymbolField = "";
				else
					layerArray[x].SymbolField = field;
				break;
			}
		}
		
		map.updateMap();
	}
}