Dispatcher = {
    init: function()
    {
        Dispatcher.ready = true;
        Dispatcher.timeout = 100;
        Dispatcher.functions = [];
        Dispatcher.args = [];
        Dispatcher.trigger = null;
    },

    addFunction: function(fun, arg){
        this.functions[this.functions.length] = fun;
        this.args[this.args.length] = arg;
    },

    setTrigger: function(fun){
        this.trigger = fun;
    },

    fire: function(){
        this.ready = this.trigger();
        if (!this.ready){
            this.functions[0](this.args[0]);
            this.functions.splice(0, 1);
            this.args.splice(0, 1);
        }
        this.start();
    },

    start : function(){
        if (this.functions.length > 0 && this.trigger != null)
        {
            setTimeout('Dispatcher.fire()', this.timeout);
        }

    }
};


var MultiItem =
{
    countLabelClass: 'multiitem_count_label',

    init: function()
    {
        MultiItem.count = 0;
        MultiItem.checkBoxes = [];
        MultiItem.selectedSkuSelects = [];
        MultiItem.addedToBagCount = 0;

        MultiItem.unsubscribeAddToBagListenersIn(skus_select);

        // if we are in an overlay change its properties so we can scroll it
        if (YAHOO.lang.isObject(my_sfcPanel))
        {
            my_sfcPanel.setProperty('fixedcenter', 'contained', true);
            my_sfcPanel.setProperty('zIndex', '5', true);
        }

        var inputs = document.getElementsByTagName('input');

        // add listeners to the checkboxes
        for (i = 0, ii = inputs.length; i < ii; i++)
        {
            if (inputs[i].type.toLowerCase() == 'checkbox')
            {
                MultiItem.checkBoxes[MultiItem.checkBoxes.length] =
                    inputs[i];
                YAHOO.util.Event.purgeElement(inputs[i], false);
                YAHOO.util.Event.addListener(inputs[i], 'click', MultiItem.checkboxClickListener);
            }
        }

        // listeners to add to bag
        var links = YAHOO.util.Selector.query('a.multiitem_add_to_bag');

        for(i = 0, ii = links.length; i < ii; i++)
        {
            YAHOO.util.Event.addListener(
                links[i],
                'click',
                MultiItem.addToBagListsner
            );
        }

        MultiItem.updateCountLabel();

        // send to a friend listener
        links = YAHOO.util.Selector.query('.multiitem_send a');
        for(i = 0, ii = links.length; i < ii; i++)
        {
            YAHOO.util.Event.removeListener(links[i], 'click', SendToFriend);
            YAHOO.util.Event.addListener(links[i], 'click', SendToFriend);
        }
        
        // add listeners to autocheck checkboxes whn the info is complete
        if (skus_select.length > 0) 
        {
            for(i = 0, ii = skus_select.length; i < ii; i++)
            {
                if (YAHOO.lang.isObject(skus_select[i])) 
                {
                    YAHOO.util.Event.addListener(skus_select[i].getQtySelect(), 'change', MultiItem.autocheckListener, skus_select[i]);
                    YAHOO.util.Event.addListener(skus_select[i].getColorSelect(), 'change', MultiItem.autocheckListener, skus_select[i]);
                    YAHOO.util.Event.addListener(skus_select[i].getSizeSelect(), 'change', MultiItem.autocheckListener, skus_select[i]);
                }
            }
        }
    },
    
    autocheckListener: function(evento, sku_select)
    {
        var itembox_id = 'itembox_' + sku_select.item_id;
        var itembox = YAHOO.util.Dom.get(itembox_id);
        var checkbox_list = YAHOO.util.Selector.query('input[type=checkbox]', itembox);
        if (checkbox_list.length > 0)
        {
            var checkbox = checkbox_list[0];
        }
        else
        {
            return;
        }
        
        var id = checkbox.name.match(/\d+/)[0];
        
        if (sku_select.checkSizeQty(true)) 
        {
            if (!checkbox.checked)
            {
                checkbox.checked = true;

                MultiItem.setSelected(id);
            }
        }
        else if(checkbox.checked)
        {
            checkbox.checked = false;
            MultiItem.setUnselected(id);
        }
    },

    checkboxClickListener: function(event)
    {
        var id = this.name.match(/\d+/)[0];
        if (this.checked)
        {
            MultiItem.setSelected(id);
        }
        else
        {
            MultiItem.setUnselected(id);
        }
    },

    setSelected: function(id)
    {
        if (skus_select[id])
        {
            var selected = MultiItem.selectedSkuSelects;
            selected[selected.length] = skus_select[id];
            MultiItem.setCount(MultiItem.getCount() + 1);
        }
    },

    setUnselected: function(id)
    {
        var item_id = skus_select[id].item_id;
        
        var selected = MultiItem.selectedSkuSelects;

        for(i = 0, ii = selected.length; i < ii; i++)
        {
            if (selected[i].item_id == item_id)
            {
                selected.splice(i, 1);
                break;
            }
        }

        MultiItem.setCount(MultiItem.getCount() - 1);
    },

    getCount: function()
    {
        return MultiItem.count;
    },

    setCount: function(val)
    {
        MultiItem.count = val;
        MultiItem.updateCountLabel();
    },

    updateCountLabel: function()
    {
        var spans = YAHOO.util.Selector.query('div.'
            + MultiItem.countLabelClass);

        for(i = 0, ii = spans.length; i < ii; i++)
        {
            label = spans[i];
            label.innerHTML = '<b>' + MultiItem.count + '</b>'
                + ' of ' + MultiItem.checkBoxes.length + ' items selected';
        }
    },

    addToBagListsner: function(event)
    {
        MultiItem.addSelectedToBag();
        YAHOO.util.Event.preventDefault(event);
    },
    
    removeErrorsToSkuSelect: function(sku_select)
    {
        var elSize  = sku_select.getSizeSelect();
        var elColor = sku_select.getColorSelect();
        var elQty   = sku_select.getQtySelect();

        YAHOO.util.Dom.addClass(elSize,  'error');
        YAHOO.util.Dom.addClass(elColor, 'error');
        YAHOO.util.Dom.addClass(elQty,   'error');
    },
    
    removeSkuSelectErrors: function(sku_select)
    {
        var elSize  = sku_select.getSizeSelect();
        var elColor = sku_select.getColorSelect();
        var elQty   = sku_select.getQtySelect();

        YAHOO.util.Dom.removeClass(elSize,  'error');
        YAHOO.util.Dom.removeClass(elColor, 'error');
        YAHOO.util.Dom.removeClass(elQty,   'error');
    },
    
    addErrorsToSkuSelect: function(sku_select)
    {
        var elSize  = sku_select.getSizeSelect();
        var elColor = sku_select.getColorSelect();
        var elQty   = sku_select.getQtySelect();

        YAHOO.util.Dom.addClass(elSize,  'error');
        YAHOO.util.Dom.addClass(elColor, 'error');
        YAHOO.util.Dom.addClass(elQty,   'error');
    },
    
    addSelectedToBag: function ()
    {
        var selected = MultiItem.selectedSkuSelects;
        var hasErrors = false;

        MultiItem.hideErrors();

        if (selected.length == 0) {
            MultiItem.showErrorPanel('Please select an item below.');
        };


        for (i = 0, ii = selected.length; i < ii; i++)
        {
            if (!selected[i].checkSizeQty(true))
            {
                var actual_sku_select = selected[i];
                MultiItem.addErrorResolvedListener(actual_sku_select);
                MultiItem.addErrorsToSkuSelect(actual_sku_select);
                hasErrors = true;
            }
        }

        if (hasErrors)
        {
            MultiItem.showErrorPanel('Please select a quantity and size for the items selected below.');
            return false;
        }

        MultiItem.call = null;

        Dispatcher.init();
        for(i = 0, ii = selected.length; i < ii; i++)
        {
            var ss = selected[i];
            var args = [ss, i, ii];

            ss.addToBagSuccess.unsubscribe(MultiItem.onAddToBagSuccessListener);
            ss.addToBagSuccess.subscribe(MultiItem.onAddToBagSuccessListener, args);

            Dispatcher.addFunction(function(sku_select)
            {
                MultiItem.call = sku_select.addToBag();
            }, ss);
        }

        Dispatcher.setTrigger(function() {
            return YAHOO.util.Connect.isCallInProgress(MultiItem.call);
        });

        Dispatcher.start();

        return true;
    },
    // - arr: [originalSkuSelect, i (number of element added), ii (of this count of elements)]
    // - args: { Response from ajaxAddToCart }
    onAddToBagSuccessListener: function(type, args, arr)
    {
        MultiItem.addedToBagCount++;
        if (Dispatcher.functions.length == 0 && !YAHOO.util.Connect.isCallInProgress(MultiItem.call))
        {
            MultiItem.hideOverlay();
            MultiItem.showAddedToCart(MultiItem.addedToBagCount);
            MultiItem.resetAddedToBag();
        }
    },

    hideOverlay: function()
    {
        if (YAHOO.lang.isObject(my_sfcPanel))
        {
            my_sfcPanel.hide();
            // my_sfcPanel.destroy();
        }
    },

    showErrorPanel: function (msg)
    {
        var div = document.getElementById('multiitem_error_container');
        var custom = document.getElementById('multiitem_error_message');
        if (div && custom)
        {
            custom.innerHTML = msg;
            div.style.display = 'block';
        }
    },

    hideErrors: function()
    {
        var div = document.getElementById('multiitem_error_container');
        if (div)
        {
            div.style.display = 'none';
        }

        var selects = YAHOO.util.Selector.query('select.error');
        for(i = 0, ii = selects.length; i < ii; i++)
        {
            YAHOO.util.Dom.removeClass(selects[i], 'error');
        }
    },

    showAddedToCart: function(number)
    {
        generateSfcPanel(
            'multiitem_added',
            'Item(s) confirmation',
            '<div class="multiitem_added"><strong>' + number + '</strong> items were added to your shopping bag.</div>',
            '435px',"","","",3
        );
    },

    unsubscribeAddToBagListenersIn: function(arr)
    {
        for(i = 0, ii = arr.length; i < ii; i++)
        {
            if (arr[i])
            {
                arr[i].addToBagSuccess.unsubscribe(MultiItem.onAddToBagSuccessListener);
            }

        }
    },

    resetAddedToBag: function(type, args, originalSkuSelect)
    {
        MultiItem.addedToBagCount = 0;
    },
    
    resolvedErrorListener: function(event, sku_select)
    {
        if (sku_select.checkSizeQty(true))
        {
            MultiItem.removeSkuSelectErrors(sku_select);
        }
    },

    addErrorResolvedListener: function(sku_select)
    {
        
        var elements = [
            sku_select.getQtySelect(),
            sku_select.getSizeSelect(),
            sku_select.getColorSelect()
        ];
        
        for(i = 0, ii = elements.length; i < ii; i++)
        {
            YAHOO.util.Event.addListener(elements[i], 'change', MultiItem.resolvedErrorListener, sku_select);
        }
    },
    
    removeErrorResolvedListener: function(sku_select)
    {
        var elements = [
            sku_select.getQtySelect(),
            sku_select.getSizeSelect(),
            sku_select.getColorSelect()
        ];
        
        for(i = 0, ii = elements.length; i < ii; i++)
        {
            YAHOO.util.Event.removeListener(elements[i], 'change', MultiItem.resolvedErrorListener);
        }
    },

    addToFavorites: function(id)
    {
        if (skus_select[id])
        {
            var ss = skus_select[id];

            MultiItem.hideErrors();

            if (!ss.checkSizeQty(true))
            {
                MultiItem.addErrorsToSkuSelect(ss);
                MultiItem.addErrorResolvedListener(ss);
                MultiItem.showErrorPanel('Pleaase select a quantity and size for the items selected below.');
                return false;
            }

            MultiItem.removeErrorResolvedListener(ss);

            var postData = "i=" + ss.item_id + "&q=1&s=" + ss.size_id + "&c="
                + ss.color_id + "&ajax=true";

            var callback =
            {
                success: function(o)
                {
                    var response = YAHOO.lang.JSON.parse(o.responseText);

                    if (!response.authenticated)
                    {
                        redirectTo('/wishlist');
                    }
                    else
                    {
                        generateSfcPanel(
                            'multiitem_added',
                            'Item(s) confirmation',
                            '<div class="multiitem_added"><strong>1</strong> items were added to your Wish List.</div>',
                            '435px',
                            true
                        );
                    }

                    ss.setDefaults('itembox_' + ss.item_id);

                    // tell everybody we changed the select boxes
                    var events = YAHOO.util.Event.getListeners(ss.getQtySelect(), 'change');
                    for(i = 0, ii = events.length; i < ii; i++)
                    {
                        events[i].fn(events[i], ss);
                    }
                },
                failure: function (o) {}
            };

            YAHOO.util.Connect.asyncRequest(
                'POST',
                '/wishlist/add',
                callback,
                postData);
        }
    },

    print: function()
    {
        var name = MultiItem.showingGroupName;
        var items_color = "";
        for(var i in skus_select)
        {
            items_color += skus_select[i].item_id + "-" + skus_select[i].color_id +"--";
        }
        
        var url = 'http://' + window.location.host + '/g/print?';
        url += 'group_name=' + name;
        if(items_color != "")
            url += '&items_color=' + items_color;

        MultiItem.pWin = window.open(url, 'Print', 'width=545,height=720');

        if (!MultiItem.pWin)
        {
            alert('Please disable your popup blocker.');
        }
    }
};

var MultiItemPDPHooks =
{
    init: function()
    {
        // add PDP skuSelect listener
        if (typeof skuSelect != 'undefined')
        {
            skuSelect.changedColorEvent.subscribe(MultiItemPDPHooks.onSkuSelectChangedColor, this);
        }

        // add listener to the link to open the outfits overlay
        var show_outfits = MultiItemPDPHooks.getOutfitLinks();

        for(i = 0, ii = show_outfits.length; i < ii; i++)
        {
            YAHOO.util.Event.addListener(show_outfits[i], 'click', MultiItemPDPHooks.showOutfitsOverlay);
        }
    },

    getOutfitLinks: function()
    {
        var links = YAHOO.util.Selector.query('#multi_item_getlook a');

        return links;
    },

    onSkuSelectChangedColor: function(type, args, me)
    {
        var color_id = args[0][0];
        var sku_select = me;
        var item_id = args[0][2].item_id;

        var postData = "item_id="+item_id+"&color_id="+color_id;
        var callback =
        {
            success: function(o) {
                var data = YAHOO.lang.JSON.parse(o.responseText);

                if (data != null)
                {
                    MultiItemPDPHooks.showOutfits();
                    MultiItemPDPHooks.changeItemGroup(data);
                }
                else
                {
                    MultiItemPDPHooks.updateItemGroupName('');
                    MultiItemPDPHooks.fadeTo(0, function(){ MultiItemPDPHooks.hideOutfits(); });
                }
            },
            failure: function (o) {}
        };

        YAHOO.util.Connect.asyncRequest(
            'POST',
            '/g/getItemGroupBySku',
            callback,
            postData);
    },

    changeItemGroup: function(data)
    {
        // do nothing if it is the same outfit
        var name = MultiItemPDPHooks.getOutfitLinks()[0]._item_group_name;
        if (data.name == name)
        {
            return;
        }

        var afterEffect = function()
        {
            YAHOO.util.Dom.get('multi_item').style.visibility = 'visible';

            //YAHOO.util.Dom.get('multi_item_desc').innerHTML = data.description;
            MultiItemPDPHooks.updateItemGroupName(data.name);
            MultiItemPDPHooks.updateItemGroupThumbnail(data.small_image,data.name);
            MultiItemPDPHooks.fadeTo(1);
        };

        MultiItemPDPHooks.fadeTo(0, afterEffect);
    },

    updateItemGroupThumbnail: function(str,name)
    {
        var img_holder = YAHOO.util.Dom.get('multi_item_img');
        while(img_holder.childNodes.length > 0)
        {
            img_holder.removeChild(img_holder.childNodes[0]);
        }
                
        var img = document.createElement('IMG');
        YAHOO.util.Dom.setAttribute(img, 'src', str);
        YAHOO.util.Dom.setAttribute(img, 'border', 'no');

        var link = document.createElement('a');
        YAHOO.util.Dom.setAttribute(link, 'href', '#');
        link._item_group_name = name;
        link.appendChild(img);

        img_holder.appendChild(link);
        
        YAHOO.util.Event.addListener(link, 'click', MultiItemPDPHooks.showOutfitsOverlay);
    },

    updateItemGroupName: function(name)
    {
        var links = MultiItemPDPHooks.getOutfitLinks();

        for(i = 0, ii = links.length; i < ii; i++)
        {
            links[i]._item_group_name = name;
        }
    },

    showOutfitsOverlay: function(event)
    {

        var link = this;
        if (link._item_group_name)
        {
            getPageOverlay('get_this_look', 'get this look', '/success/'+link._item_group_name,'756px', true);
            MultiItem.showingGroupName = link._item_group_name;
        }

        YAHOO.util.Event.preventDefault(event);
    },

    fadeTo: function(target_to, func)
    {
        var outfits = YAHOO.util.Dom.get('multi_item');
        var anim = new YAHOO.util.Anim(outfits, {opacity: {to: target_to}}, 0.5);

        if (func)
        {
            anim.onComplete.subscribe(func);
        }

        anim.animate();
    },
    
    showOutfits: function() 
    {
        var outfits = YAHOO.util.Dom.get('multi_item');
        if (outfits) 
        {
            outfits.style.display = 'block';
        }
    },
    
    hideOutfits: function() 
    {
        var outfits = YAHOO.util.Dom.get('multi_item');
        if (outfits) 
        {
            outfits.style.display = 'none';
        }
    }
};

