﻿Type.registerNamespace('DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown');

/// <summary>Extender Enum LoadType</summary>
DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.LoadType = function() {
    throw Error.invalidOperation();
}
DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.LoadType.prototype = {
    All: 0,
    Location: 1
}
DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.LoadType.registerEnum('DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.LoadType', false);

/// <summary>
/// State DropDown Extender Control
///     this extender loads the state dropdown based on the country code ddl. 
/// </summary>
/// <remarks>
///    properties: 
///      {name: 'ParentControlId', type: String} : id of state DDL control
///      {name: 'SelectedStateValueId', type: string} : id of element that holds the state
///              value selected. element must have value property (eg. input type=hidden)
///      {name: 'SelectedStateTextId', type: string} : id of element that holds the state
///              text selected. element must have value property (eg. input type=hidden)
///      {name: 'LoadMethod', type: LoadType} : states to load....location states/provinces
///              or all states/provinces
/// </remarks>
/// <history>
///     <change date="02/27/2007 12:18:00" ticket="">
///         <author>Steven Berenbrock</author>
///         <description>Initial version.</description>
///     </change>
///     <change date="04/01/2007 12:18:00" ticket="">
///         <author>Brian Adix</author>
///         <description>added call GetDollarDividendStates.</description>
///     </change>
///     <change date="07/18/2007 12:18:00" ticket="">
///         <author>Pat Spruill</author>
///         <description>Added property "PositionZeroTextUS" and "PositionZeroTextCA" </description>
///     </change>
///     <change date="06/04/2008" ticket="TFS Ticket #6653">
///         <author>StoneHenge Partners, Inc.</author>
///         <description>Changes for Daily Dividends</description>
///     </change>

/// </history>
DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.StateDropDownBehavior = function(element) {
    DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.StateDropDownBehavior.initializeBase(this, [element]);
    ///<summary>StateDropDownBehavior Extender</summary>
    ///<param name="element">Associated element</param>

    //Properties
    this._parentControlId = null;
    this._selectedStateValueId = null;
    this._selectedStateTextId = null;
    this._loadMethod = DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.LoadType.Location;
    this._selectedValue = null;
    this._positionZeroText = "";
    
    // Member variables
    this._parentElement = null;
    this._separator = ':::';

    // Event delegates
    this._changeEventHandler = null;
    this._parentChangeEventHandler = null;
    this._propertyChangeHandler = null;
}

DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.StateDropDownBehavior.prototype = {
    //*****************************************************************
    //Override methods
    //
    initialize : function() {
        DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.StateDropDownBehavior.callBaseMethod(this, 'initialize');

        var targetElement = this.get_element();

        // Clear any items that may have been put there for server side convenience
        this._clearItems();
        
        this._changeEventHandler = Function.createDelegate(this, this._onControlEvent);
        $addHandler(targetElement, "change", this._changeEventHandler);
        Sys.Debug.assert(this._changeEventHandler != null, "Couldn't create event ( change event handler for '" + targetElement.id + "'");

        if (this._parentControlId) {
            // Set properties on element so that children controls (if any) can have easy access
            this._parentElement = $get(this._parentControlId);
            // Attach change handler to parent
            Sys.Debug.assert(this._parentElement != null, "Couldn't find element '" + this._parentControlId + "'");
            
            if (this._parentElement) {
                //setup change event hander to parent ddl
                this._parentChangeEventHandler = Function.createDelegate(this, this._onParentControlEvent);
                $addHandler(this._parentElement, "change", this._parentChangeEventHandler);
                //set up array on parent element to track children dependents
                if (!this._parentElement.childDropDown) {
                    this._parentElement.childDropDown = new Array();
                }
                this._parentElement.childDropDown.push(this);
            }
        }
        
        //check for client state on postback...
        this._retrieveState();

        // fire parent change to populate self
        this._onParentControlEvent(null);
        
        this._propertyChangeHandler = Function.createDelegate(this, this._onPropertyChanged);
        $addHandler(targetElement, "propertychange", this._propertyChangeHandler);
    },

    dispose : function() {
        var targetElement = this.get_element();

        if (this._changeEventHandler) {
            $removeHandler(targetElement, "change", this._changeEventHandler);
            this._changeEventHandler = null;
        }
        
        if (this._parentElement) {
            if (this._parentChangeEventHandler) {
                $removeHandler(this._parentElement, "change", this._parentChangeEventHandler);
                this._parentChangeEventHandler = null;
            }        
        }

        if (this._propertyChangeHandler) {
            $removeHandler(targetElement, "propertychange", this._propertyChangeHandler);
            this._propertyChangeHandler = null;
        }
        
        DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.StateDropDownBehavior.callBaseMethod(this, 'dispose');
    },

    //*****************************************************************
    // Property get/set methods
    //
    get_ParentControlId : function() {
        return this._parentControlId;
    },

    set_ParentControlId : function(value) {
        this._parentControlId = value;
    },
    
    get_SelectedStateValueId : function() {
        return this._selectedStateValueId;
    },

    set_SelectedStateValueId : function(value) {
        this._selectedStateValueId = value;
    },
    
    get_SelectedStateTextId : function() {
        return this._selectedStateTextId;
    },

    set_SelectedStateTextId : function(value) {
        this._selectedStateTextId = value;
    },
    
    get_LoadMethod: function() {
        return this._loadMethod;
    },

    set_LoadMethod : function(value) {
        this._loadMethod = value;
    },
    
    get_SelectedValue: function() {
        return this._selectedValue;
    },

    set_SelectedValue : function(value) {
        this._selectedValue = value;
    },

    get_PositionZeroTextUS: function() {
        return this._positonZeroTextUS;
    },

    set_PositionZeroTextUS : function(value) {
        this._positionZeroTextUS = value;
    },

    get_PositionZeroTextCA: function() {
        return this._positonZeroTextCA;
    },

    set_PositionZeroTextCA : function(value) {
        this._positionZeroTextCA = value;
    },
    
    get_PositionZeroTextMX: function() {
        return this._positonZeroTextMX;
    },

    set_PositionZeroTextMX : function(value) {
        this._positionZeroTextMX = value;
    },
    
    //*****************************************************************
    // Custom methods
    //
    _storeState : function(selectedValue, selectedText) {
        ///<summary>Private method _storeState - set the client view state with 
        ///         selected value, and selected text.  separator must match extender class</summary>
        ///<param name="selectedValue" type="string">selected value in ddl</param>
        ///<param name="selectedText" type="string">selected text in ddl</param>                
        DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.StateDropDownBehavior.callBaseMethod(this, 'set_ClientState', [ selectedValue + this._separator + selectedText ]);
    },
    
    _retrieveState : function() {
        ///<summary>Private method _retrieveState - retrieve the client view state for 
        ///         selected value, and selected text.  separator must match set client state</summary>
        // Check client state.  If it's present,
        // that means this is a postback, so we restore the state.
        var lastState = DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.StateDropDownBehavior.callBaseMethod(this, 'get_ClientState');                
        if (lastState && (-1 != lastState.indexOf(this._separator))) {        
            // Parse the value:::text out of ClientState and set them
            var result = lastState.split(this._separator);
            this._selectedValue = result[0];
            //this._selectedText = result[1];
        }        
    },    
    
    _clearItems : function() {
        /// <summary>Clear the items from the drop down</summary>
        var e = this.get_element();
        while (0 < e.options.length) {
            e.remove(0);
        }
    },

    _isPopulated : function() {
        /// <summary>Determine whether the drop down has any items</summary>
        /// <returns type="Boolean">Whether the drop down has any items</returns>
        var items = this.get_element().options.length;
        return items > 0;
    },

    _setOptions : function(list) {
        /// <summary>Set the contents of the DropDownList to the specified list</summary>
        /// <param name="list" mayBeNull="true" elementType="Object">Array of options</param>
        if (!this.get_isInitialized()) {
            return;
        }

        var targetElement = this.get_element();
        // Remove existing contents
        this._clearItems();

        // check for text to be added to the top of the drop down control
        var index = this._parentElement.selectedIndex;
        if (index != -1) {
            var value = this._parentElement.options[index].value;
            if (this._positionZeroTextUS && this._positionZeroTextUS.length > 0 && value == "US") {
                this.optionPosZero = new Option(this._positionZeroTextUS, "", false, false);
                targetElement.options[targetElement.options.length] = this.optionPosZero;        
            }
            else if (this._positionZeroTextCA && this._positionZeroTextCA.length > 0 && value == "CA") {
                    this.optionPosZero = new Option(this._positionZeroTextCA, "", false, false);
                    targetElement.options[targetElement.options.length] = this.optionPosZero;        
                }
            else if (this._positionZeroTextMX && this._positionZeroTextMX.length > 0 && value == "MX") {
                    this.optionPosZero = new Option(this._positionZeroTextMX, "", false, false);
                    targetElement.options[targetElement.options.length] = this.optionPosZero;
            }
        }
        var matchedSelectedValue = false;
        var defaultIndex = 0;

        // Add each item to the DropDownList
        if (list) {
            for (i = 0 ; i < list.length ; i++) {
                var listItemName = list[i].Name;
                var listItemValue = list[i].Code;
                
                var isSelectedValue = (listItemValue == this._selectedValue);
                var optionElement = new Option(listItemName, listItemValue, false, isSelectedValue);
                matchedSelectedValue |= isSelectedValue;

                targetElement.options[targetElement.options.length] = optionElement;
            }
        }
        // if we didn't match the selected value, select default
        if (this._isPopulated()) {
            if (matchedSelectedValue) {
                this._storeState(targetElement.options[targetElement.selectedIndex].value, targetElement.options[targetElement.selectedIndex].text);
                this._selectedValue = targetElement.options[targetElement.selectedIndex].value;
                this._setSelectedStateValue(this._selectedValue);
                this._setSelectedStateText(targetElement.options[targetElement.selectedIndex].text);
            } else if (!matchedSelectedValue && defaultIndex != -1) {
                targetElement.options[defaultIndex].selected = true;
                this._selectedValue = targetElement.options[defaultIndex].value;
                this._storeState(targetElement.options[defaultIndex].value, targetElement.options[defaultIndex].text);
                this._setSelectedStateValue(this._selectedValue);
                this._setSelectedStateText(targetElement.options[defaultIndex].text);
            } else if (!matchedSelectedValue) {
                this._selectedValue = '';
                this._storeState('', '');
                this._setSelectedStateValue(this._selectedValue);
                this._setSelectedStateText('');
            }
        }
        //check for any child dependents that need to be notified of change
        if (targetElement.childDropDown) {
            for(i = 0; i < targetElement.childDropDown.length; i++) {
                targetElement.childDropDown[i]._onParentControlEvent();
            }
        }
        else {
            if (list && (Sys.Browser.agent !== Sys.Browser.Safari) && (Sys.Browser.agent !== Sys.Browser.Opera)) {
                // Fire the onchange event for the control to notify any listeners of the change
                if (document.createEvent) {
                    var onchangeEvent = document.createEvent('HTMLEvents');
                    onchangeEvent.initEvent('change', true, false);
                    targetElement.dispatchEvent(onchangeEvent);
                } else if( document.createEventObject ) {
                    targetElement.fireEvent('onchange');
                }
            }
        }        
    },
    
    _setSelectedStateValue : function(stateCode) {
        ///<summary>Private method _setSelectedStateValue</summary>
        ///<param name="stateCode">state value id string</param>
        ///<remarks>Sets the value attribute of element identified by the selectedStateValueId</remarks>
        if (this._selectedStateValueId) {
            var selectedStateValueElement = $get(this._selectedStateValueId);
            if (selectedStateValueElement) {
                selectedStateValueElement.value = stateCode;
            }
        }    
    },
    
    _setSelectedStateText : function(stateText) {
        ///<summary>Private method _setSelectedStateText</summary>
        ///<param name="stateText">state text id string</param>
        ///<remarks>Sets the value attribute of element identified by the selectedStateTextId</remarks>
        if (this._selectedStateTextId) {
            var selectedStateTextElement = $get(this._selectedStateTextId);
            if (selectedStateTextElement) {
                selectedStateTextElement.value = stateText;
            }
        }    
    },
    
    _setSelection : function() {
        ///<summary>Public method - reset the selected values based on selected index</summary>
        ///<remarks>method created to update extender selected value and text when changes are made to ddl
        ///     that do not trigger the change event.  Ex. google toolbar autofill does not trigger
        ///     change event.  In IE use the onpropertychange event to check if property selectedIndex
        ///     changed.  call this mthod then to update the extender selected value and text fields.
        if (!this._isPopulated()) {
            return;
        }
        var targetElement = this.get_element();
        if (-1 != targetElement.selectedIndex) {
            this._storeState(targetElement.options[targetElement.selectedIndex].value, targetElement.options[targetElement.selectedIndex].text);
            this._selectedValue = targetElement.options[targetElement.selectedIndex].value;
            this._setSelectedStateValue(this._selectedValue);
            this._setSelectedStateText(targetElement.options[targetElement.selectedIndex].text);            
        }
         else {
            this._storeState('', '');
            this._selectedValue = '';
            this._setSelectedStateValue(this._selectedValue);
            this._setSelectedStateText('');
        }
    },    
  
    _needD4BStates : function() {
        ///<summary>Private method _checkD4BStates</summary>
        ///<remarks>Checks if the current page is D4B application page
        var sPath = window.location.pathname;
        return (sPath.indexOf("D4BApplyForm") > -1);                
    },    
    
    _needD4BStates : function() {
        ///<summary>Private method _checkD4BStates</summary>
        ///<remarks>Checks if the current page is D4B application page
        var sPath = window.location.pathname;
        return (sPath.indexOf("D4BApplyForm") > -1);                
    },    
       
    
    
    
    //*****************************************************************
    // Event handler methods
    //
    _onPropertyChanged : function(evnt) {
        ///<summary>Private event method _onPropertyChanged</summary>
        ///<param name="evnt">event object</param>
        ///<remarks>method used to detect that the google toolbar autofill has changed
        /// the selection of the dll (changed event is currently not being called from google toolbar).
        /// this sets state ddl values. this method is only called from IE.</remarks>
        if (evnt) {
            if (evnt.rawEvent.propertyName == "selectedIndex") {
                this._setSelection();
            }
        }
    },
    
    _onMethodComplete : function(result, userContext, methodName) {
        ///<summary>Private event method _onMethodComplete</summary>
        ///<param name="result">Result of web service call</param>
        ///<param name="userContext">value passed to web service call for user context</param>
        ///<param name="methodName">name of method that called the web service</param>
        ///<remarks>this method is called when the completion (no errors) has been received from the 
        /// web service call</remarks>
        var acBehavior = userContext[0];
        //var code = userContext[1];
        acBehavior._setOptions(result);
    },

    _onMethodError : function(error, userContext, methodName) {
        ///<summary>Private event method _onMethodError</summary>
        ///<param name="error">error object from web service call</param>
        ///<param name="userContext">value passed to web service call for user context</param>
        ///<param name="methodName">name of method that called the web service</param>
        ///<remarks>this method is called when an error has been received from the 
        /// web service call</remarks>
        Sys.Debug.trace(error.get_message());
    },
    
    _onParentControlEvent : function(envt) {
        ///<summary>Event handler for onchange of parent ddl event</summary>
        ///<param name="evnt">event object</param>
        ///<remarks>get selected value from parent ddl</remarks>
        if (this._parentElement) {
            var index = this._parentElement.selectedIndex;
            if (index != -1) {
                var value = this._parentElement.options[index].value;
                switch (value) {
                    case "US":
                    case "CA":
                        if(this._needD4BStates())
                            {
                                //proxy for CustomerWebService.asmx GetD4BStates(parm1, complete handler, error handler, user context);
                                DTG.Dollar.Web.Consumer.Services.CustomerWebService.GetD4BStates(
                                value,
                                this._onMethodComplete, 
                                this._onMethodError, 
                                [this, value]);
                             }
                        else if (this._loadMethod == DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.LoadType.Location) 
                            {
                             //proxy for CustomerWebService.asmx GetStates(parm1, complete handler, error handler, user context);
                             DTG.Dollar.Web.Consumer.Services.CustomerWebService.GetStates(
                                value,
                                this._onMethodComplete, 
                                this._onMethodError, 
                                [this, value]);
                              }                            
                             else 
                                {
                                     //proxy for CustomerWebService.asmx GetAllStates(parm1, complete handler, error handler, user context);
                                    DTG.Dollar.Web.Consumer.Services.CustomerWebService.GetAllStates(
                                    value,
                                    this._onMethodComplete, 
                                    this._onMethodError, 
                                    [this, value]);
                                }                        
                          break;
                    
                 /*   case "MX":
                        if (this._loadMethod == DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.LoadType.Location) {
                            //proxy for CustomerWebService.asmx GetStates(parm1, complete handler, error handler, user context);
                            DTG.Dollar.Web.Consumer.Services.CustomerWebService.GetStates(
                                value,
                                this._onMethodComplete, 
                                this._onMethodError, 
                                [this, value]);
                        }
                        else
                        {
                            if (this._loadMethod == DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.LoadType.Location) 
                            {
                             //proxy for CustomerWebService.asmx GetStates(parm1, complete handler, error handler, user context);
                             DTG.Dollar.Web.Consumer.Services.CustomerWebService.GetStates(
                                value,
                                this._onMethodComplete, 
                                this._onMethodError, 
                                [this, value]);
                            }
                            else 
                            {
                                //proxy for CustomerWebService.asmx GetAllStates(parm1, complete handler, error handler, user context);
                                DTG.Dollar.Web.Consumer.Services.CustomerWebService.GetAllStates(
                                     value,
                                    this._onMethodComplete, 
                                    this._onMethodError, 
                                    [this, value]);
                            } 
                        }                                               
                        break; */
                    default:
                        this._clearItems();
                        this._selectedValue = '';
                        this._storeState('', '');
                        this._setSelectedStateValue(this._selectedValue);
                        this._setSelectedStateText('');
                        break;
                }                
            }
        }        
    },    

    _onControlEvent : function(evnt) {
        ///<summary>Event handler for onchange ddl event</summary>
        ///<param name="evnt">event object</param>
        ///<remarks>set selected value from target ddl</remarks>
        this._setSelection();
    }    
}

DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.StateDropDownBehavior.registerClass('DTG.Dollar.Web.Consumer.Common.Ajax.StateDropDown.StateDropDownBehavior', AjaxControlToolkit.BehaviorBase);

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();