Figment.Import("Disney.WDPRO.IBC.GuestServices",Figment.getJSRoot() + "modules/");
Figment.Import("Figment.EventHandler",Figment.getJSRoot() + "_framework/");
Figment.Import("Figment.DOM",Figment.getJSRoot() + "_framework/");
Figment.Import("Figment.Date",Figment.getJSRoot() + "_framework/");

Figment.Namespace("Disney.WDPRO.IBC.GuestServices.Plugins.Register");

Disney.WDPRO.IBC.GuestServices.Plugins.Register = {
    CONSTANTS: {
        PLUGIN_ID: "GuestServices_Register_PlugIn",
        CHANGE_STATE_BUTTON_CLASS: "guest_services_register_plugin_change_state_button",
        PLUGIN_STATE_CLASS: "guest_services_register_plugin_state",

        AGEGATE_ACTION_BUTTON_ID: "guest_services_agegate_action_button",

        DEFAULT_STATE: "promo",

        MINIMUM_ALLOWED_AGE: 18,
        INVALID_DATE_ERROR_CODE: "E1800003",
        UNDER_AGED_ERROR_CODE: "E1800015",

        CREATE_NEW_ACCOUNT_WORKFLOW_NAME: "Guest_STD_CreateAccount_Guest_Information_WorkFlow",
        CREATE_NEW_ACCOUNT_GUEST_INFO_PAGE_NAME: "Guest_STD_GuestInformation_CreateAccount_Page",
        NEW_ACCT_LOGIN_LINK_ID: "newAcctRegLoginLink",

        PROCESS_WORKFLOW_LOCATION: Figment.getWebRoot() + 'en_US/modules/helpers/goToEntryWorkFlow',
        PROCESS_ENGINE_LOCATION: Figment.getWebRoot() + 'en_US/_framework/components/processEngine'
    },

    getClassName: function()
    {
        return "Disney.WDPRO.IBC.GuestServices.Plugins.Register";
    },

    setToDefaultState: function()
    {
        Disney.WDPRO.IBC.GuestServices.Plugins.Register.setToState(Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.DEFAULT_STATE);
    },

    setToState: function(state)
    {
        Disney.WDPRO.IBC.GuestServices.changeState(state, YAHOO.util.Dom.getElementsByClassName(Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.PLUGIN_STATE_CLASS));
    },

    register: function(birthMonth, birthDay, birthYear, sourceName)
    {
        var errors = Disney.WDPRO.IBC.GuestServices.Plugins.Register._validateDate(birthMonth, birthDay, birthYear);
        if(errors.length > 0)
        {
            var xml = Disney.WDPRO.IBC.GuestServices.Plugins.Register._createXMLDocument(errors);
            Disney.WDPRO.IBC.GuestServices.Plugins.Register._handleErrors(xml);
            Disney.WDPRO.IBC.GuestServices.Plugins.Register._sendEvent(errors, false, "register", birthMonth, birthDay, birthYear, sourceName);
        }
        else
        {
            Disney.WDPRO.IBC.GuestServices.Plugins.Register._handleErrors(null);
            Disney.WDPRO.IBC.GuestServices.Plugins.Register._sendEvent([], true, "register", birthMonth, birthDay, birthYear, sourceName);
        }
    },

    getPluginElement: function()
    {
        return document.getElementById(Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.PLUGIN_ID);
    },

    _validateDate: function(birthMonth, birthDay, birthYear)
    {
        var errors = [];
        if(birthMonth === "" || birthDay === "" || birthYear === "")
        {
            errors.push(Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.INVALID_DATE_ERROR_CODE);
        }

        else
        {
            // Perform under-age check
            var birthDay = Figment.Date.createDate((parseInt(birthMonth, 10)-1)+"/"+birthDay+"/"+birthYear);
            var the18birthDay = Figment.Date.subtract(new Date(),"Y",Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.MINIMUM_ALLOWED_AGE);
            Disney.WDPRO.IBC.GuestServices.Shared.logger.debug("Birthday: " + birthDay.toString());
            Disney.WDPRO.IBC.GuestServices.Shared.logger.debug("18th Birthday: " + the18birthDay.toString());
            if(birthDay >= the18birthDay)
            {
                errors.push(Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.UNDER_AGED_ERROR_CODE);
            }
        }
        return errors;
    },

    _createXMLDocument: function(errorCodes)
    {
        var doc;
        var xml = "<?xml version=\"1.0\"?>\n";
        xml += "<Message>\n";
            xml += "<Errors id=\"ErrorList\">\n";
            for(var i=0; i < errorCodes.length; i++)
            {
                var errorCode = errorCodes[i];
                var message = Disney.WDPRO.IBC.GuestServices.getError(errorCode);
                if(typeof message === "undefined" || message === null)
                {
                    message = "Unknown error occurred";
                }
                xml += "<Error code=\"" + errorCode + "\">\n";
                    xml += message + "\n";
                xml += "</Error>\n";
            }
            xml += "</Errors>\n";
            xml += "<Response>\n";
                xml += "<Result id=\"result\">\n";
                    xml += "false\n";
                xml += "</Result>\n";
            xml += "</Response>\n";
        xml += "</Message>\n";
        // W3C
        if( document.implementation.createDocument )
        {
            Disney.WDPRO.IBC.GuestServices.Shared.logger.debug("Creating XML document in W3C-compliant browser");
            var parser = new DOMParser();
            doc = parser.parseFromString(xml, "text/xml");
        // MSIE
        }
        else if( window.ActiveXObject )
        {
            Disney.WDPRO.IBC.GuestServices.Shared.logger.debug("Creating XML document in IE browser");
            doc = new ActiveXObject("Microsoft.XMLDOM");
            doc.async = "false";
            doc.loadXML(xml);
        }
        return doc;
    },

    _handleErrors: function(xml)
    {
        var CONSTANTS = {
            ERROR_CODE_LIST_IN_REGISTER_STATE_ID: "guest_services_agegate_error_list"
        };
        var errorListContainer = document.getElementById(CONSTANTS.ERROR_CODE_LIST_IN_REGISTER_STATE_ID);
        if(errorListContainer !== null)
        {
            var errorLists = errorListContainer.getElementsByTagName("UL");
            var bAddToDOM = false;
            var errorList = null;
            if(errorLists.length === 0)
            {
                errorList = document.createElement("UL");
                bAddToDOM = true;
            }
            else
            {
                errorList = errorLists[0];
                // Clear the list
                while(errorList.hasChildNodes())
                {
                    errorList.removeChild(errorList.firstChild);
                }
            }

            if(errorList !== null && xml !== null)
            {
                var errorsResponse = xml.getElementsByTagName("Error");
                for(var i=0; i < errorsResponse.length; i++)
                {
                    var errorResponse = errorsResponse[i];
                    var code = errorResponse.getAttribute("code");
                    var message = Figment.DOM.getFirstChildElement(errorResponse).nodeValue.trim();
                    Disney.WDPRO.IBC.GuestServices.Shared.logger.debug("Error: " + code + " ==> " + message);

                    var error = document.createElement("LI");
                    error.appendChild(document.createTextNode(message));
                    errorList.appendChild(error);
                }

                if(bAddToDOM)
                {
                    errorListContainer.appendChild(errorList);
                }
            }
        }
    },

    _sendEvent: function(errors, result, eventName, birthMonth, birthDay, birthYear, sourceName)
    {
        var eventResponse = new Disney.WDPRO.IBC.GuestServices.Event();
        eventResponse.setEvent(eventName);
        eventResponse.setSource(sourceName);
        eventResponse.setErrors(errors);
        eventResponse.setResult(result);
        eventResponse.addData("birth_month", birthMonth);
        eventResponse.addData("birth_day", birthDay);
        eventResponse.addData("birth_year", birthYear);
        Disney.WDPRO.IBC.GuestServices.Shared.logger.debug("Sending event: " + eventResponse.toString());
        Disney.WDPRO.IBC.GuestServices.dispatchEvent(eventResponse);
    },

    _changeStateEvent: function(e)
    {
        Disney.WDPRO.IBC.GuestServices.Shared.logger.debug("Change state fired!");
        var event = Figment.EventHandler.getEvent(e);
        var element = event.element;
        Disney.WDPRO.IBC.GuestServices.Shared.logger.debug("Element: " + element.tagName + " " + element.id);
        var stateName = element.getAttribute(Disney.WDPRO.IBC.GuestServices.CONSTANTS.STATE_ATTRIBUTE_NAME);
        Disney.WDPRO.IBC.GuestServices.Shared.logger.debug("State to change to: " + stateName);

        var windowEvent = Figment.EventHandler.getEvent(e);

        var strHBXPageViewCode = Disney.WDPRO.IBC.GuestServices.getHBXPNCode(windowEvent);
        var strHBXMLCCode = Disney.WDPRO.IBC.GuestServices.getHBXMLCCode(windowEvent);
        var strSCPNCode = Disney.WDPRO.IBC.GuestServices.getSCPNCode(windowEvent);
        var strSCHierCode = Disney.WDPRO.IBC.GuestServices.getSCHierCode(windowEvent);
        if (strHBXPageViewCode !== null && strHBXMLCCode !== null){
            Disney.WDPRO.IBC.GuestServices.EVENT_HBX_Event_PageView(strHBXPageViewCode,strHBXMLCCode,strSCPNCode,strSCHierCode);
        }

        if(stateName !== null)
        {
            Disney.WDPRO.IBC.GuestServices.changeState(stateName, YAHOO.util.Dom.getElementsByClassName(Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.PLUGIN_STATE_CLASS));
        }
    },

    _ageGateEvent: function(e)
    {
        // Set-up id constants used to get the member name and password field
        // elments from the DOM
        var CONSTANTS = {
            BIRTH_MONTH_ID: "guest_services_register_birth_month",
            BIRTH_DAY_ID: "guest_services_register_birth_day",
            BIRTH_YEAR_ID: "guest_services_register_birth_year"
        };

        var birthMonth = null;
        var birthDay = null;
        var birthYear = null;

        var birthMonthField = document.getElementById(CONSTANTS.BIRTH_MONTH_ID);
        if(birthMonthField !== null)
        {
            birthMonth = birthMonthField.value;
        }

        var birthDayField = document.getElementById(CONSTANTS.BIRTH_DAY_ID);
        if(birthDayField !== null)
        {
            birthDay = birthDayField.value;
        }

        var birthYearField = document.getElementById(CONSTANTS.BIRTH_YEAR_ID);
        if(birthYearField !== null)
        {
            birthYear = birthYearField.value;
        }

        var windowEvent = Figment.EventHandler.getEvent(e);

        var strHBXPageViewCode = Disney.WDPRO.IBC.GuestServices.getHBXPNCode(windowEvent);
        var strHBXMLCCode = Disney.WDPRO.IBC.GuestServices.getHBXMLCCode(windowEvent);
        var strSCPNCode = Disney.WDPRO.IBC.GuestServices.getSCPNCode(windowEvent);
        var strSCHierCode = Disney.WDPRO.IBC.GuestServices.getSCHierCode(windowEvent);
        if (strHBXPageViewCode !== null && strHBXMLCCode !== null){
            Disney.WDPRO.IBC.GuestServices.EVENT_HBX_Event_PageView(strHBXPageViewCode,strHBXMLCCode,strSCPNCode,strSCHierCode);
        }

        var sourceName = Disney.WDPRO.IBC.GuestServices.getSourceName();

        Disney.WDPRO.IBC.GuestServices.Plugins.Register.register(birthMonth, birthDay, birthYear, sourceName);
    },

    EVENT_newAcctLoginLink_onClick: function(evt)
    {
        var windowEvent = Figment.EventHandler.getEvent(evt),
            element = windowEvent.element,
            plugins = element.getAttribute(Disney.WDPRO.IBC.GuestServices.CONSTANTS.CALLER_ELEMENT_PLUGIN_ATTRIBUTE_NAME);

        if (plugins === null) {
            element.setAttribute(Disney.WDPRO.IBC.GuestServices.CONSTANTS.CALLER_ELEMENT_PLUGIN_ATTRIBUTE_NAME, "login,register");
        }
        Disney.WDPRO.IBC.GuestServices.open(element, "newAcctLogin");
    },

    main: function()
    {
        if( Figment.doesClassExist("Disney.WDPRO.IBC.GuestServices") )
        {
            // added nullcheck to prevent JS errors where Header was not present ie: DVC
            if (Disney.WDPRO.IBC.UI.Header!=null) {
                Disney.WDPRO.IBC.UI.Header.OBSERVER = Disney.WDPRO.IBC.GuestServices.subscribe();
                Disney.WDPRO.IBC.UI.Header.OBSERVER.update = function(obs,response)
                {
                    var eventName = response.getEvent().toLowerCase();
                    var result = response.getResult();
                    var sourceName = response.getSource();

                    if(result && eventName === "login" && sourceName === "newAcctLogin")
                    {
                        window.location = Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.PROCESS_ENGINE_LOCATION+"?process=true&name=";
                    }
                };
            }
        }

        Disney.WDPRO.IBC.GuestServices.registerPlugin(Disney.WDPRO.IBC.GuestServices.Plugins.Register);
        YAHOO.util.Dom.getElementsByClassName(Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.CHANGE_STATE_BUTTON_CLASS,
        		null, null, function(element) {
        			YAHOO.util.Dom.addClass(element, Disney.WDPRO.IBC.GuestServices.CONSTANTS.PREVENT_ASYNC_FROM_PLEASEWAIT);
        			YAHOO.util.Event.addListener(element,"click",Disney.WDPRO.IBC.GuestServices.Plugins.Register._changeStateEvent);
        		});

        var ageGateActionButton = YAHOO.util.Dom.get(Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.AGEGATE_ACTION_BUTTON_ID);
        if(ageGateActionButton !== null)
        {
        	YAHOO.util.Dom.addClass(ageGateActionButton, Disney.WDPRO.IBC.GuestServices.CONSTANTS.PREVENT_ASYNC_FROM_PLEASEWAIT);
        	YAHOO.util.Event.addListener(ageGateActionButton, "click", Disney.WDPRO.IBC.GuestServices.Plugins.Register._ageGateEvent );
        }
        
        YAHOO.util.Event.addListener(Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.NEW_ACCT_LOGIN_LINK_ID,
        			'click', Disney.WDPRO.IBC.GuestServices.Plugins.Register.EVENT_newAcctLoginLink_onClick);        
    }
};

Figment.EntryPoint.add(Disney.WDPRO.IBC.GuestServices.Plugins.Register);
