var Cart = {
    MAX_ITEMS: 6,

    /* Discount:
     * Subtract 10% when user orders 2 or more books.
     * DISCOUNT_TYPE: "percent", "???", "none", <empty>
     */
    DISCOUNT_TYPE: "percent",
    DISCOUNT_KEY_TYPE: "items",
    DISCOUNT_KEY: 2, 
    DISCOUNT_AMOUNT: .10,

    ltrim : function (str) {
        return str.replace(new RegExp("^["+"\\s"+"]+", "g"), "");
    },

    add : function(itemName, itemPrice) {
        this.clearPreorder();
        var items = this.getCks('item_*');
        var i = 0;
        var maxItemNum = 0;
        for (var i = 0; i < items.length; i++) {
            var itemValStr = unescape(items[i][1]);
            var itemValToks = itemValStr.split('~');
            var itemCount = parseInt(itemValToks[0]);
            var itemVarStr = unescape(items[i][0]);
            var itemVarToks = itemVarStr.split('_');
            var itemNum = parseInt(itemVarToks[1]);
            if (itemNum >= maxItemNum)
                maxItemNum = itemNum + 1;
            if (itemValToks[1] == itemName) {
                var cookieStrVar = items[i][0];
                cookieStrVal = (parseFloat(itemValToks[0])+1);
                cookieStrVal += '~';
                cookieStrVal += itemValToks[1];
                cookieStrVal += '~';
                cookieStrVal += itemPrice;
                this.setCk(cookieStrVar, cookieStrVal);
                return 'The quantity for '+itemName + ' has been updated to '+
                    (parseFloat(itemValToks[0])+1)+'.';
            }
        }
        var newItemVarName = 'item_' + maxItemNum;
        var cookieStrVar = newItemVarName;
        var cookieStrVal = '1~';
        cookieStrVal += itemName;
        cookieStrVal += '~';
        cookieStrVal += itemPrice;
        this.setCk(cookieStrVar, cookieStrVal);
        return itemName+' has been added to your cart.';
    },

    setCk : function (cName, cVal) {
        var theDate = new Date();
        var oneYearLater = new Date( theDate.getTime() + 31536000000 );
        var expiryDate = oneYearLater.toGMTString();
        document.cookie = escape(cName)+'='+escape(cVal)+'; expires=' +
            expiryDate + '; path=/';
    },


    // Given cookie name, return value. 
    // You can suffix the name with a '*' to do a wildcard search.
    getCks : function (cName) {
        var retVal = [];
        if (document.cookie.length) {
            var cookies = document.cookie.split('; ');
            var cookieVarVals = '';
            var cNamechars = cName.split('');
            if (cNamechars[cNamechars.length-1] == '*') {
                cName = cName.substring(cName, cName.indexOf('*'));
                wildcard = true;
            } else {
                wildcard = false
            }
            for (var i = 0; i < cookies.length; i++) {
                cookieVarVals = cookies[i].split('=');
                cookieVarVals[0] = this.ltrim(cookieVarVals[0]);
                if (wildcard) {
                    if (cookieVarVals[0].indexOf(cName) == 0)
                        retVal.push([cookieVarVals[0], cookieVarVals[1]]);
                } else {
                    if (cookieVarVals[0] == cName) {
                        retVal.push([cookieVarVals[0], cookieVarVals[1]]);
                    }
                }
            }
        }
        return retVal;
    },
    
    remove : function (cookieName, cookieValue) {
        cookieName = this.ltrim(cookieName);
        var d = "Monday, 19-Aug-1996 05:00:00 GMT";
        cookieStr = cookieName+'='+cookieValue+';expires='+d;
        document.cookie = cookieStr;
    },

    clear : function (cartId) {
        items = this.getCks('item_*');
        for (var i = 0; i < items.length; i++) {
            this.remove(items[i][0], items[i][1]);
        }
        items = this.getCks('lovefraudbook_*');
        for (var i = 0; i < items.length; i++) {
            this.remove(items[i][0], items[i][1]);
        }
        shipping = this.getCks('shipping');

        if (shipping.length) 
            this.remove(shipping[0][0], shipping[0][1]);

        if (cartId)
            this.write(cartId);
    },

    clearPreorder : function () {
        items = this.getCks('lovefraudbook_*');
        for (var i = 0; i < items.length; i++) {
            this.remove(items[i][0], items[i][1]);
        }
   },

    updateCart : function (cartId) {
        items = this.getCks('item_*');
        if (!items) 
            return false;
        for (var i = 0; i < items.length; i++) {
            items[i][1] = unescape(items[i][1]);
            vals = items[i][1].split('~');
            cookieStr = items[i][0]+'=';
            try {
                cbo = document.getElementById(items[i][0]);
                cookieStr += cbo.options[cbo.selectedIndex].text;
            } catch(e) {
                cookieStr += '1';
            }
            cookieStr += '~';
            cookieStr += escape(vals[1]);
            cookieStr += '~';
            cookieStr += vals[2];
            document.cookie=cookieStr;
        }
        this.write(cartId);
    },

    updateShipping : function (shipping) {
        if (!shipping.length) 
            shipping = 'usShip';
        this.setCk('shipping', shipping);
        this.write('cart');
        document.getElementById(shipping).checked = true;
    }, 

    // Returns current shipping type and array of shipping costs
    getShipping : function () {
        // Lovefraud books counts as two books
        lfTotalItems = this.getItemCount('Love Fraud the book');
        totalItems = this.getItemCount();
        internationalItems = totalItems + lfTotalItems;
        var usShip = amerShip = otherShip = [];
        usShip = ['usShip', 'United States', 3.99];
        if (internationalItems >= 3) {
            amerShip = ['amerShip', 'Canada/Mexico', 27.95];
            otherShip = ['otherShip', 'Other Country', 45.50];
        } else {
            amerShip = ['amerShip', 'Canada/Mexio', 11.95];
            otherShip = ['otherShip', 'Other Country', 13.95];
        }
        // Add 1 dollar for each book after 1 for US shipping
        usShip[2] = usShip[2] + (totalItems - 1);

        // Adjust international totals if Love Fraud the book is present 
        // (counts as 2 books)
        /*
        if (lfTotalItems) {
            totalItems += lfTotalItems;
            if (totalItems >= 3) {
                amerShip = ['amerShip', 'Canada/Mexico', 25.95];
                otherShip = ['otherShip', 'Other Country', 41.95];
            } else {
                amerShip = ['amerShip', 'Canada/Mexio', 10.95];
                otherShip = ['otherShip', 'Other Country', 12.95];
            }
        }
        */
        var shipCookie = this.getCks('shipping');
        var shipping = '';
        if (!shipCookie || !shipCookie.length) {
            shipping = 'none';
        } else {
            shipping = eval('shipCookie[0][1]');
        }
        return [shipping, usShip, amerShip, otherShip];
    },

    // Get total items in cart
    getItemCount : function (itemName) {
        // Get total items in cart
        var items = this.getCks('item_*');
        var totalItems = 0;
        for (i = 0; i < items.length; i++) {
            items[i][1] = unescape(items[i][1]);
            var vals = items[i][1].split('~');
            if (itemName != null) {
                if (vals[1] == itemName) 
                    totalItems += parseInt(vals[0]);
            }
            else { 
                totalItems += parseInt(vals[0]);
            }   
        }
        return totalItems;
    },

    getOverMaxMsg : function() {
        var lfMsg = '';
        msg = 'This order form allows a maximum of 6 books per ' +
                'order ("Love Fraud" counts as 2 books). ' +
                'If you want more than 6 books, please contact ' +
                'terry@lovefraud.com for special purchase arrangements.';
        return msg;
    },

    // Write cart to html
    write : function (cartId) {
        // Note that we count the lovefraud book as 2
        var totalItems = this.getItemCount() + this.getItemCount(
                'Love Fraud the book');
        if (totalItems > this.MAX_ITEMS) {
            msg = this.getOverMaxMsg();
            alert(msg);        
        }
        var cartHtml = '';
        if (!totalItems) {
            cartHtml = '<table id="cartTable" border=0 cellpadding=0 ';
            cartHtml += 'cellspacing=0 width=700>';
            cartHtml += '<tr><td colspan=5 align="center">';
            cartHtml += 'There are no items in your cart.';
            cartHtml += '</td></tr>';
            cartHtml += '</table><br><br>';
            document.getElementById(cartId).innerHTML = cartHtml;
            return; 
        }
            
        var usShip = amerShip = otherShip = [];
        var shipping = '';
        var shippingVars = this.getShipping();
        var shipToClick = '';
        shipping = shippingVars[0];
        usShip = shippingVars[1];
        amerShip = shippingVars[2];
        otherShip = shippingVars[3];
        cartHtml += '<p>Please select your shipping destination.</p>'
        cartHtml += '<p>';
        cartHtml += '<input type=radio name="shipping" ';
        cartHtml += 'id="usShip" value="'+usShip[0]+'" ';
        cartHtml += 'onClick="Cart.updateShipping(\'usShip\');" ';
        if (shipping == 'usShip') {
            cartHtml += '"checked"';
            shipToClick = 'usShip'
        }
        cartHtml += '>';
        cartHtml += 'United States';
        cartHtml += '<br>';
        cartHtml += '<input type=radio name="shipping" ';
        cartHtml += 'id="amerShip" value="'+amerShip[1]+'" onClick="';
        cartHtml += 'Cart.updateShipping(\'amerShip\');" ';
        if (shipping == 'amerShip') {
            cartHtml += '"checked"';
            shipToClick = 'amerShip'
        }
        cartHtml += '>';
        cartHtml += 'Canada or Mexico';
        cartHtml += '<br>';
        cartHtml += '<input type=radio name="shipping" ';
        cartHtml += 'id="otherShip" value="'+otherShip[1]+'" onClick=';
        cartHtml += '"Cart.updateShipping(\'otherShip\');" ';
        if (shipping == 'otherShip') {
            cartHtml += '"checked"';
            shipToClick = 'otherShip'
        }
        cartHtml += '>';
        cartHtml += 'Other countries';
        cartHtml += '</p>';
        cartHtml += '<table id="cartTable" border=0 cellpadding=0 ';
        cartHtml += 'cellspacing=0 width=700>';
        cartHtml += '<tr>';
        cartHtml += '<th id="cartTdTop">Quantity</th>';
        cartHtml += '<th id="cartTdTop">Title</th>';
        cartHtml += '<th id="cartTdTop">Price</th>';
        cartHtml += '<th id="cartTdTop">Total</th>';
        cartHtml += '<th id="cartTdTop">Delete</th>';
        cartHtml += '</tr>';

        var items = this.getCks('item_*');
        var subTotal = 0;
        var discount = 0;
        var i;
        var totalItems = 0;
        for (i = 0; i < items.length; i++) {
            items[i][1] = unescape(items[i][1]);
            var vals=items[i][1].split('~');
            if (!vals) continue; // Shouldn't happen
            cartHtml += '<tr>';
            cartHtml += '<td width=75 id="cartTdLeft" align="middle">';
            cartHtml += '<select onChange="Cart.updateCart(\'cart\');"';
            cartHtml += ' id="'+items[i][0]+'">';
            cartHtml += '<option>'+vals[0];
            totalItems += vals[0];
            for (j = 1; j <= this.MAX_ITEMS; j++)
                cartHtml += '<option>' + j;
            cartHtml += '</select>';
            cartHtml += '</td>';
            cartHtml += '<td id="cartTdMiddle" align="left">';
            cartHtml += unescape(vals[1])+'</td>';
            cartHtml += '<td width=100 id="cartTdMiddle" align="right">';
            var price = (vals[2]);
            discount = this.getDiscount(this.getItemCount(), price);
            display_price = this.getDiscountedPrice(price, discount);
            subTotal += parseFloat(display_price * vals[0]);
            cartHtml += display_price;
            cartHtml += '</td>';
            cartHtml += '<td width=100 id="cartTdMiddle" align="right">';
            cartHtml += parseFloat(display_price * vals[0]).toFixed(2);
            cartHtml += '</td>';
            cartHtml += '<td width=30 id="cartTdRight" align="center">';
            cartHtml += '<a href="javascript:;" onClick="';
            cartHtml += 'Cart.remove(\''+items[i][0]+'\'';
            cartHtml += ', \''+items[i][1]+'\');';
            cartHtml += 'Cart.write(\'cart\');">';
            cartHtml += '<img src="/images/x-out.jpg" width="10" ';
            cartHtml += 'height="10" border=0></a>';
            cartHtml += '</td>';
            cartHtml += '</tr>';
        }

        // Calculate discount (if any)
        discount = this.getDiscount(totalItems, subTotal)

        if (subTotal) {
            cartHtml += '<tr><td colspan="2"></td>';
            cartHtml += '<td id="cartTdLeft" colspan="2" align="right">';
            cartHtml += 'Subtotal:';
            if (discount > 0) {
                cartHtml += '<br><font color="red" size=2>';
                cartHtml +='(10% quantity discount applied)</font>';
            }   
            cartHtml += '</td>';
            cartHtml += '<td id="cartTdRight" colspan="1" align="right">';
            cartHtml += parseFloat(subTotal).toFixed(2);
            cartHtml += '</td></tr>';
        }
        if (subTotal) { 
            cartHtml += '<tr><td colspan="2"></td>';
            cartHtml += '<td id="cartTdLeft" colspan="2" align="right">';
            cartHtml += 'Shipping:';
            if (shipping == 'none') {
                cartHtml += '<br><font color=red>Please choose shipping ';
                cartHtml += 'destination above.</font>';
            }
            cartHtml += '</td><td id="cartTdRight" colspan="1" align="right">';
            if (shipping != 'none') {
                cartHtml += eval(shipping)[2].toFixed(2);
            } else {
                cartHtml += '&nbsp;';
            }
            cartHtml += '</td></tr>';
            cartHtml += '<tr><td colspan="2"></td>';
            cartHtml += '<td id="cartTdLeft" colspan="2" align="right">';
            cartHtml += 'Total:';
            if (shipping == 'none') {
                cartHtml += '<br><font color=red>Please choose shipping ';
                cartHtml += 'destination above.</font>';
            }
            cartHtml += '</td><td id="cartTdRight" colspan="1" align="right">';
            if (shipping != 'none') {
                var total = parseFloat(subTotal + eval(shipping)[2]).toFixed(2);
                cartHtml += total;
            } else {
                cartHtml += '&nbsp;';
            }
            cartHtml += '</td></tr>';
            cartHtml += '</table>';
        } else {
            cartHtml += '<tr><td colspan=5 align="center">';
            cartHtml += 'There are no items in your cart.';
            cartHtml += '</td></tr>';
            cartHtml += '</table>';
        }
        document.getElementById(cartId).innerHTML = cartHtml;
        if (!shipToClick.length)
            shipToClick = 'usShip';
        // Set shipping (for IE)
        if (shipping != 'none')
            document.getElementById(shipping).checked = true;
    },

    checkOut : function () {
        // Note that we count the lovefraud book as 2
        totalItems = this.getItemCount() + this.getItemCount(
                'Love Fraud the book');
        if (totalItems > this.MAX_ITEMS) {
            msg = this.getOverMaxMsg();
            alert(msg);        
            return false;
        }
        // Set up shipping
        var shippingVars = this.getShipping();
        var shipping = shippingVars[0];
        var usShip = shippingVars[1];
        var amerShip = shippingVars[2];
        var otherShip = shippingVars[3];

        if (shipping == 'none') {
            alert('Please choose your shipping destination '+
                    'before continuing.');
            return;
        }

        var items = this.getCks('item_*');
        if (!items.length) {
            alert('You have no items in your cart.');
            return;
        }

        /* Paypal doesn't allow for a discount line item,
         * so parse the discount into each item.
         */
        var cartInfo = this.getTotalItemsAndSubtotal();
        // Create form object and Set static vars for paypal transaction
        var frm = document.createElement('form');
        frm.setAttribute('action', 'https://www.paypal.com/cgi-bin/webscr');
        //frm.setAttribute('action', 'http://www.lovefraud.com/storetest.php');
        frm.setAttribute('method', 'GET');
        frm.setAttribute('id', 'paypalForm');

        var cmd = document.createElement('input');
        cmd.setAttribute('type', 'hidden');
        cmd.setAttribute('name', 'cmd');
        cmd.setAttribute('value', '_cart');

        var upload = document.createElement('input');
        upload.setAttribute('type', 'hidden');
        upload.setAttribute('name', 'upload');
        upload.setAttribute('value', '1');

        var business = document.createElement('input');
        business.setAttribute('type', 'hidden');
        business.setAttribute('name', 'business');
        business.setAttribute('value', 'terry@lovefraud.com');

        frm.appendChild(cmd);
        frm.appendChild(upload);
        frm.appendChild(business);

        // Create cart items for form
        var i;
        var totalItems = 0, subtotal = 0;
        var frmItemName, frmItemPrice, frmItemQty;
        for (i = 0; i < items.length; i++) {
            items[i][1] = unescape(items[i][1]);
            var vals = items[i][1].split('~');
            frmItemName = document.createElement('input');
            frmItemPrice = document.createElement('input');
            frmItemQty = document.createElement('input');

            frmItemName.setAttribute('type', 'hidden');
            frmItemName.setAttribute('name', 'item_name_'+(i+1));
            frmItemName.setAttribute('value', vals[1]);
            frm.appendChild(frmItemName);

            frmItemPrice.setAttribute('type', 'hidden');
            frmItemPrice.setAttribute('name', 'amount_'+(i+1));
            frmItemPrice.setAttribute('value', parseFloat(vals[2] - 
                this.getDiscount(this.getItemCount(), 
                parseFloat(vals[2]))).toFixed(2))
            frm.appendChild(frmItemPrice);

            frmItemQty.setAttribute('type', 'hidden');
            frmItemQty.setAttribute('name', 'quantity_'+(i+1));
            frmItemQty.setAttribute('value', vals[0]);
            subtotal += (vals[2] * vals[0]);
            frm.appendChild(frmItemQty);

            // Keep track of total items
            totalItems += vals[0];
        }
        frmItemName = document.createElement('input');
        frmItemName.setAttribute('type', 'hidden');
        frmItemName.setAttribute('name', 'item_name_'+(i+1));
        frmItemName.setAttribute('value', 'Shipping');
        frm.appendChild(frmItemName);

        frmItemQty = document.createElement('input');
        frmItemQty.setAttribute('type', 'hidden');
        frmItemQty.setAttribute('name', 'quantity_'+(i+1));
        frmItemQty.setAttribute('value', '1');
        frm.appendChild(frmItemQty);

        /* var frmItemTax;
        frmItemTax = document.createElement('input');
        frmItemTax.setAttribute('type', 'hidden');
        frmItemTax.setAttribute('name', 'tax_'+(i+1));
        frmItemTax.setAttribute('value', '0.00');
        frm.appendChild(frmItemTax);
        */
        
        frmItemPrice = document.createElement('input');
        frmItemPrice.setAttribute('type', 'hidden');
        frmItemPrice.setAttribute('name', 'amount_'+(i+1));
        frmItemPrice.setAttribute('value', eval(shipping)[2]);
        frm.appendChild(frmItemPrice);

        document.body.appendChild(frm);
        frm.submit();
    },

    getDiscount : function (item_count, subtotal) {

        // DISCOUNT_TYPE: "percent",
        // DISCOUNT_KEY_TYPE: "items",
        // DISCOUNT_KEY: 2, 
        // DISCOUNT_AMOUNT: .10,
        // TODO: Add other types of discounts
        var discount = 0;
        if (this.DISCOUNT_TYPE && this.DISCOUNT_TYPE != "none" && 
                this.DISCOUNT_TYPE.length) {
            if (this.DISCOUNT_KEY_TYPE == "items") {
                if (item_count >= this.DISCOUNT_KEY) {
                    discount = subtotal * this.DISCOUNT_AMOUNT;
                    // Always round down on .##5
                    modified = parseInt(discount * 1000).toString();
                    if (modified.charAt(modified.length-1) == '5') 
                        discount = Math.floor(discount*100)/100;
                    /*
                    var p = discount;
                    if ((p % 1) < .5) {
                        p = Math.floor(p * 100) / 100;
                    } else {
                        p = Math.ceil(p * 100) / 100;
                    }
                    discount = p;
                    */
                }
            }
        }
        return discount.toFixed(2);
    },
    getDiscountedPrice : function(price, discount) {
        var p = (price - discount);
        /*
        if ((p % 1) < .5) {
            p = Math.floor(p * 100) / 100;
        } else {
            p = Math.ceil(p * 100) / 100;
        }
        */
        return p.toFixed(2);
    },
    getTotalItemsAndSubtotal: function () {
        var items = this.getCks('item_*');
        var totalItems = 0, subtotal = 0;
        for (i = 0; i < items.length; i++) {
            items[i][1] = unescape(items[i][1]);
            var vals = items[i][1].split('~');
            totalItems += parseInt(vals[0]);
            subtotal += parseInt(vals[0]) * parseFloat(vals[2]);
        }
        return Array(totalItems, subtotal);
    },
    deleteAllItems: function () {
        var cookies = document.cookie.split(";");
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i];
            var eqPos = cookie.indexOf("=");
            var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
            document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
        }
    }
}

