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 = "/maps/images/googleSignIcon.png";
		propertyIcon.iconSize = new GSize(32,32);
		propertyIcon.iconAnchor = new GPoint(7,25);
		propertyIcon.infoWindowAnchor = new GPoint(17,4);
	}
//	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 GSmallMapControl());
	map.addControl(new GMapTypeControl());
	//map.addControl(new GOverviewMapControl());
	map.addControl(new GScaleControl());
	map.addMapType(G_PHYSICAL_MAP);
	map.setCenter(new GLatLng(43.316223, -76.411993), 13);
	//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("/maps/data/Search.ashx?"+getQueryParameters(), plotListings);
			} else clearOverlaysOfType(listingMarkers);
		} else if (layerOpts[i].checked) {
			categoryIds.push(layerOpts[i].value);
		}
	}
	if (categoryIds.length > 0)
		getData("/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.closeExtInfoWindow());
				map.addOverlay(marker);
				listingMarkers.push(marker);
			}
			// get a random property from the bunch
			//var rndProp = Math.floor(Math.random() * (listingMarkers.length + 1));
			//getListingInfo.call(listingMarkers[rndProp]); // use method.call to pass the random property marker as {this} to the getListingInfo method, emulating what happens
			getListingInfo.call(listingMarkers[0]);
		} 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.closeExtInfoWindow();
	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 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 photoTabHeading = document.getElementById("template:address");
		var photoTabImage = document.getElementById("template:propertyPhoto");
		var detailsPrice = document.getElementById("template:price");
		var detailsLink = document.getElementById("template:detailsLink");
		var addressText = StreetNumber + " " + StreetName + " " + StreetSuffix;
		photoTabHeading.innerHTML = addressText;
		if (PhotoExists)
			photoTabImage.src = "http://retsphotos.listingpoint.com/Rets/RetsPhoto.ashx?ContentId=" + 
				this.id + "&org=" + ListingService + "&ObjectId=1&dimension=150&method=l";
		else photoTabImage.src = "http://photos7.listingpoint.com/photoTools/photo.aspx?fileName=default.jpg&org=default&dimension=150&method=w";
		photoTabImage.alt = "Photo of listing at " + addressText;
		detailsPrice.innerHTML = getPriceString(ListPrice);
		detailsLink.href = "/properties/details.asp?ListingId=" + this.id + "&region=" + ListingService;
		detailsLink.target = windowTarget;
		this.openExtInfoWindow(map,"propertyDetailsInfoWindow",photoTab.innerHTML.replace("template:","instance:"),{beakOffset:1,paddingX:5,paddingY:30});
	}
	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; }