﻿(function () { // copyright 2010 Hubsoft.com, all rights reserved
    var catalog = null,
    $topCartContents = null,
    $noItems = null,
    $cartTopLink = null,
    $cartClose = null,
    $cartTable = null,
    $checkout = null,
    $viewAll = null,
    lastSku = null,
    keepOpen = false;

    function showStatus(message) {
        var $status = $topCartContents.find('.status');
        if ($status.length === 0) {
            $status = $('<div />').addClass('status').text(message);
            $topCartContents.append($status);
        }
        $status.fadeIn(1000, function () {
            $status.fadeOut(1000, function () { $status.remove() });
        });
    }
    function getCatalog() {
        var doOpen = (arguments.length > 0 && arguments[0]);
        cookieCart.init();
        var skus = [];
        for (var i = 0; i < cookieCart.items.length; i++) {
            skus.push(escape(cookieCart.items[i].key));
        }
        $.getJSON('/JSONCatalog.ashx?skus=' + skus.join(','), function (data) {
            catalog = data;
            drawCart();
            if (doOpen) {
                openCart();
            }
        });
    }
    function handleSubTotal(price, qty) {
        if (!isNaN(price)) {
            return '$' + (price * qty).toFixed(2);
        }
        return price;
    }
    function getCatalogItem(sku) {
        if (catalog === null) { return null; }
        for (var i = 0; i < catalog.length; i++) {
            for (var j = 0; j < catalog[i].sizes.length; j++) {
                if (sku === catalog[i].sizes[j].sku) {
                    catalog[i].sizes[j].product = catalog[i];
                    return catalog[i].sizes[j];
                }
            }
        }
        return null;
    }
    function drawCart() {
        $cartTable
            .html('')
            .show();
        $noItems.hide();
        var isEmpty = true;
        $cartTable.append(
                    $('<tr />')
                        .append($('<th />').html('&nbsp;'))
                        .append($('<th />').text('Item Description/Color').addClass('name-header'))
                        .append($('<th />').text('Size'))
                        .append($('<th />').text('Price'))
                        .append($('<th />').text('Qty'))
                        .append($('<th />').text('Total'))
                        .append($('<th />').html('&nbsp;'))
                );
        $checkout.show();
        $viewAll.css({ display: 'none' });
        var trCount = 0, runningTotal = 0;
        for (var i = 0; i < cookieCart.items.length; i++) {
            var item = cookieCart.items[i];
            if (item.val > 0) {
                var size = getCatalogItem(item.key);
                if (size !== null) {
                    var product = size.product;
                    runningTotal += (size.unitPrice * item.val);
                    isEmpty = false;
                    var $tr = $('<tr />').data('sku', size.sku);
                    if (lastSku !== null && size.sku !== lastSku) {
                        $tr.css({ display: 'none' });
                    }
                    if (lastSku !== null && trCount > 0) {
                        $viewAll.css({ display: 'inline' });
                    }
                    $('<td />')
                                .addClass('img')
                                .append(
                                    $('<img />')
                                        .attr('src', product.imageLink1)
                                )
                                .appendTo($tr);
                    $('<td />').addClass('name')
                                .html(product.productName + ' <br />- <b>' + product.colorName + '</b> color')
                                .appendTo($tr);
                    $('<td />').addClass('size')
                                .text(size.sizeName)
                                .appendTo($tr);
                    $('<td />').addClass('price')
                                .text('$' + size.unitPrice.toFixed(2))
                                .appendTo($tr);
                    $('<td />').addClass('qty')
                                .append($('<input />').attr('type', 'text').attr('maxlength', '2').val(item.val))
                                .appendTo($tr);
                    $('<td />').addClass('subtotal').text(handleSubTotal(size.unitPrice, item.val)).appendTo($tr);
                    $('<td />').addClass('trash').append($('<a />').attr('href', '#').attr('title', 'trash').html('')).appendTo($tr);
                    $tr.appendTo($cartTable);
                    trCount++;
                }
            }
        }
        if (isEmpty) {
            $cartTable.hide();
            $noItems.show();
            $checkout.hide();
            $viewAll.css({ display: 'none' });
        } else {
            $cartTable.append(
                    $('<tr />')
                        .append($('<td />').attr('colspan', '5').css({'text-align':'right'}).html('<span class="subtotal">subtotal</span>'))
                        .append($('<td />').addClass('grand-total').text('$' + runningTotal.toFixed(2)))
                        .append($('<td />').html('&nbsp;'))
                );
        }
        lastSku = null;
    }
    function openCart() {
        $topCartContents.data('open', true);
        $topCartContents.stop(true, true).hide().slideDown('fast');
        if (arguments.length === 0 || !arguments[0]) {
            window.setTimeout(function () {
                if (!keepOpen) {
                    closeCart();
                }
                keepOpen = false;
            }, 3000);
        }
    }
    function closeCart() {
        $topCartContents.data('open', false);
        $topCartContents.stop(true, true).show().slideUp('fast');
    }
    function updateCart() {
        var doDelay = false,
                delay = 500;
        $cartTable.find('.qty input').each(function () {
            var $tr = $(this).closest('tr'),
                    sku = $tr.data('sku'),
                    val = $(this).val();
            if (val === '' || parseInt(val) === 0) {
                doDelay = true;
                val = 0;
                $tr.animate({ opacity: 0 }, 500);
            }
            cookieCart.snapshot();
            cookieCart.set(sku, val);
        });
        delay = (doDelay) ? delay : 0;
        window.setTimeout(function () {
            drawCart();
            cookieCart.adjustUI();
            $.getJSON('/GetCartEventJSON.ashx?r=' + escape(Math.random()), function (d) {
                if (d.shippingMessage !== '') {
                    cookieCart.eraseHistory();
                    showStatus(d.shippingMessage, false);
                } else if (d.errors.length > 0) {
                    cookieCart.undo();
                    showStatus(d.errors[0].message, true);
                } else {
                    cookieCart.eraseHistory();
                    return;
                }
            });
        }, delay);
    }
    $(function () {
        $topCartContents = $('#top-cart-contents');
        $noItems = $topCartContents.find('.noitems');
        $cartTopLink = $('#cart');
        $cartClose = $topCartContents.find('.close');
        $cartTable = $topCartContents.find('.cart-table');
        $checkout = $topCartContents.find('.checkout');
        $viewAll = $topCartContents.find('.view-all');

        $viewAll.click(function (ev) {
            ev.preventDefault();
            lastSku = null;
            drawCart();
        });

        $cartTopLink.click(function (ev) {
            ev.preventDefault();
            if ($cartTopLink.data('open')) {
                closeCart();
            } else {
                drawCart();
                openCart(true);
            }

        });
        $cartTable.bind('focus mouseover mouseenter', function () {
            if (!$topCartContents.data('open')) {
                openCart(true);
            }
            keepOpen = true;
        });
        $cartClose.click(function (ev) {
            ev.preventDefault();
            closeCart();
        });
        cookieCart.init();
        if (cookieCart.items.length > 0) {
            if (catalog === null) {
                getCatalog(false);
            } else {
                drawCart();
            }
        } else {
            $cartTable.hide();
            $noItems.show();
        }
        var updateTimeout = null;
        $cartTable.find('.qty input').live('keypress', function (ev) {
            $(this).css({ 'background-color': '#fff' });
            if (ev.which !== 0 && ev.which !== 8 && (ev.which < 48 || ev.which > 57)) {
                return false;
            }
            if (updateTimeout !== null) {
                window.clearTimeout(updateTimeout);
            }
            if (ev.which >= 48 && ev.which <= 57) {
                updateTimeout = window.setTimeout(function () {
                    updateCart();
                }, 1000);
            }
        });
        $cartTable.find('.qty input').live('focus', function () {
            this.select();
        });
        $cartTable.find('.qty input').live('change', function () {
            updateCart();
            return false;
        });
        $cartTable.submit(function (ev) {
            ev.preventDefault();
            updateCart();
        });
        $cartTable.find('.trash a').live('click', function () {
            $(this).closest('tr').find('input').val('0');
            updateCart();
            return false;
        });
        window.hubsoftCart = {
            update: function () {
                lastSku = (arguments.length > 0) ? arguments[0] : null;
                getCatalog(true);
            }
        };
    });
})();
