
var USA_COUNTRY_ID = 223;
var CANADA_COUNTRY_ID = 38;

var INITIAL_ZOOM_LEVEL = 2;
var map;
var mapDiv;
var mfgSelector;
var hoverMsg;
var loadingMsgText;
var request;
var infoRequest;

var internetDealerRequest;
var internetDiv;

var infoWindowMarker;
var infoWindowMarkerPoint;
var allMarkers = new Array();

var	zipCode;
var zipRequest = GXmlHttp.create();
var ZIP_CODE_ZOOM_LEVEL = 11;

var filterCheckboxes;

var countryRequest = GXmlHttp.create();
var countrySelect;

// points to the United States option in the country selector
// when the user types a zip, we select United States in the selector
var usOpt = null;
var caOpt = null; // Canada

var count = 0;

var COUNTRY_ZOOM_LEVEL = 3;

window.onload = pc_init;

// All javascript body onload functions must be named pc_init
// to allow functionality when user is logged in
function pc_init() {
	if (GBrowserIsCompatible()) {
		request = GXmlHttp.create();
		infoRequest = GXmlHttp.create();
		internetDealerRequest = GXmlHttp.create();
		
		var filterForm = document.getElementById('dealerFilterForm');
		filterForm.style.display = "block";
	
		mapDiv = document.getElementById('map');
		mapDiv.style.width = "500px";
		mapDiv.style.height = "375px";
		mapDiv.style.display = "block";
	
		internetDiv = document.getElementById("internetDealers");
		internetDiv.style.display = "block";
		var dealerList = document.getElementById("internetDealerList");
		dealerList.style.height = (internetDiv.offsetHeight - 9)+"px";
	
		loadingMsgText = document.createTextNode('Initializing...');
		var loadingMsgDiv = document.getElementById('loadingMsg');
		while (loadingMsgDiv.hasChildNodes()) {
			loadingMsgDiv.removeChild(loadingMsgDiv.firstChild);
		}
		loadingMsgDiv.appendChild(loadingMsgText);
		
		var rememberMeBox = document.getElementById('rememberMe');
		var cookieSave = getCookie('dealerLocatorSaveState');
		if (cookieSave == null || cookieSave == "yes") {
			rememberMeBox.checked = true;
		}
		else {
			rememberMeBox.checked = false;
		}
		rememberMeBox.onclick = stateSavePreferenceChangeHandler;
	
		initMapState();

		mfgSelect = document.getElementById("mfgSelector");
		mfgSelect.onchange = mfgSelectorResponder;
		
		zipCode = document.getElementById("zipCode");
		zipCode.onclick = function() {
			if (zipCode.value == zipCode.defaultValue) {
				zipCode.value = "";
			}
			return true;
		}
		
		initFilterAndLocationOptions();
		
		hideHoverMessage();
		
		getDealerInfo();
		getInternetDealerInfo();
	}
	else if (window.location.href.indexOf('noncompat') < 0) {
		window.location += "?noncompat=1";
	}
}

function initMapState() {
	map = new GMap(mapDiv);
	
	var initialCenter = new GLatLng(0, 0);
	var initialZoom   = INITIAL_ZOOM_LEVEL;
	
	var attLat = mapDiv.getAttribute('LAT');
	var attLng = mapDiv.getAttribute('LNG');
	var attArea= mapDiv.getAttribute('AREA');
	
	var cookieZoom = getCookie("dealerLocatorZoom");
	var cookieLat = getCookie("dealerLocatorLat");
	var cookieLng = getCookie("dealerLocatorLng");
	
	if (cookieLat != null && cookieLng != null && cookieZoom != null) {
		initialCenter = new GLatLng(cookieLat, cookieLng);
		initialZoom = cookieZoom-0; // force to number
	}
	else if (attLat != null && attLng != null && attArea != null && attArea > 0) {
		initialCenter = new  GLatLng(attLat, attLng);
		initialZoom = getZoomLevelForCountrySize(Number(attArea));
	}
	
	map.setCenter(initialCenter, initialZoom);
	
	GEvent.addListener(map, 'moveend', getDealerInfo);
	GEvent.addListener(map, 'infowindowclose', function() {
		infoWindowMarker = null;
		infoWindowMarkerPoint = null;
	});
	
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	
	markers = new Array();
}

function initFilterAndLocationOptions() {
	document.getElementById("zipBtn").onclick = getZipCoords;
	zipCode.onkeydown = watchForEnter;
	
	infoWindowContents = document.createElement('DIV');
	infoWindowContents.style.whiteSpace = "nowrap";
	
	countrySelect = document.getElementById("country_select");
	countrySelect.onchange = countrySelectorResponder;
	
	usOpt = document.getElementById("ctry"+USA_COUNTRY_ID);
	caOpt = document.getElementById("ctry"+CANADA_COUNTRY_ID);
	
	initLocationOptionValues();
	
	var checkParent = document.getElementById("dlrFilters");
	filterCheckboxes = checkParent.getElementsByTagName('INPUT');
	var serviceCheckboxes = new Array();
	var productCheckboxes = new Array();
	for (var box = 0; box < filterCheckboxes.length; box++) {
		/* IE's onchange event is broken, so use onclick */
		filterCheckboxes[box].onclick = closeWindowAndGetDealerInfo;
		if (filterCheckboxes[box].name == "serv_id") {
			serviceCheckboxes.push(filterCheckboxes[box]);
		}
		else if (filterCheckboxes[box].name == "prod_id") {
			productCheckboxes.push(filterCheckboxes[box]);
		}
	}
	
	
	initCheckboxesFromCookie(serviceCheckboxes, "dealerLocatorServices");
	initCheckboxesFromCookie(productCheckboxes, "dealerLocatorProducts");
	
	// initialize the brand dropdown
	var cookieMfg = getCookie("dealerLocatorMfgId");
	if (cookieMfg != null) {
		var mfgOption = document.getElementById("mfg"+cookieMfg);
		if (mfgOption != null) {
			mfgSelect.selectedIndex = mfgOption.index;
		}
	}
}

function initCheckboxesFromCookie(boxes, cookie) {
	var cookieValues = getCookie(cookie);
	if (cookieValues != null) {
		var valuesArray = cookieValues.split(",");
		for (var v = 0; v < valuesArray.length; v++) {
			for (var b = 0; b < boxes.length; b++) {
				if (boxes[b].value == valuesArray[v]) {
					boxes[b].checked = true;
					break;
				}
			}
		}
	}
}

function initLocationOptionValues() {
	/* Set country first; if not United States, then we'll ignore the zip code cookie */
	var countryCookie = getCookie("dealerLocatorCountry");
	var countryAttr = mapDiv.getAttribute('COUNTRY');
	var zipCookie = getCookie("dealerLocatorZipCode");
	
	/* check for valid location saved */
	var cookieLat = getCookie("dealerLocatorLat");
	var cookieLng = getCookie("dealerLocatorLng");
	var hasSavedLocation = (cookieLat != null && cookieLng != null);
	if (countryCookie != null && hasSavedLocation) {
		var savedCountry = document.getElementById("ctry"+countryCookie);
		if (savedCountry != null) {
			countrySelect.selectedIndex = savedCountry.index;
		}
	}
	else {
		var countryOpt = document.getElementById("ctry"+countryAttr);
		if (countryOpt != null) {
			countrySelect.selectedIndex = countryOpt.index;
		}
	}
	
	if (hasSavedLocation && zipCookie != null && zipCookie != "default" && usOpt.selected == true) {
		zipCode.value = zipCookie;
	}
}

function showNoDealersMessage() {
	/*var html = "<h1>No dealers found</h1>Widen your search area by zooming out or moving the map";
	showHoverMessage(html);*/
	showNoVisibleDealersMessage();
}

function showTooManyDealersMessage(n) {
	/*if (n == null) {
		var html =  "<h1>Too many dealers found</h1>";
	}
	else {
		var html = "<h1>"+n+" dealers found</h1>This is too many to be displayed on the map.<br>";
	}
	html += "Narrow your search area by zooming in or moving the map.";
	//html += " or specify some search criteria";
	showHoverMessage(html);*/
	showNoVisibleDealersMessage(n);
}

function showNoVisibleDealersMessage(n) {
	if (n == null) {
		var html =  "<h1>No dealers found</h1>";
	}
	else {
		var html = "<h1>"+n+" dealers found</h1>";
	}
	html += "To see up to 30 dealers, use the check boxes, zoom in, and/or move the map.";
	showHoverMessage(html);
}

function showHoverMessage(html) {
	hoverMsg = document.createElement('DIV');
	var msgPadding = 50;
	hoverMsg.id = "hoverMsg";
	hoverMsg.innerHTML = html;
	hoverMsg.style.position = "absolute";
	hoverMsg.style.zIndex = 10;
	
	mapDiv.appendChild(hoverMsg);
	
	hoverMsg.style.left = (mapDiv.offsetWidth/2 - hoverMsg.offsetWidth/2) + "px";
	
	hoverMsg.style.bottom = "30px"
	// Align in middle of screen - OLD
	//hoverMsg.style.top = (mapDiv.offsetHeight/2 - hoverMsg.offsetHeight/2) + "px";
	
	hoverMsg.onclick = hideHoverMessage;
}

function hideHoverMessage() {
	if (hoverMsg != null && hoverMsg.parentNode != null) {
		hoverMsg.parentNode.removeChild(hoverMsg);
	}
}

function closeWindowAndGetDealerInfo() {
	map.closeInfoWindow();
	getDealerInfo();
	getInternetDealerInfo();
}

function countrySelectorResponder() {
	zipCode.value = zipCode.defaultValue;
	countrySelect.blur();
	getCountryCoords();
	getInternetDealerInfo();
}

function mfgSelectorResponder() {
	getDealerInfo();
	getInternetDealerInfo();
}

function getDealerInfo() {
	request.abort();
	infoRequest.abort();
	zipRequest.abort();
	countryRequest.abort();
	
	loadingMsgText.nodeValue = 'Loading local dealer locations...';
	hideHoverMessage();
	var mapBounds = map.getBounds();

	saveStateToCookies();
	
	var mfg_id = encodeURIComponent(getSelectedMfgId());
	
	var url = '_dealer_xml_gen.cfm?'
		+ 'swLng='+mapBounds.getSouthWest().lng()
		+'&neLng='+mapBounds.getNorthEast().lng()
		+'&swLat='+mapBounds.getSouthWest().lat()
		+'&neLat='+mapBounds.getNorthEast().lat()
		+'&mfg_id='+mfg_id
		+buildFilterParams()
		+"&c="+(++count);
	request.open("GET",
		url,
		true);
	request.onreadystatechange = updateDealerIcons;
	request.send(null);
}

function getInternetDealerInfo() {
	internetDealerRequest.abort();
	
	var dealerList = document.getElementById("internetDealerList");
	dealerList.innerHTML = "Loading dealers...";
	
	var mfg_id = encodeURIComponent(getSelectedMfgId());
	var url = "_dealer_internet_xml_gen.cfm?mfg_id="+mfg_id
		+buildFilterParams()
		+"&ctry_id="+getSelectedCountryId()
		+"&c="+(count);
	internetDealerRequest.open("GET", url, true);
	internetDealerRequest.onreadystatechange = updateInternetDealers;
	internetDealerRequest.send(null);
}

function getSelectedMfgId() {
	var mfg_id = 0;
	if (mfgSelect.selectedIndex >= 0) {
		var activeOption = mfgSelect.options.item(mfgSelect.selectedIndex);
		mfg_id = activeOption.value;
	}
	return mfg_id;
}

function getSelectedCountryId() {
	var ctry_id = 0;
	if (countrySelect.selectedIndex >= 0) {
		var activeOption = countrySelect.options.item(countrySelect.selectedIndex);
		ctry_id = activeOption.value;
	}
	return ctry_id;
}


function buildFilterParams() {
	var servsChecked = new Array();
	var prodsChecked = new Array();
	
	for (var b = 0; b < filterCheckboxes.length; b++) {
		var box = filterCheckboxes[b];
		if (box.checked) {
			if (box.name == "serv_id") {
				servsChecked.push(box.value);
			}
			else if (box.name = "prod_id") {
				prodsChecked.push(box.value);
			}
		}
	}
	
	return "&serv_id="+servsChecked.join(',')+"&prod_id="+prodsChecked.join(',');
}

function getCheckedFilters() {
	
}

/*
	Tells whether the user is currently filtering the available dealers
	This means that either a manufacturer is selected or a checkbox is
	checked
*/
function isSearchFiltered() {
	// Check the manufacturer drop-down
	if (mfgSelect.selectedIndex > 0) {
		logDebugMessage("Manufacturer selected: "+mfgSelect.selectedIndex);
		return true;
	}
	
	// Check the checkboxes
	for (var b = 0; b < filterCheckboxes.length; b++) {
		if (filterCheckboxes[b].checked == true) {
			logDebugMessage("Check box selected: "+b);
			return true;
		}
	}
	
	return false;
}

function updateInternetDealers() {
	var dealerList = document.getElementById("internetDealerList");
	if (internetDealerRequest.readyState == 4) {
		var xmlDoc = internetDealerRequest.responseXML;
		if (xmlDoc == null || typeof xmlDoc == "undefined") {
			return;
		}
		var dealerNodes = xmlDoc.getElementsByTagName("dealer");
		var recordNode = xmlDoc.getElementsByTagName("records")[0];
		
		if (recordNode != null && recordNode.getAttribute("error") == "FALSE" && dealerNodes.length > 0) {
			var totalDealers = recordNode.getAttribute("total");
			var html = "";
			for (var i = 0; i < dealerNodes.length; i++) {
				html += '<div class="dealerIcon">';
				
				var linkHref = "svc_redir.cfm?acc_id="+dealerNodes[i].getAttribute("acc_id")+"&mfg_id="+recordNode.getAttribute("mfg_id");
				var dealerDesc = "";
				if (dealerNodes[i].hasChildNodes()) {
					dealerDesc = dealerNodes[i].firstChild.nodeValue;
				}
				
				if (dealerNodes[i].getAttribute("image").length == 0) {
					html += '<a target="_blank" class="noImageAvailable" href="'+linkHref+'" title="'+dealerDesc+'">'+dealerNodes[i].getAttribute("name")+'</a>';
				}
				else {
					html += '<a target="_blank" href="'+linkHref+'" title="'+dealerDesc+'"><img border="0" src="/dealer_logos/'+dealerNodes[i].getAttribute("image")+'"></a>';
				}
				if (dealerNodes[i].getAttribute("rating").length > 0 || dealerNodes[i].getAttribute("bid").length > 0) {
					html +='<div class="dealerRating">';
					if (dealerNodes[i].getAttribute("bid").length > 0) {
						html += '<span class="bid">'+dealerNodes[i].getAttribute("bid")+'</span>';
					}
					if (dealerNodes[i].getAttribute("rating").length > 0) {
						html += '<a href="/dealer_profile.cfm?dealer_id='+dealerNodes[i].getAttribute("id")+'" title="View this seller&rsquo;s profile">'+ratingToStars(dealerNodes[i].getAttribute("rating"))+'</a>';
					}
					html += '</div>';
				}
				html += '<a class="resourceLink" href="/dealer_profile.cfm?dealer_id='+dealerNodes[i].getAttribute("id")+'" title="View this seller&rsquo;s profile">Seller Profile</a>'
				html += '</div>';
			}
			dealerList.innerHTML = html;
			
			document.getElementById("internetLoadingMsg").innerHTML = totalDealers + ' internet dealer' + (totalDealers==1?'':'s');
		}
		else if (dealerNodes.length == 0) {
			dealerList.innerHTML = "No internet dealers were found.";
			document.getElementById("internetLoadingMsg").innerHTML = 'No internet dealers';
		}
		else {
			document.getElementById("internetLoadingMsg").innerHTML = 'Error on load';
			if (recordNode != null) {
				dealerList.innerHTML = "Error: "+recordNode.getAttribute("message");
			}
		}
	}
}

function updateDealerIcons() {
	if (request.readyState == 4) {
		var xmlDoc = request.responseXML;
		if (xmlDoc == null || typeof xmlDoc == 'undefined') {
			return;
		}
		var dealerNodes = xmlDoc.getElementsByTagName('dealer');
		var recordNode = xmlDoc.getElementsByTagName('records')[0];
		var totalDealers = recordNode.getAttribute("total");
		var shownDealers = dealerNodes.length;
		
		while (allMarkers.length > 0) {
			var m = allMarkers.pop();
			if (infoWindowMarker == null || m != infoWindowMarker) {
				map.removeOverlay(m);
			}
		}
		
		if (infoWindowMarker != null) allMarkers.push(infoWindowMarker);
		if (recordNode.getAttribute('error') == "FALSE") {
			for (i = 0; i < dealerNodes.length; i++) {
				var latitude = dealerNodes[i].getElementsByTagName('latitude')[0].firstChild.nodeValue;
				var longitude = dealerNodes[i].getElementsByTagName('longitude')[0].firstChild.nodeValue;
				if (typeof infoWindowMarkerPoint == "undefined" || infoWindowMarkerPoint == null ||
					(infoWindowMarkerPoint.x != longitude && infoWindowMarkerPoint.y != latitude))
				{
					var type = dealerNodes[i].getAttribute("type");
					var dlrMarker = createDealerMarker(latitude, longitude, xmlDoc, dealerNodes[i].getAttribute("id"), type);
					if (typeof dlrMarker != "null") {
						allMarkers.push(dlrMarker);
						map.addOverlay(dlrMarker);
					}
				}
			}
			if (shownDealers == totalDealers) {
				loadingMsgText.nodeValue = ((totalDealers==0) ? 'No' : totalDealers) + ' local dealer' + (totalDealers==1?'':'s');
				if (shownDealers == 0) {
					showNoDealersMessage();
				}
			}
			else {
				loadingMsgText.nodeValue = totalDealers + ' local dealer' + (totalDealers==1?"":"s");
				showTooManyDealersMessage(totalDealers);
			}
		}
		else {
			loadingMsgText.nodeValue = "Error: "+recordNode.getAttribute('message');
		}
	}
}

function createDealerMarker(lat, lng, xmlDoc, id, type) {
	var coords = new GLatLng(lat, lng);
	
	var icon = getDealerIconForType(type);
	var html = getInfoWindowHtmlForDealer(xmlDoc, id);
	var marker = new GMarker(coords, icon);
	
	if (html == "") return null;
	
	GEvent.addListener(marker, 'click', function() {
		// If a user clicks another marker while an info window is already open,
		// Then GMaps will open the new window, then close the old one. This means
		// that the 'infowindowclose' event fires immediately after this one, which
		// has the effect of clearing the infoWindowMarker variables. By closing any
		// open window first, we avoid that problem
		map.closeInfoWindow();
		infoWindowMarker = marker;
		infoWindowMarkerPoint = coords;
		marker.openInfoWindowHtml(html);
	});
	
	return marker;
}

function getDealerIconForType(type) {
	if (type == "premium") {
		var icon = new GIcon(G_DEFAULT_ICON);
		icon.image = "/images/maps/bigredmarker.png";
		icon.iconSize = new GSize(25,45);
		icon.shadow  = "images/maps/shadow50big.png";
		icon.shadowSize = new GSize(45,45);
		icon.transparent = "/images/maps/bigredmarkertrans.png";
		icon.iconAnchor = new GPoint(13,44);
		icon.printImage = "/images/maps/bigredmarkerprint.gif";
		icon.mozPrintImage = icon.printImage;
		return icon;
	}
	else if (type == "standard") {
		var icon = new GIcon(G_DEFAULT_ICON);
		icon.image = "/images/maps/medgreenmarker.png";
		icon.iconSize = new GSize(23,37);
		icon.shadow  = "images/maps/shadow50med.png";
		icon.shadowSize = new GSize(42,37);
		icon.transparent = "/images/maps/medgreenmarkertrans.png";
		icon.iconAnchor = new GPoint(12,36);
		icon.printImage = "/images/maps/medgreenmarkerprint.gif";
		icon.mozPrintImage = icon.printImage;
		return icon;
		return icon;
	}
	else {
		var icon = new GIcon(G_DEFAULT_ICON);
		icon.image = "/images/maps/yellowmarker.png";
		return icon;
	}
}

function getInfoWindowHtmlForDealer(doc, dealer_id) {
	var dealerNode = null;
	var allDealers = doc.getElementsByTagName('dealer');
	for (var i = 0; i < allDealers.length; i++) {
		if (allDealers[i].getAttribute('id') == dealer_id) {
			dealerNode = allDealers[i];
			break;
		}
	}
	
	if (dealerNode == null) {
		return "";
	}
	
	var html = "";
	var url = dealerNode.getAttribute('url');	
	
	html += '<div class="dealerName">';
	if (url.length > 0) {
		html += '<A HREF="/exit_link_redir.cfm?earl='+escape(url)+'" target="_blank" title="Visit this seller&rsquo;s web site">'+dealerNode.getAttribute("name").bold()+'</A>';
	}
	else {
		html += '<b>'+dealerNode.getAttribute("name")+'</b>';
	}
	html += "</div>"

	var rating = dealerNode.getAttribute('rating');
	if (rating.length > 0) {
		html += '<div>'+ratingToStars(rating)+'</div>';
	}
	
	html += '<div>'+dealerNode.getAttribute("address")+'</div>';
	
	var phone = dealerNode.getAttribute("phone1");
	if (phone.length > 0) {
		html += "<div>"+phone+"</div>";
	}
	phone = dealerNode.getAttribute("phone2");
	if (phone.length > 0) {
		html += "<div>"+phone+"</div>";
	}
	
	email = dealerNode.getAttribute("email");
	if (email.length > 0) {
		html += '<div><a href="mailto:'+email+'">'+email+'</a></div>';
	}
	
	html += '<div class="profileLink"><a href="/dealer_profile.cfm?dealer_id='+dealer_id+'" title="View this seller&rsquo;s profile">Seller Profile</a></div>';
	
	return '<div style="white-space:nowrap;">'+html+'</div>';
}

function ratingToStars(r) {
	var html = "";
	for(var s = 1; s <= 5; s++) {
		if (s <= r) {
			html += '<IMG CLASS="star" SRC="/images/red_star_on.gif" BORDER=0>';
		}
		else if ((r - Math.floor(r)) >= 0.5 && s - r <= 0.5) {
			html += '<IMG CLASS="star" SRC="/images/red_star_onoff.gif" BORDER=0>';
		}
		else {
			html += '<IMG CLASS="star" SRC="/images/red_star_off.gif" BORDER=0>';
		}
	}
	return '<span style="white-space:pre">'+html+'</span>';
}

function getZipCoords() {
	request.abort();
	infoRequest.abort();
	zipRequest.abort();
	countryRequest.abort();

	var errorTag = document.getElementById('errorMsg');
	
	while(errorTag.hasChildNodes()) errorTag.removeChild(errorTag.childNodes[0]);
	
	if (typeof zipCode == 'undefined') {
		return false;
	}
	if (zipCode.value.length == 0) {
		document.getElementById('errorMsg').appendChild(document.createTextNode("You did not enter a postal code."));
		return false;
	}
	// Check for numeric entry
	usRegEx = /^ *[0-9A-Za-z ]{5,} *$/; // allow server-side script to clean up the zip, just make sure they entered SOMETHING
	var validPostalCode = usRegEx.test(zipCode.value);
	if (!validPostalCode) {
		document.getElementById('errorMsg').appendChild(document.createTextNode("The postal code is not in the proper format."));
		return false;
	}
	
	saveStateToCookies();
	loadingMsgText.nodeValue = "Loading postal code location...";
	var url = '_dealer_zip_xml.cfm?zip='+zipCode.value;
	zipRequest.open("GET", url, true);
	zipRequest.onreadystatechange = zoomToZip;
	zipRequest.send(null);
}

function zoomToZip() {
	if (zipRequest.readyState == 4) {
		var xmlDoc = zipRequest.responseXML;
		var errorNodes = xmlDoc.getElementsByTagName('error');
		
		if (errorNodes[0].getAttribute("status") == "FALSE") {
			loadingMsgText.nodeValue = "";
			var latitude = xmlDoc.getElementsByTagName('latitude')[0].firstChild.nodeValue;
			var longitude = xmlDoc.getElementsByTagName('longitude')[0].firstChild.nodeValue;
			map.setCenter(new GLatLng(latitude, longitude), ZIP_CODE_ZOOM_LEVEL);
			map.savePosition();
			if (zipCode.value.length == 6 || zipCode.value.length == 7) {
				countrySelect.selectedIndex = caOpt.index;
			}
			else {
				countrySelect.selectedIndex = usOpt.index;
			}
			mapDiv.focus();
		}
		else {
			var errorMsg = errorNodes[0].firstChild.nodeValue;
			document.getElementById('errorMsg').appendChild(document.createTextNode(errorMsg));
			loadingMsgText.nodeValue = errorMsg;
		}
	}
}

function watchForEnter(e) {
	if (!e) var e = window.event;
	if (e.keyCode == 13) {
		getZipCoords();
	}
}

function getCountryCoords() {
	request.abort();
	infoRequest.abort();
	zipRequest.abort();
	countryRequest.abort();

	var errorTag = document.getElementById('errorMsg');
	while(errorTag.hasChildNodes()) errorTag.removeChild(errorTag.childNodes[0]);
	loadingMsgText.nodeValue = "Loading country location...";

	var country_id = 0;
	if (countrySelect.selectedIndex >= 0) {
		var activeOption = countrySelect.options.item(countrySelect.selectedIndex);
		country_id = activeOption.value;
	}

	saveStateToCookies();
	countryRequest.open("GET", '_dealer_country_xml.cfm?country_id='+country_id, true);
	countryRequest.onreadystatechange = zoomToCountry;
	countryRequest.send(null);
}

function zoomToCountry() {
	if (countryRequest.readyState == 4) {
		var zoomLevel = COUNTRY_ZOOM_LEVEL;
		var xmlDoc = countryRequest.responseXML;
		var errorNodes = xmlDoc.getElementsByTagName('error');
		
		if (errorNodes[0].getAttribute("status") == "FALSE") {
			loadingMsgText.nodeValue = "";
			var latitude = xmlDoc.getElementsByTagName('latitude')[0].firstChild.nodeValue;
			var longitude = xmlDoc.getElementsByTagName('longitude')[0].firstChild.nodeValue;
			var area = xmlDoc.getElementsByTagName('area')[0].firstChild.nodeValue;
			
			zoomLevel = getZoomLevelForCountrySize(area, latitude);
			map.setCenter(new GLatLng(latitude, longitude), zoomLevel);
			map.savePosition();
			mapDiv.focus();
		}
		else {
			var errorMsg = errorNodes[0].firstChild.nodeValue;
			document.getElementById('errorMsg').appendChild(document.createTextNode(errorMsg));
			loadingMsgText.nodeValue = errorMsg;
		}
	}
}

function getZoomLevelForCountrySize(area, latitude) {
	var logBase = 3.3; // (3.3) A smaller number leads to bigger numbers and the view being farther out
	var level = Math.log(area) / Math.log(logBase);
	return 17-Math.max(Math.min(Math.ceil(level),17),8);
}

function stateSavePreferenceChangeHandler() {
	var saveBox = document.getElementById('rememberMe');
	
	if (saveBox.checked) {
		setCookie('dealerLocatorSaveState', "yes");
		saveStateToCookies();
	}
	else {
		setCookie('dealerLocatorSaveState', "no");
		clearStateCookies();
	}
}

function saveStateToCookies() {
	var mapCenter = map.getCenter();
	var userWantsToSave = getCookie('dealerLocatorSaveState');
	
	if (userWantsToSave == "no") {
		return;
	}
	
	setCookie("dealerLocatorLat", mapCenter.lat());
	setCookie("dealerLocatorLng", mapCenter.lng());
	setCookie("dealerLocatorZoom",map.getZoom());
	
	var servsChecked = new Array();
	var prodsChecked = new Array();
	
	for (var b = 0; b < filterCheckboxes.length; b++) {
		var box = filterCheckboxes[b];
		if (box.checked) {
			if (box.name == "serv_id") {
				servsChecked.push(box.value);
			}
			else if (box.name = "prod_id") {
				prodsChecked.push(box.value);
			}
		}
	}
	
	setCookie("dealerLocatorServices",servsChecked.join(","));
	setCookie("dealerLocatorProducts",prodsChecked.join(","));

	if (zipCode.value == zipCode.defaultValue) {
		setCookie("dealerLocatorZipCode", "default");
	}
	else {
		setCookie("dealerLocatorZipCode", zipCode.value);
	}
	
	var country_id = 0;
	if (countrySelect.selectedIndex >= 0) {
		var activeOption = countrySelect.options.item(countrySelect.selectedIndex);
		country_id = activeOption.value;
	}
	setCookie("dealerLocatorCountry", country_id);
	
	var mfg_id = 0;
	if (mfgSelect.selectedIndex >= 0) {
		var activeOption = mfgSelect.options.item(mfgSelect.selectedIndex);
		mfg_id = activeOption.value;
	}
	setCookie("dealerLocatorMfgId", mfg_id);
}
function clearStateCookies() {
	var cookies = ["dealerLocatorLat", "dealerLocatorLng", "dealerLocatorZoom",
					"dealerLocatorServices", "dealerLocatorProducts", "dealerLocatorZipCode",
					"dealerLocatorCountry", "dealerLocatorMfgId"];
	for (var i = 0; i < cookies.length; i++) {
		delCookie(cookies[i]);
	}
}

// Create a cookie with the specified name and value.
function setCookie(sName, sValue) {
	date = new Date(2010,1,1);
	document.cookie = sName + "=" + escape(sValue) + "; expires=" + date.toGMTString();
}

// Retrieve the value of the cookie with the specified name.
function getCookie(sName) {
	// cookies are separated by semicolons
	var aCookie = document.cookie.split("; ");
	for (var i=0; i < aCookie.length; i++)
	{
		// a name/value pair (a crumb) is separated by an equal sign
		var aCrumb = aCookie[i].split("=");
		if (sName == aCrumb[0]) 
			return unescape(aCrumb[1]);
	}

	// a cookie with the requested name does not exist
	return null;
}

function delCookie(sName) {
	var sValue = "null";
	document.cookie = sName + "=" + escape(sValue) + "; expires=Fri, 31 Dec 1999 23:59:59 GMT;";
}

function logDebugMessage(msg) {
	var dbug = document.getElementById('dbug');
	if (!(dbug == null || typeof dbug == 'undefined')) {
		dbug.innerHTML += "<BR>"+msg;
	}
}
