/*	
	Simplistate Maps 
	by Chad Pommiss
*/
var INT_MAP_UPDATE_TIMEOUT				= 500;
var INT_VISIBLE_ZOOM					= 10;
var INT_MIN_ZOOM						= 13;
var INT_SEARCH_ZIPCODE_ZOOM				= 13;
var INT_SEARCH_ADDRESS_ZOOM				= 17;
var INT_SEARCH_TOWN_ZOOM				= 14;
var INT_SEARCH_NEIGHBORHOOD_ZOOM		= 14;
var INT_SEARCH_NEAR_ZOOM				= 13;
var TXT_ERROR_ZOOM						= "Zoomed out too far!  Zoom in further to see results!";
var TXT_ERROR_RESULTS					= "Showing first 100 results.  Add search criteria, or zoom in!";
var TXT_ERROR_NORESULTS					= "Nothing found in this area with your search criteria.";
var INT_RADIUS_MILE						= 0.55;
var INT_SEARCHTYPE_ZIPCODE				= 0;
var INT_SEARCHTYPE_ADDRESS				= 1;
var INT_SEARCHTYPE_TOWN					= 2;
var INT_SEARCHTYPE_NEIGHBORHOOD			= 3;
var INT_SEARCHTYPE_MLS					= 4;

var objManager;
var objDataset;
var objVisited;
var intUpdateTimeout;

var boolUpdateHappening					= false;
var arrMarkers							= new Array();
var arrMLSLookup						= new Array();
var arrLatLng							= new Array(32.793053, -79.941294);			// charleston, sc default latlng
var strCurInput_Lookup					= "";
var strCurInput_Near					= "";
var intCurInput_Type					= -1;
var dblNearLatitude						= 0.0;
var dblNearLongitude					= 0.0;

function initializeMap() {	
	// set up our hash table
	objVisited				= new Hash();
	
	// hurr we go!
	if (GBrowserIsCompatible()) {
		objMap			= new GMap2(document.getElementById("map_object"));

		// in case we are passed a ?town=xxxxxxx querystring
		if (strForceTown != "") {
			var intTownID		= 0;
			
			for (var intCounter = 0; intCounter <= parseInt($("#intTownCount").val()); intCounter++) {
				if ($("#strTownLU_" + intCounter).val() == strForceTown) {
					$("#radTown_" + intCounter).attr("checked", "checked");
					intTownID		= intCounter;
					break;
				}
			}
			
			if (intTownID > 0) {
				objMap.setCenter(new GLatLng(parseFloat($("#strTownLat_" + intTownID).val()), parseFloat($("#strTownLng_" + intTownID).val())), INT_MIN_ZOOM);
			} else {
				objMap.setCenter(new GLatLng(arrLatLng[0], arrLatLng[1]), INT_MIN_ZOOM);
			}
			
			// erase so we don't jump here over and over again
			strForceTown		= "";
		} else if (objSavedSearch.lat != null) {
			$("map_loader").show();
			objMap.setCenter(new GLatLng(parseFloat(objSavedSearch.lat), parseFloat(objSavedSearch.lng)), parseInt(objSavedSearch.zoom));
			
			setTimeout(restoreSearch, 500, objSavedSearch);
		} else {
			objMap.setCenter(new GLatLng(arrLatLng[0], arrLatLng[1]), INT_MIN_ZOOM);
		}
		
		objMap.enableDragging();
		objMap.addControl(new GMapTypeControl());
		objMap.addControl(new GLargeMapControl3D());
		
		// events
		GEvent.addListener(objMap, "dragstart", function() {
			clearTimeout(intUpdateTimeout);
		});
		GEvent.addListener(objMap, "zoomstart", function() {
			clearTimeout(intUpdateTimeout);
		});
		GEvent.addListener(objMap, "dragend", function() {
			if (objMap.getZoom() >= INT_VISIBLE_ZOOM) {
				clearTimeout(intUpdateTimeout);
				intUpdateTimeout		= setTimeout(loadMarkers, INT_MAP_UPDATE_TIMEOUT, false);
			} else {
				clearMarkers();
				
				$("#lyrNumHomes").html("0");
				$("#map_message_text").html(TXT_ERROR_ZOOM);
				$("#map_message_wrapper").show();
			}
		});
		GEvent.addListener(objMap, "zoomend", function() {
			if (objMap.getZoom() >= INT_VISIBLE_ZOOM) {
				clearTimeout(intUpdateTimeout);
				intUpdateTimeout		= setTimeout(loadMarkers, INT_MAP_UPDATE_TIMEOUT, false);
			} else {
				clearMarkers();

				$("#lyrNumHomes").html("0");
				$("#map_message_text").html(TXT_ERROR_ZOOM);
				$("#map_message_wrapper").show();
			}
		});

		// marker manager
		objManager		= new MarkerManager(objMap);

		// handle preset values from a submit from another part of the site or saved search
		if (objSavedSearch.lat == null) {
			populateSearch();
			loadMarkers();
		} else {
			// give it time to set up the search options
			setTimeout(loadMarkers, 1000);
		}
	}
}

function loadMarkers() {
	if (!boolUpdateHappening) {
		var objBounds		= objMap.getBounds();
		var objSW			= objBounds.getSouthWest();
		var objNE			= objBounds.getNorthEast();
		var strBounds		= objSW.lat() + "|" + objSW.lng() + "|" + objNE.lat() + "|" + objNE.lng();
		var intRadius		= 0;

		// search bar on page 1 of search tool
		if (intCurInput_Type != $("#intSearchType").val()) {
			intCurInput_Type	= $("#intSearchType").val();
			strCurInput_Lookup	= $("#strSearchQuery").val();
			
			// clear near this box since it is mutually exclusive and remove circle
			strCurInput_Near	= "";
			$("#strNearQuery").val("");
			$("#intNearRange").val(1);
			$("#radTown_0").attr("checked", "checked");
			removeCircle();
						
			searchObtainLatLng();
			return false;
		} else {
			if (strCurInput_Lookup != $("#strSearchQuery").val()) {
				intCurInput_Type	= $("#intSearchType").val();
				strCurInput_Lookup	= $("#strSearchQuery").val();
				
				// clear near this box since it is mutually exclusive and remove circle
				strCurInput_Near	= "";
				$("#strNearQuery").val("");
				$("#intNearRange").val(1);
				$("#radTown_0").attr("checked", "checked");
				removeCircle();
								
				searchObtainLatLng();
				return false;
			} else {
				// page 3 (near this) auto-locate
				if (strCurInput_Near != $("#strNearQuery").val()) {
					// obtain lat/lng
					strCurInput_Near		= $("#strNearQuery").val();
	
					// clear main box since it is mutually exclusive
					strCurInput_Lookup		= "";
					intCurInput_Type		= -1;
					$("#strSearchQuery").val("");
					$("#intSearchType").val(-1);
					$("#radTown_0").attr("checked", "checked");
					removeCircle();
					
					nearLookupAddress(strCurInput_Near);
					return false;
				} else if (strCurInput_Near != "") {
					// clear main box since it is mutually exclusive
					strCurInput_Lookup		= "";
					intCurInput_Type		= -1;
					$("#strSearchQuery").val("");
					$("#intSearchType").val(-1);
					$("#radTown_0").attr("checked", "checked");
					removeCircle();
	
					if ((dblNearLatitude != 0) && (dblNearLongitude != 0)) {
						drawCircle(objMap, new GLatLng(dblNearLatitude, dblNearLongitude), (INT_RADIUS_MILE * parseInt($("#intNearRange").val())), 40);
						
						strBounds		= dblNearLatitude + "|" + dblNearLongitude + "|0.0|0.0";
					}
				}
			}
		}

		// set toggle
		boolUpdateHappening	= true;
		
		if (arguments[0] == null) {
			buildSearchBar();
		}
		
		$("#map_loader").show();
		
		if ($("#strNearQuery").val().length > 0) {
			intRadius		= $("#intNearRange").val()
		}
	
		// close any open info windows
		objMap.closeExtInfoWindow();
		
		$.get(	"/search/_query.php", 
				{	
					bounds: strBounds, 
					type: intCurInput_Type, 
					q: strCurInput_Lookup, 
					sqft: $("#sliderSquareFootage").slider("value"), 
					beds: $("#sliderBedrooms").slider("value"), 
					baths: $("#sliderBathrooms").slider("value"), 
					price: getPriceRange(), 
					rad: intRadius, 
					yearbuilt: $("#intYearBuilt").val(), 
					stories: $("#strNumStories").val(), 
					pkg: $("#strParking").val(), 
					beach: $("#intBeachRange").val(), 
					dt: $("#intDowntownRange").val(), 
					pt: $("#strPropertyType").val(), 
					gated: $("#chkCommGated").attr("checked") == true ? "1" : "", 
					pool: $("#chkCommPool").attr("checked") == true ? "1" : "", 
					tennis: $("#chkCommTennis").attr("checked") == true ? "1" : "", 
					golf: $("#chkCommGolf").attr("checked") == true ? "1" : "", 
					ch: $("#chkCommClubhouse").attr("checked") == true ? "1" : "", 
					ramp: $("#chkCommRamp").attr("checked") == true ? "1" : "", 
					dock: $("#chkCommDock").attr("checked") == true ? "1" : "", 
					remarks: $("#strRemarks").val() == STR_SEARCH_REMARKS_DEFAULT ? "" : $("#strRemarks").val(), 
					lottypes: getSelectedLotTypes()
				}, 
				parseMarkers, 
				"json");
	
		objNE				= null;
		objSW				= null;
		objBounds			= null;
	}
}

function parseMarkers(objData) {
	var objJSON				= objData;
	var arrNewMarkers		= new Array();
	var arrNewMLS			= new Array();
	var objMarker;
	var objElement;
	var txtElement;
	var objFragment;
	var txtFragment;

	// set toggle
	boolUpdateHappening	= false;

	if (objJSON.markers.length > 0) {
		if (objJSON.markers.length >= 100) {
			$("#map_message_text").html(TXT_ERROR_RESULTS);
			$("#map_message_wrapper").show();
		} else {
			$("#map_message_wrapper").hide();
		}
		$("#lyrNumHomes").html(objJSON.markers.length);
		
//		objFragment				= document.createDocumentFragment();
		txtFragment				= "";
		
		for (var intCounter = 0; intCounter < objJSON.markers.length; intCounter++) {
			arrNewMLS.push(objJSON.markers[intCounter].id);
			
			if (!markerExists(objJSON.markers[intCounter].id)) {
				// generate element for sidebar
//				objElement		= addSidebarItem(objJSON.markers[intCounter]);
//				objFragment.appendChild(objElement);

				txtElement		= addSidebarItem(objJSON.markers[intCounter]);
				txtFragment		+= txtElement;
				txtElement		= null;
				
				// generate GMarker object
				objMarker		= createMarker(new GLatLng(	objJSON.markers[intCounter].la, 
															objJSON.markers[intCounter].ln), 
															{
																id: objJSON.markers[intCounter].id, 
																price: objJSON.markers[intCounter].price, 
																street: objJSON.markers[intCounter].street, 
																img: objJSON.markers[intCounter].img, 
																beds: (objJSON.markers[intCounter].bed) ? objJSON.markers[intCounter].bed : 0, 
																baths: (objJSON.markers[intCounter].bath) ? objJSON.markers[intCounter].bath : 0, 
																sqft: (objJSON.markers[intCounter].sqft) ? objJSON.markers[intCounter].sqft : 0, 
																yb: (objJSON.markers[intCounter].yb) ? objJSON.markers[intCounter].yb : 0, 
																tm: (objJSON.markers[intCounter].tm) ? objJSON.markers[intCounter].tm : 0
															}, 
															{icon: new GIcon((objVisited.hasItem(objJSON.markers[intCounter].id)) ? objIcons_ResidentialSeen : objIcons_Residential)});

				// add to new markers table
				arrNewMarkers.push(objMarker);
				arrMarkers.push(objMarker);
			}
		}
		
		cleanupMarkers(arrNewMLS);
		
		objManager.addMarkers(arrNewMarkers, INT_VISIBLE_ZOOM);
		objManager.refresh();
		
//		$("#map_results_frame").append(objFragment);
		$("#map_results_frame").append(txtFragment);

		/*
		$("img").lazyload({         
			 placeholder : "/_images/_elements/holder.jpg",
			 container: $("#map_results_frame")
		});
		*/
		
		// re-sort
		if (intCurSortType > -1)		sortSidebar(intCurSortType, false);
	} else {
		// no data found
		clearMarkers();		
		$("#lyrNumHomes").html("0");
		$("#map_message_text").html(TXT_ERROR_NORESULTS);
		$("#map_message_wrapper").show();
	}
	
	$("#map_loader").hide();

	objJSON					= null;
	arrNewMarkers			= null;
	objMarker				= null;
	objFragment				= null;
	txtElement				= null;
	txtFragment				= null;
}

function addSidebarItem(objItem) {
	// after a LOT of profiling, innerhtml seems to be the fastest method for this.. :(
	if (objItem.bed == null) 		objItem.bed		= "0";
	if (objItem.bath == null)		objItem.bath	= "0";
	if (objItem.sqft == null)		objItem.sqft	= "0";
	
	var txtElement				= "<div id=\"id-" + objItem.id + "\" class=\"mls\" title=\"" + objItem.tm + "\"><em>" + objItem.street + "</em><ul><li><img src=\"/_content/_thumb.php?f=" + objItem.img + "\" border=\"0\" alt=\"\" /></li><li><span class=\"a\" title=\"" + objItem.price + "\">$" + $.currency(objItem.price, {s: ",", d: ".", c: 2}) + "</span><br /><div class=\"stats\"><strong>Beds:&nbsp;&nbsp;</strong><span class=\"b\">" + objItem.bed + "</span><strong>&nbsp;&nbsp;&nbsp;Baths:&nbsp;&nbsp;</strong><span class=\"c\">" + objItem.bath + "</span><br /><strong>Sq. Ft.:&nbsp;&nbsp;</strong>" + objItem.sqft + "<br /><a href=\"javascript:viewInfo(" + objItem.id + ");\" class=\"details\">&nbsp;</a></div></li></ul></div>";
	return txtElement;
}

function createMarker(objLatLng, objData, objIcon) {
	var objMarker		= new GMarker(objLatLng, objIcon);

	objMarker.intMLSID			= objData.id;
	objMarker.objPropertyInfo	= objData;
	
	GEvent.addListener(objMarker, "click", function() { 
		if (!objVisited.hasItem(objMarker.intMLSID.toString())) {
			objVisited.setItem(objMarker.intMLSID.toString(), true);
			
			setMarkerImage(objMarker);
		}
		viewInfo(this.intMLSID); 
	});
	
	return objMarker;
}

function setMarkerImage(objPointer) {
	objPointer.getIcon().image = STR_RES_SEEN_ICON;
	objPointer.setImage(STR_RES_SEEN_ICON);
}

function markerExists(intMLSID) {
	for (var intCounter = 0; intCounter < arrMLSLookup.length; intCounter++) {
		if (arrMLSLookup[intCounter] == intMLSID) {
			return true;
		}
	}
	
	return false;
}

function cleanupMarkers(arrNewMLS) {
	var intCurMLSID;
	var boolRemove;
	var arrKillList			= new Array();
	
	for (var intCounter = 0; intCounter < arrMarkers.length; intCounter++) {
		intCurMLSID			= arrMarkers[intCounter].intMLSID;
		boolRemove			= true;
		
		for (var intMLSCounter = 0; intMLSCounter < arrNewMLS.length; intMLSCounter++) {
			if (arrNewMLS[intMLSCounter] == intCurMLSID) {
				boolRemove	= false;	
			}
		}
		
		if (boolRemove)		arrKillList.push(intCurMLSID);
	}
	
	for (var intCounter = 0; intCounter < arrKillList.length; intCounter++) {
		for (var intMarkerCounter = 0; intMarkerCounter < arrMarkers.length; intMarkerCounter++) {
			if (arrMarkers[intMarkerCounter].intMLSID == arrKillList[intCounter]) {
				$("#map_results_frame #id-" + arrKillList[intCounter]).remove();
				objManager.removeMarker(arrMarkers[intMarkerCounter]);
				
				arrMarkers.splice(intMarkerCounter, 1);
				break;
			}
		}
	}
	
	// set new mls lookup table
	arrMLSLookup			= arrNewMLS;
}

function clearMarkers() {
	$("#map_results_frame").html("");
	
	for (var intCounter = 0; intCounter < arrMarkers.length; intCounter++) {
		objManager.removeMarker(arrMarkers[intCounter]);
	}
	objManager.refresh();

	arrMarkers			= new Array();
	arrMLSLookup		= new Array();
}

function viewInfo(intMLSID) {
	var objData;
	var strWindowText	= "";
	
	for (var intCounter = 0; intCounter < arrMarkers.length; intCounter++) {
		if (arrMarkers[intCounter].intMLSID == intMLSID) {
			if (!objVisited.hasItem(intMLSID.toString())) {
				objVisited.setItem(intMLSID.toString(), true);
				
				setMarkerImage(arrMarkers[intCounter]);
			}
			
			objData			= arrMarkers[intCounter].objPropertyInfo;
			strWindowText	=	"<ul>" + 
									"<li class=\"price_left\">&nbsp;</li>" + 
									"<li class=\"price_middle\"><em>$" + $.currency(objData.price, {s: ",", d: ".", c: 2}) + "&nbsp;</em></li>" + 
									"<li class=\"price_right\">&nbsp;</li>" + 
								"</ul>" + 
								"<div id=\"content_wrapper\">" + 
									"<div id=\"quick_buttons_wrapper\">" + 
										"<div id=\"quick_buttons\">" + 
											"<a href=\"/detail/view/" + objData.id + "/\" target=\"_blank\" class=\"more popup\" rel=\"details\">&nbsp;</a>" + 
											"<a href=\"javascript:saveProperty(" + objData.id + ");\" class=\"save\">&nbsp;</a>" + 
											"<a href=\"javascript:requestInfo(" + objData.id + ");\" class=\"schedule\">&nbsp;</a>" + 
										"</div>" + 
									"</div>" + 
									"<ul>" + 
										"<li class=\"content_middle\">" + 
											"<div id=\"street_wrapper\"><h6><a href=\"/detail/view/" + objData.id + "/\" target=\"_blank\" class=\"popup\" rel=\"details\">" + objData.street + "</a></h6></div>" + 
											"<a href=\"/detail/view/" + objData.id + "/\" target=\"_blank\" class=\"popup\" rel=\"details\"><img src=\"/_content/_thumb_lg.php?f=" + objData.img + "\" width=\"147\" height=\"103\" border=\"0\" alt=\"\" /></a>" + 
											"<dl>" + 
												"<dd><div class=\"stats_left\">MLS #:&nbsp;&nbsp;</div><div class=\"stats_right\">" + objData.id + "</div></dd>" + 
												"<dd><div class=\"stats_left\">Beds:&nbsp;&nbsp;</div><div class=\"stats_right\">" + objData.beds + "</div></dd>" + 
												"<dd><div class=\"stats_left\">Baths:&nbsp;&nbsp;</div><div class=\"stats_right\">" + objData.baths + "</div></dd>" + 
												"<dd><div class=\"stats_left\">Sq. Ft.:&nbsp;&nbsp;</div><div class=\"stats_right\">" + objData.sqft + "</div></dd>" + 
												"<dd><div class=\"stats_left\">Year Built:&nbsp;&nbsp;</div><div class=\"stats_right\">" + objData.yb + "</div></dd>" + 
												"<dd><div class=\"stats_left\">On Simplistate:&nbsp;&nbsp;</div><div class=\"stats_right\">~" + objData.tm + " days" + "</div></dd>" + 
											"</dl>" + 
										"</li>" +
									"</ul>" + 
								"</div>";

			// close any existing info window
			objMap.closeExtInfoWindow();

			arrMarkers[intCounter].openExtInfoWindow(	objMap,
														"ext_info_window",
														strWindowText, 
														{
															paddingX: 176, 
															paddingY: 35, 
															beakOffset: 0
														});
			
			setTimeout(function() { $(".popup").popupwindow(arrPopupProfiles); }, 500);
			break;
		}
	}
}

function getNeighborhoodLatLng(strTownKey) {
	$("#map_loader").show();

	$.get(	"/search/_get-neighborhood-loc-by-key.php", 
		  	{
				key: strTownKey
			}, 
			function(objData) {
				$("#map_loader").hide();
				
				if ((objData.ll != null) && (objData.lo != null)) {
					var dblLatitude		= parseFloat(objData.ll);
					var dblLongitude	= parseFloat(objData.lo);
					
					if ((dblLatitude != 0) && (dblLongitude != 0)) {
						arrLatLng[0]	= dblLatitude;
						arrLatLng[1]	= dblLongitude;
					}
					
					dblLatitude			= null;
					dblLongitude		= null;
					
					initializeMap();
				}
			}, 
			"json");
}

function getTownLatLng(strTownKey) {
	$("#map_loader").show();

	$.get(	"/search/_get-town-loc-by-key.php", 
		  	{
				key: strTownKey
			}, 
			function(objData) {
				$("#map_loader").hide();
				
				if ((objData.ll != null) && (objData.lo != null)) {
					var dblLatitude		= parseFloat(objData.ll);
					var dblLongitude	= parseFloat(objData.lo);
					
					if ((dblLatitude != 0) && (dblLongitude != 0)) {
						arrLatLng[0]	= dblLatitude;
						arrLatLng[1]	= dblLongitude;
					}
					
					dblLatitude			= null;
					dblLongitude		= null;
					
					initializeMap();
				}
			}, 
			"json");
}

function searchObtainLatLng() {
	var intCurSearchType		= parseInt($("#intSearchType").val());
	
	if (strCurInput_Lookup != "") {
		$("#map_loader").show();

		switch (intCurSearchType) {
			case INT_SEARCHTYPE_ZIPCODE :
				if (strCurInput_Lookup.match(/^[0-9]{5}(?:-[0-9]{4})?$/)) {
					$.get(	"/search/_get-zipcode.php", 
							{
								zip: strCurInput_Lookup
							}, 
							function(objData) {
								if ((objData.ll != null) && (objData.lo != null)) {
									var dblLatitude		= parseFloat(objData.ll);
									var dblLongitude	= parseFloat(objData.lo);
									
									if ((dblLatitude != 0) && (dblLongitude != 0)) {
										objMap.closeExtInfoWindow();
										objMap.setCenter(new GLatLng(dblLatitude, dblLongitude), INT_SEARCH_ZIPCODE_ZOOM);
										
										// perform query
										loadMarkers();
									} else {
										setTimeout(showZipcodeError, 500);
									}
								} else {
									setTimeout(showZipcodeError, 500);
								}
							}, 
							"json");
				} else {
					// this ain't no zipcode, willis!
					$("#intSearchType").val(-1);
					intCurInput_Type	= -1;
					
					// go
					searchObtainLatLng();
				}
				break;
				
			case INT_SEARCHTYPE_ADDRESS :
				if (strCurInput_Lookup.match(/^[0-9]{5}(?:-[0-9]{4})?$/)) {
					// zip code!  mos' def!
					$("#intSearchType").val(INT_SEARCHTYPE_ZIPCODE);
					intCurInput_Type	= INT_SEARCHTYPE_ZIPCODE;

					// go
					searchObtainLatLng();
				} else if (strCurInput_Lookup.match(/^[0-9]{7}$/)) {
					// mls #
					$("#intSearchType").val(INT_SEARCHTYPE_MLS);
					intCurInput_Type	= INT_SEARCHTYPE_MLS;

					// go
					searchObtainLatLng();
				} else {
					if (strCurInput_Lookup.indexOf(",") == -1) {
						strCurInput_Lookup		+= ", Charleston, SC";
					}
				
					$.get(	"/search/_get-address.php", 
							{
								address: strCurInput_Lookup
							}, 
							function(objData) {
								if ((objData.ll != null) && (objData.lo != null)) {
									var dblLatitude		= parseFloat(objData.ll);
									var dblLongitude	= parseFloat(objData.lo);
									
									if ((dblLatitude != 0) && (dblLongitude != 0)) {
										objMap.closeExtInfoWindow();
										objMap.setCenter(new GLatLng(dblLatitude, dblLongitude), INT_SEARCH_ADDRESS_ZOOM);
										
										if (objData.street != null) {
											$("#strSearchQuery").val(objData.street);
											strCurInput_Lookup		= objData.street;
										}
										
										// perform query
										loadMarkers();
									} else {
										setTimeout(showAddressError, 500);
									}
								} else {
									setTimeout(showAddressError, 500);
								}
							}, 
							"json");
				}
				break;
				
			case INT_SEARCHTYPE_TOWN :
				if (strCurInput_Lookup.match(/^[0-9]{5}(?:-[0-9]{4})?$/)) {
					// zip code!  mos' def!
					$("#intSearchType").val(INT_SEARCHTYPE_ZIPCODE);
					intCurInput_Type	= INT_SEARCHTYPE_ZIPCODE;

					// go
					searchObtainLatLng();
				} else if (strCurInput_Lookup.match(/^[0-9]{7}$/)) {
					// mls #
					$("#intSearchType").val(INT_SEARCHTYPE_MLS);
					intCurInput_Type	= INT_SEARCHTYPE_MLS;

					// go
					searchObtainLatLng();
				} else {
					$.get(	"/search/_get-town-loc.php", 
							{
								query: strCurInput_Lookup
							}, 
							function(objData) {
								if ((objData.ll != null) && (objData.lo != null)) {
									var dblLatitude		= parseFloat(objData.ll);
									var dblLongitude	= parseFloat(objData.lo);
									
									if ((dblLatitude != 0) && (dblLongitude != 0)) {
										objMap.closeExtInfoWindow();
										objMap.setCenter(new GLatLng(dblLatitude, dblLongitude), INT_SEARCH_TOWN_ZOOM);
										
										if (objData.name != null) {s
											$("#strSearchQuery").val(objData.name);
											strCurInput_Lookup		= objData.name;
										}
										
										// perform query
										loadMarkers();
									} else {
										setTimeout(showTownList, 500);
									}
								} else {
									setTimeout(showTownList, 500);
								}
							}, 
							"json");
				}
				break;

			case INT_SEARCHTYPE_NEIGHBORHOOD :
				if (strCurInput_Lookup.match(/^[0-9]{5}(?:-[0-9]{4})?$/)) {
					// zip code!  mos' def!
					$("#intSearchType").val(INT_SEARCHTYPE_ZIPCODE);
					intCurInput_Type	= INT_SEARCHTYPE_ZIPCODE;

					// go
					searchObtainLatLng();
				} else if (strCurInput_Lookup.match(/^[0-9]{7}$/)) {
					// mls #
					$("#intSearchType").val(INT_SEARCHTYPE_MLS);
					intCurInput_Type	= INT_SEARCHTYPE_MLS;

					// go
					searchObtainLatLng();
				} else {
					$.get(	"/search/_get-neighborhood-loc.php", 
							{
								query: strCurInput_Lookup
							}, 
							function(objData) {
								if ((objData.ll != null) && (objData.lo != null)) {
									var dblLatitude		= parseFloat(objData.ll);
									var dblLongitude	= parseFloat(objData.lo);
									
									if ((dblLatitude != 0) && (dblLongitude != 0)) {
										objMap.closeExtInfoWindow();
										objMap.setCenter(new GLatLng(dblLatitude, dblLongitude), INT_SEARCH_NEIGHBORHOOD_ZOOM);
										
										if (objData.name != null) {
											$("#strSearchQuery").val(objData.name);
											strCurInput_Lookup		= objData.name;
										}
										
										// perform query
										loadMarkers();
									} else {
										setTimeout(showNeighborhoodError, 500);
									}
								} else {
									setTimeout(showNeighborhoodError, 500);
								}
							}, 
							"json");
				}
				break;

			case INT_SEARCHTYPE_MLS :
				if (strCurInput_Lookup.match(/^[0-9]{7}$/)) {
					$.get(	"/search/_get-mls.php", 
							{
								id: strCurInput_Lookup
							}, 
							function(objData) {
								if ((objData.ll != null) && (objData.lo != null)) {
									var dblLatitude		= parseFloat(objData.ll);
									var dblLongitude	= parseFloat(objData.lo);
									
									if ((dblLatitude != 0) && (dblLongitude != 0)) {
										objMap.closeExtInfoWindow();
										objMap.setCenter(new GLatLng(dblLatitude, dblLongitude), INT_SEARCH_ADDRESS_ZOOM);
										
										if (objData.id != null) {
											$("#strSearchQuery").val(objData.id);
											strCurInput_Lookup		= objData.id;
										}
										
										// perform query
										loadMarkers();
									} else {
										setTimeout(showMLSError, 500);
									}
								} else {
									setTimeout(showMLSError, 500);
								}
							}, 
							"json");
				} else {
					// this ain't no zipcode, willis!
					$("#intSearchType").val(-1);
					intCurInput_Type	= -1;
					
					// go
					searchObtainLatLng();
				}
				break;

			default :
				// attempt to auto-detect the type of search they entered
				if (strCurInput_Lookup.match(/^[0-9]{5}(?:-[0-9]{4})?$/)) {
					// zip code!  mos' def!
					$("#intSearchType").val(INT_SEARCHTYPE_ZIPCODE);
					intCurInput_Type	= INT_SEARCHTYPE_ZIPCODE;

					// go
					searchObtainLatLng();
				} else if (strCurInput_Lookup.match(/^[0-9]{7}$/)) {
					// mls numbers are seven numerals long
					$("#intSearchType").val(INT_SEARCHTYPE_MLS);
					intCurInput_Type	= INT_SEARCHTYPE_MLS;

					// go
					searchObtainLatLng();
				} else if (strCurInput_Lookup.match(/^[a-zA-Z.' ]+$/)) {
					// probably a town since it lacks numbers and doesn't contain anything like a pound sign for a unit number or commas for a city
					$("#intSearchType").val(INT_SEARCHTYPE_TOWN);
					intCurInput_Type	= INT_SEARCHTYPE_TOWN;
					
					// go
					searchObtainLatLng();
				} else {
					// who knows!
					jQuery.facebox(function() { 
						jQuery.get(	"/search/_oops.php", 
									{
										query: strCurInput_Lookup
									},
									function(txtData) {
										jQuery.facebox(txtData)
									})
								  });
				}
				break;
		}
	}
}

function nearLookupAddress(strTargetAddress) {
	var strFormattedAddress		= strTargetAddress;
	
	if (strFormattedAddress.indexOf(",") == -1) {
		strFormattedAddress		+= ", Charleston, SC";
	}
	
	$.get(	"/search/_get-address.php", 
		  	{
				address: strFormattedAddress
			},
			function(objData) {
				if ((objData.ll != null) && (objData.lo != null)) {
					var dblLatitude		= parseFloat(objData.ll);
					var dblLongitude	= parseFloat(objData.lo);
					
					if ((dblLatitude != 0) && (dblLongitude != 0)) {
						dblNearLatitude		= dblLatitude;
						dblNearLongitude	= dblLongitude;

						objMap.closeExtInfoWindow();
						objMap.setCenter(new GLatLng(dblLatitude, dblLongitude), INT_SEARCH_NEAR_ZOOM);
						
						if (objData.street != null) {
							$("#strNearQuery").val(objData.street);
							strCurInput_Near		= objData.street;
						}
						
						// perform query
						loadMarkers();
					} else {
						setTimeout(showAddressError, 500);
					}
				} else {
					setTimeout(showAddressError, 500);
				}
			}, 
			"json");
}

function showTownList() {
	$("#map_loader").hide();
	$("#strSearchQuery").val("");

	jQuery.facebox(function() { 
		jQuery.get(	"/search/_towns.php", 
				   	{
						q: strCurInput_Lookup
					}, 
					function(txtData) {
						jQuery.facebox(txtData)
					});
	});
	strCurInput_Lookup		= "";
}

function showNeighborhoodError() {
	$("#map_loader").hide();
	$("#strSearchQuery").val("");

	jQuery.facebox(function() { 
		jQuery.get(	"/search/_neighborhoods.php", 
				   	{
						q: strCurInput_Lookup
					}, 
					function(txtData) {
						jQuery.facebox(txtData)
					});
	});
	strCurInput_Lookup		= "";
}

function showZipcodeError() {
	$("#strSearchQuery").val("");
	$("#map_loader").hide();

	jQuery.facebox(function() { 
		$.get(	"/search/_zipcode.php", 
			  	{
					zip: strCurInput_Lookup
				}, 
				function(txtData) {
					jQuery.facebox(txtData)
				});
	});
}

function showMLSError() {
	$("#strSearchQuery").val("");
	$("#map_loader").hide();

	jQuery.facebox(function() { 
		$.get(	"/search/_mls.php", 
			  	{
					id: strCurInput_Lookup
				}, 
				function(txtData) {
					jQuery.facebox(txtData)
				});
	});
}

function showAddressError() {
	$("#map_loader").hide();

	jQuery.facebox(function() { 
		$.get(	"/search/_address.php", 
			  	{
					address: strCurInput_Lookup
				}, 
				function(txtData) {
					jQuery.facebox(txtData)
				});
	});
}

function populateSearchBox(intSearchType, strText, dblTargetLatitude, dblTargetLongitude) {
	switch (intSearchType) {
		case INT_SEARCHTYPE_ZIPCODE :
			// bypass for now
			loadMarkers();
			break;
			
		case INT_SEARCHTYPE_ADDRESS :
			// bypass for now
			loadMarkers();
			break;
			
		case INT_SEARCHTYPE_TOWN :
			// close facebox
			$.facebox.close();
			
			// recenter map and set search query
			objMap.closeExtInfoWindow();
			objMap.setCenter(new GLatLng(dblTargetLatitude, dblTargetLongitude), INT_SEARCH_TOWN_ZOOM);
			$("#strSearchQuery").val(strText);
			strCurInput_Lookup		= strText;

			// perform query
			loadMarkers();
			break;
			
		case INT_SEARCHTYPE_MLS :
			// bypass for now
			loadMarkers();
			break;
	}
}

function setSearchType(intSearchType) {
	// close facebox
	$.facebox.close();
	
	// set searchtype
	$("#intSearchType").val(intSearchType);
	
	// reset search string
	intCurInput_Type			= intSearchType;
	strCurInput_Lookup			= "";
	
	// perform query
	loadMarkers();
}

function populateSearch() {
	// disable tooltips on sliders for now
	boolDisplayTooltips			= false;

	// entry fields
	if (intPresetType > -1)		$("#intSearchType").val(intPresetType);
	if (strPresetQuery != "")	$("#strSearchQuery").val(strPresetQuery);
	
	// sliders
	if (strPresetSQFT != "")		$("#sliderSquareFootage").slider("value", parseFloat(strPresetSQFT));
	if (strPresetBedrooms != "")	$("#sliderBedrooms").slider("value", parseFloat(strPresetBedrooms));
	if (strPresetBathrooms != "")	$("#sliderBathrooms").slider("value", parseFloat(strPresetBathrooms));
	if (strPresetPrice != "") {
		if (strPresetPrice.indexOf("|") > -1) {
			var arrPresetPrice		= strPresetPrice.split("|");
			
			$("#sliderPrice").slider("values", 0, arrPresetPrice[0]);
			$("#sliderPrice").slider("values", 1, arrPresetPrice[1]);
			
			arrPresetPrice			= null;
		}
	}
	
	// clean up
	intPresetType				= -1;
	strPresetQuery				= "";
	strPresetSQFT				= "";
	strPresetBedrooms			= "";
	strPresetBathrooms			= "";
	strPresetPrice				= "";

	// re-enable tooltips on sliders
	boolDisplayTooltips			= true;
}

function jumpToTown(dblTownLat, dblTownLng) {
	$("#strNearQuery").val("");
	$("#strSearchQuery").val("");
	$("#intSearchType").val("-1");
	
	strCurInput_Lookup		= "";
	strCurInput_Near		= "";
	intCurInput_Type		= -1;

	objMap.closeExtInfoWindow();
	objMap.setCenter(new GLatLng(dblTownLat, dblTownLng), INT_MIN_ZOOM);
	
	loadMarkers();
}

// Draw a circle on map around center (radius in miles)
// Modified by Jeremy Schneider based on http://maps.huge.info/dragcircle2.htm
var line;
var poly	= [];

function drawCircle(map, center, radius, numPoints) {
	poly = [] ; 
	var lat = center.lat() ;
	var lng = center.lng() ;
	var d2r = Math.PI/180 ;                // degrees to radians
	var r2d = 180/Math.PI ;                // radians to degrees
	var Clat = (radius/3963) * r2d ;      //  using 3963 as earth's radius
	var Clng = Clat/Math.cos(lat*d2r);
	
	//Add each point in the circle
	for (var i = 0 ; i < numPoints ; i++)
	{
		var theta = Math.PI * (i / (numPoints / 2)) ;
		Cx = lng + (Clng * Math.cos(theta)) ;
		Cy = lat + (Clat * Math.sin(theta)) ;
		poly.push(new GLatLng(Cy,Cx)) ;
	}

	//Remove the old line if it exists
	if(line)
	{
		map.removeOverlay(line) ;
	}
	
	//Add the first point to complete the circle
	poly.push(poly[0]) ;

	//Create a line with teh points from poly, red, 3 pixels wide, 80% opaque
	line = new GPolyline(poly, '#529B16', 3, 0.8) ;
	
	map.addOverlay(line) ;
}

function removeCircle() {
	if (line) {
		objMap.removeOverlay(line);
	}
	
	line	= null;
}