function Box (id) {
    this.is_open = false;
    this.id = id;
}

BoxModel = {
    boxes: new Array(),
    open: function  (id) {
        hideErrorPanel();
        for (var i=0; i < this.boxes.length; i++) {
            if (this.boxes[i].is_open && !this.close(i)) {
                return false;
            } 
        };
        this.show(id);
        this.boxes[id].is_open = true;
                
        return true;
    },
    
    addBox: function  (box) {
        this.boxes[this.boxes.length] = box;
    },
    
    hide: function(id) {
        var details = document.getElementById('details_' + id);
        if (details) { details.style.display = 'none'; }
        
        if (!skus_select[id].checkSizeQty()) { 
            var summary = document.getElementById('summary_' + id);
            summary.style.display = 'none';
        }
    },
    
    show: function(id) {
        var details = document.getElementById('details_' + id);
        details.style.display = 'block';
    },
    
    close: function  (id) {
        if (skus_select[id].checkSizeQty()) {
            this.hide(id);
            var qty   = document.getElementById('sum_qty_' + id);
            var size  = document.getElementById('sum_size_' + id);
            var color = document.getElementById('sum_color_' + id);
            
            qty.innerHTML = skus_select[id].qty.length > 0 ? 'QTY: ' + skus_select[id].qty : '';
            size.innerHTML = skus_select[id].size_id.length > 0 ? 'SIZE: ' + skus_select[id].color_size[id][skus_select[id].color_id][skus_select[id].size_id]['description'] : '';
            color.innerHTML = skus_select[id].color_id.length > 0 ? 'COLOR: ' + color_desc[skus_select[id].color_id] 
                                                                  : '';
            
            var summary = document.getElementById('summary_' + id);
            summary.display = 'block';
        } else {
            showError(id);
            return false;
        }
        hideError(id);
        this.boxes[id].is_open = false;
        return true;
    },
    
    toggleSelection: function(id) {
        var chk = document.getElementById('item_' + id);
        if ( chk && !chk.checked ) { 
            this.hide(id);
            this.boxes[id].is_open = false;
        } else {
            if (!this.open(id)) {
                var ido = this.getCurrentlyOpenId();
                if (ido >= 0) {
                    document.getElementById('item_' + ido).checked = false;
                    this.boxes[ido].is_open = false;
                    this.hide(ido);
                                        
                    this.open(id);
                }
            } else {
                return true;
            };
        }
        return true;
    },
    
    getCurrentlyOpenId: function  () {
        for (var i=0; i < this.boxes.length; i++) {
            if (this.boxes[i].is_open) return this.boxes[i].id;
        };
        return -1;
    }
};

function hideErrorPanel () {
    var div = document.getElementById('qv_errors');
    if (div) {
        div.style.display = 'none';
    }
}

function details (item_id, show, id) {
    var visible = 'block';
    if (!show) {
        // hiding the box. validate before closing.
        return BoxModel.close(id);
    } 
    return BoxModel.open(id);
}

function selectFirstColor () {
    var boxes = YAHOO.util.Dom.getElementsByClassName('item', 'div');
    for (var i=0; i < boxes.length; i++) {
        YAHOO.util.Dom.getElementsByClassName('swatch', 'div', boxes[i])[0].onclick();
    };
}

function populateSize(selected_el, color_id, newimg, item_id) {
    item_id = item_id || null;
    var sw;
    if (item_id != null) {
        sw = YAHOO.util.Dom.getElementsByClassName('swatches',
                'div',document.getElementById('itembox_' + item_id))[0];
    } else {
        sw = document.getElementById('swatches');
    }

    var swatches = YAHOO.util.Dom.getElementsByClassName('swatch', 'div', sw);
    var ddSize = YAHOO.util.Dom.getElementsByClassName('size_select',
                        'select', document.getElementById('itembox_' + item_id))[0]
                    || document.getElementById("size_select");

    if(typeof current_color_id != 'undefined' && current_color_id == color_id)
        return;

    current_color_id[item_id] = color_id;

    while (ddSize.options.length > 1) ddSize.remove(1);

    for (var i=0; i < swatches.length; i++) {
        swatches[i].className='swatch';
    };

    selected_el.className='swatch selected';

    for (var size_id in color_size[item_id][color_id]) {
        addOption(ddSize, color_size[item_id][color_id][size_id]['description'], size_id);
    }

    newimg=newimg || '';
    if (newimg != '') {
        var img = YAHOO.util.Dom.getElementsByClassName(
                    'product_image',
                    'img',
                    document.getElementById('itembox_' + item_id))[0]
                  || document.getElementById('product_image');
        img.src = newimg;
    };

    hideSwatchName();
} // function

function addOption(select_elem, label, value) {
    var opt = new Option(label, value);
    try {
        select_elem.add(opt, null); // standards compliant
    } catch(ex) {
        select_elem.add(opt); // IE only
    }
}

function showErrorPanel (msg) {
    var div = document.getElementById('qv_errors');
    var custom = document.getElementById('custom-alert');
    if (div && custom) {
        custom.innerHTML = msg;
        div.style.display = 'block';
    }
}

function addAllToWishlist () {
    var inputs = document.getElementsByTagName('input');
    var checked_items = new Array();
    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type == 'checkbox' && inputs[i].checked) {
            checked_items[checked_items.length] = inputs[i].name.match(/\d+/)[0];
        };
    };

    call = null;
    if (checked_items.length == 0) { 
        showErrorPanel('Select the items you would like to add to your favorites.');
    };
    for (var i = 0; i < checked_items.length; i++) {
        Dispatcher.addFunction(
            function (num) {
                call = wishlist.addWithConnection(skus_select[ num ]);
            }, checked_items[i]);
    };

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

    Dispatcher.start();
}

function showError (id) {
    document.getElementById('missing_size_qty_' + id).style.display = 'block';
}
function hideError (id) {
    document.getElementById('missing_size_qty_' + id).style.display = 'none';
}

function addAllToBag () {

    var inputs = document.getElementsByTagName('input');
    var checked_items = new Array();

    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type == 'checkbox' && inputs[i].checked) {
            checked_items[checked_items.length] = inputs[i].name.match(/\d+/)[0];
        };
    };

    var all_set = true;

    var j;
    // Reset all errors first
    for (var i=0; i < inputs.length; i++) {
        if (inputs[i].type != 'checkbox') continue;
        j = inputs[i].name.match(/\d+/)[0];
        document.getElementById('missing_size_qty_'+j).style.display = 'none';
    }

    if (checked_items.length == 0) { 
        showErrorPanel('Select the items you would like to add to your bag.');
    };

    // check if the qty/sizes are OK
    for (var i=0; i < checked_items.length; i++) {
        if (!skus_select[checked_items[i]].checkSizeQty()) {
            document.getElementById('missing_size_qty_' + checked_items[i]).style.display = 'block';
            document.getElementById('missing_size_qty_id').value = i;
            all_set = false;
        } else {
            document.getElementById('missing_size_qty_' + checked_items[i]).style.display = 'none';
            document.getElementById('missing_size_qty_id').value = i;
        };
    };

    if (!all_set) {
        return;
    }


    call = null;
    for (var i = 0; i < checked_items.length; i++) {
        Dispatcher.addFunction(
            function (num) {
                call = skus_select[ num ].addToBag()
            }, checked_items[i]);
    };

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

    Dispatcher.start();
}

Dispatcher = {
    ready: true,
    timeout: 100,
    functions: [],
    args: [],
    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 = this.functions.splice(1, this.functions.length - 1);
            this.args = this.args.splice(1, this.args.length - 1);
        }
        this.start();
    },

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


function printAll () {
    var inputs = document.getElementsByTagName('input');
    var checked_items = new Array();
    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type == 'checkbox' && inputs[i].checked) {
            checked_items[checked_items.length] = inputs[i].name.match(/\d+/);
        };
    };

    var itemQueue = new Array();
    var colorQueue = new Array();
    var sizeQueue = new Array();
    var qtyQueue = new Array();
    for (var i=0; i < checked_items.length; i++) {
        itemQueue[i] = skus_select[checked_items[i]].item_id;
        colorQueue[i] = skus_select[checked_items[i]].color_id;
        sizeQueue[i] = skus_select[checked_items[i]].size_id;
        qtyQueue[i] = skus_select[checked_items[i]].qty;
    };
    if(itemQueue.length > 0){
        var sUrl = "/detail/print";
        var params = '/' + itemQueue + '/' + colorQueue;
        if (sizeQueue && qtyQueue)
            params += '/' + sizeQueue + '/' + qtyQueue;
        popup(sUrl+params, 'print', 1000, 1024, true);
    }
}

function showSendAllDetails() {
    var inputs = document.getElementsByTagName('input');
    var checked_items = new Array();
    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type == 'checkbox' && inputs[i].checked) {
            checked_items[checked_items.length] = inputs[i].name.match(/\d+/);
        };
    };

    var itemQueue = new Array();
    var colorQueue = new Array();
    for (var i=0; i < checked_items.length; i++) {
        itemQueue[i] = skus_select[checked_items[i]].item_id;
        colorQueue[i] = skus_select[checked_items[i]].color_id;
    };

    if(itemQueue.length > 0){
        var callback = {
            success: function(o) {
                send_details = new YAHOO.widget.Panel("send_details", {
                    width:"514px",
                     x: (document.documentElement.clientWidth - 514)/2,
                    y: 145,
                    close:false,
                    zindex:101,
                    visible:false,
                    draggable:false,
                    modal:true,
                    underlay: 'none'
                });

                send_details.setBody(o.responseText);

                send_details.render(document.body);
                if (typeof quickViewPanel != 'undefined') {
                    quickViewPanel.hide();
                };
                send_details.show();
            },
            failure: function (o) {}
        };

        YAHOO.util.Connect.asyncRequest(
            'POST',
            '/detail/sendDetailsToFriend/',
            callback,
            'item=' + itemQueue + '&color=' + colorQueue
        );
    }
}
