/*
 * StateCountry.js
 *
 * Used to handle updating state dropdowns based
 * on the selection of a country dropdown.
 */
function StateCountry() {
    var logger = LogFactory.getLog("StateCountry.js");

    this.formName;
    this.stateFieldName;
    this.countryFieldName;
    this.otherStateFieldName; // do I need this?
    this.getStatesUrl;
    this.otherStateContainerId;
    this.stateDropdownContainerId;
    this.stateContainerId;
    this.countryIdForStateDropdown; // This is needed to set up defaults
    this.stateDropdownTextOption;

    var countryDropdown;
    var otherStateElem;
    var stateDropdowns = new Array();
    var stateContainerElem;
    var cloneableStateDropdown;

    var digitRegex = new RegExp("^\\d+$");

    var self = this;
    var initialValue;
    var initialCountry;

    this.setInitialState = function(state) {
        initialValue = state;
    }

    this.setInitialCountry = function(ctry) {
        initialCountry = ctry;
    }

    this.init = function() {
        logger.debug("Enter init()");

        // Initialize some values
        countryDropdown = document.forms[this.formName].elements[this.countryFieldName];
        stateContainerElem = document.getElementById( this.stateContainerId );
        otherStateElem     = document.getElementById( this.otherStateContainerId );
        cloneableStateDropdown = document.getElementById( this.stateDropdownContainerId );
        if( countryDropdown.value == this.countryIdForStateDropdown ) {
            stateDropdowns[ countryDropdown.value ] = cloneableStateDropdown;
        }

        initialValue = document.forms[self.formName].elements[self.stateFieldName][0].value;

        updateState();

        countryDropdown.onchange = updateStateChange;


        logger.debug("Exit init()");
    }

    this.update = function() {
        countryDropdown.value = initialCountry;
        updateState();
    }

    var updateStateChange = function() {
        updateState();
        if( document.forms[self.formName].elements[self.stateFieldName].selectedIndex ) {
            // Do nothing
        } else {
            if( digitRegex.test( document.forms[self.formName].elements[self.stateFieldName].value ) ) {
                document.forms[self.formName].elements[self.stateFieldName].value="";
            }
        }
    }

    var updateState = function() {
        logger.debug("Enter updateState()");


        var osElem = document.getElementById( self.otherStateContainerId );
        var sdElem = document.getElementById( self.stateDropdownContainerId );
        if( osElem ) {
            stateContainerElem.removeChild( osElem );
        }
        if( sdElem ) {
            stateContainerElem.removeChild( sdElem );
        }

        var newDropdown = stateDropdowns[ countryDropdown.value ];
        if( newDropdown ) {
            stateContainerElem.appendChild( newDropdown );
            if( digitRegex.test( initialValue ) ) {
                if( document.forms[self.formName].elements[self.stateFieldName].options ) {
                    for( var i=0; i< document.forms[self.formName].elements[self.stateFieldName].options.length; i++ ) {
                        var opt = document.forms[self.formName].elements[self.stateFieldName].options[i];
                        if( opt.value == initialValue ) {
                            opt.selected = true;
                        }
                    }
                }
            } else {
            }

        } else {
            stateContainerElem.appendChild( otherStateElem );

            var http = getHTTPObject(); 
            // Should this be a POST?
            var uri = self.getStatesUrl + "?id=" + countryDropdown.value;
            http.open("GET", uri );
            http.onreadystatechange = function() {
                if (http.readyState == 4 ) {
                    if( http.status == 200 ) {
                        parseStateResponse( http.responseXML );
                        //updateState();
                    } else {
                        logger.warn("Problem with response, code = ",
                                    http.status, "\n",
                                    http.responseText);
                    }
                }
            }
            http.send( null );

        }

        logger.debug("Exit updateState()");
    }

    var parseStateResponse = function( respXml ) {
        logger.debug("Enter parseStateResponse()");

        var stateNodes = respXml.getElementsByTagName("state");
        if( stateNodes.length == 0 ) {
            logger.debug("Exit parseStateResponse(): no states");
            return;
        }
        var countryNodes = respXml.getElementsByTagName("country");
        if( countryNodes.length == 0 ) {
            logger.debug("Exit parseStateResponse(): no country!");
            return;
        }
        var countryId = countryNodes[0].getAttribute("id");

        var newStateElem = cloneableStateDropdown.cloneNode(true);
        var oldSelect = newStateElem.getElementsByTagName("select").item(0);
        var newSelect = oldSelect.cloneNode(false); // Get rid of all options
        newStateElem.removeChild( oldSelect );
        newStateElem.appendChild( newSelect );
        var opt = document.createElement("option");
        if( self.stateDropdownTextOption ) {
            // Create the empty first value
            var newOpt = opt.cloneNode(false);
            newOpt.value = "";
            newOpt.label = self.stateDropdownTextOption;
            newOpt.appendChild( document.createTextNode( newOpt.label ) );
            newSelect.appendChild( newOpt );
        }
            
        for( var i=0; i<stateNodes.length; i++ ) {
            var newOpt = opt.cloneNode(false);
            newOpt.value = stateNodes[i].getAttribute("id");
            newOpt.label = stateNodes[i].getAttribute("name");
            newOpt.appendChild( document.createTextNode( newOpt.label ) );
            newSelect.appendChild( newOpt );
        }
        stateDropdowns[ countryId ] = newStateElem;
        updateState();

        logger.debug("Exit parseStateResponse()");
    }


}
