Event.observe(window, 'load', function() { 
    Event.observe($('addpromo'), 'click', addPromoCode);
    initCartProcessObservers();
    init();
});

function addPromoCode() { 
    $('addpromocodeform').action='addpromocode';
    $('addpromocodeform').submit();
}

function initCartProcessObservers() {
    if ($('cartForm')) {
        var cartForm = $('cartForm');
        var removeLinks = cartForm.getElementsByTagName('a');
        var links = $A(removeLinks);
        links.each( function(e) {
            Event.observe(e, 'click', removeItem);
        });
    }   
}

function init() { 
    var cartForm = $('cartForm');
    var inputs = cartForm.getInputs('text'); 
    inputs.each(function(e) {
        Event.observe(e, 'change', cartItemQtyChanged);
    });   
}

function removeItem(event) { 
    var removeElement = Event.element(event);
    var elementId = removeElement.id;
    var qtyId = elementId.sub('remove_', 'qty_');
    var productIdElementId =  elementId.sub('remove_', 'cartLineProductId_');
    var productId = $(productIdElementId).value;
    var itemIndex = getProductLineItemIndex(event,productId);
    var formValues = "update_" + itemIndex + "= 0"; 
    updateCartData(qtyId, formValues, 0, itemIndex);
    cartTeaser();
}

function getProductLineItemIndex(event, productId) { 
    var itemIndex = null;
    var productIdParam = "productId=" + productId;
    var formValues = $('cartForm').serialize() + "&" + productIdParam;
    new Ajax.Request('getShoppingCartItemIndex', {
        asynchronous: false, 
        onSuccess: function(transport) {
            var data = transport.responseText.evalJSON(true);
            itemIndex = data.itemIndex;
        },
        parameters: formValues
    });  
    return itemIndex;
}

function pageReload() { 
    Effect.toggle($('miniCartPage'),'slide',{ duration : .3});
}

function cartTeaser() {
    var microCart = $('miniCartPage');
    Effect.toggle(microCart,'slide',{
        duration : .3,
        beforeStart: function() {
            var cartUpdate = new Ajax.Updater('miniCartPage', './mycart', {method: 'get'});
        },
        afterFinish: function() {
            if(microCart.visible()) {
                microCart.removeClassName('contracted');
                microCart.addClassName('expanded');
            } else {
                microCart.removeClassName('expanded');
                microCart.addClassName('contracted');
            }
            var microcartQty = $('microCartQty').innerHTML; 
            if($('miniCartQty')) {
                $('miniCartQty').update(microcartQty);
            } else { 
                if($('miniCartQty1')) {
                    $('miniCartQty1').update(microcartQty + " Item");
                } else {
                    $('miniCartQty1').update(microcartQty + " Items");
                }
            }
            window.setTimeout('pageReload()', 2500);
            var microcartQty = $('microCartQty').innerHTML;
            $('microCartQty').update(microcartQty);
        }
    });
}

function updateCartData(elementId, formValues, itemQty, itemIndex) { 
    new Ajax.Request('cartItemQtyUpdate', {
        asynchronous: true, 
        onSuccess: function(transport) {
            var data = transport.responseText.evalJSON(true);
            if (data.totalQuantity == 0) { 
                $('cartTotalSection').hide();       
                $('bodySection').hide(); 
                $('headSection').hide(); 
                $('cartEmptyMsg').show();
                $('miniCartQty').update(data.totalQuantity);
            } else {               
                $('miniCartQty').update(data.totalQuantity); 
                $('cartSubTotal').update(data.subTotalCurrencyFormatted);
                $('cartDiscount').update(data.displayOrderAdjustmentsTotalCurrencyFormatted);         
                $('cartGrandTotal').update(data.displayGrandTotalCurrencyFormatted);                          
                if (elementId != undefined || $F(elementId) != "") {                 
                    if (itemQty == 0) {                     
                        var cartItemRowId = elementId.sub('qty_','cartItemRow_');
                        $(cartItemRowId).remove();
                        var cartItemDisplayRowId = elementId.sub('qty_','cartItemDisplayRow_');
                        $(cartItemDisplayRowId).remove();
                    } else {
                        var itemsHash = $H(data.cartItemData);
                        var lineTotalId = elementId.sub('qty_','displayItem_');
                        var lineDiscountTotalId = elementId.sub('qty_','addPromoCode_');
                        var lineItemTotal = itemsHash.get("displayItemSubTotalCurrencyFormatted_"+itemIndex);
                        var lineItemAdjustment = itemsHash.get("displayItemAdjustment_"+itemIndex);
                        $(lineTotalId).update(lineItemTotal);
                        $(lineDiscountTotalId).update(lineItemAdjustment);
                        var completedLineItemQtyId =  elementId.sub('qty_','completedCartItemQty_');
                        $(completedLineItemQtyId).update($(elementId).value);
                        $('completedCartItemAdjustment_'+itemIndex).update(lineItemAdjustment);
                        var completedCartItemSubTotalId = elementId.sub('qty_','completedCartItemSubTotal_');
                        $(completedCartItemSubTotalId).update(lineItemTotal);
                    }
                }
            }
        },
        parameters: formValues
    });
}

function cartItemQtyChanged(event) { 
    var qtyElement = Event.element(event);
    var elementId = qtyElement.id;
    var productIdElementId = elementId.sub('qty_', 'cartLineProductId_');
    var productId = $(productIdElementId).value;
    if (qtyElement.value >= 0 && !isNaN(qtyElement.value) && (qtyElement.value!="")) { 
        var itemIndex = getProductLineItemIndex(event, productId);
        qtyParam = "update_" + itemIndex +"="+qtyElement.value;
        var formValues = $('cartForm').serialize() + '&' + qtyParam;
        updateCartData(elementId, formValues, qtyElement.value, itemIndex);
        cartTeaser();
    } else {
        qtyElement.value = "";  
    }
}