$.fn.address = function(options) {
	options = $.extend({
		country: '.countries',
		state: '.states',
		zip: "#ZipInput",
		empty: false
	}, options);
	
	var 
		form = this,
		usStates = {
			AL: 'Alabama', 
			AK: 'Alaska', 
			AZ: 'Arizona',
			AR: 'Arkansas',
			CA: 'California',
			CO: 'Colorado',
			CT: 'Connecticut',
			DE: 'Delaware',
			DC: 'District Of Columbia',
			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'
		},
		caStates = {
			AB: 'Alberta',
			BC: 'British Columbia',
			MB: 'Manitoba',
			NB: 'New Brunswick',
			NL: 'Newfoundland And Labrador',
			NS: 'Nova Scotia',
			NT: 'Northwest Territories',
			NU: 'Nunavut',
			ON: 'Ontario',
			PE: 'Prince Edward Island',
			QC: 'Quebec',
			SK: 'Saskatchewan', 
			YT: 'Yukon'
		},
		usCode,
		caCode,
		selectedCountry,
		stateInput = $(options.state, form),
		stateField = stateInput.attr('name')
	;
	
	$('option', options.country).each(function() {
		var 
			name = $(this).text(),
			code = $(this).attr('value')
		;
		if(name == 'United States') {
			usCode = code;
		} else if(name == 'Canada') {
			caCode = code;
		}
	});

	function main() {
		selectedCountry = $(options.country, form).val();
		if(selectedCountry == usCode) {
			stateInput.replaceWith(buildSelect(usStates)); 
			if(options.zip) {
				$(options.zip).parents('div:first').addClass('required');
			}
		} else if(selectedCountry == caCode) {
			stateInput.replaceWith(buildSelect(caStates)); 
			if(options.zip) {
				$(options.zip, form).parents('div:first').addClass('required');
			}
		} else {
			stateInput.replaceWith(buildTextInput()); 
			if(options.zip) {
				$(options.zip, form).parents('div:first').removeClass('required');
			}
		}
	}
	
	function buildSelect(items) {
		var currentVal = stateInput.val();
		stateInput = $('<select>').attr('name', stateField);
		
		if(options.empty) {
			var empty = options.empty === true ? ' ' : options.empty;
			$('<option>').text(empty).appendTo(stateInput);
		} 
		
		for(code in items) {
			$('<option>')
				.attr('value', code)
				.attr('selected', (currentVal.toLowerCase() == code.toLowerCase()) ? 'selected' : '')
				.text(items[code])
				.appendTo(stateInput);
		}
		return stateInput;
	}
	
	function buildTextInput() {
		var currentVal = (stateInput.attr('tagName') == 'INPUT') ? stateInput.val() : '';
		stateInput = $('<input>').attr('type', 'text').attr('name', stateField).attr('value', currentVal);
		return stateInput;
	}
	
	$(options.country, form).change(main);
	main();
	return form
	;
}
