Figment.Import( 'Figment.EventHandler',Figment.getJSRoot() + '_framework/' );
Figment.Import( 'Figment.Net.Request',Figment.getJSRoot() + '_framework/' );
Figment.Import( 'Figment.DOM',Figment.getJSRoot() + '_framework/' );

Figment.Namespace('Disney.WDPRO.IBC.MySavedOffers');

(function() {
    /* Shortcut declarations */
    var Dom = YAHOO.util.Dom,
        $ = YAHOO.util.Dom.get,
        Event = YAHOO.util.Event;

    Disney.WDPRO.IBC.MySavedOffers = {
        AJAX_PROCESSOR_LOCATION: Figment.getWebRoot() + 'en_US/_framework/components/ajaxProcessor',
        CLASSNAME_MODULE: 'module',
        ORIGINATING_FORM: null,
        ID_SAVEDOFFERS_LIST: 'savedOffersList',
        ID_SAVEDOFFERS_ERROR: 'mySavedOffers_Error',
        CLASSNAME_CLOSE_STATE: 'closedState',
        CLASSNAME_OPEN_STATE: 'openedState',
        PRIVATE_CONTENT_TEXT: null,
        ID_SAVEDOFFERS_COLLAPSED_STATE: 'savedOffersExpanded',
        CLASSNAME_SAVEDOFFERS_BUTTON: 'mySavedOffersBtn',
        CLASSNAME_SAVEDOFFERS_LOGIN_BUTTON: 'mySavedOffersLoginBtn',
        GUEST_SERVICES_SOURCE_NAME: "my-saved-offers",

        /**
         * @private
         */
        OBSERVER: null,

        /**
         * @private
         */
        getModule: function()
        {
            var that = Disney.WDPRO.IBC.MySavedOffers,
                savedOffersCollapsedState = $(that.ID_SAVEDOFFERS_COLLAPSED_STATE);

            function isModule(el) {
                return ( el.nodeType === 1 && el.nodeName.toLowerCase() === 'div' && Dom.hasClass(el, that.CLASSNAME_MODULE) )
            }

            if (isModule(savedOffersCollapsedState)) {
                return savedOffersCollapsedState;
            } else {
                return Dom.getAncestorBy(savedOffersCollapsedState, isModule);
            }
        },

        /**
         * Get the status reported by the request.
         *
         * @private
         * @return {string}
         */
        getStatus: function(doc) {
          var statusText = "";

          if (typeof doc !== 'undefined' && doc !== null) {
            var element = doc.documentElement;
            var statusNodes = element.getElementsByTagName("Status");

            if (statusNodes !== null && statusNodes.length) {
              var childNode = Figment.DOM.getFirstChildElement(statusNodes[0]);
              if (childNode !== null) {
                statusText = childNode.nodeValue;
                if (typeof statusText === 'undefined' || statusText === null) {
                  statusText = "";
                }
              }
            }
          }

          return statusText;
        },

        /**
         * Get the response reported by the request.
         * @private
         */
        getResponse: function(doc)
        {
            var element;
            var offerNodes = null;
            var offerNode;

            if( typeof doc !== 'undefined' && doc !== null )
            {
                element = doc.documentElement;
                offerNodes = element.getElementsByTagName( "Offers" );
                if( offerNodes !== null && offerNodes.length > -1 )
                {
                    offerNode = offerNodes[0];
                }
            }

            // Cleanup after ourselves
            delete element;
            delete doc;
            delete offerNodes;

            return offerNode;
        },

        /**
         *
         */
        getContent: function(doc)
        {
            var element;
            var inputNodes = null;
            var content = null;

            if( typeof doc !== 'undefined' && doc !== null )
            {
                element = doc.documentElement;
                inputNodes = element.getElementsByTagName( "Input" );
                if( inputNodes !== null && inputNodes.length > 0 )
                {
                    var inputNode = inputNodes[0];
                    content = inputNode.firstChild.nodeValue;
                }
            }

            // Cleanup after ourselves
            delete element;
            delete doc;
            delete inputNode;
            delete inputNodes;

            return content;
        },

        /**
         *
         */
        getOffers: function()
        {
            var offers = null;
            var netRequest = null;
            var doc = null;
            var statusOfCall;
            var offerNode;
            var i;

            netRequest = new Figment.Net.Request();
            netRequest.addParameter('strModuleName',Figment.DOM.getRealModuleName(Disney.WDPRO.IBC.MySavedOffers.getModule()));
            netRequest.addParameter('mySavedOffersLogin_Submit',true);
            netRequest.getOptions().setMethod('post');
            netRequest.getOptions().setUseCallbacks(false);
            netRequest.send( Disney.WDPRO.IBC.MySavedOffers.AJAX_PROCESSOR_LOCATION );
            doc = netRequest.getResponseXML();

            statusOfCall = Disney.WDPRO.IBC.MySavedOffers.getStatus(doc);
            if( statusOfCall.toLowerCase().indexOf('success') > -1 )
            {
                // Got the saved offers
                offerNode = Disney.WDPRO.IBC.MySavedOffers.getResponse(doc);
                if( offerNode !== null )
                {
                    offers = offerNode.getElementsByTagName( 'Item' );
                }
                Disney.WDPRO.IBC.MySavedOffers.PRIVATE_CONTENT_TEXT = Disney.WDPRO.IBC.MySavedOffers.getContent(doc);

                // No errors occured, so make sure we don't show the error message
                Disney.WDPRO.IBC.MySavedOffers.hideError();
            }
            else
            {
                // Failed to get the saved offers for this guest
                Disney.WDPRO.IBC.MySavedOffers.showError();
            }

            // Cleanup after ourselves
            delete doc;
            delete netRequest;
            delete offerNode;

            return offers;
        },

        /**
         * Remove all the offers from the HTML document.
         */
        removeOffers: function()
        {
            var offersList = $( Disney.WDPRO.IBC.MySavedOffers.ID_SAVEDOFFERS_LIST );
            if( offersList !== null )
            {
                // Remove all children
                Figment.DOM.removeChildNodes(offersList);
            }
            Disney.WDPRO.IBC.MySavedOffers.hideError();

            // Cleanup after ourselves
            delete offersList;
        },

        findForm: function(currentElement)
        {
            return Dom.getAncestorBy(currentElement,
                    function(el){
                        return ( el.nodeType === 1 && el.tagName.toLowerCase() === 'form')
            });
        },

        /**
         * Add the offers to the HTML document.
         */
        addOffers: function(offers)
        {
            var offersList = $( Disney.WDPRO.IBC.MySavedOffers.ID_SAVEDOFFERS_LIST );
            if( offersList !== null )
            {
                // first let's delete anything in the list from the cookie:
                Disney.WDPRO.IBC.MySavedOffers.removeOffers();

                for (var i = 0, len = offers.length; i < len; i++) {
                    var offer = offers[i];
                    var item = document.createElement('LI');
                    item.appendChild(document.createTextNode(offer.firstChild.nodeValue));
                    offersList.appendChild(item);
                }
            }

            // Cleanup after ourselves
            delete offersList;
            delete offers;
        },

        /**
         * Show the error message.
         */
        showError: function()
        {
            var errorMessage = $(Disney.WDPRO.IBC.MySavedOffers.ID_SAVEDOFFERS_ERROR);
            if( errorMessage !== null )
            {
                if( Dom.hasClass(errorMessage,Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_CLOSE_STATE) )
                {
                    Dom.replaceClass(errorMessage,Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_CLOSE_STATE,Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_OPEN_STATE);
                }
                else
                {
                    Dom.addClass(errorMessage,Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_OPEN_STATE);
                }
            }
            // Cleanup after ourselves
            delete errorMessage;
        },

        /**
         * Hide the error message.
         */
        hideError: function() {
          var MySavedOffers = Disney.WDPRO.IBC.MySavedOffers;
          var errorMessage = $(MySavedOffers.ID_SAVEDOFFERS_ERROR);
          if (errorMessage !== null) {
            if (Dom.hasClass(errorMessage, MySavedOffers.CLASSNAME_OPEN_STATE)) {
                Dom.replaceClass(errorMessage, MySavedOffers.CLASSNAME_OPEN_STATE, MySavedOffers.CLASSNAME_CLOSE_STATE);
            } else {
              Dom.addClass(errorMessage, MySavedOffers.CLASSNAME_CLOSE_STATE);
            }
          }
          // Cleanup after ourselves
          delete errorMessage;
        },

        /**
         * @private
         */
        EVENT_checkOffersBtn_onClick: function(evt)
        {
            var windowEvent = Figment.EventHandler.getEvent(evt);
            var element = windowEvent.element;

            Disney.WDPRO.IBC.MySavedOffers.ORIGINATING_FORM = Disney.WDPRO.IBC.MySavedOffers.findForm(element);

            var 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,Disney.WDPRO.IBC.MySavedOffers.GUEST_SERVICES_SOURCE_NAME);
            windowEvent.preventDefault();

            // Cleanup after ourselves
            Figment.EventHandler.cleanUp(windowEvent);
            delete element;
        },

        /**
         * @private
         */
        main: function(evt) {
          var that = this;

          // Attach the event to the login button in the "My Saved Offers" module
          Dom.getElementsByClassName(that.CLASSNAME_SAVEDOFFERS_LOGIN_BUTTON,
              null, null, function(el) {
                  Event.on(el, 'click', Disney.WDPRO.IBC.MySavedOffers.EVENT_checkOffersBtn_onClick);
          });

          if (Figment.doesClassExist('Disney.WDPRO.IBC.GuestServices')) {
            that.OBSERVER = Disney.WDPRO.IBC.GuestServices.subscribe();
            // Code to handle any changed to the logged in state of the guest
            that.OBSERVER.update = function(obs, response) {
                var savedOfferBtns;
                var savedOfferBtn;
                var savedOfferLoginBtn;
                var offers;
                var content;

                var eventName = response.getEvent().toLowerCase();
                var sourceName = response.getSource().toLowerCase();
                var result = response.getResult();

                switch(eventName) {
                  // IF LOGIN WAS EXECUTED
                  case "login":
                    // IF LOGIN WAS SUCCESSFUL
                    if (result) {
                      var bOkToCall = true;

                      if (Figment.doesClassExist("Disney.WDPRO.IBC.ReviewQuoteButton")) {
                        if (sourceName === Disney.WDPRO.IBC.ReviewQuoteButton.GUEST_SERVICES_SOURCE_NAME) {
                          bOkToCall = false;
                          break;
                        }
                      }

                      if (bOkToCall) {
                        // EXECUTE SAVED LATER ITEMS THAT REQUIRED A LOGGED IN USER
                        offers = that.getOffers();
                        if (offers !== null) {
                          that.addOffers(offers);
                        }

                        // Update the content for the button with the number of offers
                        that.replaceButtonText(that.CLASSNAME_SAVEDOFFERS_BUTTON, that.PRIVATE_CONTENT_TEXT);
                        that.showButtons(that.CLASSNAME_SAVEDOFFERS_BUTTON);
                        that.hideButtons(that.CLASSNAME_SAVEDOFFERS_LOGIN_BUTTON);
                      }
                    }
                    break;

                  // IF LOGOUT WAS EXECUTED
                  case "logout":
                    // IF LOGOUT WAS SUCCESSFUL
                    if (result) {
                      // EXECUTE SAVED FOR LATER CODE THAT OCCURS WHEN USER LOGS OUT
                      // We don't want to remove these offers now, they're powered by the cookie!
                      // Disney.WDPRO.IBC.MySavedOffers.removeOffers();
                      that.hideButtons(that.CLASSNAME_SAVEDOFFERS_BUTTON);
                      that.showButtons(that.CLASSNAME_SAVEDOFFERS_LOGIN_BUTTON);
                    }
                    break;

                  // REGISTER FROM MY SAVED OFFERS REQUESTED
                  case "register":
                    if (result) {
                      if (sourceName === that.GUEST_SERVICES_SOURCE_NAME) {
                        var data = response.getData();
                        var birthMonth = data.get("birth_month");
                        var birthDay = data.get("birth_day");
                        var birthYear = data.get("birth_year");
                        // Handle register of new guest
                        // Spawn new workflow for Reg only (the default
                        // behavior)
                        window.location.href = Disney.WDPRO.IBC.GuestServices.CONSTANTS.PROCESS_ENGINE + "?process=false&workflow=" + Disney.WDPRO.IBC.GuestServices.Plugins.Register.CONSTANTS.CREATE_NEW_ACCOUNT_WORKFLOW_NAME + "&birth_month=" + birthMonth + "&birth_day=" + birthDay + "&birth_year=" + birthYear;
                      }
                    }
                    break;
                }
            };
          };
        },

        /**
         *
         */
        hideButtons: function(className)
        {
            Dom.getElementsByClassName( className, null, null,
                    function(el){
                        if( Dom.hasClass(el, Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_OPEN_STATE) )
                        {
                            Dom.replaceClass(el, Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_OPEN_STATE,Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_CLOSE_STATE);
                        }
                        else
                        {
                            Dom.addClass(el, Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_CLOSE_STATE);
                        }
            });
        },

        /**
         *
         */
        showButtons: function(className)
        {
            Dom.getElementsByClassName(className, null, null,
                    function(el){
                        if( Dom.hasClass(el,Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_CLOSE_STATE) )
                        {
                            Dom.replaceClass(el,Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_CLOSE_STATE,Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_OPEN_STATE);
                        }
                        else
                        {
                            Dom.addClass(el,Disney.WDPRO.IBC.MySavedOffers.CLASSNAME_OPEN_STATE);
                        }
            });
        },

        /**
         *
         */
        replaceButtonText: function(className,text)
        {
            Dom.getElementsByClassName(className, null, null,
                function(el){
                    el.value = text;
                }
            );
        }
    };

    Figment.EntryPoint.add( Disney.WDPRO.IBC.MySavedOffers );

})();
