
/* create the top-level country objects */
var debug = false;
var numCountries = 10;

if(blankLabel == null){
	var blankLabel = "-Any-";
}
if (blankLabel1 == null) {
    var blankLabel1 = "Select a Country to see States";   
}
if(blankLabel2 == null){
	var blankLabel2 = "Select a Country to see Metro Areas"
}
var countries = new Array(numCountries);
countries[0] = new Country (blankLabel, "");
countries[1] = new Country ("USA", "9000");
countries[2] = new Country ("Australia", "1000");
countries[3] = new Country ("Canada", "2000");
countries[4] = new Country ("India", "3000");
countries[5] = new Country ("Ireland", "4000");
countries[6] = new Country ("New Zealand", "5000");
countries[7] = new Country ("Singapore", "6000");
countries[8] = new Country ("South Africa", "7000");
countries[9] = new Country ("United Kingdom", "8000");

/* make metrocode objects, assign to country */

var mcode = new Array(22);
mcode[0] =  new MetroCode (blankLabel, 0);
mcode[1] =  new MetroCode ("Atlanta", 101);
mcode[2] =  new MetroCode ("Baltimore/Washington", 102);
mcode[3] =  new MetroCode ("Boston", 103);
mcode[4] =  new MetroCode ("Chicago", 104);
mcode[5] =  new MetroCode ("Cleveland", 130);
mcode[6] =  new MetroCode ("Dallas", 105);
mcode[7] =  new MetroCode ("Denver", 106);
mcode[8] =  new MetroCode ("Detroit", 107);
mcode[9] =  new MetroCode ("Houston", 131);
mcode[10] =  new MetroCode ("Los Angeles", 108);
mcode[11] =  new MetroCode ("Miami", 109);
mcode[12] =  new MetroCode ("Minneapolis/St. Paul", 110);
mcode[13] =  new MetroCode ("New York", 111);
mcode[14] =  new MetroCode ("Philadelphia", 112);
mcode[15] =  new MetroCode ("Phoenix", 113);
mcode[16] =  new MetroCode ("Portland", 114);
mcode[17] =  new MetroCode ("Saint Louis", 132);
mcode[18] =  new MetroCode ("Salt Lake City", 115);
mcode[19] =  new MetroCode ("San Diego", 116);
mcode[20] =  new MetroCode ("San Francisco", 117);
mcode[21] =  new MetroCode ("Seattle", 118);
//Cleveland,Houston,Saint Louis is added later and the highest code is 132
countries[1].mcode = mcode;

var mcode = new Array(2);
mcode[0] =  new MetroCode (blankLabel, 0);
mcode[1] =  new MetroCode ("Calgary", 201);
mcode[2] =  new MetroCode ("Edmonton", 202);
mcode[3] =  new MetroCode ("Montreal", 203);
mcode[4] =  new MetroCode ("Ottawa", 204);
mcode[5] =  new MetroCode ("Quebec", 205);
mcode[6] =  new MetroCode ("Toronto", 206);
mcode[7] =  new MetroCode ("Vancouver", 207);
mcode[8] =  new MetroCode ("Victoria", 208);
mcode[9] =  new MetroCode ("Winnipeg", 209);
countries[3].mcode = mcode;

function populateCountriesList (ctrl) {

    for (var i = 0; i < countries.length; i++)
        appendOption (ctrl, countries[i].label, countries[i].value, i == 1);
}

function isValidAreaCode(countryIndex, stateIndex, phone) {
	var country = countries[countryIndex];
	var state = country.states[stateIndex];
	if (state.areacode.indexOf(getUSAreaCode(phone)) == - 1) {
		return false;
	}
	return true;
}

function getUSAreaCode (phone) {
	var areaCode = "";
	var re = /[-.() ]/g;
	phone = phone.replace(re, '');

	if (phone.indexOf("+1") == 0) {
		phone = phone.substring(2);
		if (phone.length > 3)
			areaCode = phone.substring(0,3);
		else
			areaCode = phone;
	} else if (phone.indexOf("1") == 0) {
		phone = phone.substring(1);
		if (phone.length > 3)
			areaCode = phone.substring(0,3);
		else
			areaCode = phone;
	} else if (phone.length > 3) {
		areaCode = phone.substring(0,3);
	} else {
		areaCode = phone;
	}
	return areaCode;
}

function changeMetroList (ctrl1, ctrl2) {
	if(ctrl1.selectedIndex < 0)
		var mainValue = 0;
	else
    	var mainValue = ctrl1.options[ctrl1.selectedIndex].value;
    	
    //if the user selects no country, clear the 2nd
    if (mainValue == 0 || mainValue == "") {
        ctrl2.options.length = 0;
        appendOption (ctrl2, blankLabel2, 0);
        ctrl2.disabled = true;
        return;
    }
    var con = getCountryFromValue (mainValue);
    //clear options from 2nd control
    ctrl2.options.length = 0;
    if (con.mcode == null) {
        ctrl2.disabled = true;
        try {
        	document.getElementById('metroLabel').style.color = '#999999';
        } catch (e){}

        return;
    }
    ctrl2.disabled = false;
    try {
     	document.getElementById('metroLabel').style.color = '#333333';
    } catch (e){}
    for (var i = 0; i < con.mcode.length; i++)
        appendOption (ctrl2, con.mcode[i].label, con.mcode[i].value);
    
    
    if (debug) {
        var vals = "Country: " + con.label + ": " + con.value + "\n\nMetros:\n\n";
        for (var i = 0; i < con.mcode.length; i++) {
            
            if(con.mcode[i].value != 0) {
                vals += con.mcode[i].label + ": " + con.mcode[i].value + "\n";
            }
        }
        alert (vals);
    }

}

function changeStateList (ctrl1, ctrl2) {
var _counter = 0;

	for(var i = 1; i< ctrl1.length; i++){//ignore default val
	
		if(ctrl1.options[i].selected == true){
			_counter++;
		}
	}
	

	if(_counter < 2){
	    if(ctrl1.selectedIndex < 0)
			var mainValue = 0;
		else
    		var mainValue = ctrl1.options[ctrl1.selectedIndex].value;
    		
	    //if the user selects no country, clear the 2nd
	    if (mainValue == 0 || mainValue == "" || mainValue  == blankLabel|| mainValue.size > 1) {
	        ctrl2.options.length = 0;
	        appendOption (ctrl2, blankLabel1, "");
	        ctrl2.disabled = true;
	        return;
	    }
    }
    var con = getCountryFromValue (mainValue);
    //clear options from 2nd control
    ctrl2.options.length = 0;
    if (con.states == null) {
        ctrl2.disabled = true;
        try {
        	if(document.getElementById('stateLabel'))
	        	document.getElementById('stateLabel').style.color = '#999999';
        } catch (e){}
        return;
    }
    ctrl2.disabled = false;
    try {
    	if(document.getElementById('stateLabel'))
    		document.getElementById('stateLabel').style.color = '#333333';
    } catch (e){}
 

    for (var i = 0; i < con.states.length; i++)
        appendOption (ctrl2, con.states[i].label, con.states[i].value);
    
    
    if (debug) {
        var vals = "Country: " + con.label + ": " + con.value + "\n\nStates:\n\n";
        for (var i = 0; i < con.states.length; i++) {
            
            if(con.mcode[i].value != 0) {
                vals += con.states[i].label + ": " + con.states[i].value + "\n";
            }
        }
        alert (vals);
    }
	
}


function selectCountry(ctrl1, val1) {
    for (var i = 0; i < ctrl1.options.length; i++) {
        if (ctrl1.options[i].value == val1) {
            ctrl1.options[i].selected = true;
            break;
        }
    }
}

function selectCountries(ctrl, val) {
    var countries = val.split(",");
    for (var i = 0; i < countries.length; i++)
        selectCountry (ctrl, countries[i]);
}

function selectMetro(ctrl1, val1) {

    for (var i = 0; i < ctrl1.options.length; i++) {
   // alert(ctrl1.options[i].value, val1);
        if (ctrl1.options[i].value == val1) {
            ctrl1.options[i].selected = true;
            break;
        }
    }
}


function selectMetros(ctrl, val, state) {

	var _counter = 0;
	var _metros = val.split(",");
	var _states = state;
	for(var i = 1; i<_states.length; i++){//ignore default val
	
		if(_states.options[i].selected == true){
			_counter++;
		}
	}
	

	if(_counter == 0){
    	for (var i = 0; i < _metros.length; i++){
        selectMetro (ctrl, _metros[i]);
		}
	}
	
   
}

function selectStates(ctrl, val) {
    var states = val.split(",");
    for (var i = 0; i < states.length; i++)
        selectState (ctrl, states[i]);
}

function selectState(ctrl1, val1) {
    selectMetro(ctrl1, val1);
}

function appendOption (ctrl, label, value, sel) {
    var opt = new Option(label, value);
    ctrl.options[ctrl.options.length] = opt;
}

function Country (label, value) {
    this.label = label;
    this.value = value;
    this.mcode = null;
    this.states = null;
    return this;   
}

function MetroCode (label, value) {
    this.label = label;
    this.value = value;
    return this;   
}

function State (label, value, arecode) {
    this.label = label;
    this.value = value;
    this.areacode = areacode;
    return this;   
}

function getCountryFromValue (val) {
    for (var i = 0; i < numCountries; i++) {
        if (val == countries[i].value)
            return countries[i];
    } 
    return countries[0];
}
function getStateFromValue (country, val){
	if(!val)
		return {label:""};
	var tempstr = "" + val + "";
	if(country.value.trim().substring(0,1) == tempstr.substring(0,1)){
		for(var i = 0; i < country.states.length; i++){
			 if(val == country.states[i].value)
			 	return country.states[i];
		}
	}
	return {label:""};
}

/* make state list objects, assign to country */

var states = new Array(9);
states[0] = new State(blankLabel, "");
states[1] = new State("Australian Capital Territory (ACT)", "1001");
states[2] = new State("New South Wales (NSW)", "1002");
states[3] = new State("Northern Territory (NT)", "1003");
states[4] = new State("Queensland (QLD)", "1004");
states[5] = new State("South Australia (SA)", "1005");
states[6] = new State("Tasmania (TAS)", "1006");
states[7] = new State("Victoria (VIC)", "1007");
states[8] = new State("Western Australia (WA)", "1008");
countries[2].states = states;

var states = new Array(14);
states[0] = new State(blankLabel, "");
states[1] = new State("Alberta (AB)", "2001");
states[2] = new State("British Columbia (BC)", "2002");
states[3] = new State("Manitoba (MB)", "2003");
states[4] = new State("New Brunswick (NB)", "2004");
states[5] = new State("Newfoundland and Labrador (NL)", "2005");
states[6] = new State("Northwest Territories (NT)", "2007");
states[7] = new State("Nova Scotia (NS)", "2006");
states[8] = new State("Nunavut (NU)", "2008");
states[9] = new State("Ontario (ON)", "2009");
states[10] = new State("Prince Edward Island (PE)", "2010");
states[11] = new State("Quebec (QC)", "2011");
states[12] = new State("Saskatchewan (SK)", "2012");
states[13] = new State("Yukon (YT)", "2013");
countries[3].states = states;          

var states = new Array(26);

states[0] = new State(blankLabel, "");
states[1] = new State("Carlow (CAR)", "4001");
states[2] = new State("Cavan (CAV)", "4002");
states[3] = new State("Clare (CLA)", "4003");
states[4] = new State("Cork (COR)", "4004");
states[5] = new State("Donegal (DON)", "4005");
states[6] = new State("Dublin (DUB)", "4006");
states[7] = new State("Galway (GAL)", "4007");
states[8] = new State("Kerry (KER)", "4008");
states[9] = new State("Kildare (KID)", "4009");
states[10] = new State("Kilkenny (KIK)", "4010");
states[11] = new State("Laois (LEX)", "4011");
states[12] = new State("Leitrim (LET)", "4012");
states[13] = new State("Limerick (LIM)", "4013");
states[14] = new State("Longford (LOG)", "4014");
states[15] = new State("Louth (LOU)", "4015");
states[16] = new State("Mayo (MAY)", "4016");
states[17] = new State("Meath (MEA)", "4017");
states[18] = new State("Monaghan (MOG)", "4018");
states[19] = new State("Offaly (OFF)", "4019");
states[20] = new State("Roscommon (ROS)", "4020");
states[21] = new State("Sligo (SLI)", "4021");
states[22] = new State("Tipperary (TIP)", "4022");
states[23] = new State("Waterford (WAT)", "4023");
states[24] = new State("Westmeath (WEM)", "4024");
states[25] = new State("Wexford (WEX)", "4025");
states[26] = new State("Wicklow (WIC)", "4026");
countries[5].states = states;          


var states = new Array(60);
var areacode = null;
//Integer code for the states are assigned for two letter sorting
states[0] = new State(blankLabel, "");
areacode = "205|251|256|334";
states[1] = new State("Alabama (AL)", "9002", areacode);
areacode = "907";
states[2] = new State("Alaska (AK)", "9001", areacode); 
areacode = "480|520|602|623|928";
states[3] = new State("Arizona (AZ)", "9004", areacode); 
areacode = "479|501|870";
states[4] = new State("Arkansas (AR)", "9003", areacode); 
areacode = "209|213|310|323|408|415|510|530|559|562|619|626|650|661|707|714|760|805|818|831|858|909|916|925|949|951";
states[5] = new State("California (CA)", "9005", areacode); 
areacode = "303|719|720|970";
states[6] = new State("Colorado (CO)", "9006", areacode); 
areacode = "203|860";
states[7] = new State("Connecticut (CT)", "9007", areacode); 
areacode = "302";
states[8] = new State("Delaware (DE)", "9009", areacode); 
areacode = "202";
states[9] = new State("District Of Columbia (DC)", "9008", areacode); 
areacode = "239|246|305|321|352|386|407|561|727|772|786|813|850|863|904|941|954";
states[10] = new State("Florida (FL)", "9010", areacode); 
areacode = "229|404|478|678|706|770|912";
states[11] = new State("Georgia (GA)", "9011", areacode); 
areacode = "808";
states[12] = new State("Hawaii (HI)", "9012", areacode); 
areacode = "208";
states[13] = new State("Idaho (ID)", "9014", areacode); 
areacode = "217|224|309|312|618|630|708|773|815|847";
states[14] = new State("Illinois (IL)", "9015", areacode); 
areacode = "219|260|317|574|765|812";
states[15] = new State("Indiana (IN)", "9016", areacode); 
areacode = "319|515|563|641|712";
states[16] = new State("Iowa (IA)", "9013", areacode); 
areacode = "316|620|785|913";
states[17] = new State("Kansas (KS)", "9017", areacode); 
areacode = "270|502|606|859";
states[18] = new State("Kentucky (KY)", "9018", areacode); 
areacode = "225|318|337|504|985";
states[19] = new State("Louisiana (LA)", "9019", areacode); 
areacode = "207";
states[20] = new State("Maine (ME)", "9022", areacode); 
areacode = "240|301|331|410|443";
states[21] = new State("Maryland (MD)", "9021", areacode);
areacode = "413|508|617|774|781|978";
states[22] = new State("Massachusetts (MA)", "9020", areacode); 
areacode = "231|248|269|313|517|586|616|734|810|906|989";
states[23] = new State("Michigan (MI)", "9023", areacode); 
areacode = "218|320|507|612|651|763|952";
states[24] = new State("Minnesota (MN)", "9024", areacode); 
areacode = "228|601|662";
states[25] = new State("Mississippi (MS)", "9026", areacode); 
areacode = "314|417|573|636|660|816";
states[26] = new State("Missouri (MO)", "9025", areacode); 
areacode = "406";
states[27] = new State("Montana (MT)", "9027", areacode); 
areacode = "308|402";
states[28] = new State("Nebraska (NE)", "9030", areacode); 
areacode = "702|775";
states[29] = new State("Nevada (NV)", "9034", areacode); 
areacode = "603";
states[30] = new State("New Hampshire (NH)", "9031", areacode); 
areacode = "201|609|732|856|862|908|973";
states[31] = new State("New Jersey (NJ)", "9032", areacode); 
areacode = "505";
states[32] = new State("New Mexico (NM)", "9033", areacode); 
areacode = "212|315|516|518|585|607|631|646|716|718|845|914|917";
states[33] = new State("New York (NY)", "9035", areacode); 
areacode = "252|336|704|828|910|919";
states[34] = new State("North Carolina (NC)", "9028", areacode); 
areacode = "701";
states[35] = new State("North Dakota (ND)", "9029", areacode); 
areacode = "216|330|419|440|513|614|740|937|999";
states[36] = new State("Ohio (OH)", "9036", areacode); 
areacode = "405|580|918";
states[37] = new State("Oklahoma (OK)", "9037", areacode); 
areacode = "503|541|971";
states[38] = new State("Oregon (OR)", "9038", areacode); 
areacode = "215|267|412|484|570|610|717|724|814";
states[39] = new State("Pennsylvania (PA)", "9039", areacode); 
areacode = "401";
states[40] = new State("Rhode Island (RI)", "9040", areacode); 
areacode = "803|843|864";
states[41] = new State("South Carolina (SC)", "9041", areacode); 
areacode = "605";
states[42] = new State("South Dakota (SD)", "9042", areacode); 
areacode = "423|615|731|865|901|931";
states[43] = new State("Tennessee (TN)", "9043", areacode); 
areacode = "210|214|254|281|325|361|409|432|469|512|682|713|806|817|830|832|903|915|936|940|956|972|979";
states[44] = new State("Texas (TX)", "9044", areacode); 
areacode = "435|801";
states[45] = new State("Utah (UT)", "9045", areacode); 
areacode = "802";
states[46] = new State("Vermont (VT)", "9047", areacode); 
areacode = "276|434|540|571|703|757|804";
states[47] = new State("Virginia (VA)", "9046", areacode); 
areacode = "206|253|360|425|509";
states[48] = new State("Washington (WA)", "9048", areacode); 
areacode = "304";
states[49] = new State("West Virginia (WV)", "9050", areacode); 
areacode = "262|414|608|715|920";
states[50] = new State("Wisconsin (WI)", "9049", areacode); 
areacode = "307";
states[51] = new State("Wyoming (WY)", "9051", areacode); 
states[52] = new State("------", "  ");
// US territories:
areacode = "684";
states[53] = new State("American Samoa (AS)", "9101", areacode); 
areacode = "";
states[54] = new State("Federated States Of Micronesia (FM)", "9102", areacode); 
areacode = "671";
states[55] = new State("Guam (GU)", "9103", areacode); 
areacode = "";
states[56] = new State("Marshall Islands (MH)", "9104", areacode); 
areacode = "670";
states[57] = new State("Northern Mariana Islands (MP)", "9105", areacode); 
areacode = "";
states[58] = new State("Palau (PW)", "9107", areacode); 
areacode = "787";
states[59] = new State("Puerto Rico (PR)", "9106", areacode); 
areacode = "340";
states[60] = new State("Virgin Islands (VI)", "9108", areacode); 
countries[1].states = states;

function doMetroChange() {
    
    //enable area and zip fields
   try{ form.cnZip.disabled = false;
    form.cnArea1.disabled = false;
}catch(e){}
try{form.zip.disabled = false;
	form.area1.disabled = false;
	}catch(e){}
	
	var	_counter = 0;

		for (i=0; i < country.length; i++){
			if(country.options[i].selected){
			_counter++;
			}
		}
		if(country.options[0].selected == true || _counter > 1){
			state.options.length = 0;
			metro.options.length = 0;
			appendOption(state, blankLabel1, "");
			appendOption(metro, blankLabel2, "");
			state.disabled = true;
			metro.disabled = true;
		}else{
    		changeStateList (country, state);
    		changeMetroList (country, metro);
    		handleMetroChange (metro);
		}

}


function handleMetroChange(ctrl) {
    if (ctrl.disabled || ctrl.options == null || ctrl.options.length == 0) return;
    var val = 0;
    try {
        val = ctrl.options[ctrl.selectedIndex].value;
    } catch (e) {}
    var disable = val != 0;
    var form = ctrl.form;
    
    try{
	if (disable) {
	    form.cnZip.value = "";
		form.cnArea1.value = "";
		form.cnStates.selectedIndex = 0;
	}
    form.cnZip.disabled = disable;
    form.cnArea1.disabled = disable;
    form.cnStates.disabled = disable;
    }catch(e){}
    
     try{
	if (disable) {
	    form.zip.value = "";
		form.area1.value = "";
		form.states.selectedIndex = 0;
	}
    form.zip.disabled = disable;
    form.area1.disabled = disable;
    form.states.disabled = disable;
    }catch(e){}
}

function getStateString(ctrl) {
	var ret = "";
	if (ctrl == null || ctrl.options == null)
	    return "";
	
    for (var i = 0; i < ctrl.options.length; i++) {
        if (ctrl.options[i].selected && ctrl.options[i].value != "") {
            
            ret += ctrl.options[i].value + ",";
        }
    }
    if (ret.length > 0) {
        ret = ret.substring (0, (ret.length - 1));
    }
    return ret;
}


function handleStateChange(ctrl){
clearMulti(metroField);
//metroField.options[0].value = '';
}
// Combo box functions for 6.10 Tethering project changes.  May not need, but just in case product changes its mind.
function handleCountryComboChange(id){
	var countryVal = $get(id).value;
	var country = getCountryFromValue(countryVal);
	createComboBox('stateCBTable', 'stateCb', 'stateHidden', 'stateCbHover', country.states, null, null);
}
function createCountryStateComboBox(val, sval){
	createComboBox('countryCBTable', 'countryCb', 'countryHidden', 'countryCbHover', countries, 'handleCountryComboChange', val);

	var country = getCountryFromValue(val);

	createStateComboBox(sval, country);
}
function createStateComboBox(val, country){
	createComboBox('stateCBTable', 'stateCb', 'stateHidden', 'stateCbHover', country.states, 'void', val);
}
// Location/Contact changes
function handleCountryChange(ns) {
	if(ns == undefined){
		var ns = "contact";
	}
    var country = $get(ns + "Country");
    var state = $get(ns + "State");
    changeStateList (country, state);
}