/* $Id: change_states.js,v 1.7.2.5 2007/02/20 11:26:13 max Exp $ */

/*
	Initialization procedure
*/
function init_js_states(obj, state_name, county_name, state_value, county_value, force_run) {
	if (!obj || typeof(state_name) != 'string' || !state_name || !obj.form.elements.namedItem(state_name))
		return false;

	/* Get child objects	*/
	obj.states = obj.form.elements.namedItem(state_name);
	obj.counties = (typeof(county_name) == 'string' && county_name) ? obj.form.elements.namedItem(county_name) : false;

	obj.lastCode = false;
	obj.lastStateCode = false;
	obj.defaultStates = [];
	if (obj.counties)
		obj.defaultCounties = [];

	/* Get default values	*/
	var code = obj.options[obj.selectedIndex].value;
	if (countries[code] && countries[code].states && countries[code].states.length > 0) {
		for (var i in countries[code].states) {
			if (countries[code].states[i].code == state_value) {

				/* Save default state	*/
				obj.defaultStates[code] = i;
				if (obj.counties && countries[code].states[i].counties && countries[code].states[i].counties.length > 0) {
					for (var x in countries[code].states[i].counties) {
						if (x == county_value) {

							/* Save default county	*/
							obj.defaultCounties[i] = x;
							break;
						}
					}
				}
				break;
			}
		}
	}

	/* Save state and/or county full name	*/
	if (!obj.defaultStates[code]) {
		obj.defaultStateFull = state_value;
		obj.defaultCountyFull = county_value;
	} else if (obj.counties && !obj.defaultCounties[obj.defaultStates[code]]) {
		obj.defaultCountyFull = county_value;
	}

	obj.states.countries = obj;
	obj.statesName = state_name;
	if (obj.counties) {
		obj.counties.countries = obj;
		obj.countiesName = county_name;
	}

	/* Define handler for onchange events	*/
	if (obj.onchange)	
		obj.oldOnchange = obj.onchange;
	obj.onchange = change_states;

	if (obj.states.onchange)	
		obj.oldStatesOnchange = obj.states.onchange;
	obj.states.onchange = change_counties;

	if (obj.counties && obj.counties.onchange) {
		obj.oldCountiesOnchange = obj.counties.onchange;
	}

	/* Object settings	*/
	obj.statesInputSize = 32;
	obj.statesInputMaxLength = false;
	obj.statesSpanClass = "SmallText";
	obj.statesSpanStyle = false;
	obj.statesSelectClass = false;
	obj.statesSelectStyle = false;
	obj.statesInputClass = false;
	obj.statesInputStyle = false;
	obj.statesNoStates = window.txt_no_states ? txt_no_states : false;
	obj.countiesNoCounties = window.txt_no_counties ? txt_no_counties : false;

	if (force_run) {
		start_js_states(document.getElementById(obj.id));

	} else if (window.addEventListener) {
		window.addEventListener("load", new Function('', "start_js_states(document.getElementById('"+obj.id+"'))"), false);

	} else if (window.attachEvent) {
		window.attachEvent("onload", new Function('', "start_js_states(document.getElementById('"+obj.id+"'))"));

	} else if (localBFamily != 'MSIE' || (localPlatform != 'MacPPC' && localPlatform != 'Mac')) {
		if (window.onload)
			window.oldOnload = window.onload;
		window.onload = new Function('', "if (this.oldOnload) this.oldOnload(); start_js_states(document.getElementById('"+obj.id+"'))");

	} else {
		setTimeout("start_js_states(document.getElementById('"+obj.id+"'))", 3000);

	}

	check_countries(obj);

	return obj;
}

/*
	Initial object run
*/
function start_js_states(obj) {
	if (obj && obj.onchange) {
		if (localBFamily == 'Opera') {
			var p = obj;
			while (p.parentNode) {
				if (p.style.display == 'none') {
					return;
				}
				p = p.parentNode;
			}
		}

		obj.onchange();
	}
}

/*
	Change states list
*/
function change_states() {
	var code = this.options[this.selectedIndex].value;

	/* Detect input box type and get default value	*/
	if (this.states.tagName.toUpperCase() == 'SPAN') {
		var type = false;

	} else if (this.states.tagName.toUpperCase() == 'SELECT') {
		var type = 'S';
		if (this.lastCode && countries[this.lastCode] && countries[this.lastCode].states && countries[this.lastCode].states.length > 0) {
			for (var i in countries[this.lastCode].states) {
				if (countries[this.lastCode].states[i].code == this.states.options[this.states.selectedIndex].value) {
					this.defaultStates[this.lastCode] = i;
					break;
				}
			}
		}

	} else if (this.states.tagName.toUpperCase() == 'INPUT') {
		var type = 'I';
		this.defaultStateFull = this.states.value;

	} else {
		return true;
	}

	if (countries[code].states === false) {
		/* If current country hasn't any states	*/
		if (type !== false) {
			this.states = tag_replace(this.states, "SPAN");
			if (this.statesNoStates)
				this.states.innerHTML = this.statesNoStates;
			if (this.statesSpanClass)
				this.states.className = this.statesSpanClass;
			this.states.countries = this;
			this.states.onchange = change_counties;
		}

	} else if (countries[code].states.length == 0) {
		/* If current country has empty states list	*/
		if (type != "I") {
			this.states = tag_replace(this.states, "INPUT", this.statesName);
			if (this.statesInputSize)
				this.states.size = this.statesInputSize;
			if (this.statesInputMaxLength)
				this.states.maxLength = this.statesInputMaxLength;
			if (this.statesInputClass)
				this.states.className = this.statesInputClass;
			this.states.countries = this;
			this.states.onchange = change_counties;
			this.states.oldOnchange = this.oldStatesOnchange;
		}
		if (this.defaultStateFull)
			this.states.value = this.defaultStateFull;

	} else if (countries[code].states.length > 0) {
		/* If current country has states list	*/
		if (type != "S") {
			this.states = tag_replace(this.states, "SELECT", this.statesName);
			if (this.statesSelectClass)
				this.states.className = this.statesSelectClass;
			this.states.countries = this;
			this.states.onchange = change_counties;
			this.states.oldOnchange = this.oldStatesOnchange;

		}

		/* States list cleaning	*/
		if ((this.lastCode != code || states_sort_override) && type == 'S') {
			while (this.states.options.length > 0)
				this.states.options[this.states.options.length-1] = null;
		}

		if (type != 'S' || this.lastCode != code) {
			/* Fill states list	*/
			if (states_sort_override) {

				/* Sort	*/
				var tmp = [];
				for (var i in countries[code].states) {
					tmp[i] = {
						name: countries[code].states[i].name,
						code: countries[code].states[i].code,
						order: countries[code].states[i].order,
						idx: i
					};
				}
				tmp.sort(sort_states);

				/* Fill list	*/
				for (var i in tmp) {
					if (!tmp[i])
						continue;

					this.states.options[this.states.options.length] = new Option(tmp[i].name, tmp[i].code);
					if (this.defaultStates[code] == tmp[i].idx) {
						this.states.options[this.states.options.length-1].selected = true;
						this.states.selectedIndex = this.states.options.length-1;
					}
				}

				/* Set default state	*/
			} else {
				for (var i in countries[code].states) {
					this.states.options[this.states.options.length] = new Option(countries[code].states[i].name, countries[code].states[i].code);
					if (this.defaultStates[code] == i)
						this.states.options[this.states.options.length-1].selected = true;
				}
			}

		} else if (this.defaultStates[code] && countries[code].states[this.defaultStates[code]]) {
			/* Set default state	*/
			for (var i = 0; i < this.states.options.length; i++) {
				if (this.states.options[i].value == countries[code].states[this.defaultStates[code]].code) {
					this.states.options[i].selected = true;
					this.states.selectedIndex = i;
					break;
				}
			}		

		} else {
			this.states.options[0].selected = true;
			this.states.selectedIndex = 0;
		}
	}

	/* Call old onchange event handler	*/
	if (this.oldOnchange)
		this.oldOnchange();

	/* Call counties rebuild procedure	*/
	if (this.states.onchange)
		this.states.onchange();

	this.oldSelectedIndex = this.selectedIndex;

	this.lastCode = code;

}

/*
	Change counties list
*/
function change_counties() {
	if (!this.countries || !this.countries.counties)
		return true;

	var counties = this.countries.counties;
	var code = this.countries.options[this.countries.selectedIndex].value;
	var scode = false;
	if (this.options && countries[code].states && countries[code].states.length > 0 && this.options[this.selectedIndex]) {
		for (var i in countries[code].states) {
			if (countries[code].states[i].code == this.options[this.selectedIndex].value) {
				scode = i;
				break;
			}
		}
	} else if (this.tagName.toUpperCase() == "INPUT") {
		scode = 0;
	}

	/* Detect input box type and get default value	*/
	if (counties.tagName.toUpperCase() == 'SPAN') {
		var type = false;

	} else if (counties.tagName.toUpperCase() == 'SELECT') {
		var type = 'S';
		if (this.countries.lastCode && this.countries.lastStateCode && countries[this.countries.lastCode] && countries[this.countries.lastCode].states && countries[this.countries.lastCode].states[this.countries.lastStateCode] && countries[this.countries.lastCode].states[this.countries.lastStateCode].counties && countries[this.countries.lastCode].states[this.countries.lastStateCode].counties.length > 0) {
			for (var i in countries[this.countries.lastCode].states[this.countries.lastStateCode].counties) {
				if (i == counties.options[counties.selectedIndex].value) {
					this.countries.defaultCounties[this.countries.lastStateCode] = i;
					break;
				}
			}
		}

	} else if (counties.tagName.toUpperCase() == 'INPUT') {
		var type = 'I';
		this.countries.defaultCountyFull = counties.value;

	} else {
		return true;
	}

	if (scode === false) {
		/* If current country hasn't any states	and counties	*/
		if (type !== false) {
			this.countries.counties = counties = tag_replace(counties, "SPAN");
			if (this.countries.countiesNoCounties)
				counties.innerHTML = this.countries.countiesNoCounties;
			if (this.countries.statesSpanClass)
				counties.className = this.countries.statesSpanClass;
		}

	} else if (!countries[code].states[scode] || countries[code].states[scode].counties.length == 0) {
		/* If current country hasn't states	or current state hasn't counties list */
		if (type != "I") {
			this.countries.counties = counties = tag_replace(counties, "INPUT", this.countries.countiesName);
			if (this.countries.statesInputSize)
				counties.size = this.countries.statesInputSize;
			if (this.countries.statesInputMaxLength)
				counties.maxLength = this.countries.statesInputMaxLength;
			if (this.countries.statesInputClass)
				counties.className = this.countries.statesInputClass;
			if (this.countries.oldCountiesOnchange)
				counties.onchange = this.countries.oldCountiesOnchange;
		}
		if (this.countries.defaultCountyFull)
			counties.value = this.countries.defaultCountyFull;

	} else if (countries[code].states[scode].counties.length > 0) {
		/* If current state has counties list	*/
		if (type != "S") {
			this.countries.counties = counties = tag_replace(counties, "SELECT", this.countries.countiesName);
			if (this.countries.statesSelectClass)
				counties.className = this.countries.statesSelectClass;
			if (this.countries.oldCountiesOnchange)
				counties.onchange = this.countries.oldCountiesOnchange;
		}

		/* Clear old counties list	*/
		if ((this.countries.lastStateCode != scode || states_sort_override) && type == 'S') {
			while (counties.options.length > 0)
				counties.options[0] = null;
		}

		/* Fill counties list	*/
		if (this.countries.lastStateCode != scode || type != 'S') {

		if (states_sort_override) {

			/* Sort	*/
			var tmp = [];
			for (var i in countries[code].states[scode].counties) {
				tmp[i] = {
					name: countries[code].states[scode].counties[i].name,
					order: countries[code].states[scode].counties[i].order,
					idx: i
				};

			}
			tmp.sort(sort_states);

			/* Fill list	*/
			for (var i in tmp) {
				if (!tmp[i])
					continue;
				counties.options[counties.options.length] = new Option(tmp[i].name, tmp[i].idx);
				if (this.countries.defaultCounties[scode] == tmp[i].idx) {
					counties.options[counties.options.length-1].selected = true;
					counties.selectedIndex = counties.options.length-1;
				}
			}

		} else {
			for (var i in countries[code].states[scode].counties) {
				counties.options[counties.options.length] = new Option(countries[code].states[scode].counties[i].name, i);
				if (this.countries.defaultCounties[scode] == i)
					counties.options[counties.options.length-1].selected = true;
			}
		}

		}
	}

	this.countries.lastStateCode = scode;

	if (this.oldOnchange)
		this.oldOnchange();	

	if (counties.onchange)
		counties.onchange();
}

/*
	Replace tag by tag
*/
function tag_replace(obj, tag, tname) {
	var tmp = obj.parentNode.insertBefore(document.createElement(tag), obj);
	obj.parentNode.removeChild(obj);
	if (obj.name)
		obj.name = '';
	delete obj;
	if (tname)
		tmp.id = tmp.name = tname;
	return tmp;
}

/*
	Sort states and counties (Opera fix)
*/
function sort_states(a, b) {
	if (!a || !b || !a.order || !b.order || a.order == b.order)
		return 0;
	return a.order > b.order ? 1 : -1;
}

/*
	Check countries list (for Google Toolbar Autofill functionality)
*/
function check_countries(obj) {
	if (!obj || !obj.id)
		return;

	if (isset(obj.oldSelectedIndex) && obj.oldSelectedIndex != obj.selectedIndex && obj.onchange)
		obj.onchange();

	obj.oldSelectedIndex = obj.selectedIndex;
	obj.changeStatesTO = setTimeout("check_countries(document.getElementById('"+obj.id+"'));", 1000);
}
