//**************************************************************************************************//
//**************************************************************************************************//
// these variables can be overwritten in the page
//**************************************************************************************************//
//**************************************************************************************************//
var _address; 
/*
Possible values of the variable _address. Address(es) have to be encoded!
ONLY ONE SOLUTION AT EACH TIME!

1. ONLY SINGLE ADDRESS
	_address = "51|48|48|53|53|32|67|101|110|116|114|97|108|32|65|118|101|32|78|117|101|118|111|44|32|67|65|32|57|50|53|54|55|32|85|83";

2. MULTIBE ADDRESSES
	_address = new Array;
	_address[0] = "51|48|48|53|53|32|67|101|110|116|114|97|108|32|65|118|101|32|78|117|101|118|111|44|32|67|65|32|57|50|53|54|55|32|85|83";
	_address[1] = "49|51|32|77|111|114|110|105|110|103|32|68|111|118|101|32|76|97|103|117|110|97|32|78|105|103|117|101|108|44|32|67|65|32|57|50|54|55|55|32|85|83";

3. SINGLE LAT/LNG ADDRESS
	_address = new Array;
	_address[0] = new Array(1);
	_address[0][0] = "32.710864";
	_address[0][1] = "-117.148333";		

4. MULTIPLE LAT/LNG ADDRESSES
	_address = new Array;
	_address[0] = new Array(1);
	_address[1] = new Array(1);
	_address[0][0] = "32.710864";
	_address[0][1] = "-117.148333";		
	_address[1][0] = "32.985052";
	_address[1][1] = "-117.233047";		
*/

var _public = true; // defines if the address is public or private
var _openPrint = false; // print mode for open houses flyer
var _zoomControl = true; // true or false for zoom control on map
var _letteredMarker = false; // define if marker has a letter or only a dot
var _activeMarker = false;
var _onlyShowLngLat = false;
var _zoomControlLarge = false;
var _mapTypeControl = true;
var _mapOverviewControl = true;
var _dragable = true;
var _publicZoomLevel  = 16;
var _privateZoomLevel = 14;
var _print = false;

var _cf = false; // defines if JS is active to pass vars or do we store the data right away with CF
//**************************************************************************************************//
//**************************************************************************************************//
//**************************************************************************************************//

var map;
var geocoder;
var _zoomLevel;
var _defaultZoomLevel = 4;

var _markerArray = new Array();
var _arrGAddress = new Array();

// Create a base icon for all of our markers that specifies the
// shadow, icon dimensions, etc.
var baseIcon = new GIcon();
baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
baseIcon.iconSize = new GSize(20, 34);
baseIcon.shadowSize = new GSize(37, 34);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor = new GPoint(9, 2);
baseIcon.infoShadowAnchor = new GPoint(18, 25);

if (!GBrowserIsCompatible()) {
	location.href = "http://browser_not_compatible_url"; // to be changed
}

function load() {
	defineMapSettings();
	map = new GMap2(e("map"));
	if (_print){
		GEvent.addListener(map, 'load', function(){window.print();});
	}
	map.setCenter(new GLatLng(37.062500,-95.677068), _defaultZoomLevel);
	if (_zoomControl) {
		if (_zoomControlLarge) {
			map.addControl(new GLargeMapControl());
		}
		else {
			map.addControl(new GSmallMapControl());
		}
	}
	if (_mapTypeControl) map.addControl(new GMapTypeControl());
	if (_mapOverviewControl) map.addControl(new GOverviewMapControl());
	if (!_dragable) map.disableDragging();
	geocoder = new GClientGeocoder();
	map.clearOverlays();
	
	if (_address != null) {
		
	//	if (_address.constructor.toString().indexOf("Array") != -1) {
		if (isArray(_address)) {
			multipleLocations(_address);
		} 
		else {
			geocoder.getLocations(a(_address), addAddressToMapGeo);
		}	
	}
}

function loadAccess() {
	defineMapSettings();
}

function defineMapSettings() {
	_zoomLevel = _publicZoomLevel;
	if (!_public) {
		_zoomLevel = _privateZoomLevel;
		_zoomControl = false;
	}
	if (_openPrint) {
		_mapTypeControl = false;
		_mapOverviewControl = false;
		_zoomControl = false;
		_dragable = false;		
	}
}

function multipleLocations(arrPoints) {
	var cntArrPoints = 0;
	var d = 0;
	var arrGeo = new Array;
	for (var i = 0; i < arrPoints.length-1; i++) {
//		if (arrPoints[i].constructor.toString().indexOf("Array") != -1) {
		if (isArray(arrPoints[i])) {
			// lat/lng has been passed
			if ((arrPoints[i][0] != "" || arrPoints[i][0] != 0) || (arrPoints[i][1] != "" || arrPoints[i][1] != 0)) {
				// check if only on address is passed, if so show dotted marker
				if (arrPoints.length == 1) {
					addSingleAddressToMap(arrPoints[i][0], arrPoints[i][1])
				}
				// here we show alphabetical markers
				else {
					addMultipleAddressesToMap(arrPoints[i][0], arrPoints[i][1], i)
				}
			}
		}
		else {
			// real address has been passed, now we have to geo code
			geocoder.getLocations(a(arrPoints[i]), myfunc);
		}
	}
	
	function myfunc(response) {
		if (!response || response.Status.code != 200) {
			alert("Sorry, we were unable to geocode that address");
		} else {
			var placeArray = response.Placemark;
			// go thru array, if we got multiple results
			for (var i = 0; i < placeArray.length; i++) {
				place = placeArray[i];
				addMultipleAddressesToMap(place.Point.coordinates[1], place.Point.coordinates[0], cntArrPoints)
			}
		}
		cntArrPoints++;
	}
}

function addSingleAddressToMap(lat, lng) {
	var t = "";
	addSingleAddressToMapWithText(lat, lng, t)
}

function addMultipleAddressesToMap(lat, lng, x) {
	var t = "";
	addMultipleAddressesToMapWithText(lat, lng, t, x)
}

function addSingleAddressToMapWithText(lat, lng, t) {
	point = new GLatLng(lat, lng);
	if (_letteredMarker) {
		var marker = createLetterMarker(point, t, 0);
	}
	else {
		var marker = createMarker(point, t);
	}
	map.addOverlay(marker);
	// open marker if _activeMarker is true
	if (_activeMarker) {
		marker.openInfoWindowHtml(t);
	}
	reCenterMap();
}

function addMultipleAddressesToMapWithText(lat, lng, t, x) {
	point = new GLatLng(lat, lng);
	if (_letteredMarker) {
		var marker = createLetterMarker(point, t, x);
	}
	else {
		var marker = createMarker(point, t);
	}
	map.addOverlay(marker);
	reCenterMap();
}

// addAddressToMap() is called when the geocoder returns an
// answer.  It adds a marker to the map with an open info window
// showing the nicely formatted version of the address and the country code.
function addAddressToMapGeo(response) {
	var _county = "";
	var _state = "";
	var _city = "";
	var _locality = "";
	var _streetAddress = "";
	var _zip = "";
	var _lat = "";
	var _lng = "";
	
	if (!response || response.Status.code != 200) {
		alert("Sorry, we were unable to geocode that address");
	} 
	else {
		placeArray = response.Placemark;
		// go thru array, if we got multiple results
		for (var i = 0; i < placeArray.length; i++) {
			place = placeArray[i];
			point = new GLatLng(place.Point.coordinates[1],
								place.Point.coordinates[0]);
	
			_county = place.AddressDetails.Country.CountryNameCode;
			if (_county == "US") {
				_state = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
				if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea != null) {
					_city = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;
					if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality != null) {
						_locality      = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
						_streetAddress = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
						_zip           = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
						_lat           = place.Point.coordinates[1];
						_lng           = place.Point.coordinates[0];
					}
				/* 
				ADDED: 04/29/2008 Google hack !!!!!!!!!!!!!!!!!!!!!
				KML did not have SubAdministrativeArea				
				*/
				} else {
					if (place.AddressDetails.Country.AdministrativeArea.Locality != null) {
						_locality      = place.AddressDetails.Country.AdministrativeArea.Locality.LocalityName;
						_streetAddress = place.AddressDetails.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
						_zip           = place.AddressDetails.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber;
						_lat           = place.Point.coordinates[1];
						_lng           = place.Point.coordinates[0];
					}
				}
			}
			
			_arrGAddress[i] = new Array(7);
			
			_arrGAddress[i][0] = _streetAddress;
			_arrGAddress[i][1] = _city;
			if (_locality != "") _arrGAddress[i][1] = _locality;
			_arrGAddress[i][2] = _state;
			_arrGAddress[i][3] = _zip;
			_arrGAddress[i][4] = _county;
			_arrGAddress[i][5] = _lat;
			_arrGAddress[i][6] = _lng;
			
			//if(_arrGAddress[i][0] != ''){
				var t =
				'<span class="marker">' +
				'<b>Street Address: </b>' + _arrGAddress[i][0] + '<br>' +
				'<b>City, St Zip:   </b>' + _arrGAddress[i][1] + ', ' +_arrGAddress[i][2] + ' ' + _arrGAddress[i][3] + '<br>' +
				'<br>' +
				'Use this address ';
		 
				if (_cf) {
					t = t + '<input type="button" onclick="passMarkerValuesCf(' + i + ')" title="go" value="Confirm">';
				}
				else {
					t = t + '<input type="button" onclick="passMarkerValues(' + i + ', parent.document, parent.document.forms[0])" title="Confirm" value="Confirm">';
				}
					
				t = t + '</span>';
			/*}
			else{
				var t =
				'<span class="marker">' +
				'<b>No Exact Match</b><br> Please select <b>\'No Match\'</b> below. <br>' +
				'<br>' + '</span>';
			}*/
			
			if (_onlyShowLngLat) {
				_activeMarker = true;
				var t =
				'<span class="marker">' +   
				'<b>Lat: </b>' + place.Point.coordinates[1] + '<br>' +
				'<b>Lng: </b>' + place.Point.coordinates[0] + '<br>' +
				'<br>' + '</span>';
			}
			
			// set marker
			var marker = createMarker(point, t);
			map.addOverlay(marker);
			
			// if only one returned address open marker right away
			if (placeArray.length == 1 && _activeMarker) {
				marker.openInfoWindowHtml(t);
			}
	
			// center map and adjust the map to show all marker(s)
			reCenterMap();
		}
	}
}

function reCenterMap() {
	var bounds = arrayBounds(_markerArray);
	var center_lat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) / 2.0;
	var center_lng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) / 2.0;
	var center = new GLatLng(center_lat,center_lng)
	var zoom = map.getBoundsZoomLevel(bounds);
	if (_zoomLevel < zoom) zoom = _zoomLevel;
	map.setCenter(center,zoom-1);
}

function createMarker(point, t) {
	var marker = new GMarker(point);
	_markerArray.push(marker);
	if (_activeMarker) {
		GEvent.addListener(marker, "mouseover", function() {
			marker.openInfoWindowHtml(t);
		});
		
	}
	return marker;
}

function createLetterMarker(point, t, index) {
	// Create a lettered icon for this point using our icon class
	var letter = String.fromCharCode("A".charCodeAt(0) + index);
	var icon = new GIcon(baseIcon);
	icon.image = "http://www.google.com/mapfiles/marker" + letter + ".png";
	var marker = new GMarker(point, icon);
	_markerArray.push(marker);
	reCenterMap();
	return marker;
}


function e(id) {
	return document.getElementById(id);
}

function getWindowHeight() {
	if (window.self && self.innerHeight) {
		return self.innerHeight;
	}
	if (document.documentElement && document.documentElement.clientHeight) {
		return document.documentElement.clientHeight;
	}
	return 0;
}

function resizeApp() {
	var offsetTop = 0;
	var mapElem = e("map");
	for (var elem = mapElem; elem != null; elem = elem.offsetParent) {
		offsetTop += elem.offsetTop;
	}
	var height = getWindowHeight() - offsetTop - 10;
	if (height >= 0) {
		mapElem.style.height = height + "px";
	}
}

function arrayBounds(ary) {
	// compute the bounds for an array of markers
	var bounds = new GLatLngBounds();
	if (ary && ary.length > 0) {
		for (var i = 0; i < ary.length; i++) {
			var marker = ary[i];
			if (marker) {
				bounds.extend(marker.getPoint());
			}
		}
	}
	return bounds;
}

function passMarkerValues(i, objOpener, objForm) {
	
	var _streetAddress = _arrGAddress[i][0];
	var _city          = _arrGAddress[i][1];
	var _state         = _arrGAddress[i][2];
	var _zip           = _arrGAddress[i][3];
	var _county        = _arrGAddress[i][4];
	var _lat           = _arrGAddress[i][5];
	var _lng           = _arrGAddress[i][6];
	
	// split the streetnumber from the variable _streetAddress
	var _numFirstSpace = _streetAddress.indexOf(' ');
	var _strStreetNumber = _streetAddress.substring(0,_numFirstSpace);
	var _strStreetName = _streetAddress.substring(_numFirstSpace +1 ); // we cat the space between.

	if (_strStreetName != "") objForm.streetName.value = _strStreetName;
	if (_strStreetNumber != "") objForm.streetNo.value = _strStreetNumber;
	if (_city != "") objForm.geocity.value = _city;
	if (_zip != "") objForm.geozipcode.value = _zip;
	var url_check = objOpener.title.search("Express"); 
	if (url_check != -1) { 
   		if (_zip != "") objForm.zipcode.value = _zip; 
		//objForm.city.value = _city;
	} 
	if (_lat != "") objForm.lat.value = _lat;
	if (_lng != "") objForm.lng.value = _lng;
	
	objForm.mapchecked.value = "1";
	objForm.addressConfirmed.value = 'true';
	objForm.verifier.value = 'Address Verified';
	objForm.verifier.disabled = true;
	objOpener.getElementById('gFrame').style.height='0pt';
	objOpener.getElementById('gFrame').style.width='0pt';
	
	//if ((_strStreetName != "" && _strStreetNumber != "" && _city != "" && _zip != "") && _county == "US") {	
		//objForm.mappable.value = "true";
	//}

}


function passMarkerValuesCf(i) {
	var _streetAddress = _arrGAddress[i][0];
	var _city          = _arrGAddress[i][1];
	var _state         = _arrGAddress[i][2];
	var _zip           = _arrGAddress[i][3];
	var _county        = _arrGAddress[i][4];
	var _lat           = _arrGAddress[i][5];
	var _lng           = _arrGAddress[i][6];
	
	var _numFirstSpace = _streetAddress.indexOf(' ');
	var _strStreetNumber = _streetAddress.substring(0,_numFirstSpace);
	var _strStreetName = _streetAddress.substring(_numFirstSpace +1 ); // we cut at the space between.
	
	var _a = 'sno=' + _strStreetNumber + '&sna=' + _strStreetName + '&city=' + _city + '&st=' + _state + '&zip=' + _zip + '&co=' + _county + '&lat=' + _lat + ' &lng=' + _lng;
	window.location.href = 'XX-00-00-cf-address-change.cfm?lid=' + _lid + '&ad=' + b(_a);
}


function a(str) {
   var newstr=""
   strArr=str.split('|')
   for (i=0,n=strArr.length;i<n;i++) {
      newstr += String.fromCharCode(strArr[i])
   }
   return newstr   
}   

function b(str) {
   var newstr=""
   for (i=0,n=str.length;i<n;i++) newstr += '|'+str.charCodeAt(i);
   return newstr.substring(1);
}   

function openMapWindow(values) {
	winMap = window.open("PA-05-00-address-lookup.cfm?address="+values, "winMap", "height=600, width=800");
	winMap.focus();
	return false;
}

function getAddressValues(objOpener, objForm) {
	var country = objForm.country.value
	var street = objForm.streetName.value;
	if(street == '' && (country == 'US' || country == 'Canada')){
		alert('Street Name is required to confirm an address.');
		return false;
	}
	var street_no = objForm.streetNo.value;
	if(street_no == '' && (country == 'US' || country == 'Canada')){
		alert('Street Number is required to confirm an address.');
		return false;
	}
	var city = objForm.city.value;
	if(city == ''){
		alert('City Name is required to confirm an address.');
		return false;
	}
	var zipcode = objForm.zipcode.value;
	if(zipcode == '' && (country == 'US' || country == 'Canada')){
		alert('Zip Code is required to confirm an address.');
		return false;
	}
	if(country == 'US'){
		country = '';
	}
	//objForm.addressConfirmed.value = 'true';
	objOpener.getElementById('gFrame').style.width='500pt';
	objOpener.getElementById('gFrame').style.height='300pt';
	objOpener.getElementById('gFrame').src = '/map/addressLookup.cfm?address=' + b(street_no + ' ' + street + ', ' + city + ', ' + zipcode + ' ' + country); 
}

function getAddressValuesNoZip(objOpener, objForm) {
	var street = objForm.streetName.value;
	if(street == ''){
		alert('Street Name is required to confirm an address.');
		return false;
	}
	var street_no = objForm.streetNo.value;
	//if(street_no == ''){
		//alert('Street Number is required to confirm an address.');
		//return false;
	//}
	var city = objForm.city.value;
	if(city == ''){
		alert('City Name is required to confirm an address.');
		return false;
	}
	var zipcode = objForm.zipcode.value;
	//if(zipcode == ''){
		//alert('Zip Code is required to confirm an address.');
		//return false;
	//}
	var country = objForm.country.value;
	if(country == 'US'){
		country = '';
	}
	//alert(street_no + ' ' + street + ', ' + city + ', ' + zipcode + ' ' + country);
	//alert(b(street_no + ' ' + street + ', ' + city + ', ' + zipcode + ' ' + country));
	objForm.addressConfirmed.value = 'true';
	objOpener.getElementById('gFrame').style.width='500pt';
	objOpener.getElementById('gFrame').style.height='300pt';
	objOpener.getElementById('gFrame').src = '/map/addressLookup.cfm?address=' + b(street_no + ' ' + street + ', ' + city + ', ' + zipcode + ' ' + country); 
}

function unVerify(objForm){
	objForm.mapchecked.value = "0";
	objForm.verifier.value = 'Verify Address';
	objForm.verifier.disabled = false;
	objForm.addressConfirmed.value = 'false';
	objForm.geocity.value = '';
	objForm.geozipcode.value = '';
	objForm.lat.value = '';
	objForm.lng.value = ''; 
}

function noMatch(objOpener, objForm){
	//objForm.mappable.value = "0";
	objForm.mapchecked.value = "1";
	objForm.addressConfirmed.value = 'true';
	objForm.verifier.value = 'No Address Match';
	objOpener.getElementById('gFrame').style.height='0pt';
}

function noMatchCf() {
	window.location.href = 'XX-00-00-cf-address-change.cfm?lid=' + _lid + '&nomatch';
}

String.prototype.toCapitalCase = function() {
	var re = /\s/;
	var words = this.split(re);
	re = /(\S)(\S+)/;
	for (i = words.length - 1; i >= 0; i--) {
		re.exec(words[i]);
		words[i] = RegExp.$1.toUpperCase()
		+ RegExp.$2.toLowerCase();
	}
	return words.join(' ');
} 

function isArray(obj) { 
	var ret = false; 
	if ((obj) && (!(isNaN(parseInt(obj.length))))) { 
		var len = parseInt(obj.length, 10); 
		if (len == obj.length) { 
			obj[len] = 'probe'; 
			ret = (len < obj.length); 
			delete obj[len]; 
		} 
	} 
	return ret; 
} 

