
var US_COUNTRY_CODE = "US";
var CANADA_COUNTRY_CODE = "CA";
var BLOCK_DISPLAY_STYLE = "";
var NO_DISPLAY = "none";
var EMPTY_VALUE = "";

function getProvinceField(form) {
    return form.caProvince ? form.caProvince : null;
}


function getStateValue(form) {
    return form.usState ? form.usState.value : null;
}


function getOtherValue(form) {
    return form.otherState ? form.otherState.value : null;
}


function showCounty(countyId) {
    try {
        var elem = document.getElementById(countyId);
        elem.style.display = BLOCK_DISPLAY_STYLE;
    } catch (e) {
        // yes, we know it's undefined.
    }

}


function hideCounty(countyFieldToSet, countyId) {
    try {
        var elem = document.getElementById(countyId);
        elem.style.display = NO_DISPLAY;

        if (countyFieldToSet) {
            setSubentityValue(EMPTY_VALUE, countyFieldToSet);
        }
    } catch (e) {
        // yes, we know it's undefined.
    }
}


function hideProvince(provinceFieldToSet, countyId, provinceId) {
    if (elem = document.getElementById(provinceId)) {
        elem.style.display = NO_DISPLAY;
    }

    try {
        // why isn't this working?
        //setStateValue(EMPTY_VALUE, false, provinceFieldToSet, countyId);
    } catch (e) {
        // yes, we know it's undefined.
    }
}


function hideOther(otherId) {
    if (elem = document.getElementById(otherId)) {
        elem.style.display = NO_DISPLAY;
    }
}


function hideState(stateFieldToSet, stateId, countyId) {
    try {
        var elem = document.getElementById(stateId);
        elem.style.display = NO_DISPLAY;

        setStateValue(EMPTY_VALUE, false, stateFieldToSet, countyId);
    } catch (e) {
        // yes, we know it's undefined.
    }
}


function showState(stateFieldToSet, countyFieldToSet, stateValue, stateId, countyId) {
    setStateValue(stateValue, true, stateFieldToSet, countyFieldToSet, countyId);

    var elem = document.getElementById(stateId);
    elem.style.display = BLOCK_DISPLAY_STYLE;
}


function showOther(stateFieldToSet, otherValue, countyId, otherId) {
    setStateValue(otherValue, false, stateFieldToSet, countyId);

    var elem = document.getElementById(otherId);
    elem.style.display = BLOCK_DISPLAY_STYLE;
}


function showProvince(stateFieldToSet, provinceFieldToSet, countyId, provinceId) {
    setStateValue(provinceFieldToSet.value, false, stateFieldToSet, countyId);

    var elem = document.getElementById(provinceId);
    elem.style.display = BLOCK_DISPLAY_STYLE;
}


function setPrevSubentityValue(value, selectedEntityPrefix) {
    selectedEntityPrefix = (selectedEntityPrefix && selectedEntityPrefix != 'undefined' && selectedEntityPrefix != '') ? selectedEntityPrefix : '';

	if(selectedEntityPrefix == 'ship'){
	    document.address.prevSubentityship.value = value;
	} else {
		document.address.prevSubentity.value = value;
	}
}


function checkStates(country, stateFieldToSet, countyFieldToSet, provinceFieldToSet, stateValue, stateId, provinceId, countyId, otherId, otherValue, selectedEntityPrefix, billCounty) {
    switch(country.value) {
        case US_COUNTRY_CODE:
            hideProvince(provinceFieldToSet, countyId, provinceId);
            hideOther(otherId);
            showState(stateFieldToSet, countyFieldToSet, stateValue, stateId, countyId);
            showCounty(countyId);
            displaySubentity(countyFieldToSet, stateValue, countyId, selectedEntityPrefix);
            selectSubentity(stateValue, billCounty);
            break;
        case CANADA_COUNTRY_CODE:
            hideState(stateFieldToSet, stateId, countyId);
            hideOther(otherId);
            hideCounty(countyFieldToSet, countyId)
            //alert('stateFieldToSet:' + stateFieldToSet.name + ' provinceFieldToSet: ' + provinceFieldToSet.value);
            showProvince(stateFieldToSet, provinceFieldToSet, countyId, provinceId);
            break;
        default:
            hideState(stateFieldToSet, stateId, countyId);
            hideProvince(stateFieldToSet, countyId, provinceId);
            hideCounty(countyFieldToSet, countyId);
            showOther(stateFieldToSet, otherValue, countyId, otherId);
            //setStateValue(EMPTY_VALUE, false, stateFieldToSet, countyId);
    }
}


/*
 * Displays or hides the states county if it exists.
 */
function displaySubentity(countyFieldToSet, stateValue, countyId, selectedEntityPrefix) {
    selectedEntityPrefix = (selectedEntityPrefix && selectedEntityPrefix != 'undefined' && selectedEntityPrefix != '') ? selectedEntityPrefix : '';

	if(selectedEntityPrefix == 'ship'){
	    var prevSubentity = document.address.prevSubentityship.value;
	} else {
		var prevSubentity = document.address.prevSubentity.value;
	}

    var selectedEntity = selectedEntityPrefix + stateValue;

    setPrevSubentityValue(selectedEntity, selectedEntityPrefix);

    if (EMPTY_VALUE != prevSubentity) {
        try {
            showCounty(countyId);
            var elem = document.getElementById(prevSubentity);
            //elem.style.display = NO_DISPLAY;
        } catch (e) {
            // yes, we know it's undefined.
        }
    }

    try {
        var elem = document.getElementById(selectedEntity);
        elem.style.display = BLOCK_DISPLAY_STYLE;

        if (countyFieldToSet) {
            eval('var tempValue = document.address.thisSubentity' + selectedEntity + '.value');
            setSubentityValue(tempValue, countyFieldToSet);
        }
    } catch(e) {
        hideCounty(countyFieldToSet, countyId);
    }
}

/*
 * Selects a value in the county drop down
 */
function selectSubentity(stateValue, billCounty){
	if(billCounty && billCounty != '' && billCounty != 'undefined'){
		countyFieldToSet = 'thisSubentityship' + stateValue;
	
		try {
			var elements = document.address.elements;
			var length = elements.length;
			
			for(i=0;i<length;i++){
				var current = elements[i];

				if(current.name == countyFieldToSet){
					var options = current.options;
					var optionLength = options.length;
					
					for(j=0;j<optionLength;j++){
						var currentOption = options[j];

						if(currentOption.value == billCounty){
							current.selectedIndex = j;
						}
					}
				}
			}
	
		} catch (e) {
			//Yes, we know it's undefined.
		}
	}
}

function setStateValue(stateValue, doSubentity, stateFieldToSet, countyFieldToSet, countyId, selectedEntityPrefix) {
    //alert('state='+stateValue+'stateFieldToSet='+stateFieldToSet.name);
    stateFieldToSet.value = stateValue;

    // pretty much a hack.
    if (doSubentity && countyFieldToSet) {
        displaySubentity(countyFieldToSet, stateValue, countyId, selectedEntityPrefix);
    } else {
        try {
            var elem = document.getElementById(countyId);
            elem.style.display = NO_DISPLAY;
        } catch (e) {
            // yes, we know it's undefined.
        }
    }
}


function setSubentityValue(subentityValue, countyFieldToSubmit) {
    countyFieldToSubmit.value = subentityValue;
}


function initializeDisplay(thisState, thisProvince, stateFieldToSet, customerCounty, countyFieldToSet, provinceFieldToSet, stateValue, countyId, thisOther, otherValue, selectedEntityPrefix) {
    if (BLOCK_DISPLAY_STYLE == thisState) {
        setStateValue(stateValue, false, stateFieldToSet, countyFieldToSet, countyId);
        setPrevSubentityValue(stateValue, selectedEntityPrefix);

        try {
            var elem = document.getElementById(stateValue);
            elem.style.display = BLOCK_DISPLAY_STYLE;

            showCounty(countyId);
            try {
                if (0 < customerCounty.length) {
                    countyFieldToSet.value = customerCounty;

                    displaySubentity(countyFieldToSet, stateValue, countyId, selectedEntityPrefix);
                }
            } catch (e) {
                // yes, we know it's undefined.
            }
        } catch(e) { }
    } else if (BLOCK_DISPLAY_STYLE == thisProvince) {
        if (provinceFieldToSet) {
            setStateValue(provinceFieldToSet.value, false, stateFieldToSet, countyFieldToSet, countyId);
        }

    } else if (BLOCK_DISPLAY_STYLE == thisOther) {
        setStateValue(otherValue, false, stateFieldToSet, countyFieldToSet, countyId);

    } else {
        //setStateValue(EMPTY_VALUE, false, stateFieldToSet, countyFieldToSet, countyId);

    }
}
