function Find()
{
	var self = this;

	// properties
	this.XmlReqFind;
	
	// methods
	this.findLayer = findLayer;
	this.parcelSearch = parcelSearch;
	this.structureSearch = structureSearch;
	this.processFeatureSearch = processFeatureSearch;
	this.getFields = getFields;
	this.processGetFields = processGetFields;
	
	function findLayer()
	{
		// go into "tblFindFeature" to get each field namd and value.
		// build string to send to web service
		var table = document.getElementById("tblFindFeature");
		var findStr = "";
		
		for( var i = 0; i < table.rows.length; i++ )
		{
			var rowName = table.rows[i];
			var rowValue = document.getElementById("findLayer" + i);
			
			// remove ":" from rowName
			rowName = rowName.innerText.substr(0, rowName.innerText.lastIndexOf(':'));
			
			if( rowName != '' && rowValue.value != '' )
				findStr += rowName + "," + rowValue.value + "|";
		}
		
		findStr = findStr.substr(0, findStr.lastIndexOf('|'));
		
		var layerId = document.getElementById("selectSearchLayer").value;
		url = server + "FindService.asmx/FindLayer?layerId=" + layerId + "&values=" + findStr;
		
		if(window.ActiveXObject)
		{
			self.XmlReqFind = new ActiveXObject("Microsoft.XMLHTTP");
			
			if(self.XmlReqFind)
			{
				self.XmlReqFind.onreadystatechange = processFeatureSearch;
				self.XmlReqFind.open("GET", url, true); //async call
				self.XmlReqFind.send();
			}
		}
	}
	
	function parcelSearch()
	{
		showLoading();
		
		// take values from html form and send request to IMS for parcels
		var parcelSearchTaxNumber1 = document.getElementById("parcelSearchTaxNumber1").value;
		var parcelSearchTaxNumber2 = document.getElementById("parcelSearchTaxNumber2").value;
		var parcelSearchTaxNumber3 = document.getElementById("parcelSearchTaxNumber3").value;
		var parcelSearchTaxNumber4 = document.getElementById("parcelSearchTaxNumber4").value;
		var parcelSearchTaxNumber5 = document.getElementById("parcelSearchTaxNumber5").value;
		var parcelSearchTaxNumber6 = document.getElementById("parcelSearchTaxNumber6").value;
		var parcelSearchRecordNumber = document.getElementById("parcelSearchRecordNumber").value;
		var parcelSearchFirstName = document.getElementById("parcelSearchFirstName").value;
		var parcelSearchLastName = document.getElementById("parcelSearchLastName").value;
		var parcelSearchHouseNo = document.getElementById("parcelSearchHouseNo").value;
		var parcelSearchStreet = document.getElementById("parcelSearchStreet").value;
		
		url = server + "FindService.asmx/ParcelSearch?taxNumber1=" + parcelSearchTaxNumber1 + "&taxNumber2=" + parcelSearchTaxNumber2 + 
			"&taxNumber3=" + parcelSearchTaxNumber3 + "&taxNumber4=" + parcelSearchTaxNumber4 + "&taxNumber5=" + parcelSearchTaxNumber5 +
			"&taxNumber6=" + parcelSearchTaxNumber6 +"&recordNumber=" + parcelSearchRecordNumber + 
			"&firstName=" + parcelSearchFirstName + "&lastName=" + parcelSearchLastName + "&houseNo=" + parcelSearchHouseNo + "&street=" + parcelSearchStreet;

		if(window.ActiveXObject)
		{
			self.XmlReqFind = new ActiveXObject("Microsoft.XMLHTTP");
			
			if(self.XmlReqFind)
			{
				self.XmlReqFind.onreadystatechange = processFeatureSearch;
				self.XmlReqFind.open("GET", url, true); //async call
				self.XmlReqFind.send();
			}
		}
	}
	
	function structureSearch()
	{
		showLoading();
		
		// take values from html form and send request to IMS for parcels
		var structureSearchHouseNo = document.getElementById("structureSearchHouseNo").value;
		var structureSearchStreet = document.getElementById("structureSearchStreet").value;
		
		url = server + "FindService.asmx/StructureSearch?houseNo=" + structureSearchHouseNo + "&street=" + structureSearchStreet;
		
		if(window.ActiveXObject)
		{
			self.XmlReqFind = new ActiveXObject("Microsoft.XMLHTTP");
			
			if(self.XmlReqFind)
			{
				self.XmlReqFind.onreadystatechange = processFeatureSearch;
				self.XmlReqFind.open("GET", url, true); //async call
				self.XmlReqFind.send();
			}
		}
	}
	
	function processFeatureSearch()
	{
		if( self.XmlReqFind.readyState == 4 )
		{
			if( self.XmlReqFind.status == 200 )
			{
				// parse response and place data into html table
				var resultTable = document.getElementById("divResultsList");
				resultTable.innerHTML = "";
				
				var response = self.XmlReqFind.responseXML.documentElement;
				var features = response.getElementsByTagName('FEATURES');
				var featureID = "";
				var html = "";
				
				// get request specific top level values (layer, layerHyperlink, response feature count, hasMore features)
				var layer = features[0].attributes.getNamedItem('layer').value;
				var layerHyperlink = features[0].attributes.getNamedItem('hyperlink').value;
				var count = features[0].attributes.getNamedItem('count').value;
				var hasMore = features[0].attributes.getNamedItem('hasmore').value;
				
				if( count == 0 )
					spnResultsInfo.innerHTML = "No Features Found";
				else if( count == 1 )
					spnResultsInfo.innerHTML = "1 Feature Found";
				else
					spnResultsInfo.innerHTML = count + " Features Found";
				
				// looks at FEATURES elements
				for( var i = 0; i < features.length; i++ )
				{
					// looks at FEATURE elements
					for( var x = 0; x < features[i].childNodes.length; x++ )
					{
						var fieldCount = 0;
							
						// get feature specific top level values (uniqueName, uniqueValue, primaryDisplay)
						var uniqueName = features[i].childNodes[x].attributes.getNamedItem('uniquename').value;
						var uniqueValue = features[i].childNodes[x].attributes.getNamedItem('uniquevalue').value;
						var pdisplay = features[i].childNodes[x].attributes.getNamedItem('pdisplay').value;
						
						// for parcels, need to add 1 to this value
						var totalFieldsInFeature = features[i].childNodes[x].attributes.getNamedItem('fields').value;
					
						// get envelope information
						var minx = features[i].childNodes[x].childNodes[0].attributes.getNamedItem('minx').value;
						var miny = features[i].childNodes[x].childNodes[0].attributes.getNamedItem('miny').value;
						var maxx = features[i].childNodes[x].childNodes[0].attributes.getNamedItem('maxx').value;
						var maxy = features[i].childNodes[x].childNodes[0].attributes.getNamedItem('maxy').value;
						
						// setup primary display field in HTML
						featureID = "feature" + x;
						className = "fieldPrimary";
						
						html = "<table width=\"100%\" cellspacing=\"0\" cellpadding=\"2\" style=\"margin-top:5px;\">";
						html += "<tr id=\"" + featureID + "\" class=\"" + className + "\">";
						html += "<td><img class=\"collapseImage\" src=\"images/plus.gif\" onmousedown=\"collapseFeatureData('" + featureID + "'," + totalFieldsInFeature + ");\" />";
						
						if( pdisplay != '' )
							html += layer + ": " + pdisplay + "</td>";
						else
							html += layer + ": " + uniqueValue + "</td>";
						
						if( layer == 'Parcels' )
						{
							html += "<td align=\"right\"><img src=\"images/adjoiners.gif\" onmousedown=\"var sFilter = new SpatialFilter(); sFilter.getAdjoiningParcels('" + uniqueValue + "');\" alt=\"Get Adjoining Parcels\" />";
							html += "<img src=\"images/feature_zoom_to.gif\" onmousedown=\"map.zoomToFeature('" + minx + "', '" + miny + "', '" + maxx + "', '" + maxy + "');\" alt=\"Zoom to Feature\" />";
							html += "<img src=\"images/feature_report.gif\" alt=\"Feature Details\" onmousedown=\"var featD = new Feature(); featD.getFeatureDetails('" + layer + "','" + uniqueValue + "');\"/></td>";
						}
						else
						{
							html += "<td align=\"right\"><img src=\"images/feature_zoom_to.gif\" onmousedown=\"map.zoomToFeature('" + minx + "', '" + miny + "', '" + maxx + "', '" + maxy + "');\" alt=\"Zoom to Feature\" />";
							html += "<img src=\"images/feature_report.gif\" alt=\"Feature Details\" onmousedown=\"var featD = new Feature(); featD.getFeatureDetails('" + layer + "','" + uniqueValue + "');\"/></td>";
						}
						
						html += "</tr>";
						
						// looks at FIELDGROUP elements
						// ** start at y = 1 because 0 index would be the ENVELOPE tag already discovered above
						for( var y = 1; y < features[i].childNodes[x].childNodes.length; y++ )
						{
							var fieldGroupName = features[i].childNodes[x].childNodes[y].attributes.getNamedItem('name').value;
							var fieldGroupHyperlink = features[i].childNodes[x].childNodes[y].attributes.getNamedItem('hyperlink').value;
							
							// looks at FIELD elements
							for( var z = 0; z < features[i].childNodes[x].childNodes[y].childNodes.length; z++ )
							{
								var fieldName = features[i].childNodes[x].childNodes[y].childNodes[z].attributes.getNamedItem('name').value;
								var fieldAlias = features[i].childNodes[x].childNodes[y].childNodes[z].attributes.getNamedItem('alias').value;
								var fieldNameHyperlink = features[i].childNodes[x].childNodes[y].childNodes[z].attributes.getNamedItem('namehyperlink').value;
								var fieldValue = features[i].childNodes[x].childNodes[y].childNodes[z].attributes.getNamedItem('value').value;
								var fieldValueHyperlink = features[i].childNodes[x].childNodes[y].childNodes[z].attributes.getNamedItem('valuehyperlink').value;
								
								// add each field to the HTML
								className = (fieldCount % 2 == 1)?"Odd":"Even";
								featureID = "feature" + x + "field" + fieldCount;
								html += "<tr id=\"" + featureID + "\" style=\"display:none;\">";
								
								// add field name (alias)
								if( fieldNameHyperlink != "" )
								{
									html += "<td class=\"field" + className + "\">";
									html += "<a class=\"fieldLink\" href=\"" + fieldNameHyperlink + "\" target=\"_new\">";
									html += fieldAlias + "</a></td>";
								}
								else
									html += "<td class=\"field" + className + "\">" + fieldAlias + "</td>";
								
								// add field value
								if( fieldValue != null )
								{
									// check for hyperlink!
									if( fieldValueHyperlink != "" )
									{
										html += "<td class=\"fieldValue" + className + "\">";
										html += "<a class=\"fieldLink\" href=\"" + fieldValueHyperlink + "\" target=\"_new\">";
										html += fieldValue + "</a></td>";
									}
									else
										html += "<td class=\"fieldValue" + className + "\">" + fieldValue + "</a></td>";
								}
								else
									html += "<td></td></tr>";
								
								fieldCount++;
							}
						}
						
						html += "</table>";
						resultTable.innerHTML += html;
					}
				}
				
				activateTab("tabResults");
				trResultsInfo.style.display='block';
				trDetailsInfo.style.display='none';
				divResultsList.style.display='block';
				divDetailsList.style.display='none';
				subTabResultsList.className='subTabActive';
				subTabDetailsList.className='subTabNormal';
				
				// disable loading div
				loading.style.visibility = "hidden";
				
				if( hasMore == 'True' )
					alert("This search returned more than the number of features allowed.  Please refine your search for more detailed results.");
			}
		}
	}
	
	function getFields(layer)
	{
		// get the fields for a layer
		url = server + "FieldService.asmx/GetFields?layerId=" + layer;
		
		if( window.ActiveXObject )
		{
			self.XmlReqSearchFields = new ActiveXObject("Microsoft.XMLHTTP");
			
			if( self.XmlReqSearchFields )
			{
				self.XmlReqSearchFields.onreadystatechange = processGetFields;
				self.XmlReqSearchFields.open("GET", url, true); //async call
				self.XmlReqSearchFields.send();
			}
		}
	}
	
	function processGetFields()
	{
		if( self.XmlReqSearchFields.readyState == 4 )
		{
			if( self.XmlReqSearchFields.status == 200 )
			{
				var response = self.XmlReqSearchFields.responseXML.documentElement;
				var html = "<form name=\"frmLayerLabels\"><table 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=\"fieldValueOdd\" align=\"left\"><input id=\"layerLabels" + i + "\" class=\"inputText\" type=\"radio\" name=\"group1\" value=\"" + name + "\">" + name + "</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';\" onclick=\"var layer = new Layer(); layer.updateLabel(true);\">";
				html += "</td><td align=\"center\">";
				html += "<input type=\"button\" class=\"buttonNormal\" value=\"Go\" onmouseover=\"this.className='buttonActive';\" onmouseout=\"this.className='buttonNormal';\" onclick=\"var layer = new Layer(); layer.updateLabel(false);\">";
				html += "</td></tr>";
				html += "</table></form>";
				divLayerLabels.innerHTML = html;
			}
		}
	}
}