// JavaScript Document
var objMap, objGeoCoder,isIE6,ieTimeout,lastMenu;
var objMarkers = new Array();
var mapID = null;
var checkPoint;
google.load("maps", "2.x");
google.load("search" , '1');
google.setOnLoadCallback(initMap); 

function checkAccountlink() {
	if (doesQSExist(["fid"])) {
		var myAccount = document.getElementById("ID");
		var myFacility = getQSValue("fid");
		for (var i = 0; i < myAccount.length; i++)
			if (myAccount[i].value == myFacility) myAccount.selectedIndex = i;
	}
}
function showMenu(obj) {
	if (isIE6) {
		if (lastMenu != null) lastMenu.css("left", "-4999");
		var menu = $(obj).parent().find("ul");
		menu.css("left","0");
		lastMenu = menu;
	}
}
function popWin(winSource) {
	wPopup = window.open(winSource, "StoragePartners", "width=520,height=380,scollbars=0,toolbar=0,location=0,directories=0,status=0,menubar=1");
}
function togglePanel(panelID) {
	var domObject = document.getElementById(panelID + "Content");
	if (domObject.style.display != "block") domObject.style.display = "block";
	else domObject.style.display = "none";
}
function toggleToMap() {
	var domObject = document.getElementById("visual_map");
	domObject.style.display = "block";
	domObject = document.getElementById("visual_photos");
	domObject.style.display = "none";
}
function toggleToPhotos() {
	var domObject = document.getElementById("visual_map");
	domObject.style.display = "none";
	domObject = document.getElementById("visual_photos");
	domObject.style.display = "block";
}
function clearPhoneOrEmail(domObject) {
	if (domObject.value == "phone or email required") domObject.value = "";
}
function clearMoveInDate(domObject) {
	if (domObject.value == "expected date needed") domObject.value = "";
}
function validateMoveInDate(domObject) {
	if (domObject.value == "")
		alert("expected move in date needed");
}
function clearComments(domObject) {
	var test = new String();
	if (domObject.value.indexOf("there are specific features") >= 0) domObject.value = "";
}
function validatePhoneOrEmail(domObject) {
	var objPhone = document.getElementById("Phone");
	var objEmail = document.getElementById("Email");
	if (objEmail == domObject)
		if (objPhone.value == "" && objEmail.value == "")
			alert("phone or email required");
}
function submitReservationform() {
	/*
	var objStoreName = document.getElementById("StoreName");
	var objStoreAddress = document.getElementById("StoreAddress");
	var objStoreEmail = document.getElementById("StoreEmail");
	var objFirstName = document.getElementById("FirstName");
	var objLastName = document.getElementById("LastName");
	var objUnitSize = document.getElementById("UnitSize");
	var objComments = document.getElementById("Comments");
	*/
	var objPhone = document.getElementById("Phone");
	var objEmail = document.getElementById("Email");
	var objMoveIn = document.getElementById("MoveIn");
	if (objPhone.value == "" && objEmail.value == "") {
		alert("phone or email required");
	} else if (objMoveIn.value == "") {
		alert("expected date needed");
	} else {
		document.RequestForm.submit();
		/*
		var mailto = objStoreEmail;
		var subject = "New Reservation for " + objStoreName.innerText + " - " + objStoreAddress.innerText;
		var bodyText = "New reservation:\n\n" +
			"Contact: " + objFirstName.value + " " + objLastName.value + "\n" +
			"Phone: " + objPhone.value + "\n" +
			"Email: " + objEmail.value + "\n" +
			"Unit Size: " + objUnitSize.value + "\n" +
			"Move In: " + objMoveIn.value + "\n" +
			"Comments: " + objComments.value + "\n\n" +
			"Interested In: \n\n" +
			"Store Name: " + objStoreName.innerText + "\n" +
			"Store Address: " + objStoreAddress.innerText + "\n" +
			"Store Email: " + objStoreEmail.innerText;
		var mailLink = "mailto: " + objStoreEmail.innerText + "?subject=" + escape(subject) + "&body=" + escape(bodyText);
		var win = window.open(mailLink, "emailWindow");
		if (win && win.open && !win.closed) win.close();
		*/
	}
}
function clearZip(domObject) {
	if (domObject.value == "enter your zipcode") domObject.value = "";
}
function validateZip(domObject) {
	if (domObject.value == "") domObject.value = "enter your zipcode";	
	else {
		var dvl = domObject.value.length;
		if (dvl != 5) alert("please use a 5 digit zipcode");
	}
}
function clearCity(domObject) {
	if (domObject.value == "enter your city") domObject.value = "";
} 
function validateCity(domObject) {
	if (domObject.value == "") domObject.value = "enter your city";
}
function submitZip() {
	var myform = document.forms.StoreLocator;
	if (myform.ZipCode.value == "enter your zipcode") {
		alert("Please enter your zipcode");
		return;
	}
	var remEl = document.getElementById("City");
	remEl.parentNode.removeChild(remEl);
	remEl = document.getElementById("State");
	remEl.parentNode.removeChild(remEl);
	myform.submit();
}
function submitCityState() {
	var myform = document.forms.StoreLocator;
	if (myform.City.value == "enter your city") {
		alert("Please enter your city");
		return;
	}
	if (myform.State.selectedIndex == 0) {
		alert("Please choose a state");
		return;
	}
	var remEl = document.getElementById("ZipCode");
	remEl.parentNode.removeChild(remEl);
	myform.submit();
}
function doesQSExist(whichVars) {
	var exists = false;
	if (window.location.search.indexOf('?') > -1) {
		if (whichVars != null) {
			for (var i = 0; i < whichVars.length; i++) {
				if (getQSValue(whichVars[i]) != "") return true;
			}
		}
	}
	return exists;
}
function getQSValue(key) {
	var qstring = window.location.search.split("?");
	if (qstring.length == 1) return "";
	var allValues = qstring[1];
	var pairs = allValues.split('&');
	for (var i = 0; i < pairs.length; i++) {
		var pair = pairs[i].split('=');
		if (pair[0] == key) return pair[1];
	}
	return "";
}
function prefillForm(paramString) {
	var params = paramString.split("&");
	for (var i = 0; i < params.length; i++) {
		var pair = params[i].split("=");
		if (pair[0] == "size") var unitSize = pair[1];
	}
	document.RequestForm.UnitSize.value = unescape(unitSize);
	
}
function addMapControl(setMapType) {
	mapID = setMapType;
}
function initMap() {
	if (GBrowserIsCompatible() && mapID != null) {
		objMap = new google.maps.Map2(document.getElementById(mapID));
		objMap.setCenter(new google.maps.LatLng(48.185521, -122.137595), 10);
        objMap.addControl(new google.maps.SmallMapControl()); // controls
		objMap.addControl(new google.maps.MapTypeControl());  // map type
		objGeoCoder = new GClientGeocoder();
		objMap.clearOverlays();
		if (doesQSExist(["ZipCode", "City"])) {
			var address = getQSValue("ZipCode").length > 0 ? getQSValue("ZipCode") : getQSValue("City") + ", " + getQSValue("State");
			objGeoCoder.getLocations(address, function(response) {
				checkPoint = [response.Placemark[0].Point.coordinates[1], response.Placemark[0].Point.coordinates[0]];
				var closest = returnClosest(objMarkers, checkPoint, 5);
				for (var i = 0; i < closest.length; i++) {
					createMarker(closest[i]);
					var distance = document.getElementById("distance_" + closest[i][0]);
					distance.firstChild.data = closest[i][closest[i].length - 1];
				}
				$("li.result_listing").tsort("div>div>span");			
				// redo listings with "miles" text...tinysort will sort by alpha instead of numeric
				for (i = 0; i < closest.length; i++) {
					distance = document.getElementById("distance_" + closest[i][0]);
					distance.firstChild.data = closest[i][closest[i].length - 1] + " miles from you";
				}
				objMap.setCenter(new GLatLng(closest[0][1], closest[0][2]), closest[0][6]);
				setCustomZoom(closest, checkPoint);
			});
		} else {
			for (var i = 0; i < objMarkers.length; i++)	createMarker(objMarkers[i]);
			objMap.setCenter(new GLatLng(objMarkers[0][1], objMarkers[0][2]), objMarkers[0][6]);
			setCustomZoom(objMarkers);
		}
	}
	setupThickbox();
}
function setCustomZoom(allMarkers, checkPoint) {
	var minLat = allMarkers[0][1], maxLat = allMarkers[0][1], minLon = allMarkers[0][2], maxLon = allMarkers[0][2];
	for (var i = 0; i < allMarkers.length; i++) {
		if (allMarkers[i][1] < minLat) minLat = allMarkers[i][1];
		if (allMarkers[i][1] > maxLat) maxLat = allMarkers[i][1];
		if (allMarkers[i][2] < minLon) minLon = allMarkers[i][2];
		if (allMarkers[i][2] > maxLon) maxLon = allMarkers[i][2];
	}
	if (checkPoint != null) {
		if (checkPoint[0] < minLat) minLat = checkPoint[0];
		if (checkPoint[0] > maxLat) maxLat = checkPoint[0];
		if (checkPoint[1] < minLon) minLon = checkPoint[1];
		if (checkPoint[1] > maxLon) maxLon = checkPoint[1];
	}
	
	var cenLat = (maxLat + minLat) / 2;
	var cenLon = (maxLon + minLon) / 2;
	var ne = new google.maps.LatLng(maxLat, maxLon);
	var sw = new google.maps.LatLng(minLat, minLon);
	var bounds = new google.maps.LatLngBounds(sw, ne);
	var center = new google.maps.LatLng(cenLat, cenLon);
	var mapWidth = objMap.getSize().width;
	var mapHeight = objMap.getSize().height;
	var zoom = objMap.getBoundsZoomLevel(bounds, new google.maps.Size(objMap.getSize()));
	if (allMarkers.length == 1) zoom = allMarkers[0][6];
	objMap.setCenter(center, zoom);
}
function createMarker(markerData) { //latlng, number) {
	var result = document.getElementById("result_" + markerData[0]);
	if (result != null) result.style.display = "block";
	var point = new google.maps.LatLng(markerData[1], markerData[2]);
	var marker = new google.maps.Marker(point);
	marker.value = markerData[3];
	objMap.addOverlay(marker);
	GEvent.addListener(marker,"click", function() {
		var htmlInfo = (markerData[4] == "#") ? "<b>" + markerData[3] + "</b><br />" + markerData[5] :
			 "<b><a href='" + markerData[4] + "'>" + markerData[3] + "</a></b><br />" + markerData[5];
		objMap.openInfoWindowHtml(point, htmlInfo);
	});
}
function addMapMarker(id, lat, long, label, link, address, zoom) {
	objMarkers.push([id, lat, long, label, link, address, zoom]);
}
function returnClosest(allpoints, checkpoint, count) {
	var result;
	for (var i = 0; i < allpoints.length; i++)
		allpoints[i].push(getDistance(allpoints[i],checkpoint).toPrecision(4));
	allpoints.sort(sortDistances);
	var closest = new Array();
	for (i = 0; i < count; i++) closest.push(allpoints[i]);
	return closest;
}
function sortDistances(a,b) {return a[a.length - 1] - b[a.length - 1];}

function getDistance (point1, point2) {
	var lat1 = point1[1], lon1 = point1[2], lat2 = point2[0], lon2 = point2[1];
	var R = 6371; // earth's mean radius in km
	var dLat = (lat2-lat1).toRad();
	var dLon = (lon2-lon1).toRad();
	lat1 = lat1.toRad(), lat2 = lat2.toRad();
	
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2) * Math.sin(dLon/2);
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
	var d = R * c;
	return Math.round(d * 0.621371192 * 100) / 100; // convert kilometers to miles
}

function LatLon(lat, lon) {
  this.lat = lat;
  this.lon = lon;
}

Number.prototype.toRad = function() {return this * Math.PI / 180;}
Number.prototype.toDeg = function() {return this * 180 / Math.PI;}
Number.prototype.toBrng = function() {return (this.toDeg()+360) % 360;}

Number.prototype.toPrecision = function(fig) {  // override toPrecision method with one which displays 
  if (this == 0) return 0;                      // trailing zeros in place of exponential notation
  var scale = Math.ceil(Math.log(this)*Math.LOG10E);
  var mult = Math.pow(10, fig-scale);
  return Math.round(this*mult)/mult;
}
