$(function(){
	var usStates = {AL: "Alabama", AK: "Alaska", AZ: "Arizona", AR: "Arkansas", CA: "California", CO: "Colorado", CT: "Connecticut", DE: "Delaware", FL: "Florida", GA: "Georgia", HI: "Hawaii", ID: "Idaho", IL: "Illinois", IN: "Indiana", IA: "Iowa", KS: "Kansas", KY: "Kentucky", LA: "Louisiana", ME: "Maine", MD: "Maryland", MA: "Massachusetts", MI: "Michigan", MN: "Minnesota", MS: "Mississippi", MO: "Missouri", MT: "Montana", NE: "Nebraska", NV: "Nevada", NH: "New Hampshire", NJ: "New Jersey", NM: "New Mexico", NY: "New York", NC: "North Carolina", ND: "North Dakota", OH: "Ohio", OK: "Oklahoma", OR: "Oregon", PA: "Pennsylvania", RI: "Rhode Island", SC: "South Carolina", SD: "South Dakota", TN: "Tennessee", TX: "Texas", UT: "Utah", VT: "Vermont", VA: "Virginia", WA: "Washington", WV: "West Virginia", WI: "Wisconsin", WY: "Wyoming"};
	var auStates = {AAT: "Australian Antarctic Territory", ACT: "Australian Capital Territory", NT: "Northern Territory", NSW: "New South Wales", QLD: "Queensland", SA: "South Australia", TAS: "Tasmania", VIC: "Victoria", WA: "Western Australia"};
	
	var $state = $(".ow-form-row-id-state");
	
	if($state.length) {
		var stateSelector = pp.StateSelector({
			selector: ".ow-form-row-id-state",
			countrySelect: ".ow-form-element-countryselect"
		});
	
		stateSelector.addStateList("us", usStates);
		stateSelector.addStateList("au", auStates);
	
		stateSelector.refreshSelect();
	}
});

pp.StateSelector = function(spec, my) {
	spec = spec || {};
	my = my || {};
	
	my.$pane = $(spec.selector);
	if(!spec.selector || !my.$pane.length){
		throw "'selector' was not specified in spec, or do not yield any results";
	}
	
	if(!spec.countrySelect) {
		throw "Option 'countrySelect' is required";
	}
	my.$countrySelect = $(spec.countrySelect);
	
	// my.inputId = $("input,select", my.$pane).eq(0).attr("id");
	my.originalInput = $("input,select", my.$pane).eq(0);
	my.states = {};
	
	my.makeSelect = function(country) {
		var html = '<select id="' + my.originalInput.attr("id") + '" name="' + my.originalInput.attr("name") + '" class="' + my.originalInput.attr("class") + '">';
		for(var k in my.states[country]) {
			if(typeof my.states[country][k] != "function"){
				html += '<option value="' + k + '">' + my.states[country][k] + '</option>';
			}
		}
		html += "</select>";
		
		return $(html);
	};
	
	var that = {};
	
	that.addStateList = function(country, list) {
		my.states[country.toLowerCase()] = list;
	};
	
	that.refreshSelect = function() {
		var country = my.$countrySelect.val().toLowerCase();
		var $currentField = $("select, input", my.$pane).eq(0);
		var currentState = $currentField.val();
		if(my.states[country]) {
			$currentField.replaceWith(my.makeSelect(country).val(currentState));
		} else if($("select", my.$pane).length) {
			$currentField.replaceWith(my.originalInput.val(""));
		}
	};
	
	that.init = function() {
		my.$countrySelect.change(that.refreshSelect);
	};
	
	// public functions go here
	
	that.init();
	
	return that;
};
