/**
 * Controls all of the stuff in the advanced search for the resort selection
 *
 * No need for a namespace.  Nothing accesses this.
 */
(function() {
    /* Variable Declarations {{{*/
    var Dom = YAHOO.util.Dom,
        $ = YAHOO.util.Dom.get,
        ProductSelection = YAHOO.Disney.WDPRO.IBC.ProductSelection,
        Anim = YAHOO.util.Anim,
        Event = YAHOO.util.Event;

    var moreVacationPrefsHBXLink = 'MoreVacationPrefs_Link';

    // brower detection
    var isIE = YAHOO.env.ua.ie;

    var ids = {
        resortCategoryList: "resortCategoryList",
        resortSelectionDropDownContainer: "resortSelectionDropDownContainer",
        resortSelectionDropDown: "resortSelectionDropDown",
        noPreferenceInput: "ResortCategory_No_Preference",
        iKnowWhatIWantInput: "ResortCategory_I_KNOW",
        resortSelectionModule: "ResortSelection_Module",
        diningCheckbox: "diningCheckbox",
        diningInfoText: "diningInfoText",
        productSelectionModule: "ProductSelection_Module"
    };

    var classes = {
        openedState: "openedState",
        closedState: "closedState",
        hoverState: "hoverState",
        moduleAction: "moduleAction",
        packageOnly: "packageOnly",
        resortCategories: "resortCategoryItem",
        selected: "selected"
    };

    var noPreferenceValue = "No_Preference",
        resortCategoryPrefix = "ResortCategory_",
        resortPrefix = "Resort_DResort_",
        resortSelectionNoPreferencePrefix = "ResortSelection_No_Preference_",
        resortSuffix = "_Resorts",
        iKnowValue = "I_Know";

    // This will be an array of option elements for a full list of resorts
    var unfilteredResortSelectionDropDownOptions = [];

    /* END Variable Declarations }}}*/

    function onClick(elem, evt) {
        return Event.on(elem, "click", evt);
    }

    function withEachResortCategoryInput(apply) {
        Dom.getElementsBy(function(elem) { return Dom.hasClass(elem.parentNode, classes.resortCategories); }, "input", ids.resortCategoryList, apply);
    }

    function withEachResortOption(apply) {
        Dom.getElementsBy(function(elem) { return true; }, "option", ids.resortSelectionDropDown, apply);
    }

    function submitReportingLinkTrack_onclick(linkValue) {

        //set option object for tracking links
        var optionsObject = {engines:[Disney.WDPRO.IBC.Reporting.ANALYTICS_ENGINES.HitBox,Disney.WDPRO.IBC.Reporting.ANALYTICS_ENGINES.SiteCatalyst]
                            };

        optionsObject.linkName = linkValue;

        //track link
        Disney.WDPRO.IBC.Reporting.TrackCustomLink(optionsObject);

        //clean up
        delete optionsObject;
    }

    function handleResortCategoryChange() {
        // Remove the selected class
        var selectedResortCategoryCode = '';
        withEachResortCategoryInput(function(elem) {
                    var resortCode = elem.id.substring(resortCategoryPrefix.length);
                    var resortId = resortCode + resortSuffix;

                    var parentElem = elem.parentNode;
                    if (elem.checked === true) {
                        selectedResortCategoryCode = resortCode;
                        Dom.addClass(parentElem, classes.selected);
                        Dom.replaceClass(resortId, classes.closedState, classes.openedState);

                        // Always default to the no preference
                        var resortNoPreferenceInput = $(resortSelectionNoPreferencePrefix + resortCode);
                        if (resortNoPreferenceInput !== null) {
                            resortNoPreferenceInput.checked = true;
                        }
                        delete resortNoPreferenceInput;
                    } else {
                        Dom.removeClass(parentElem, classes.selected);
                        Dom.replaceClass(resortId, classes.openedState, classes.closedState);
                    }
                    delete parentElem;
                });
        // Kill dining checkbox for ODLX resorts
        if (selectedResortCategoryCode === "ODLX"){
            handleDiningChange(true);
        } else {
            handleDiningChange(false);
        }

        Dom.replaceClass(ids.resortSelectionDropDownContainer, classes.openedState, classes.closedState);
    }

    function handleIKnowWhatResortIWantChange() {
        handleResortCategoryChange();
        Dom.replaceClass(ids.resortSelectionDropDownContainer, classes.closedState, classes.openedState);
        handleIKnowWhatResortDiningChange();
    }

    function handleIKnowWhatResortDiningChange() {
        var resortCode = $(ids.resortSelectionDropDown).value.substring(resortPrefix.length);
        // Kill dining checkbox for ODLX resorts
        if (resortCode === "SWN" || resortCode === "DOL"){
            handleDiningChange(true);
        } else {
            handleDiningChange(false);
        }
    }

    function handleDiningChange(arg) {
        if ($(ids.diningCheckbox) !== null){
            if (arg){
                $(ids.diningCheckbox).checked = false;
                $(ids.diningCheckbox).disabled = true;
                Dom.replaceClass(ids.diningInfoText, 'diningInfo', 'diningInfoDisabled');
            } else {
                $(ids.diningCheckbox).disabled = false;
                Dom.replaceClass(ids.diningInfoText, 'diningInfoDisabled', 'diningInfo');
            }
        }
    }

    function resetCategorySelection() {
        $(ids.noPreferenceInput).checked = true;
        handleResortCategoryChange();
    }

    function handleProductSelectionChange(evt, args, obj) {
        var chosenHeadingId = args.shift().id,
            resortSelectionDropDown = $(ids.resortSelectionDropDown),
            optionsToRemove = [],
            i;

        resetCategorySelection();

        // Hide any package only class if the heading is room only
        // Do that, with a little toggle action
        var apply,
            applyWithoutOptionsManagement,
            applyWithOptionsManagement;

        if (chosenHeadingId === ProductSelection.getRoomOnlyAccordionHeadId() ||
                chosenHeadingId === ProductSelection.getRoomDineAccordionHeadId()) {
            apply = function(elem) { Dom.addClass(elem, classes.closedState); };
        } else {
            apply = function(elem) { Dom.removeClass(elem, classes.closedState); };
        }

        // Adjust the options in the resort drop down.
        if (isIE && ( chosenHeadingId === ProductSelection.getRoomOnlyAccordionHeadId() ||
                      chosenHeadingId === ProductSelection.getRoomDineAccordionHeadId() )) {
            // alias method chain
            applyWithoutOptionsManagement = apply;
            applyWithOptionsManagement = function(elem) {
                if (elem.parentNode === resortSelectionDropDown) {
                    optionsToRemove.push(elem);
                } else {
                    applyWithoutOptionsManagement(arguments);
                }
            };
            apply = applyWithOptionsManagement;
        }

        Dom.getElementsByClassName(classes.packageOnly, undefined, ids.resortSelectionModule, apply);

        if (isIE) {
            var removeOptionsFromResortSelect = function() {
                for (i=0; i < optionsToRemove.length; i++) {
                    resortSelectionDropDown.removeChild(optionsToRemove[i]);
                }
            };
            removeOptionsFromResortSelect();

            if (chosenHeadingId === ProductSelection.getRoomOnlyAccordionHeadId() ||
                chosenHeadingId === ProductSelection.getRoomDineAccordionHeadId()) {
                removeOptionsFromResortSelect();
            } else {
                withEachResortOption(function(elem) {
                    optionsToRemove.push(elem);
                });
                removeOptionsFromResortSelect();
                for (i=0; i < unfilteredResortSelectionDropDownOptions.length; i++) {
                    resortSelectionDropDown.appendChild(unfilteredResortSelectionDropDownOptions[i]);
                }
            }
        }

        delete resortSelectionDropDown;
    }

    function moreVacationsPrefsHBXLink(elem) {
        var moduleState = '';
        if (YAHOO.util.Dom.hasClass(ids.resortSelectionModule, 'openedModule')){
            moduleState = '_Open';
        } else if (YAHOO.util.Dom.hasClass(ids.resortSelectionModule, 'closedModule')){
            moduleState = '_Close';
        }
        /*old hitbox direct method
        _hbLink(moreVacationPrefsHBXLink + moduleState);*/
        submitReportingLinkTrack_onclick(moreVacationPrefsHBXLink + moduleState);
    }

    function init() {
        if (isIE) {
            withEachResortOption(function(elem) {
                unfilteredResortSelectionDropDownOptions.push(elem);
            });
        }

        ProductSelection.afterUpdateProductSelection.subscribe(handleProductSelectionChange);
        Dom.getElementsByClassName(classes.selected, 'DT', $("ProductSelection_Module"),
            function(e) {
                handleProductSelectionChange(null, [e]);
            }
        );

        onClick(ids.noPreferenceInput, handleResortCategoryChange);

        withEachResortCategoryInput(
            function(elem) {
                onClick(elem, handleResortCategoryChange);
            }
        );

        onClick(ids.iKnowWhatIWantInput, handleIKnowWhatResortIWantChange);

        Event.on(ids.resortSelectionDropDown, "change", handleIKnowWhatResortDiningChange);

        // If you refresh in firefox, the radio could be checked, so update the badboy
        handleResortCategoryChange();

        // Event handler for the hover color, since IE6 doesn't know about :hover on anything other than a link
        // And yes, I'm browser sniffing.
        if (isIE && isIE <= 6) {
            Dom.getElementsByClassName(classes.moduleAction, "h3", ids.resortSelectionModule,
                function(elem) {
                    Event.on(elem, "mouseover", function() { Dom.addClass(elem, classes.hoverState); });
                    Event.on(elem, "mouseout", function() { Dom.removeClass(elem, classes.hoverState); });
                }
            );
        }
        Dom.getElementsByClassName(classes.moduleAction, "h3", ids.resortSelectionModule,
            function(elem) {
                onClick(elem, function() { moreVacationsPrefsHBXLink(elem); });
            }
        );
    }

    Figment.EntryPoint.add({main: init});
})();

