
function locale(args){

    this.load = load_locale;
    this.get_country = get_country;
    this.get_region = get_region;
    this.region_postal_exceptions = Array();
    this.postal_row = null;
    this.get_region_row = (args.get_region_row) ? args.get_region_row : get_region_row_default;
    this.get_postal_row = (args.get_postal_row) ? args.get_postal_row : get_postal_row_default;
    this.init = false;
    this.skip_postal = (args.skip_postal) ? args.skip_postal : false;
    this.country_el = (args.country_el) ? args.country_el : 'country';
    this.region_el = (args.region_el) ? args.region_el : 'state_cd';
    this.postal_el = (args.postal_el) ? args.postal_el : 'zip';
}


function get_country(){
    return YAHOO.util.Dom.get(this.country_el);
}

function get_region(){
    return YAHOO.util.Dom.get(this.region_el);
}

function remove_region_field(){
    
    var state_el = this.args.get_region();
    var row = this.get_state_row();
    var parent = row.parent;
    parent.removeChild(state_el);
    
}

function load_locale(init){
    
    this.init = (init) ? init : false;
    var request_handler = { success: handle_success, failure: handle_failure, args: this };
    el = this.get_country();
    var selected_country = el.options[el.options.selectedIndex].value;
    request = YAHOO.util.Connect.asyncRequest('GET', '/utils/locale/load_locale.ajax.php?country=' + selected_country+'&region='+submitted_state_cd+'&region_id='+this.region_el, request_handler, null);
}

var handle_success = function(o){

    var state_el = this.args.get_region();
    var country_el = this.args.get_country();

    var parent = state_el.parentNode;
    var selected_state = (state_el.options) ? state_el.options[state_el.options.selectedIndex].value : state_el.value;
    var locale = YAHOO.lang.JSON.parse(o.responseText);
    this.args.region_postal_exceptions = locale.region_postal_exceptions;
    
    if(!this.args.init){
        parent.removeChild(state_el);
    
        if(locale.select_html == null){
            var input = document.createElement('input');
            input.id = this.args.region_el;
            input.name = this.args.region_el;
            parent.appendChild(input);
        } else{
            parent.innerHTML += locale.select_html;
        }
    }
    
    if(!locale.use_zip && !this.args.region_postal_exceptions.in_array(selected_state) && !this.args.skip_postal){
        var zip = YAHOO.util.Dom.get(this.args.postal_el);
        if(zip){
            var row = this.args.get_postal_row();
            this.args.postal_row = row.cloneNode(true);
            row.parentNode.removeChild(row);
        }
    }
    
    
    if((locale.use_zip || this.args.region_postal_exceptions.in_array(selected_state)) && !this.args.skip_postal){
        
        if(!YAHOO.util.Dom.get(this.args.postal_el)){
            var state_el = this.args.get_region();
            var row = this.args.get_region_row();
            YAHOO.util.Dom.insertAfter(this.args.postal_row,row);
        }

    }
    
    // add a listener to deal with region level postal exceptions
    if(this.args.region_postal_exceptions.length > 0 && !this.args.skip_postal){
        YAHOO.util.Event.addListener(this.args.region_el,'change',handle_postal_exceptions,this.args);
    }
    
    this.args.init = false;

}

function handle_postal_exceptions(e,args){

    if(args.region_postal_exceptions.in_array(this.value)){
        YAHOO.util.Dom.insertAfter(args.postal_row,args.get_region_row());
    } else{
        var row = args.get_postal_row();
        if(row){
            args.postal_row = args.get_postal_row().cloneNode(true);
            row.parentNode.removeChild(row);
        }
    }
    
}

var handle_failure = function(o){
    // in the event the ajax request fails, we'll leave the user with a text input
    var state_el = YAHOO.util.Dom.get(this.args.region_el);
    var parent = state_el.parentNode;    
    var input = document.createElement('input');
    input.id = this.args.region_el;
    parent.appendChild(input);
}

function get_region_row_default(){
    var region = this.get_region();
    return (region) ? region.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode : null;
}

function get_postal_row_default(){
    var zip = YAHOO.util.Dom.get('zip');
    return (zip) ? zip.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode : null;
}

Array.prototype.in_array = function(str){
    
    for(i = 0; i < this.length; i++){
        
        if(this[i] == str){
            return true;
        } else{
            continue;
        }
    }
    
    return false;
}
