// State / Provinces list courtesy of idLiveThere.com
var stateToAbbrev = [];
var abbrevToState = [];

addState("Alaska", "AK");
addState("Alabama", "AL");
addState("Arkansas", "AR");
addState("Arizona", "AZ");
addState("California", "CA");
addState("Colorado", "CO");
addState("Connecticut", "CT");
addState("District of Columbia", "DC");
addState("DC", "DC");
addState("Delaware", "DE");
addState("Florida", "FL");
addState("Georgia", "GA");
addState("Hawaii", "HI");
addState("Iowa", "IA");
addState("Idaho", "ID");
addState("Illinois", "IL");
addState("Indiana", "IN");
addState("Kansas", "KS");
addState("Kentucky", "KY");
addState("Louisiana", "LA");
addState("Massachusetts", "MA");
addState("Maryland", "MD");
addState("Maine", "ME");
addState("Michigan", "MI");
addState("Minnesota", "MN");
addState("Missouri", "MO");
addState("Mississipi", "MS");
addState("Montana", "MT");
addState("North Carolina", "NC");
addState("North Dakota", "ND");
addState("Nebraska", "NE");
addState("New Hampshire", "NH");
addState("New Jersey", "NJ");
addState("New Mexico", "NM");
addState("Nevada", "NV");
addState("New York", "NY");
addState("Ohio", "OH");
addState("Oklahoma", "OK");
addState("Oregon", "OR");
addState("Pennsylvania", "PA");
addState("Rhode Island", "RI");
addState("South Carolina", "SC");
addState("South Dakota", "SD");
addState("Tennessee", "TN");
addState("Texas", "TX");
addState("Utah", "UT");
addState("Virginia", "VA");
addState("Vermont", "VT");
addState("Washington", "WA");
addState("Wisconsin", "WI");
addState("West Virginia", "WV");
addState("Wyoming", "WY");
addState("Alberta", "AB");
addState("British Columbia", "BC");
addState("Manitoba", "MB");
addState("New Brunswick", "NB");
addState("Northwest Territories", "NWT");
addState("Newfoundland and Labrador", "NL");
addState("Nova Scotia", "NS");
addState("Nunavut", "NU");
addState("Ontario", "ON");
addState("Prince Edward Island", "PEI");
addState("Quebec", "QC");
addState("Québec", "QC");
addState("Saskatchewan", "SK");
addState("Yukon", "YT");

function addState(full, shortName)
{
	stateToAbbrev[full] = shortName;
	abbrevToState[shortName] = full; 
}

// returns the full name if given an abbreviation, or the abbreviation if given a full name
function convertState(current)
{
	return current.length <= 3 ? abbrevToState[current] : stateToAbbrev[current];
}

function toggleLocationField() { $('#location_section').toggle();} 

function clearText() 
{ 
	var DEFAULT_TEXT = "city, state or postal code";
	var field = document.locationForm.locationField;
	if(field.value == DEFAULT_TEXT) 
	field.value = '';
}

function submitLocationForm()
{
	var submitButton = document.locationForm.send;
	submitButton.disabled = true;
	submitButton.value = 'Loading...';
	
	findState(document.locationForm.locationField.value);
}

var geocoder;

function findState(location)
{
	if(GBrowserIsCompatible())
	{
		geocoder = new GClientGeocoder();
		geocoder.getLatLng(location, function(ll) { if(!ll) { alert("Couldn't geocode this location"); return } reverseGeo(ll);});
	}
}

function reverseGeo(ll)
{
	geocoder.getLocations(ll, function(p) { if(!p) { alert("Couldn't reverse geocode this location"); return } processPlaces(p);});
}

function processPlaces(p)
{
	if(p.Status.code == 200)
	{
		
		var allStates = [];
		var allCountries = [];
		var placemarks = p.Placemark;
		// TODO: double check that an array of placemarks is always returned
		for(var i = 0 ; i < placemarks.length ; i++)
		{
			var countryInfo = placemarks[i].AddressDetails.Country;
			var countryName = countryInfo.CountryName;
			if(countryInfo.AdministrativeArea)
			{
				var stateAbbrev = countryInfo.AdministrativeArea.AdministrativeAreaName;
				if(allStates.indexOf(stateAbbrev) == -1) allStates.push(stateAbbrev);
				if(allCountries.indexOf(countryName) == -1) allCountries.push(countryName);
			}
		}
		if(allCountries.length == 1 && allStates.length == 1) // found an unambiguous match
		{
			var expires = new Date();
			expires.setDate(expires.getDate()+365);
			document.cookie = "location="+escape(convertState(allStates[0]))+":"+escape(allCountries[0])+";expires="+expires.toGMTString();
			window.location.reload();
		}
	}
}

function incrementArray(array, item)
{
	if(array.indexof(item) == -1) array.push(item);
}

