function Layer()
{
	
	this.Name;
	this.Type; // Image/Feature
	this.DefaultVisible = false;
	this.LayerGroupName;
	this.MinScale;
	this.MaxScale;
	this.LayerPosition;
	this.IsVisible = false;
	this.UserChanged = false;
	this.Hyperlink;
	this.SpatialFilter = new SpatialFilter();
	this.QueryList = new Array();
	this.fieldOptions = new Array();
			
	// properties
	this.XmlReqLoadLayers; // XMLHttpRequest object
	this.XmlReqSearchLayers; // XMLHttpRequest object
	this.XmlReqSearchFields; // XMLHttpRequest object
	
	//Methods
	this.loadLayerList = loadLayerList;
	this.processLayerList = processLayerList;
	this.getSearchableLayers = getSearchableLayers;
	this.getSearchableFields = getSearchableFields;
	this.getSearchableFieldsHTML = getSearchableFieldsHTML;
	
	function loadLayerList()
	{
		url = server + "LayerService.asmx/LoadLayers?userGroupName=" + user.userGroupName;
		
		self.XmlReqLoadLayers = new TXmlHttp();
		
		if( self.XmlReqLoadLayers )
		{
			self.XmlReqLoadLayers.onreadystatechange = processLayerList;
			self.XmlReqLoadLayers.open("GET", url, true);
			self.XmlReqLoadLayers.send(null);
		}
	}

	function processLayerList()
	{
		if( self.XmlReqLoadLayers.readyState == 4 )
		{
			if( self.XmlReqLoadLayers.status == 200 )
			{
				var layer;
				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\" id=\"" + layerGroupName + "img\" src=\"images4/minus_layers.gif\" onmousedown=\"collapseLayerGroup('" + layerGroupName + "');\">" + layerGroupName + "</td></tr><tbody id=\"" + layerGroupName + "\">";
						for( var x = 0; x < layerGroups[i].childNodes.length; x++ )
						{
						    //alert(layerGroups[i].childNodes[x].attributes.getNamedItem("name").value);
							// add each layer to the JS array
							if( layerGroups[i].childNodes[x].attributes != null )
							{
								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('active').value == 'True' )
									layer.Active = true;
								else
									layer.Active = false;
								
								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;
								
								layerArray.push(layer);
								
								// continue building HTML for UI
								if( layer.Active )
								{
									// 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 += "</tbody>";
					}
				}
				
				layerHtml += "</table>";
				//alert(layerHtml);
				divLayersList.innerHTML = layerHtml;
				// load first map
				map.getMap("REFRESH", 0, 0, 0, 0, false);
				//set active layer
				setActiveLayerNoClick(map.ActiveLayer);
				
				var feat = new Feature();
				feat.checkForZoomToFeature();
			}
		}
	}
	
	function getSearchableLayers()
	{
		url = server + "LayerService.asmx/GetSearchableLayers?userGroupName=" + user.userGroupName;
	
		self.XmlReqSearchLayers = new TXmlHttp();
		
		if( self.XmlReqSearchLayers )
		{
			self.XmlReqSearchLayers.onreadystatechange = processGetSearchableLayers;
			self.XmlReqSearchLayers.open("GET", url, true); //async call
			self.XmlReqSearchLayers.send(null);
		}
	}
	
	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("queryBuilderLayerPageDrop").options[0] = new Option("", "", false, false);
				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("queryBuilderLayerPageDrop").options[i + 1] = new Option(name, name, false, false);
					document.getElementById("selectSearchLayer").options[i + 1] = new Option(name, name, false, false);
					document.getElementById("bufferLayerSelect").options[i] = new Option(name, name, false, false);
				}
			}
		}
	}
	
	function getSearchableFields(layerName)
	{
		var fieldOptions = new Array();
		url = server + "FieldService.asmx/GetSearchableFields?layerId=" + layerName + "&userGroupName=" + user.userGroupName;

		self.XmlReqSearchFields = new TXmlHttp();
		
		if( self.XmlReqSearchFields )
		{
			self.XmlReqSearchFields.open("GET", url, false); //sync call
			self.XmlReqSearchFields.send(null);
			var response = self.XmlReqSearchFields.responseXML.documentElement;
			
			var fields = response.getElementsByTagName('FIELD');
			
							
			for( var i = 0; i < fields.length; i++ )
			{
				var name = fields[i].attributes.getNamedItem('name').value;
									
				fieldOptions[i] = new Option(name, name, false, false);
			}
			
			return fieldOptions;
		}
	}
	function getSearchableFieldsHTML(layerName)
	{
		var fieldOptions = new Array();
		url = server + "FieldService.asmx/GetSearchableFields?layerId=" + layerName + "&userGroupName=" + user.userGroupName;

		self.XmlReqSearchFields = new TXmlHttp();
		
		if( self.XmlReqSearchFields )
		{
			self.XmlReqSearchFields.open("GET", url, false); //sync call
			self.XmlReqSearchFields.send(null);
			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;
					var alias = fields[i].attributes.getNamedItem('alias').value;
					
					if(null == alias || "" == alias){
						alias = name;
					}
					
					//var isRange = fields[i].attributes.getNamedItem('is_range').value;
					
					html += "<tr id='field_field_row_" + name + "'>";
					html += "<td  style=\"background-color: #A0A0A0;\" class=\"fieldOdd\" align=\"left\" id=\"find_field_" + name + "\">" + alias + ": </td>";
					//if(isRange == "true" || isRange == "True"){
					//	html += "<td class=\"fieldValueOdd\" align=\"left\" nowrap>between <input id=\"findLayer" + i + "\" type=\"text\" size=\"4\"> and ";
					//	html += "<input id=\"findLayer" + i + "_max\"  type=\"text\" size=\"4\"></td>";
					//}else{
						html += "<td  style=\"background-color: #A0A0A0;\" class=\"fieldValueOdd\">equals <input id=\"findLayer" + i + "\"  type=\"text\" size=\"9\"></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 align=\"center\">";
				html += "<input id=\"findLayerButton\" type=\"button\" class=\"buttonNormal\" value=\"Go\" onkeypress=\"entsub('findLayerButton');\" onmouseover=\"this.className='buttonActive';\" onmouseout=\"this.className='buttonNormal';\" onclick=\"showLoading(); var find = new Find(); find.findLayer();\"></td>";
				html += "<td align=\"center\"><input id=\"clearLayerButton\" type=\"button\" class=\"buttonNormal\" value=\"Clear\" onkeypress=\"entsub('clearLayerButton');\" onmouseover=\"this.className='buttonActive';\" onmouseout=\"this.className='buttonNormal';\" onclick=\"clearSearch();\">";
				html += "</td></tr>";
				html += "</table>";
				//alert(divSearch.style.width);
				//the 83 should be something dynamic
				//divLayerSearchInner.style.width = parseInt(divSearch.style.width);
				divLayerSearchInner.style.height = parseInt(divSearch.style.height) - 83;//400;
				divLayerSearchInner.innerHTML = html;
		}
	}
}