﻿var Step2Controller = (function() {
    function fnStep2ControllerConstructor(oNewModel, oNewView, oNewEventDispatcher) {
        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                 Private Variables                */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        var oModel;
        var oView;
        var oValidator;
        var oViewHelper;
        var oEventDispatcher;

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                Accessors/Mutators                */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        this.setEventDispatcher = function(oNewEventDispatcher) {
            if (oNewEventDispatcher)
                oEventDispatcher = oNewEventDispatcher;
        }

        this.setModel = function(oNewModel) {
            if (oNewModel) {
                oModel = oNewModel;
                oModel.addObserver(this);
            }
        }

        this.setView = function(oNewView) {
            if (oNewView)
                oView = oNewView;
        }

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                  Event Handlers                  */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        function form_onKeyUp(event) {
            var iKeyCode = event.which ? event.which : event.keyCode;
            var oElement = Event.element(event);
            if (oElement.match("input[type='text']") && iKeyCode != 9)
                oModel["set" + oElement.identify().replace(/txt/g, "")](oElement.value);
        }

        function lstCountry_onChange(event) {
            var oElement = Event.element(event);
            oModel.setCountry(oElement.value);
        }

        function lstCountry_onKeyUp(event) {
            lstCountry_onChange(event);
        }

        function lstProvince_onChange(event) {
            var oElement = Event.element(event);
            oModel.setProvince(oElement.value);
        }

        function lstState_onChange(event) {
            var oElement = Event.element(event);
            oModel.setState(oElement.value);
        }

        function txtPhoneNumber_onKeyDown(event) {            
            var iKeyCode = event.which ? event.which : event.keyCode;
            var oElement = Event.element(event);
            var ctrl = event.ctrlKey;
            var shift = event.shiftKey;
                        
            var bNumber = (iKeyCode > 47 && iKeyCode < 58) || (iKeyCode > 95 && iKeyCode < 106);
            var bArrow = (iKeyCode > 34 && iKeyCode < 41);
            var bDelete = (iKeyCode == 8 || iKeyCode == 46);
            var bTab = (iKeyCode == 9);
            
            var bCopy = (iKeyCode == 67 && ctrl) || (iKeyCode == 45 && ctrl) || (iKeyCode == 88 && ctrl);
            var bPaste = (iKeyCode == 86 && ctrl) || (iKeyCode == 45 && shift);
          
            if (bNumber || bArrow || bDelete || bTab || bCopy || bPaste) {
                if (bNumber && oElement.value.length == 20)
                        Event.stop(event);
            } else
                Event.stop(event);
        }
        
        function txtPhoneNumber_onKeyUp(event)
        {
           if ($("lstCountry").value == "United States") {
                var oElement = Event.element(event);
                var sValue = oElement.value.replace(/-/g, "");
                var tplPhoneNumber = new Template("#{0}#{1}#{2}-#{3}#{4}#{5}-#{6}#{7}#{8}#{9}");
                var oDigits = {0: "", 1: "", 2: "", 3: "", 4: "", 5: "", 6: "", 7: "", 8: "", 9: ""};
                for (var iCharacter = 0; iCharacter < 10; iCharacter++){
	                if (iCharacter == sValue.length)
		                break;
	                else
		                oDigits[iCharacter] = sValue.substr(iCharacter, 1);
                }
                var sNewValue = tplPhoneNumber.evaluate(oDigits).replace(/-+$/g, "");
                oElement.value = sNewValue;
            }
        }

        function btnStep2Continue_onClick(event) {
            if (oValidator.isValid())
                oEventDispatcher.dispatchEvent("Continue", { step: 2 });
            else {
                oEventDispatcher.dispatchEvent("Set Error Modal Header", { text: "In order to continue to Step 3 of your quote, please be sure to provide information for the following field(s):" });
                var hErrors = oValidator.getAllErrors();
                var hStep2Errors = $H();
                hErrors.each(function(oPair) {
                    if (oPair.value.length > 0)
                        hStep2Errors.set(oPair.key, new Array(oPair.key));
                });
                oEventDispatcher.dispatchEvent("Set Error Modal List", { errors: hStep2Errors });
                oEventDispatcher.dispatchEvent("Show Error Modal", null);
                oViewHelper.showErrorMessages(hErrors);
            }
        }
        
        function tabStep2Back_onClick(event)
		{
		    var sCountry = oModel.getCountry();
		    
		    if(sCountry != "Please Select..." && sCountry != "-")
			{
		        var url = "/onlinequote/getregionbycountry.aspx?country=" + unescape(sCountry);
                new Ajax.Request(url, { method: "get", onSuccess: function(transport){
                   	var response = eval("("+transport.responseText+")");
		            var region = response.region;
        		    
		            // Notify all observers that region has changed!!!
		            oLicenseItemModel.setRegion(region);
		            
		            oEventDispatcher.dispatchEvent("BackToFirst", null);
                }});
            }
            else 
            {
                oEventDispatcher.dispatchEvent("BackToFirst", null);
            }
		}
		
        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*            Class Level Private Methods           */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        function attachEvents() {
            Event.observe($$("div.Form").first(), "keyup", form_onKeyUp);
            Event.observe($("lstCountry"), "change", lstCountry_onChange);
            Event.observe($("lstCountry"), "keyup", lstCountry_onKeyUp);
            Event.observe($("lstProvince"), "change", lstProvince_onChange);
            Event.observe($("lstState"), "change", lstState_onChange);
            Event.observe($("txtPhoneNumber"), "keydown", txtPhoneNumber_onKeyDown);
            Event.observe($("txtPhoneNumber"), "keyup", txtPhoneNumber_onKeyUp);
            Event.observe($("btnStep2Continue"), "click", btnStep2Continue_onClick);
            Event.observe($("tbStep1"), "click", tabStep2Back_onClick);
        }

        function initializeView() {
            oViewHelper.loadValues({ sEmailAddress: oModel.getEmailAddress(), sFirstName: oModel.getFirstName(), sLastName: oModel.getLastName(), sCompany: oModel.getCompany(), sCountry: oModel.getCountry(), sState: oModel.getState(), sPostalCode: oModel.getPostalCode(), sProvince: oModel.getProvince(), sPhoneNumber: oModel.getPhoneNumber() });
        }

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                Observer Interface                */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        this.update = function(oArguments) {
            switch (oArguments.event) {
                case "Value Changed":
                    var sProperty = oArguments.property;
                    oValidator.validatePropertyByName(sProperty);
                    oViewHelper.updateErrorMessages(oValidator.getAllErrors());
                    if (sProperty == "Country") {
                        var sCountry = oModel.getCountry();
                        oViewHelper.showLocationFields(sCountry);
                        oViewHelper.togglePhoneNumber(sCountry);
                    }
                    break;
                case "Details Changed":
                    initializeView();
                    break;
            }
        }

        /****************************************************/
        /*                                                  */
        /*                                                  */
        /*                 Initialize Class                 */
        /*                                                  */
        /*                                                  */
        /****************************************************/

        this.setModel(oNewModel);
        this.setView(oNewView);
        this.setEventDispatcher(oNewEventDispatcher);
        if (oModel && oView && oEventDispatcher) {
            oValidator = new ContactInformationModelPropertyValidator(oModel);
            oViewHelper = new ContactInformationFormViewHelper(oView);
            initializeView();
            attachEvents();
        }
    }

    return fnStep2ControllerConstructor;
})();
