var mapContainer, divStatus, search, map, searchOpts, searchModeField, searchOptsBtn, 
	propTypeField, minpriceField, maxpriceField, bedsField, bathsField,
	minSqFtField, maxSqFtField, windowTarget, feedbackPolygon;
var bounds, listings, schools, poi, coords, listingMarkers = new Array(), schoolMarkers = new Array(), poiMarkers = new Array();
var li_mapDrawArea_drag, li_mapDrawArea_dragStart, li_mapDrawArea_dragEnd, li_marker_mousemove, areaPolygon, requests = new Array(),
	cursorCoords, dragStart, dragEnd, dragging, drawMarker, radiusPoint, radiusLine, propertyIcon, emptyIcon, poiIcons;

// Conversion factor: meters to miles
var meToMi = 0.000621371192;
// Conversion factor: degrees to radians
var dToR = Math.PI / 180;
// Conversion factor: radians to degrees
var rToD = 180 / Math.PI;
// mean radius of the Earth, as miles
var R = 6378137 * meToMi;

// Is Debug mode (writes out GLog messages)	
function D() {
	var d = Q("debug");
	if (d && d.toLowerCase().substring(0,1) == "t")
		return true;
	return false;
}

// Get a Query String parameter value matching key
function Q(key) {
	var q = window.location.search;
	if (q && q.length > 1) q = q.substring(1, q.length);
	if (q) 
		for(var i=0; i<q.split("&").length; i++) 
			if (q.split("&")[i].split("=")[0].toLowerCase() == key.toLowerCase())
				return q.split("&")[i].split("=")[1];
	return null;
}

function E(id) {
	return document.getElementById(id);
}

function fillWindow() {
	setVars();
	if(window.innerWidth) {
		mapContainer.style.width = window.innerWidth.toString()+"px";
		mapContainer.style.height = window.innerHeight.toString()+"px";
		divStatus.style.top = ((window.innerHeight/2) - 30).toString()+"px";
		divStatus.style.left = ((window.innerWidth/2) - 100).toString()+"px";
	} else {
		mapContainer.style.width = document.documentElement.clientWidth.toString()+"px";
		mapContainer.style.height = document.documentElement.clientHeight.toString()+"px";
		divStatus.style.top = ((document.documentElement.clientHeight/2) - 30).toString()+"px";
		divStatus.style.left = ((document.documentElement.clientWidth/2) - 100).toString()+"px";
	}
}

function openFullScreen() {
	var winWidth = screen.availWidth, winHeight = screen.availHeight;
	window.name='mainSiteWindow';
	window.open('/maps/search_fs.asp','mapSearchWindow','left=0,top=0,width='+winWidth.toString()+',height='+winHeight.toString()+',scrollbars=no,menubar=no,status=no,toolbar=no,location=no');
}

function getBounds() {
	bounds = map.getBounds();
}

var _searchMode = "Map";
function searchMode() {
	// Check the modes that require a polygon and makes sure that polygon is defined
	switch(_searchMode) {
		case "Area" :
			if (!areaPolygon || (areaPolygon && radiusPoint && radiusLine)) searchMode_set("Map");
			break;
		case "Radius" :
			if (!radiusPoint && !radiusLine) searchMode_set("Map");
			break;
	}
	return _searchMode;
}

function searchMode_set(value) {
	_searchMode = value;
}

function clearPolygons() {
	map.closeInfoWindow();
	map.closeExtInfoWindow();
	if (areaPolygon) map.removeOverlay(areaPolygon);
	if (radiusLine) map.removeOverlay(radiusLine);
	if (radiusPoint) map.removeOverlay(radiusPoint);
	areaPolygon = null;
	radiusLine = null;
	radiusPoint = null;
}

function clearListeners() {
	if (drawMarker) map.removeOverlay(drawMarker);
	if (li_mapDrawArea_dragStart) GEvent.removeListener(li_mapDrawArea_dragStart);
	if (li_mapDrawArea_drag) GEvent.removeListener(li_mapDrawArea_drag);
	if (li_mapDrawArea_dragEnd) GEvent.removeListener(li_mapDrawArea_dragEnd);
	if (li_marker_mousemove) GEvent.removeListener(li_marker_mousemove);
	drawMarker = null;
	li_mapDrawArea_dragStart = null;
	li_mapDrawArea_drag = null;
	li_mapDrawArea_dragEnd = null;
	li_marker_mousemove = null;
}

function setDrawMarker() {
	map.disableDragging();
	drawMarker = new GMarker(cursorCoords, {draggable:true, bouncy:false, icon:emptyIcon});
	map.addOverlay(drawMarker);
	drawMarker.enableDragging();
	li_marker_mousemove = GEvent.addListener(map, "mousemove", function(latlng){drawMarker.setLatLng(latlng);});
	for (var i=0, j=map.getPane(G_MAP_MARKER_PANE).getElementsByTagName("img"); i<j.length; i++)
		if (j[i].src.indexOf(drawMarker.getIcon().image) >= 0) j[i].className = "drawIcon";
}

function setControlNav() {
	map.enableDragging();
	mapContainer.className = "nav";
	clearListeners();
}

function setControlDrawArea() {
	clearListeners();
	mapContainer.className = "drawArea";
	setDrawMarker();
	li_mapDrawArea_dragStart = GEvent.addListener(drawMarker, "dragstart", mapDrawArea_dragStart);
	li_mapDrawArea_dragEnd = GEvent.addListener(drawMarker, "dragend", mapDrawArea_dragEnd);
	li_mapDrawArea_drag = GEvent.addListener(drawMarker, "drag", mapDrawArea_drag);
}

function setControlDrawRadius() {
	clearListeners();
	mapContainer.className = "drawRadius";
	setDrawMarker();
	li_mapDrawArea_dragStart = GEvent.addListener(drawMarker, "dragstart", mapDrawRadius_dragStart);
	li_mapDrawArea_dragEnd = GEvent.addListener(drawMarker, "dragend", mapDrawRadius_dragEnd);
	li_mapDrawArea_drag = GEvent.addListener(drawMarker, "drag", mapDrawRadius_drag);
}

function mapDrawArea_dragStart() {
	if (D()) GLog.write("Dragging started at " + cursorCoords.toString());
	dragStart = cursorCoords;
	feedbackPolygon.className = "on area";
}

function mapDrawArea_dragEnd() {
	if (D()) GLog.write("Dragging ended at " + cursorCoords.toString());
	dragEnd = cursorCoords;
	drawArea(dragStart,dragEnd);
}

function mapDrawArea_drag() {
	if (D()) GLog.write("Dragging at " + cursorCoords.toString());
	feedbackArea(dragStart,cursorCoords);
}

function mapDrawRadius_dragStart() {
	if (D()) GLog.write("Dragging started at " + cursorCoords.toString());
	dragStart = cursorCoords;
	var radiusIcon = new GIcon();
	radiusIcon.image = "images/redDotIcon.png";
	radiusIcon.iconSize = new GSize(12,12);
	radiusIcon.iconAnchor = new GPoint(6,6);
	radiusIcon.infoWindowAnchor = new GPoint(0,6);
	clearPolygons();
	radiusPoint = new GMarker(dragStart,{icon:radiusIcon});
	map.addOverlay(radiusPoint);
	radiusPoint.openExtInfoWindow(map, "radiusInfoWindow", "Radius from " + dragStart.y.toFixed(5).toString() + ", " + dragStart.x.toFixed(5).toString(),{beakOffset:-20});
}

function mapDrawRadius_dragEnd() {
	if (D()) GLog.write("Dragging ended at " + cursorCoords.toString());
	dragEnd = cursorCoords;
	drawRadius(dragStart,dragEnd);
}

function mapDrawRadius_drag() {
	if (D()) GLog.write("Current radius is " + calculateDistance(dragStart,cursorCoords).toString() + " miles.");
	feedbackRadius(dragStart,cursorCoords);
}

function feedbackArea(start,end) {
	var pStart = map.fromLatLngToContainerPixel(start), pEnd = map.fromLatLngToContainerPixel(end);
	feedbackPolygon.style.top = ((pStart.y < pEnd.y) ? pStart.y.toString() : pEnd.y.toString()) + "px";
	feedbackPolygon.style.left = ((pStart.x < pEnd.x) ? pStart.x.toString() : pEnd.x.toString()) + "px";
	feedbackPolygon.style.width = ((pEnd.x > pStart.x) ? (pEnd.x - pStart.x).toString() : (pStart.x - pEnd.x).toString()) + "px";
	feedbackPolygon.style.height = ((pEnd.y > pStart.y) ? (pEnd.y - pStart.y).toString() : (pStart.y - pEnd.y).toString()) + "px";
}

function drawArea(start,end) {
	clearPolygons();
	var opStart = new GLatLng(start.lat(),end.lng()), opEnd = new GLatLng(end.lat(),start.lng());
	areaPolygon = new GPolygon(new Array(start, opStart, end, opEnd, start),"#FF0000",3,1,"#FFFFFF",0.4);
	map.addOverlay(areaPolygon);
	feedbackPolygon.className = "off";
	map.setCenter(areaPolygon.getBounds().getCenter(), map.getBoundsZoomLevel(areaPolygon.getBounds()));
	if (D()) GLog.write(areaPolygon.getBounds());
}

function drawRadius(start,end) {
	var distance = calculateDistance(start,end);
	var circlePoints = new Array();
	for (var i=0; i<72; i++)
		circlePoints.push(calcPointOnCircle(start,i*360/72,distance));
	circlePoints.push(calcPointOnCircle(start,0,distance));
	areaPolygon = new GPolygon(circlePoints,"#FF0000",3,1,"#FFFFFF",0.4);
	map.addOverlay(areaPolygon);
	radiusLine = new GPolyline(new Array(start,end),"#FF0000",3,1);
	map.addOverlay(radiusLine);
	map.setCenter(start, map.getBoundsZoomLevel(areaPolygon.getBounds()));
	if (D()) GLog.write("Will search for properties within " + distance.toString() + " miles of " + start.toString() + ".");
}

function feedbackRadius(start,end) {
	var pStart, pEnd, distance;
	distance = calculateDistance(start,end);
	document.getElementById("radiusInfoWindow_contents").innerHTML = distance.toFixed(2).toString() + " mile radius from " + start.y.toFixed(5).toString() + ", " + start.x.toFixed(5).toString();
}

function calculateDistance(start,end) {
	return end.distanceFrom(start) * meToMi;
}

function calcPointOnCircle(center, point, radius) {
	// center coordinates as radians
	var cX = center.x * dToR, cY = center.y * dToR;
	// point on circle as radians
	var p = point * dToR;
	// angular distance on the earth's surface
	var r = radius/R;
	var y = Math.asin(Math.sin(cY)*Math.cos(r)+Math.cos(cY)*Math.sin(r)*Math.cos(p));
	var x = cX+Math.atan2(Math.sin(p)*Math.sin(r)*Math.cos(cY),Math.cos(r)-Math.sin(cY)*Math.sin(y));
	// Convert back to degrees
	y = y * rToD;
	x = x * rToD;
	return new GLatLng(y,x);
}

function setVars() {
	if(!windowTarget)
		windowTarget = "_blank";
	if(!mapContainer)
		mapContainer = document.getElementById("map");
	if(!divStatus)
		divStatus = document.getElementById("status");
	if (!search)
		search = document.getElementById("search");
	if (!searchOpts)
		searchOpts = document.getElementById("searchOpts");
	if (!searchOptsBtn)
		searchOptsBtn = document.getElementById("searchOptsBtn");
	if (!searchModeField)
		searchModeField = document.getElementById("searchModeField");
	if (!propTypeField)
		propTypeField = document.getElementById("propTypeField");
	if (!minpriceField)
		minpriceField = document.getElementById("minpriceField");
	if (!maxpriceField)
		maxpriceField = document.getElementById("maxpriceField");
	if (!bedsField)
		bedsField = document.getElementById("bedsField");
	if (!bathsField)
		bathsField = document.getElementById("bathsField");
	if (!minSqFtField)
		minSqFtField = document.getElementById("minSqFtField");
	if (!maxSqFtField)
		maxSqFtField = document.getElementById("maxSqFtField");
	if (!feedbackPolygon)
		feedbackPolygon = document.getElementById("polygon");
	if (!emptyIcon) {
		emptyIcon = new GIcon();
		emptyIcon.image = "images/emptyIcon.png";
		emptyIcon.iconSize = new GSize(32,32);
		emptyIcon.iconAnchor = new GPoint(16,16);
		emptyIcon.dragCrossImage = "images/emptyIcon.png";
		emptyIcon.dragCrossSize = new GSize(32,32);
		emptyIcon.dragCrossAnchor = new GPoint(16,16);
	}
	if (!propertyIcon) {
		propertyIcon = new GIcon();
		propertyIcon.image = "images/googleSignIcon.png";
		propertyIcon.iconSize = new GSize(32,32);
		propertyIcon.iconAnchor = new GPoint(7,25);
		propertyIcon.infoWindowAnchor = new GPoint(24,13);
	}
	if (!poiIcons) {
		poiIcons = new Object();
		var layerOpts = E("layerControlForm").elements;
		for (var i=0; i<layerOpts.length; i++) {
			var cat = layerOpts[i].value;
			if (cat != "property") {
				var poiIcon = new GIcon();
				poiIcon.image = "images/icons/"+cat+".png";
				poiIcon.iconSize = new GSize(32,32);
				poiIcon.iconAnchor = new GPoint(16,16);
				poiIcon.infoWindowAnchor = new GPoint(16,16);
				poiIcons[cat] = poiIcon;
			}
		}
	}
}

function makeMap() {
	setVars();
	map = new GMap2(mapContainer);
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GOverviewMapControl());
	map.addControl(new GScaleControl());
	map.addMapType(G_PHYSICAL_MAP);
	map.setCenter(new GLatLng(40.2821, -76.6474), 14);
	map.setMapType(G_PHYSICAL_MAP);
	GEvent.addListener(map, "mousemove", map_mousemove);
	window.onunload = GUnload;
}

function map_mousemove(latlng) {
	cursorCoords = latlng;
}

function getData(url, onResult) {
	var request = GXmlHttp.create();
	request.open('GET', url, true);
	request.onreadystatechange = function() { onResult.call(request); };
	request.send(null);  
	requests.push(request);
}

function setStatus(flag) {
	// Make sure we're not still doing requests
	if (!flag) 
		for (var i=0; i<requests.length; i++)
			if (requests[i].readyState < 4)
				return;
	divStatus.className = (flag) ? "on" : "off";
	// If we've finished all requests, clear the request list
	requests = new Array();
}

function setOverlays() {
	if (areaPolygon) {
		if (searchMode() == "Radius" && radiusPoint) {
			map.addOverlay(areaPolygon);
			map.addOverlay(radiusPoint);
		}
		else if (searchMode() == "Area")
			map.addOverlay(areaPolygon);
		areaPolygon.setStrokeStyle({color:"#FF0000",weight:1,opacity:0.5});
		areaPolygon.setFillStyle({color:"#FFFFFF",opacity:0.3});
	}
	setControlNav();
}

function searchButton_press() {
	getBounds();
	setStatus(true);
	toolboxButton_onmouseup(E('navigateToolField'));
	SearchControl.toggleDisplay(searchOptsBtn);
	var layerOpts = E("layerControlForm").elements;
	var categoryIds = new Array();
	for (var i=0; i<layerOpts.length; i++) {
		if (layerOpts[i].value == "property") {
			if (layerOpts[i].checked) {
				getData("http://www.brwnstone.com/maps/data/Search.ashx?"+getQueryParameters(), plotListings);
			} else clearOverlaysOfType(listingMarkers);
		} else if (layerOpts[i].checked) {
			categoryIds.push(layerOpts[i].value);
		}
	}
	if (categoryIds.length > 0)
		getData("http://www.brwnstone.com/maps/data/Places.ashx?"+getQueryParameters()+"&CategoryIds="+categoryIds.join(","), plotPoi);
	else clearOverlaysOfType(poiMarkers);
}

function clearOverlaysOfType(overlays) {
	for (var i=0; i<overlays.length; i++) {
		map.removeOverlay(overlays[i]);
		overlays.splice(i,1);
	}
}

function plotPoi() {
	clearOverlaysOfType(poiMarkers);
	if (this.readyState == 4) {
		setStatus(false);
		var resp = this.responseXML;
		poi = resp.documentElement.getElementsByTagName("Place");
		if (poi.length > 0) {
			for (var i=0; i<poi.length; i++) {
				var latitude = GXml.value(poi[i].getElementsByTagName("Latitude")[0]);
				var longitude = GXml.value(poi[i].getElementsByTagName("Longitude")[0]);
				var placeId = GXml.value(poi[i].getElementsByTagName("PlaceId")[0]);
				var categoryId = GXml.value(poi[i].getElementsByTagName("ParentCategoryId")[0]);
				if (categoryId == "")
					categoryId = GXml.value(poi[i].getElementsByTagName("CategoryId")[0]);
				var point = new GLatLng(latitude,longitude);
				var marker = new GMarker(point,{icon:poiIcons[categoryId],title:GXml.value(poi[i].getElementsByTagName("PlaceName")[0])});
				marker.id = placeId;
				//GEvent.addListener(marker,"click", getPoiInfo);
				map.addOverlay(marker);
				poiMarkers.push(marker);
			}
		}
	}
}

function plotListings() {
	clearOverlaysOfType(listingMarkers);
	if (this.readyState == 4) {
		setStatus(false);
//		setOverlays();
		var resp = this.responseXML;
		listings = resp.documentElement.getElementsByTagName("Listing");
		var boundary = resp.documentElement.getElementsByTagName("Coordinates")[0];
		if (listings.length > 0) {
			if(boundary != undefined) {
				bounds = new GLatLngBounds(
					new GLatLng(
						GXml.value(boundary.getElementsByTagName("MinLat")[0]), GXml.value(boundary.getElementsByTagName("MinLon")[0])),
					new GLatLng(
						GXml.value(boundary.getElementsByTagName("MaxLat")[0]), GXml.value(boundary.getElementsByTagName("MaxLon")[0])))
				map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
			}
			for (var i=0; i<listings.length; i++) {
				var latitude = GXml.value(listings[i].getElementsByTagName("Latitude")[0]);
				var longitude = GXml.value(listings[i].getElementsByTagName("Longitude")[0]);
				var listingId = GXml.value(listings[i].getElementsByTagName("ListingID")[0]);
				var IsInHouse = (GXml.value(listings[i].getElementsByTagName("IsInHouse")[0]).toUpperCase() == "TRUE");
				var point = new GLatLng(latitude,longitude);
				var marker = new GMarker(point,{icon:propertyIcon});
				marker.id = listingId;
				GEvent.addListener(marker,"mouseover", getListingInfo);
				GEvent.addListener(marker,"mouseout", map.closeInfoWindow());
				map.addOverlay(marker);
				listingMarkers.push(marker);
			}
		} else {
			// TODO: Make an integrated alert info window.
			alert("There were no properties matching your criteria in the defined search area. Please adjust the map area or broaden your search criteria and try again.")
		}
	}
}
function getPoiInfo() {
	map.closeInfoWindow();
	var point = null;
	for (var i=0; i<poi.length; i++)
		if(GXml.value(poi[i].getElementsByTagName("PlaceId")[0]) == this.id)
			point = poi[i];
	if (point != null) {
		var placeName = "<p>" + GXml.value(point.getElementsByTagName("PlaceName")[0]) + "</p>";
		this.openInfoWindowHtml(placeName);
	}
}

function getListingInfo() {
	map.closeInfoWindow();
	for(var i=0; i<listings.length; i++) 
		if(GXml.value(listings[i].getElementsByTagName("ListingID")[0]) == this.id) 
			listing = listings[i];
	if(listing != null) {
		var ListPrice = GXml.value(listing.getElementsByTagName("ListPrice")[0]);
		var area = GXml.value(listing.getElementsByTagName("Area")[0]);
		var StreetNumber = GXml.value(listing.getElementsByTagName("StreetNumber")[0]);
		var StreetName = GXml.value(listing.getElementsByTagName("StreetName")[0]);
		var StreetSuffix = GXml.value(listing.getElementsByTagName("StreetSuffix")[0])
		var City = GXml.value(listing.getElementsByTagName("City")[0]);
		var State = GXml.value(listing.getElementsByTagName("State")[0]);
		var ZipCode = GXml.value(listing.getElementsByTagName("ZipCode")[0]);
		var Beds = GXml.value(listing.getElementsByTagName("Beds")[0]);
		var BathsFull = GXml.value(listing.getElementsByTagName("BathsFull")[0]);
		var BathsHalf = GXml.value(listing.getElementsByTagName("BathsHalf")[0]);
		var LivingArea = GXml.value(listing.getElementsByTagName("LivingArea")[0]);
		//var Remarks = GXml.value(listing.getElementsByTagName("Remarks")[0]);
		var IsInHouse = (GXml.value(listing.getElementsByTagName("IsInHouse")[0]).toUpperCase() == "TRUE");
		var ListingService = GXml.value(listing.getElementsByTagName("ListingService")[0]);
		var Latitude = GXml.value(listing.getElementsByTagName("Latitude")[0]);
		var Longitude = GXml.value(listing.getElementsByTagName("Longitude")[0]);
		var PhotoExists = (GXml.value(listing.getElementsByTagName("PhotoExists")[0]).toUpperCase() == "TRUE");
		var PhotoFileName = GXml.value(listing.getElementsByTagName("PhotoFileName")[0]);
		var photoTab = document.getElementById("template:infoTabPhoto");
		//var detailsTab = document.getElementById("template:infoTabDetails");
		var photoTabHeading = document.getElementById("template:address");
		//var detailsTabHeading = document.getElementById("template:detailsAddress");
		var photoTabImage = document.getElementById("template:propertyPhoto");
		var detailsPrice = document.getElementById("template:price");
		//var detailsPropertySpecs = document.getElementById("template:propertySpecs");
		//var detailsRemarks = document.getElementById("template:remarks");
		var detailsLink = document.getElementById("template:detailsLink");
		var addressText = StreetNumber + " " + StreetName + " " + StreetSuffix;
		photoTabHeading.innerHTML = addressText;
		//detailsTabHeading.innerHTML = addressText;
		photoTabImage.src = "http://retsphotos.listingpoint.com/Rets/RetsPhoto.ashx?ContentId=" + 
			this.id + "&org=" + ListingService + "&ObjectId=1&dimension=175&method=l";
		if (ListingService == "Keystone") photoTabImage.src += "&ObjectType=HiRes"	
		photoTabImage.alt = "Photo of listing at " + addressText;
		detailsPrice.innerHTML = getPriceString(ListPrice);
		//detailsRemarks.innerHTML = Remarks;
		detailsLink.href = "/properties/details.asp?ListingId=" + this.id + "&region=" + ListingService;
		detailsLink.target = windowTarget;
		var photoTabHTML = photoTab.innerHTML.replace("template:","instance:"); 
		//var detailsTabHTML = detailsTab.innerHTML.replace("template:","instance:");
		var InfoWindowData = [
			new GInfoWindowTab("Photo",photoTabHTML)
		]
		this.openInfoWindowTabs(InfoWindowData);
		document.getElementById("instance:address").parentNode.className = "infoWindowContent";
		//document.getElementById("instance:detailsAddress").parentNode.className = "infoWindowContent";
	}
	else alert("Couldn't find this listing in the data.");
}

function getQueryParameters() {
	var query = ""; var propTypes = document.getElementById("propTypeField");
	if (searchMode() == "Radius")
		query += "radius=" + radiusPoint.getPoint().toUrlValue() + "," + (radiusLine.getLength() * meToMi).toString();
	else if (searchMode() == "Area")
		query += "bounds=" + areaPolygon.getBounds().getNorthEast().toUrlValue() + "," + areaPolygon.getBounds().getSouthWest().toUrlValue();
	else query += "bounds=" + bounds.getNorthEast().toUrlValue() + "," + bounds.getSouthWest().toUrlValue();
	query += "&propType=";
	for (var i=0; i<propTypes.length; i++)
		if (propTypes.options[i].selected)
			query += propTypes.options[i].value + ",";
	if (query.lastIndexOf(",") == query.length-1)
		query = query.substring(0,query.lastIndexOf(","));
	query += "&priceMin=" + document.getElementById("minpriceField").options[document.getElementById("minpriceField").selectedIndex].value;
	query += "&priceMax=" + document.getElementById("maxpriceField").options[document.getElementById("maxpriceField").selectedIndex].value;
	query += "&bedsMin=" + document.getElementById("bedsField").options[document.getElementById("bedsField").selectedIndex].value;
	query += "&bathsMin=" + document.getElementById("bathsField").options[document.getElementById("bathsField").selectedIndex].value;
	return query;
}

function getPriceString(num) {
	var numString = Number(num).toFixed(0).toString();
	var returnVal = "";
	for (var i=numString.length,j=0; i>0; i--,j++) {
		if (j>0 && j%3==0) returnVal = "," + returnVal;
		returnVal = numString.charAt(i-1) + returnVal;
	}
	returnVal = "$" + returnVal;
	return returnVal;
}

function searchOptsBtnOver() {
	searchOptsBtn.src = searchOptsBtn.src.replace(".gif","_hover.gif");
}

function searchOptsBtnOut() {
	searchOptsBtn.src = searchOptsBtn.src.replace("_hover.gif",".gif");
}

function searchOptsBtnDown() {
	searchOptsBtn.src = searchOptsBtn.src.replace("_hover.gif","_press.gif");
}

function searchOptsBtnUp() {
	searchOptsBtn.src = searchOptsBtn.src.replace("_press.gif","_hover.gif");
}

function toggleSearchOpts() {
	if (search.className == "on") {
		searchOptsBtn.src = searchOptsBtn.src.replace("xIcon","magnifyingGlassIcon");
		searchOptsBtn.title = "Show Search Options";
		search.className = "off";
	} else {
		searchOptsBtn.src = searchOptsBtn.src.replace("magnifyingGlassIcon","xIcon");
		searchOptsBtn.title = "Hide Search Options";
		search.className = "on";
	}
}

function toolboxActiveTool_get() {
	var nav = E("navigateToolField"), 
		area = E("areaToolField"), 
		rad = E("radiusToolField"), 
		del = E("deleteToolField");
	if (area.value == "on") return area;
	if (rad.value == "on") return rad;
	// if we're still here, make sure nav is set and return it
	toolboxActiveTool_set(nav);
	return nav;
}
function toolboxActiveTool_set(tool) {
	var tools = new Array(E("navigateToolField"), E("areaToolField"), E("radiusToolField"), E("deleteToolField"));
	for (var i=0; i<4; i++) {
		tools[i].value = "off";
		SearchControl.swapButtonIcon(tools[i], SearchControl.ICONTYPE_ON);
	}
	tool.value = "on";
	SearchControl.swapButtonIcon(tool, SearchControl.ICONTYPE_ACTIVE);
}
function toolboxButton_onmouseover(tool) {
	SearchControl.swapButtonIcon(tool, SearchControl.ICONTYPE_HOVER);
}
function toolboxButton_onmouseout(tool) {
	if (tool.id == toolboxActiveTool_get().id)
		SearchControl.swapButtonIcon(tool, SearchControl.ICONTYPE_ACTIVE);
	else SearchControl.swapButtonIcon(tool, SearchControl.ICONTYPE_ON);
}
function toolboxButton_onmousedown(tool) {
	SearchControl.swapButtonIcon(tool, SearchControl.ICONTYPE_PRESS);
}
function toolboxButton_onmouseup(tool) {
	switch (tool.id) {
		case "deleteToolField" :
			clearPolygons();
			clearListeners();
			searchMode_set("Map");
			setControlNav();
			toolboxActiveTool_set(E("navigateToolField"));
			break;
		case "navigateToolField" :
			clearListeners();
			setControlNav();
			toolboxActiveTool_set(tool);
			break;
		case "areaToolField" :
			searchMode_set("Area");
			setControlDrawArea();
			toolboxActiveTool_set(tool);
			break;
		case "radiusToolField" :
			searchMode_set("Radius");
			setControlDrawRadius();
			toolboxActiveTool_set(tool);
			break;
	}
}

function SearchControl() {}
SearchControl.ICONTYPE_ON = "";
SearchControl.ICONTYPE_HOVER = "_hover";
SearchControl.ICONTYPE_PRESS = "_press";
SearchControl.ICONTYPE_ACTIVE = "_on";
SearchControl.btn_onmouseover = function(button) { SearchControl.swapButtonIcon(button, SearchControl.ICONTYPE_HOVER); }
SearchControl.btn_onmouseout = function(button) { SearchControl.swapButtonIcon(button, SearchControl.ICONTYPE_ON); }
SearchControl.btn_onmousedown = function(button) { SearchControl.swapButtonIcon(button, SearchControl.ICONTYPE_PRESS); }
SearchControl.btn_onmouseup = function(button) { SearchControl.swapButtonIcon(button, SearchControl.ICONTYPE_ON); }
SearchControl.swapButtonIcon = function(button, iconType) {
	var pos = button.src.lastIndexOf("_");
	if (pos < 0) pos = button.src.lastIndexOf(".");
	var repl = button.src.substring(pos), ext = button.src.substring(button.src.lastIndexOf("."));
	button.src = button.src.replace(repl, iconType + ext);
}
SearchControl.toggleDisplay = function(button) {
	if (search.className == "on") {
		button.src = button.src.replace("collapseIcon","expandIcon");
		button.title = "Show Search Options";
		search.className = "off";
	} else {
		button.src = button.src.replace("expandIcon","collapseIcon");
		button.title = "Hide Search Options";
		search.className = "on";
	}
}
SearchControl.togglePanelDisplay = function(button,panel) {
	var panelElement = E(panel);
	if (button.className == "on") {
		button.innerHTML = "+";
		button.className = "off";
		panelElement.className = "off";
	} else {
		button.innerHTML = "-";
		button.className = "on";
		panelElement.className = "on";
	}
}
SearchControl.toggleCriteriaForm = function(button) {
	var frm = E("criteriaForm");
	if (button.className == "on") {
		button.innerHTML = "+";
		button.className = "off";
		frm.className = "off";
	} else {
		button.innerHTML = "-";
		button.className = "on";
		frm.className = "on";
	}
}
SearchControl.toggleLayerForm = function(button) {
	var frm = E("layersForm");
	if (button.className == "on") {
		button.innerHTML = "+";
		button.className = "off";
		frm.className = "off";
	} else {
		button.innerHTML = "-";
		button.className = "on";
		frm.className = "on";
	}
}
SearchControl.displayHelp = function() {
	var winWidth = 600, leftPos = (screen.availWidth / 2) - 300, winHeight = screen.availHeight - 75, topPos = 25;
	window.open('/maps/help.asp','mapHelpWindow','left='+leftPos.toString()+',top='+topPos.toString()+',width='+winWidth.toString()+',height='+winHeight.toString()+',scrollbars=yes,menubar=no,status=no,toolbar=no,location=no');
}
SearchControl.prototype = new GControl();
SearchControl.prototype.initialize = function(map) {
	var container = document.createElement("div");
	// do stuff here
	map.getContainer().appendChild(container);
	return container;
}
SearchControl.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(31,5));
}
SearchControl.prototype.selectable = function() { return false; }
SearchControl.prototype.printable = function() { return false; }
