function Feature()
{
	var self = this;
	
	this.XmlReqDetails; // XMLHttpRequest object
	this.XmlReqIdentify; // XMLHttpRequest object
	
	// methods
	this.getIdentify = getIdentify;
	this.getFeatureDetails = getFeatureDetails;
	this.checkForZoomToFeature = checkForZoomToFeature;
	
	function getIdentify(x, y, dist)
	{
		var layerId;
		var spatialFilter;
		
		for( var i = 0; i < layerArray.length; i++ )
		{
			if( layerArray[i].LayerPosition == map.ActiveLayer )
			{
				layerId = layerArray[i].Name;
				break;
			}	
		}
		
		spatialFilter = new SpatialFilter();
		spatialFilter.Points = "";
		spatialFilter.Points += convertMapPoints(x, y);
		
		buffer = new Buffer();
		buffer.BufferUnits = map.Units;
		buffer.BufferDistance = dist;
		spatialFilter.Buffer = buffer;
		
		var str = spatialFilter.Points.split(",");
		var x = str[0];
		var y = str[1];
		
		url = server + "FeatureService.asmx/GetFeatureIdentify?x=" + x + "&y=" + y + "&distance=" + buffer.BufferDistance + "&layerId=" + layerId + "&userGroupName=" + user.userGroupName;
		self.XmlReqIdentify = new TXmlHttp();
		
		if(self.XmlReqIdentify)
		{
			self.XmlReqIdentify.onreadystatechange = processIdentify;
			self.XmlReqIdentify.open("GET", url, true); //async call
			self.XmlReqIdentify.send(null);
		}
	}

	function getFeatureDetails(layerId, objectIdValue)
	{
		url = server + "FeatureService.asmx/GetFeatureDetails?layerId=" + layerId + "&objectIdValue=" + objectIdValue + "&userGroupName=" + user.userGroupName;
		
		feature.XmlReqDetails = new TXmlHttp();
		
		if(feature.XmlReqDetails)
		{
			feature.XmlReqDetails.onreadystatechange = processFeatureDetail;
			feature.XmlReqDetails.open("GET", url, true); //async call
			feature.XmlReqDetails.send(null);
		}
	}
	
	function checkForZoomToFeature()
	{
		// need to check for zoomToParcel url param
		// if it exists, pull the gpin value and zoom to that parcel
		// if it doesn't, continue with loading the first map
		
		// ie: default.aspx?layer=Parcels&field=GPIN&value=2567-30-6782
		
		var layer = getURLParameters("layer");
		var field = getURLParameters("field");
		var value = getURLParameters("value");
		
		if( layer != null )
		{
			// need to filter the vars for spaces from the url (%20)
			layer = layer.replace("%20", " ");
			field = field.replace("%20", " ");
			value = value.replace("%20", " ");
		
			showLoading();
			url = server + "FeatureService.asmx/GetZoomToFeatureWithGeom?layerId=" + layer + "&fieldName=" + field + "&fieldValue=" + value + "&userGroupName=" + user.userGroupName;
			
			var XmlReqZoomToFeature = new TXmlHttp();
			
			if( XmlReqZoomToFeature )
			{
				XmlReqZoomToFeature.open("GET", url, false); //sync call
				XmlReqZoomToFeature.send(null);
				var res = XmlReqZoomToFeature.responseXML.documentElement;
				
				var envelopeItems = res.getElementsByTagName('ENVELOPE');
				
				if( envelopeItems.length > 0 )
				{
					map.setMinX(envelopeItems[0].attributes.getNamedItem('minx').value);
					map.setMinY(envelopeItems[0].attributes.getNamedItem('miny').value);
					map.setMaxX(envelopeItems[0].attributes.getNamedItem('maxx').value);
					map.setMaxY(envelopeItems[0].attributes.getNamedItem('maxy').value);
				}
				
				// with points, we can just call "function spatialSelect(command, points)" 
				// to make the map highlight the feature and get the new map
				var finalPoints = new Array();
				
				var points = res.getElementsByTagName('POINTS');
				var pointsStr = points[0].attributes.getNamedItem('coords').value;
				
				var pointsArray = pointsStr.split(';');
				var cnt = 0;
				
				for( var i = 0; i < pointsArray.length; i++ )
				{
					var temp = pointsArray[i].split(' ');
					finalPoints[cnt++] = temp[0];
					finalPoints[cnt++] = temp[1];
				}
				
				// set Parcels as active layer
				for( var y = 0; y < layerArray.length; y++ )
				{
					if( layerArray[y].Name == layer )
					{
						setActiveLayerNoClick(layerArray[y].LayerPosition);
						break;
					}	
				}
				
				spatialSelect("SELECTPOLY", finalPoints, true);
			}
		}
	}
}