/****************************************************************************
Copyright (c) 2009 The Wojo Group

thewojogroup.com
simplecartjs.com
http://github.com/thewojogroup/simplecart-js/tree/master

The MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

Copyright (c) 2010 G. Allen Morris III

http://www.gam3.com/

****************************************************************************/
function dumpProps(obj, parent) {
   // Go through all the properties of the passed-in object
   for (var i in obj) {
      // if a parent (2nd parameter) was passed in, then use that to
      // build the message. Message includes i (the object's property name)
      // then the object's property value on a new line
      if (parent) { var msg = parent + "." + i + "\n" + obj[i]; } else { var msg = i + "\n" + obj[i]; }
      // Display the message. If the user clicks "OK", then continue. If they
      // click "CANCEL" then quit this level of recursion
      if (!confirm(msg)) { return; }
      // If this property (i) is an object, then recursively process the object
      if (typeof obj[i] == "object") {
         if (parent) { dumpProps(obj[i], parent + "." + i); } else { dumpProps(obj[i], i); }
      }
   }
}

Basket = { };

var NextShelfId = 1,			// used for selfItems 
    NextCartId = 1,
    Custom = "Custom",
    GoogleCheckout="GoogleCheckout",
    PayPal="PayPal",
    Email="Email";

var AustralianDollar=AUD="AUD",
    CanadianDollar=CAD="CAD",
    CzechKoruna=CZK="CZK",
    DanishKrone=DKK="DKK",
    Euro=EUR="EUR",
    HongKongDollar=HKD="HKD",
    HungarianForint=HUF="HUF",
    IsraeliNewSheqel=ILS="ILS",
    JapaneseYen=JPY="JPY",
    MexicanPeso=MXN="MXN",
    NorwegianKrone=NOK="NOK",
    NewZealandDollar=NZD="NZD",
    PolishZloty=PLN="PLN",
    PoundSterling=GBP="GBP",
    SingaporeDollar=SGD="SGD",
    SwedishKrona=SEK="SEK",
    SwissFranc=CHF="CHF",
    USDollar=USD="USD";

function Cart() {
    var me = this;
    /* member variables */
    me.Version = '2.0.1';
    me.Shelf = new Shelf();
    me.items = {};
    me.current_basket = undefined;
    me.baskets = {};
    me.isLoaded = false;
    me.pageIsReady = false;
    me.quantity = 0;
    me.change = false;
    me.total = 0;
    me.taxRate = 0.00;
    me.taxCost = 0;
    me.discounts = 0.00;
    me.shippingFlatRate = 0;
    me.shippingTotalRate = 0;
    me.shippingQuantityRate = 0;
    me.shippingRate = 0;
    me.shippingCost = 0;
    me.currency = USD;
//    me.checkoutTo = PayPal;
    me.checkoutTo = GoogleCheckout;
//    me.checkoutTo = Custom;
    me.email = "gam3-p_1244493026_biz@gam3.net";
    me.merchantId    = "365423849508451";
    me.cartHeaders = ['Name','Price','Quantity','Total'];
    me.menuSwitch = {};
    /*
        cart headers:
        you can set these to which ever order you would like, and the cart will display the
	appropriate headers and item info.  any field you have for the items in the cart can
	be used, and 'Total' will automatically be price*quantity.

        there are keywords that can be used:

            1) "_input" - the field will be a text input with the value set to
	       the given field. when the user changes the value, it will update
	       the cart.  this can be useful for quantity. (ie "Quantity_input")

            2) "increment" - a link with "+" that will increase the item quantity by 1

            3) "decrement" - a link with "-" that will decrease the item quantity by 1

            4) "remove" - a link that will remove the item from the cart

            5) "_image" or "Image" - the field will be an img tag with the src
	        set to the value. You can simply use "Image" if you set a field
		in the items called "Image".  If you have a field named
		something else, like "Thumb", you can add the "_image" to
		create the image tag (ie "Thumb_image").

            6) "_noHeader" - this will skip the header for that field
	        (ie "increment_noHeader")
    */

    /******************************************************
            add/remove items to cart
     ******************************************************/

    me.toggleMenu = function(id) {
	var x = document.getElementById('section_' + id);
	var y;
	if (x) {
	    var m = document.getElementById('multiple');

	    if (m.checked) {
		for (var nid in me.menuSwitch) {
		    if (nid == id) {
		       continue;
		    }
		    y = document.getElementById('section_' + nid);
		    var q = document.getElementById('exp_' + nid);
		    y.style.display = 'none';
		    q.replaceChild(
			document.createTextNode("+"),
			q.childNodes[0]
		    );
		    me.menuSwitch[nid] = false;
		}
	    }
	    y = document.getElementById('exp_' + id);

	    if (x.style['display'] == 'none') {
		x.style.display = 'inherit';
                y.replaceChild(
		    document.createTextNode("close"),
		    y.childNodes[0]
		);
		if (me.menuSwitch[id]) {
alert("reopen");
		}
		me.menuSwitch[id] = true;
	    } else {
		x.style.display = 'none';
                y.replaceChild(
		    document.createTextNode("+"),
		    y.childNodes[0]
		);
		if (!me.menuSwitch[id]) {
alert("reclose");
		}
		me.menuSwitch[id] = false;
	    }
	    me.change = true;
	    me.save();
	}
	else {
	    alert("error in menu");
	}
    }

/* setup the menu from the loaded data */

    me.setMenu = function(id, state) {
	x = document.getElementById('section_' + id);
	if (x) {
	    y = document.getElementById('exp_' + id);
	    if (state) {
		x.style.display = 'inherit';
                y.replaceChild(
		    document.createTextNode("close"),
		    y.childNodes[0]
		);
		me.menuSwitch[id] = true;
	    } else {
		x.style.display = 'none';
                y.replaceChild(
		    document.createTextNode("+"),
		    y.childNodes[0]
		);
		me.menuSwitch[id] = false;
	    }
	    me.change = true;
	    me.save();
	}
    }

    me.add = function () {
        var me = this;

        /* load cart values if not already loaded */
        if ( !me.pageIsReady ) {
            me.initializeView();
            me.update();
        }
        if ( !me.isLoaded ) {
            me.load();
            me.update();
        }

        var newItem = new CartItem();

	if (me.inBasket()) {
	    newItem.setBasket(me.currentBasket());
	}

        /* check to ensure arguments have been passed in */
        if ( !arguments || arguments.length === 0 ) {
            error( 'No values passed for item.');
            return;
        }
        var argumentArray = arguments;
        if (arguments[0] && typeof( arguments[0] ) != 'string' && typeof( arguments[0] ) != 'number') {
	    argumentArray = arguments[0];
        }
        if (newItem.parseValuesFromArray( argumentArray )) {
	    newItem.checkQuantityAndPrice();

	    if (newItem.isBasket()) {
		if (me.inBasket()) {
		    alert("You must complete your current basket before you can start a new one.");
		    return;
		} else {
		    alert("Baskets don't work this way anymore");
		}
	    } else {
		/* if the item already exists, update the quantity */
		var id = me.hasItem(newItem);
		if ( id ) {
		    me.items[id].quantity = parseInt(me.items[id].quantity,10) + parseInt(newItem.quantity,10);
		} else {
		    me.items[newItem.id] = newItem;
		}
		if (me.inBasket()) {
		    // clear the current_basket if full;
		    if (me.currentBasketItem().isFull()) {
alert(
me.currentBasketItem().title + " gift basket is full\n\n" +
"If you would like a special basket, please call 866-737-7379" +
"or 707-961-1899" + "and we can make one for you.");
//		        me.clearBasket();
                    }
		}
	    }
	    me.change = true;
	    me.update();
	}
    };

    me.remove = function( id ) {
        var tempArray = {};
        for ( var item in this.items ) {
            if ( item != id ) {
                tempArray[item] = this.items[item];
            } else {
// alert("removing");
	    }
        }
        this.items = tempArray;
    };

    me.startBasket = function() {
        var name;
	var note;
//	if (this.currentBasket()) {
//	    alert("Already in a basket: " + this.currentBasket());
//	} else {
	    name = document.getElementById("basketName");
	    note = document.getElementById("basketNote");
	    if (!name.value) {
	       alert("Please Name your Basket");
	       return false;
	    }
	    var newItem = new BasketItem(name.value);
	    newItem.notes = note.value;
	    me.items[newItem.id] = newItem;
	    me.setBasket(newItem.id);
	    me.update();
//alert("href");
	    location.href = "/products.html#main";
	    return true;
//	}
    }

    me.currentBasketItem = function() {
        return this.items[this.current_basket];
    }

    me.currentBasket = function() {
        return this.current_basket;
    }

    me.setBasket = function(id) {
        me.current_basket = id;
    }

    me.clearBasket = function() {
        delete me.current_basket;
    }

    me.inBasket = function() {
        return this.current_basket;
    }

    me.empty = function () {
	for (var x = 0; x < 10; x++) {
	    if (readCookie('simpleCart_' + x)) {
		dataString = readCookie('simpleCart_' + x);
		createCookie('simpleCartSave_' + x, dataString, 1 );
		createCookie('simpleCart_' + x, "", 1 );
	    } else {
	        break;
	    }
	}
        simpleCart.items = {};
	me.current_basket = undefined;
        me.change = true;
        me.save();
	me.update();
    };

    me.canRestore = function () {
        if ( readCookie('simpleCartSave_0') ) {
	    return true;
	} else {
	    return false;
	}
    }

    me.restore = function () {
        var me = this;

        /* initialize variables and items array */
	if (me.items.length) {
	    alert("Your cart is not empty.");
 	    return;
	}

        if ( readCookie('simpleCartSave') ) {
            var data = readCookie('simpleCartSave');
	    createCookie('simpleCart', data, 30 );
        }
	for (var x = 0; x < 10; x++) {
	    if (readCookie('simpleCartSave_' + x)) {
		dataString = readCookie('simpleCartSave_' + x);
		createCookie('simpleCart_' + x, dataString, 1 );
		createCookie('simpleCartSave_' + x, "", 1 );
	    } else {
	        break;
	    }
	}
        me.load();
	me.update();
    };

    /******************************************************
             item accessor functions
     ******************************************************/

    me.find = function (criteria) {
        if ( !criteria )
            return null;
        var results = [];
        for ( var next in me.items ) {
            var item = me.items[next],
                fits = true;
            for ( var name in criteria ) {
                if ( !item[name] || item[name] != criteria[name] )
                    fits = false;
            }
            if ( fits )
                results.push( me.next )
        }
        return (results.length == 0 ) ? null : results;
    }

    me.changeContact = function() {
        me.contact_info = this.value;
	me.save();
    }

    /******************************************************
             checkout management
     ******************************************************/

    me.checkout = function() {
        if ( simpleCart.quantity === 0 ) {
            error("Cart is empty");
            return;
        }
        switch ( simpleCart.checkoutTo ) {
            case PayPal:
                simpleCart.paypalCheckout();
                break;
            case GoogleCheckout:
                simpleCart.googleCheckout();
                break;
            case Email:
                simpleCart.emailCheckout();
                break;
            default:
                simpleCart.customCheckout();
                break;
        }
    };

    me.paypalCheckout = function() {

        var me = this,
            winpar = "scrollbars,location,resizable,status",
            strn  = "https://www.www.paypal.com/cgi-bin/webscr?cmd=_cart" +
                    "&upload=1" +
                    "&business=" + me.email +
                    "&currency_code=" + me.currency,
            counter = 1,
            itemsString = "";


        if ( me.taxRate ) {
            strn = strn +
                "&tax_cart=" +  me.currencyStringForPaypalCheckout( me.taxCost );
        }

        for ( var current in me.items ) {
            var item = me.items[current];

            if ( item.quantity >= 12 ) {
                var x = item.quantity - (item.quantity % 12);
                me.discounts = me.discounts + (parseFloat(x, 10) * item.price * 0.10);
	    }

            var optionsString = "";
	    if (item.isBasket()) {
		item.basket = item.id;
	    }
            for ( var field in item ) {
                if ( typeof(item[field]) != "function"
		     && field != "id" 
		     && field != "price" 
		     && field != "quantity" 
		     && field != "name" 
		     && field != "shipping"
		     && field != "baskets"
		     && field != "link"
		     && field != "title"
		     && field != "href"
		     && field != "key"
		     && field != "basketItems") {
                    optionsString = optionsString + ", " + field + "=" + item[field];
                }
            }
            optionsString = optionsString.substring(2);

            itemsString = itemsString   + "&item_name_"     + counter + "=" + escape(item.name) +
                                          "&item_number_"   + counter + "=" + counter +
                                          "&quantity_"      + counter + "=" + item.quantity +
                                          "&amount_"        + counter + "=" + me.currencyStringForPaypalCheckout( item.price ) +
                                          "&on0_"           + counter + "=" + "Options" +
                                          "&os0_"           + counter + "=" + optionsString;
	    if (item.discount()) {
;
	    }
            counter++;
        }

        if ( me.shipping() != 0) {
             itemsString = itemsString  + "&item_name_"     + counter + "=Shipping" 
                                        + "&item_number_"   + counter + "=" + counter 
                                        + "&quantity_"      + counter + "=1"
                                        + "&amount_"        + counter + "=" + me.shipping();
            counter++;
        }
        if ( me.discounts ) {
	    itemsString = itemsString  + "&discount_amount_cart=" + me.discounts;
        }

        strn = strn + itemsString ;
        window.open (strn, "paypal", winpar);
    };

    me.googleCheckout = function() {
        var me = this;

        if ( me.currency != USD && me.currency != GBP ) {
            error( "Google Checkout only allows the USD and GBP for currency.");
            return;
        } else if ( me.merchantId === "" || me.merchantId === null || !me.merchantId ) {
            error( "No merchant Id for google checkout supplied.");
            return;
        }

        var form = document.createElement("form"),
	counter = 1;
//      form.style.display = "none";
        form.method = "POST";
//	form.action = "https://www.google.com/checkout/cws/v2/Merchant/" + me.merchantId + "/checkoutForm";
	form.action = "https://checkout.google.com/api/checkout/v2/checkoutForm/Merchant/" + me.merchantId;
	form.name = "googleCheckoutForm";
//	form.target = "_blank";

        form.acceptCharset = "utf-8";

        for ( var current in me.items ) {
            var item                = me.items[current];
            form.appendChild( me.createHiddenElement( "item_name_"      + counter, item.get_name()        ) );
            form.appendChild( me.createHiddenElement( "item_quantity_"  + counter, item.get_quantity()    ) );
            form.appendChild( me.createHiddenElement( "item_price_"     + counter, item.get_price()       ) );
            form.appendChild( me.createHiddenElement( "item_currency_"  + counter, me.currency            ) );
            form.appendChild( me.createHiddenElement( "item_tax_rate_"  + counter, me.taxRate             ) );
            form.appendChild( me.createHiddenElement( "_charset_"                , ""                     ) );

            var descriptionString = "";
	    for ( var field in item) {
                if ( typeof( item[field] ) != "function" &&
                                    field != "id"       &&
                                    field != "quantity" &&
                                    field != "price" &&
				    !(field == "basket" && item[field] == 'N/A')
				    )
                {
                        descriptionString = descriptionString + ", " + field + ": " + item[field];
                }
            }
            descriptionString = descriptionString.substring( 1 );
            form.appendChild( me.createHiddenElement( "item_description_" + counter, descriptionString) );
            counter++;
        }
        if (me.discounts) {
             form.appendChild( me.createHiddenElement( "item_name_"         + counter, "Discount"        ) );
             form.appendChild( me.createHiddenElement( "item_quantity_"     + counter, 1    ) );
             form.appendChild( me.createHiddenElement( "item_price_"        + counter, -me.discounts       ) );
             form.appendChild( me.createHiddenElement( "item_currency_"     + counter, me.currency  ) );
             form.appendChild( me.createHiddenElement( "item_tax_rate_"     + counter, me.taxRate   ) );
             form.appendChild( me.createHiddenElement( "item_description_"  + counter, "Quantity Discount"  ) );
             form.appendChild( me.createHiddenElement( "_charset_"                   , ""               ) );
            counter++;
        }
 
        form.appendChild( me.createHiddenElement(
            "checkout-flow-support.merchant-checkout-flow-support.continue-shopping-url",
            "http://www.hotpepperjelly.com/order_complete.html" ) );
 
        form.appendChild( me.createHiddenElement(
            "checkout-flow-support.merchant-checkout-flow-support.shipping-methods.flat-rate-shipping-1.name",
            "UPS Ground"));
        form.appendChild( me.createHiddenElement(
            "checkout-flow-support.merchant-checkout-flow-support.shipping-methods.flat-rate-shipping-1.price",
            me.shipping()));
        form.appendChild( me.createHiddenElement(
            "checkout-flow-support.merchant-checkout-flow-support.shipping-methods.flat-rate-shipping-1.price.currency",
            "USD"));
 
        form.appendChild( me.createHiddenElement("checkout-flow-support.merchant-checkout-flow-support.shipping-methods.flat-rate-shipping-1.shipping-restrictions.allow-us-po-box", "false"));
 
        form.appendChild( me.createHiddenElement(
           "shipping-amount",
           "10.00"));

        var a = document.createElement("input");
        a.setAttribute("type", "submit");
        a.setAttribute("name", "bob");
        a.setAttribute("value", "bob");
        form.appendChild( a );

	var div = document.createElement("div");
        div.appendChild( form );
        document.body.appendChild( div );
        form.submit();
//	alert(div.innerHTML);
//	alert("x");
        document.body.removeChild( div );
    };

    me.emailCheckout = function() {
        return;
    };

    me.customCheckout = function() {
        return;
    };

    /******************************************************
                data storage and retrival
     ******************************************************/

    /* load cart from cookie */
    me.load = function () {
        var me = this;
	var data;
	var extra = 0;
	var global;
	var info;

        /* initialize variables and items array */
        me.items = {};
        me.total = 0.00;
        me.quantity = 0;
	me.contact_info = '';

        /* retrieve item data from cookie */
	for (var x = 0; x < 10; x++) {
	    if ( readCookie('simpleCart_' + x) ) {
		data = unescape(readCookie('simpleCart_' + x)).split('++');
		global = data.shift();
		var info = global.split('||');

		for (var x=0, xlen=info.length;x < xlen; x++) {
		    var lv = info[x].split('=');
		    if (lv[0] == "CurrentBasket") {
			me.setBasket(lv[1]);
		    } else if (lv[0] == "ExpandMenu") {
			me.menuSwitch[lv[1]] = true; 
		    } else if (lv[0] == "xtra") {
			extra = lv[1]; 
		    } else if (lv[0] == "contact_info") {
		        me.contact_info = lv[1];
		    } else if (lv[0]) {
			 alert("Unknown " + info[x]);
		    }
		}

		for (var x = 0, xlen = data.length; x < xlen; x++) {
		    r = new RegExp("id=b\\d");
		    var match = r.test(data[x]);
		    var newItem;
		    if (match) {
			newItem = new BasketItem();
		    } else {
			newItem = new CartItem();
		    }

		    var info = data[x].split('||');
		    if ( newItem.parseValuesFromArray( info ) ) {
			newItem.checkQuantityAndPrice();
			/* store the new item in the cart */
if (newItem.key) {
if (products[newItem.key].price != newItem.price) {
    alert(products[newItem.key].price + ' ' + newItem.price);
}
			newItem.title = products[newItem.key].name;
			newItem.name = products[newItem.key].name;
if (newItem.title != newItem.name) {
    alert(newItem.title + ' ' + newItem.name);
}
if (products[newItem.key].href != newItem.href) {
    alert(products[newItem.key].href + ' ' + newItem.href);
}
}
			me.items[newItem.id] = newItem;
		    }
		    if (newItem.isBasket()) {
// alert(newItem.isBasket() + " " + newItem.id);
			me.baskets[newItem.id] = newItem;
		    }
		}
	    }
	}

        me.isLoaded = true;
    };

    /* save cart to cookie */
    me.save = function () {
	var cookie_counter = 0;

	dataString = "";

	if (me.inBasket()) {
	    dataString = "CurrentBasket=" + escape(me.currentBasket());
	} else {
	    dataString = "CurrentBasket=";
	}
	if (me.contact_info) {
	    dataString = dataString + "||contact_info=" + escape(me.contact_info);
	}

        for ( var item in me.menuSwitch ) {
	    if (me.menuSwitch[item]) {
		dataString = dataString + "||ExpandMenu=" + escape(item);
	    }
	}

        for ( var item in this.items ) {
            var s  = this.items[item].print();
	    if (dataString.length + s.length > 4000) {
	        alert("Your cart is full, please call us or make multiple orders");
		createCookie('simpleCart_' + cookie_counter, dataString, 30);
		me.change = false;
		me.load();
		if (me.inBasket()) {
error("test me");
		    me.getBasket().remove();
		}
		return;
	    }
            dataString = dataString + "++" + s;
        }

	createCookie('simpleCart_' + cookie_counter, dataString, 30);
	me.change = false;
    };

    /******************************************************
                 view management
     ******************************************************/

    me.initializeView = function() {
        var me = this;
        me.totalOutlets             = getElementsByClassName('simpleCart_total');
        me.quantityOutlets          = getElementsByClassName('simpleCart_quantity');
        me.cartDivs                 = getElementsByClassName('simpleCart_items');
        me.taxCostOutlets           = getElementsByClassName('simpleCart_taxCost');
        me.taxRateOutlets           = getElementsByClassName('simpleCart_taxRate');
        me.shippingCostOutlets      = getElementsByClassName('simpleCart_shippingCost');
        me.finalTotalOutlets        = getElementsByClassName('simpleCart_finalTotal');
        me.discountsOutlets         = getElementsByClassName('simpleCart_discounts');
        me.restoreButton            = getElementsByClassName('simpleCart_restore');
        me.contactInputs            = getElementsByClassName('contact');

        me.addEventToArray( me.contactInputs, simpleCart.changeContact, "change" );
        me.addEventToArray( getElementsByClassName('simpleCart_checkout'), simpleCart.checkout, "click" );
        me.addEventToArray( getElementsByClassName('simpleCart_empty'), simpleCart.empty, "click" );

        me.Shelf.readPage();

        me.addButtons               = getElementsByClassName('item_Add');	// get all the add buttons
        me.itemCounts               = getElementsByClassName('item_count');
        me.expandMenus              = getElementsByClassName('expand_menu');

        me.checkoutText             = getElementsByClassName('checkoutText');

        me.listBaskets              = getElementsByClassName('list_baskets');
        me.basketTitle              = getElementsByClassName('basketTitle');
        me.basketFinish             = getElementsByClassName('basketFinish');
        me.basketName               = getElementsByClassName('basketName');

        me.pageIsReady = true;
    };


    me.updateView = function() {
	var text;
	var att;
	var didit = false;

        me.updateViewTotals();
	for ( menu in me.menuSwitch ) {
	    me.setMenu(menu, me.menuSwitch[menu]);
	}

        if ( me.cartDivs && me.cartDivs.length > 0 ) {
            me.updateCartView();
        }

	for ( offset in me.restoreButton ) {
	    me.restoreButton[offset].style.display = 'inherit';
	    if (me.quantity > 0) {
		me.restoreButton[offset].innerHTML = "Empty Cart";
		me.restoreButton[offset].setAttribute('onclick', 'javascript: simpleCart.empty();');
	    } else if (simpleCart.canRestore()) {
		me.restoreButton[0].innerHTML = "Restore Cart";
		me.restoreButton[offset].setAttribute('onclick', 'javascript: simpleCart.restore();');
	    } else {
		me.restoreButton[offset].style.display = 'none';
	    }
	}
	for ( var offset in me.checkoutText ) {
	    if (me.quantity > 0) {
		me.checkoutText[offset].style.display = '';
	    } else {
		me.checkoutText[offset].style.display = 'none';
	    }
	}
	for ( var offset in me.basketFinish ) {
	    if (me.inBasket()) {
		for ( var offset in me.basketName ) {
		    me.basketName[offset].innerHTML = me.currentBasketItem().title;
		}
		me.basketFinish[offset].style.display = '';
	    } else {
		me.basketFinish[offset].style.display = 'none';
	    }
	    var divEl = me.basketFinish[offset];
	    var aEl =  divEl.getElementsByTagName('a');
	    if (aEl.length) {
	        var yyy = aEl.item(0);
		yyy.setAttribute(
		  'onclick', 
		  'javascript: ' + 
		  'simpleCart.clearBasket();' +
		  'simpleCart.save();' +
		  'simpleCart.updateView();'
		);
		yyy.href = "#bill";
	    }
	}

	for ( var offset in me.itemCounts ) {
            att = me.itemCounts[offset].getAttribute('class').split(/\s+/);

            for ( var i in att ) {
	        if (att[i] == 'item_count') {
		    continue;
		}
		count = 0;

		for ( var j in me.items) {
		    if ( att[i] == me.items[j].key ) {
		        count += me.items[j].quantity;
		    }
		}
		if (count > 0) {
		    me.itemCounts[offset].innerHTML = count;
		} else {
		    me.itemCounts[offset].innerHTML = "none";
		}
	    }
	}
	for ( offset in me.basketTitle ) {
	    var id = (document.URL).split('#');
	    if (id[1] && simpleCart.items[id[1]]) {
                me.basketTitle[offset].innerHTML = simpleCart.items[id[1]].getTitle() + " Basket";
	    }
	}
	for ( offset in me.listBaskets ) {
	    for ( basket in me.baskets ) {
	        e = document.createElement("li");
	        a = document.createElement("a");
		a.setAttribute("href", me.baskets[basket].href);
	        t = document.createTextNode(me.baskets[basket].getCartTitle());
		a.appendChild(t);
	        t = document.createTextNode("Edit ");
		e.appendChild(t);
		e.appendChild(a);
		me.listBaskets[offset].appendChild(e);
	    }
	}
	if (me.inBasket()) {
	    if (me.currentBasketItem().isFull()) {
		text = "Remove from " + me.currentBasketItem().title + " Gift Basket";
	    } else {
		text = "Add to " + me.currentBasketItem().title + " Gift Basket";
	    }
	} else {
	    text = "Add to Cart";
	}

	for ( offset in me.addButtons ) {
	    var textNode = document.createTextNode( text );
	    var button = me.addButtons[offset];
	    var parent = button.parentNode;

            id = me.addButtons[offset].getAttribute('id');

	    if (id) {
                key = me.Shelf.items[id].key.value;
		for ( var j in me.items) {
		    var item =  me.items[j];
		    // Only display count if not editing a basket or item in current basket.
		    if ( key == item.key && ((!item.inBasket() && !me.currentBasket()) || ( me.currentBasket() == item.inBasket() ))) {
			if (parent.lastChild.type == "select-one") {
			    e = parent.lastChild;
			    parent.removeChild(e);
			}
			e = item.getSelect();
			parent.appendChild(e);
		    }
		}
	    }
	    button.replaceChild(
		textNode,
		button.childNodes[0]
	    );
	}
	for ( offset in me.contactInputs ) {
	    me.contactInputs[offset].value = me.contact_info;
	}
    };

    me.updateViewTotals = function() {
        var outlets = [ ["quantity"     , "none"        ] ,
                        ["total"        , "currency"    ] ,
                        ["discounts"    , "currency"    ] ,
                        ["shippingCost" , "currency"    ] ,
                        ["taxCost"      , "currency"    ] ,
                        ["taxRate"      , "percentage"  ] ,
                        ["finalTotal"   , "currency"    ] ];

        for ( var x=0, xlen=outlets.length; x < xlen; x++) {

            var arrayName = outlets[x][0] + "Outlets",
                outputString;

            for ( var element in me[ arrayName ] ) {
                switch ( outlets[x][1] ) {
                    case "none":
                        outputString = "" + me[outlets[x][0]];
                        break;
                    case "currency":
                        outputString = me.valueToCurrencyString( me[outlets[x][0]] );
                        break;
                    case "percentage":
                        outputString = me.valueToPercentageString( me[outlets[x][0]] );
                        break;
                    default:
                        outputString = "" + me[outlets[x][0]];
                        break;
                }
                me[arrayName][element].innerHTML = "" + outputString;
            }
        }
    };

    me.updateCartView = function() {
        var newRows = [],
            x,newRow,item,current,header,newCell,info,outputValue,option,headerInfo;

        /* create headers row */
        newRow = document.createElement('div');
        for ( header in me.cartHeaders ) {
            newCell = document.createElement('div');
            headerInfo = me.cartHeaders[header].split("_");

            newCell.innerHTML = headerInfo[0];
            newCell.className = "item" + headerInfo[0];
            for (x = 1, xlen = headerInfo.length; x < xlen; x++) {
                if (headerInfo[x].toLowerCase() == "noheader") {
                    newCell.style.display = "none";
                }
            }
            newRow.appendChild( newCell );
        }
        newRow.className = "cartHeaders";
        newRows[0] = newRow;

        /* create a row for each item in the cart */
        x = 1;
        for ( current in me.items ) {
            item = me.items[current];
	    if (!item) {
	        continue;
            }
            if (item.inBasket()) {
	        continue;		// items in baskets get listed with basket
	    }

	    newRows[x] = me.addCartRow(item, 0);
	    x++;

	    if (item.isBasket) {
		for ( basketItem in item.basketItems ) {
		    bi = me.items[ item.basketItems[basketItem] ];
		    if (!bi) {
			continue; 
		    }
		    newRows[x] = me.addCartRow(bi, 1);
		    x++;
		}
	    }
        }

        for ( current in me.cartDivs ) {
            /* delete current rows in div */
            var div = me.cartDivs[current];
            while ( div.childNodes[0] ) {
                div.removeChild( div.childNodes[0] );
            }

            for (var j=0, jLen = newRows.length; j < jLen; j++) {
                div.appendChild( newRows[j] );
            }
        }
    };

    me.addCartRow = function(item, indent) {
	var newRow = document.createElement('div');
	var header;
	var newCell;
	var info;

        var first = true;

	for ( header in me.cartHeaders ) {
	    newCell = document.createElement('div');
	    info = me.cartHeaders[header].split("_");
	    var t;
	    switch( info[0].toLowerCase() ) {
		case "total":
		    var t = document.createTextNode( me.valueToCurrencyString(parseFloat(item.get_price())*parseInt(item.quantity,10) ) );
		    newCell.appendChild(t);
		    break;
		case "link":
		    var a = document.createElement("a");
		    a.setAttribute("href", item.href);
		    var t = document.createTextNode(item.getCartTitle());
		    a.appendChild(t);
		    newCell.appendChild(a);
		    break;
		case "price":
		    outputValue = me.valueToCurrencyString( item[ info[0].toLowerCase() ] ? item[info[0].toLowerCase()] : " " );
		    outputValue = item.getPrice();
		    var t = document.createTextNode(item.getPrice());
		    newCell.appendChild(t);
		    break;
		case "quantity":
		    if (!item.isBasket()) {
			newCell.appendChild(item.getSelect());
		    }
		    break;
		default:
		    var t = document.createTextNode( item[ info[0].toLowerCase() ] ? item[info[0].toLowerCase()] : " " );
		    newCell.appendChild(t);
		    break;
	    }

	    newCell.className = "item" + info[0];
	    if (first && indent) {
		newCell.className = "item" + info[0] + " inBasket";
	    } else {
		newCell.className = "item" + info[0];
	    }
	    newRow.appendChild( newCell );
	    first = false;
	}
	newRow.className = "itemContainer";
	return newRow;
    };

    me.addEventToArray = function ( array , functionCall , theEvent ) {
        for ( var outlet in array ) {
            var element = array[outlet];
            if ( element.addEventListener ) {
                element.addEventListener(theEvent, functionCall , false );
            } else if ( element.attachEvent ) {
                element.attachEvent( "on" + theEvent, functionCall );
            }
        }
    };

    me.createHiddenElement = function ( name , value ) {
        var element = document.createElement("input");
        element.type = "hidden";
        element.name = name;
        element.value = value;
        return element;
    };

    /******************************************************
                Currency management
     ******************************************************/

    me.currencySymbol = function() {
        switch(me.currency) {
            case JPY:
alert("jpy");
                return "&yen;";
            case EUR:
alert("jpy");
                return "&euro;";
            case GBP:
alert("jpy");
                return "&pound;";
            case USD:
            case CAD:
            case AUD:
            case NZD:
            case HKD:
            case SGD:
                return "$";
            default:
                return "";
        }
    };

    me.currencyStringForPaypalCheckout = function( value ) {
        if ( me.currencySymbol() == "&#36;" ) {
            return "$" + parseFloat( value ).toFixed(2);
        } else {
            return "" + parseFloat(value ).toFixed(2);
        }
    };

    /******************************************************
                Formatting
     ******************************************************/


    me.valueToCurrencyString = function( value ) {
        return parseFloat( value ).toCurrency( me.currencySymbol() );
    };

    me.valueToPercentageString = function( value ) {
        return parseFloat( 100*value ) + "%";
    };

    me.valueToImageString = function( value ) {
        if ( value.match(/<\s*img.*src\=/) ) {
            return value;
        } else {
            return "<img src=\"" + value + "\" />";
        }
    };

    me.valueToTextInput = function( value , html ) {
        return "<input type=\"text\" value=\"" + value + "\" " + html + " />";
    };

    me.valueToLink = function( value, link, html ) {
        return "<a href=\"" + link + "\" " + html + " >" + value + "</a>";
    };

    me.valueToElement = function( type , value , html ) {
        return "<" + type + " " + html + " > " + value + "</" + type + ">";
    };

    /******************************************************
                Duplicate management
     ******************************************************/

    me.hasItem = function ( item ) {
        for ( var current in me.items ) {
            var testItem = me.items[current];
            var matches = true;
            for ( var field in item ) {
                if ( typeof( item[field] ) != "function" &&
                     field != "quantity"                 &&
                     field != "id"                       ) {
                    if ( item[field] != testItem[field] ) {
                        matches = false;
                    }
                }
            }
            if ( matches ) {
                return current;
            }
        }
        return false;
    };

    /******************************************************
                Cart Update managment
     ******************************************************/

    me.update = function() {
        if ( !simpleCart.isLoaded ) {
            simpleCart.load();
        }
        if ( !simpleCart.pageIsReady ) {
            simpleCart.initializeView();
        }
        me.updateTotals();
        me.updateView();
        me.save();
    };

    me.updateTotals = function() {
        me.total = 0 ;
        me.quantity  = 0;
	me.discounts = 0.00;

        for ( var current in me.items ) {
            var item = me.items[current];
            if ( item.quantity < 1 ) {
alert("This is bad.");
                item.remove();
		continue;
            } else if ( item.quantity !== null && item.quantity != "undefined" ) {
                me.quantity = parseInt(me.quantity,10) + parseInt(item.quantity,10);
            }
            if ( item.quantity >= 12 ) {
                var x = item.quantity - (item.quantity % 12);
                me.discounts = me.discounts + (parseFloat(x, 10) * item.get_price() * 0.10);
	    }
            if ( item.get_price() ) {
                me.total = parseFloat(me.total) + parseInt(item.quantity,10)*parseFloat(item.get_price());
            }
        }
        me.shippingCost = me.shipping();
        me.taxCost = parseFloat(me.total)*me.taxRate;
        me.finalTotal = me.shippingCost + me.taxCost + me.total - me.discounts;
    };

    me.shipping = function() {
        shipping = 0;
	total = parseInt(me.total,10);
        if (false) {
            shipping = me.total <= 0 ? 0 : 7.5 + (parseFloat(me.total) * .25);	// gam3 for HPJ only
	} else {
	    if ( total === 0 )
		shipping = 0.0;
	    else if ( total > 100 )
		shipping = me.total * .25;
	    else if ( total >= 80 )
		shipping = 21.00;
	    else if ( total >= 70 )
		shipping = 18.00;
	    else if ( total >= 60 )
		shipping = 16.50;
	    else if ( total >= 50 )
		shipping = 15.00;
	    else if ( total >= 40 )
		shipping = 13.00;
	    else if ( total >= 30 )
		shipping = 11.50;
	    else if ( total >= 20 )
		shipping = 10.50;
	    else if ( total >= 10 )
		shipping = 9.50;
            else
	        shipping = 7.50;
	}

        return shipping;
    }

    me.discount = function() {
	return 1.11;
    }

    me.initialize = function() {
        simpleCart.initializeView();
        simpleCart.update();
    };
}

/*******************************************************************************
 *          Basket Item Object
 ******************************************************************************/

function BasketItem(name) {
    this.id = "b" + NextCartId++;

    this.title = name;
    this.quantity = 1;
    this.price = "0.00";
    this.basketItems = {};
}

    BasketItem.prototype.remove = function() {
	for (i in this.basketItems) {
	    simpleCart.remove(i);
	}
        simpleCart.remove(this.id);
    }

    BasketItem.prototype.removeItem = function(item) {
        var key = item.id;
	var done = false;
        var tempArray = [];

        if (!delete this.basketItems[key]) {
	    error("something bad happened deleting " + key + " from " + this.id);
            return false;
	}
	return true;
    }

    BasketItem.prototype.maxQuantity = function() {
	return 10;
    }

    BasketItem.prototype.selectMax = function() {
        var ret = 1;
	return this.maxQuantity() - this.getQuantity();
    }

    BasketItem.prototype.getTitle = function() {
        return this.title;
    }

    BasketItem.prototype.getCartTitle = function() {
        ret = this.title + " Basket";
	if (this.getQuantity()) {
            ret = ret + " (with " + this.getQuantity() + " items)";
	}
	return ret;
    }

    CartItem.prototype.getTitle = function() {
        return this.name;
    }

    CartItem.prototype.getCartTitle = function() {
        return this.title;
    }

    CartItem.prototype.selectMax = function() {
        var ret;
	var q = this.quantity;
        if (this.inBasket()) {
	    var x = this.getBasket().selectMax();
	    ret = x + this.quantity;
	} else {
	    ret = 48;
	}
	return ret;
    }

    BasketItem.prototype.getQuantity = function() {
	var quantity = 0;
	for (b in this.basketItems) {
	    if (!simpleCart.items[b]) {
		quantity = quantity + 0;
	    } else {
		quantity = quantity + simpleCart.items[b].quantity;
	    }
	}
	return quantity;
    }

    BasketItem.prototype.setQuantity = function(n) {
alert("setQuantity " + n);
        this.quantity = n;
    }

    CartItem.prototype.setQuantity = function(n) {
alert("Cart.setQuantity " + n);
        this.quantity = n;
    }

    CartItem.prototype.get_name = function() {
        return this.name;
    }
    CartItem.prototype.get_quantity = function() {
        return this.quantity;
    }
    CartItem.prototype.get_price = function() {
        return this.price;
    }

    BasketItem.prototype.get_price = function( ) {
	var price = 0;
	var quantity = this.getQuantity();
	if (quantity > 8) {
	   price = 15;
	} else if (quantity > 6) {
	   price = 15;
	} else if (quantity > 4) {
	   price = 12;
	} else if (quantity > 0) {
	   price = 8.5;
	}
	return price;
    }
    BasketItem.prototype.get_name = function(n) {
        return this.getCartTitle();
    }
    BasketItem.prototype.get_quantity = function() {
        return this.quantity;
    }
    BasketItem.prototype.getPrice = function( ) {
	return simpleCart.valueToCurrencyString( this.get_price() );
    }

    CartItem.prototype.getPrice = function( ) {
	return simpleCart.valueToCurrencyString( this.get_price() );
    }

    BasketItem.prototype.isBasket = function( ) {
	return true;
    }

    BasketItem.prototype.inBasket = function( ) {
	return false;
    }

    BasketItem.prototype.discount = function( ) {
        return 0.00;
    };

    BasketItem.prototype.print = function () {
        var returnString = '';
        for ( var field in this ) {
            if ( typeof( this[field] ) == "function" ) {
		continue;
	    }
	    // exclude link to reduce size of cookie
            if ( field == "link" ) {
		continue;
	    }
            if ( field == "basketItems" ) {
		continue;
	    }
            if ( field == "items" ) {
alert("error");
	    }
	    // only include basket if item is in basket
            if ( field == "basket" && this[field] == 'N/A' ) {
		continue;
	    }
            if ( typeof( this[field] ) != "function" ) {
                returnString += escape(field) + "=" + escape(this[field]) + "||";
            }
        }
        return returnString.substring(0,returnString.length-2);
    };

    BasketItem.prototype.parseValuesFromArray = function( array ) {
        if ( array && array.length && array.length > 0) {
            for (var x = 0, xlen = array.length; x < xlen; x++ ) {
                /* ensure the pair does not have key delimeters */
                array[x].replace(/||/, "| |");
                array[x].replace(/\+\+/, "+ +");

                /* split the pair and save the unescaped values to the item */
                var value = array[x].split('=');
                if ( value.length > 1 ) {
                    if ( value.length > 2 ) {
                        for (var j = 2, jlen = value.length; j < jlen; j++) {
                            value[1] = value[1] + "=" + value[j];
                        }
                    }
                    this[ unescape(value[0]).toLowerCase() ] = unescape(value[1]);
                }
            }

	    if ((NextCartId - 0) <= (this.id.substring(1) - 0)) {
//error("update " + NextCartId + " to " + (this.id.substring(1) - 0 + 1));
		NextCartId = this.id.substring(1) - 0 + 1;
	    }

	    if (!this.link) {
		this.href = '/basket.html#' + this.id;
		this.link = '<a href="/basket.html#' + this.id  + '" >' + this.title + "</a>";
	    }

            return true;
        } else {
            return false;
        }
    }

    BasketItem.prototype.checkQuantityAndPrice = function( array ) {
	return true;
    }

    BasketItem.prototype.addItemToBasket = function(id) {
	if (this.isFull()) {
	    alert("I am full.");
	    if (simpleCart.currentBasket() == this.id) {
//		simpleCart.current_basket = undefined;
	    }
	    return false;
	} else {
	    this.basketItems[id] = id;
	    return true;
	}
    };

    BasketItem.prototype.isFull = function() {
        var count =  this.getQuantity();
	return this.maxQuantity() <= count;
    };

/*******************************************************************************
 *          Cart Item Object
 ******************************************************************************/

function CartItem() {
    this.id = "c" + NextCartId++;
}

    CartItem.prototype.discount = function() {
        return 0.00;
    };

    CartItem.prototype.set = function ( field, value ) {
        field = field.toLowerCase();
        if ( typeof( this[field] ) != "function" && field != "id" ) {
            if ( field == "quantity" ) {
                value = value.replace( /[^(\d|\.)]*/gi , "" );
                value = value.replace(/,*/gi, "");
                value = parseInt(value,10);
            } else if ( field == "price") {
                value = value.replace( /[^(\d|\.)]*/gi, "");
                value = value.replace(/,*/gi , "");
                value = parseFloat( value );
            }
            if ( typeof(value) == "number" && isNaN( value ) ) {
                error( "Improperly formatted input.");
            } else {
                this[field] = value;
            }
        } else {
            error( "Cannot change " + field + ", this is a reserved field.");
        }
    };

    CartItem.prototype.increment = function() {
        this.quantity = parseInt(this.quantity,10) + 1;
        simpleCart.update();
    };

    CartItem.prototype.decrement = function() {
        if ( parseInt(this.quantity,10) < 2 ) {
            this.remove();
        } else {
            this.quantity = parseInt(this.quantity,10) - 1;
            simpleCart.update();
        }
    };

    CartItem.prototype.print = function () {
        var returnString = '';
        for ( var field in this ) {
            if ( typeof( this[field] ) == "function" ) {
		continue;
	    }
	    // exclude link to reduce size of cookie
            if ( field == "link" ) {
		continue;
	    }
	    // only include basket if item is in basket
            if ( field == "basket" && this[field] == 'N/A' ) {
		continue;
	    }
            if ( typeof( this[field] ) != "function" ) {
                returnString += escape(field) + "=" + escape(this[field]) + "||";
            }
        }
        return returnString.substring(0,returnString.length-2);
    };

    CartItem.prototype.checkQuantityAndPrice = function() {
        var prod;
	if ( this.key ) {
	    ;
	} else {
	    alert("no key " + this.name);
	}
        if ( !this.price || this.quantity == null || this.quantity == 'undefined') {
            this.quantity = 1;
            error('No quantity for item.');
        } else {
            this.quantity = ("" + this.quantity).replace(/,*/gi, "" );
            this.quantity = parseInt( ("" + this.quantity).replace( /[^(\d|\.)]*/gi, "") , 10);
            if ( isNaN(this.quantity) ) {
                error('Quantity is not a number.');
                this.quantity = 1;
            }
        }
	this.name = this.title;

        if ( !this.price || this.price == null || this.price == 'undefined') {
            this.price=0.00;
            error('No price for item or price not properly formatted.');
        } else {
            this.price = ("" + this.price).replace(/,*/gi, "" );
            this.price = parseFloat( ("" + this.price).replace( /[^(\d|\.)]*/gi, "") );
            if ( isNaN(this.price) ) {
                error('Price is not a number.');
                this.price = 0.00;
            }
        }
    };

    CartItem.prototype.parseValuesFromArray = function( array ) {
        if ( array && array.length && array.length > 0) {
            for (var x = 0, xlen = array.length; x < xlen; x++ ) {
                /* ensure the pair does not have key delimeters */
                array[x].replace(/||/, "| |");
                array[x].replace(/\+\+/, "+ +");

                /* split the pair and save the unescaped values to the item */
                var value = array[x].split('=');
                if ( value.length > 1 ) {
                    if ( value.length > 2 ) {
                        for (var j = 2, jlen = value.length; j < jlen; j++) {
                            value[1] = value[1] + "=" + value[j];
                        }
                    }
                    this[ unescape(value[0]).toLowerCase() ] = unescape(value[1]);
                }
            }

	    if ((NextCartId - 0) <= (this.id.substring(1) - 0)) {
//error("update " + NextCartId + " to " + (this.id.substring(1) - 0 + 1));
		NextCartId = this.id.substring(1) - 0 + 1;
	    }

	    if (!this.link) {
		this.link = '<a href="' + this.href + '" >' + this.title + "</a>";
	    }

	    if (this.in_basket && this.basket_type) {
		alert("item " + this.id + " is a basket but is in " + this.in_basket);
		return false;
	    } else
	    if (this.inBasket()) {
		if (!this.getBasket().addItemToBasket(this.id)) {
		    alert("Could not put " + this.id + " into basket " + this.in_basket);
		    return false;
		}
		this.link = '<a href="/basket.html#' + this.inBasket()  + '" >' + this.title + "</a>";
	    } else
	    if (this.basket_type) {
	        alert("Error " + this.basket_type);
	    }
            return true;
        } else {
            return false;
        }
    };

    CartItem.prototype.remove = function() {
        if (this.inBasket()) {
           this.getBasket().removeItem(this);
	}
        simpleCart.remove(this.id);
	/* make sure you update */
    };

    CartItem.prototype.checkBasket = function() {
        if (this.isBasket()) {
	}
        if (this.inBasket()) {
	}
    }

    CartItem.prototype.isBasket = function() {
        return false;
    };

    CartItem.prototype.getBasket = function() {
	return simpleCart.items[this.in_basket];
    }

    CartItem.prototype.inBasket = function() {
        return this.in_basket;
    };

    CartItem.prototype.setBasket = function(id) {
        this.in_basket = id;
    }

    CartItem.prototype.getSelect = function() {
	var e = document.createElement("select");
	e.className = "Select";
	var q = this.quantity;
	var end = this.selectMax();
	if (end < q) {
	    end = q;
	}

	var o;
	var tempArray = [ e ];
	var addFunction = function(qq, x) {
	    return function(event) {
	        var item = simpleCart.items[x];
// alert(e.options[e.selectedIndex].value);
                var value = e.options[e.selectedIndex].value;
		if (value == 0) {
		    e.parentNode.removeChild(e);
		    simpleCart.items[x].remove();
		} else {
		    simpleCart.items[x].set("quantity", value);
		}
		simpleCart.update();
	    }
	};

	o = document.createElement( "option" );
	var t = document.createTextNode( "remove" );
	o.appendChild(t);
	o.setAttribute("value", "0");
	e.appendChild( o );
	for (var x = 1; x <= end; x++) {
	    var o = document.createElement( "option" );
	    var t = document.createTextNode( x );
	    if (x == q) {
		o.setAttribute("selected", "selected");
	    }
	    o.appendChild(t);
	    e.appendChild( o );
	}
	simpleCart.addEventToArray( tempArray , addFunction(e, this.id) , "change");
	return e;
    }

    /* end of CartItem Class */

/*******************************************************************************
 *    Shelf Object for managing items on shelf that can be added to cart
 ******************************************************************************/

function Shelf() {
    this.items = {};
}

    Shelf.prototype.readPage = function () {
        this.items = {};
        var newItems = getElementsByClassName( "simpleCart_shelfItem" );

        for ( var current in newItems ) {
            var newItem = new ShelfItem();
            this.checkChildren( newItems[current], newItem );
            this.items[newItem.id] = newItem;
        }
    };

    Shelf.prototype.checkChildren = function(item , newItem) {
        for (var x = 0; item.childNodes[x]; x++) {
            var node = item.childNodes[x];
            if ( node.className && node.className.match(/item_[^ ]+/) ) {
                var data = /item_[^ ]+/.exec(node.className)[0].split("_");

                if ( data[1] == "add" || data[1] == "Add" ) {
                    var tempArray = [];
                    tempArray.push( node );
                    var addFunction = simpleCart.Shelf.addToCart( newItem.id );
                    simpleCart.addEventToArray( tempArray , addFunction , "click");
                    if ( node.tagName != "BUTTON" ) {
			alert("not a button");
		    }
                    node.id = newItem.id;
                } else {
                    newItem[data[1]]  = node;
                }
            }
            if ( node.childNodes[0] ) {
                this.checkChildren( node , newItem );
            }
        }
    };

    Shelf.prototype.empty = function () {
        this.items = {};
    };

    Shelf.prototype.addToCart = function( id ) {
        return function() {
            if ( simpleCart.Shelf.items[id] ) {
		simpleCart.Shelf.items[id].addToCart();
            } else {
                error( "Shelf item with id of " + id + " does not exist.");
            }
        };
    };


/*******************************************************************************
 *  Shelf Item Object
 ******************************************************************************/

function ShelfItem() {
    this.id = "s" + NextShelfId++;
}

    ShelfItem.prototype.remove = function () {
        simpleCart.Shelf.items[this.id] = null;
    };

    ShelfItem.prototype.addToCart = function () {
        var outStrings = [],valueString;

        for ( var field in this ) {
            if ( typeof( this[field] ) != "function" && field != "id" ) {
                valueString = "";
		field_name = field;

                switch(field) {
                    case "price":
                        if ( this[field].value ) {
                            valueString = this[field].value;
                        } else if ( this[field].innerHTML ) {
alert("don't use this.");
                            valueString = this[field].innerHTML;
                        }
                        /* remove all characters from price except digits and a period */
                        valueString = valueString.replace( /[^(\d|\.)]*/gi , "" );
                        valueString = valueString.replace( /,*/ , "" );
                        break;
                    case "image":
                        valueString = this[field].src;
                        break;
                    case "basket":
			field_name = "basket_type";
                    default:
                        if ( this[field].value ) {
                            valueString = this[field].value;
                        } else if ( this[field].innerHTML ) {
alert("don't use this.");
                            valueString = this[field].innerHTML;
                        } else if ( this[field].src ) {
                            valueString = this[field].src;
                        } else {
                            valueString = this[field];
                        }
                        break;
                }
                outStrings.push( field_name + "=" + valueString );
            }
        }
        simpleCart.add( outStrings );
    };

/* end of ShelfItem class */

/*******************************************************************************
 * Thanks to Peter-Paul Koch for these cookie functions
 *  (http://www.quirksmode.org/js/cookies.html)
 ******************************************************************************/
function createCookie(name, value, days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
    }
    else var expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ')
	    c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) === 0)
	    return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, "", -1);
}

/******************************************************************************
 *  Developed by Robert Nyman, http://www.robertnyman.com
 *  Code/licensing: http://code.google.com/p/getelementsbyclassname/
 *****************************************************************************/
var getElementsByClassName = function (className, tag, elm) {
    if (document.getElementsByClassName) {
        getElementsByClassName = function(className, tag, elm) {
            elm = elm || document;
            var elements = elm.getElementsByClassName(className),
                nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
                returnElements = [],
                current;
            for (var i = 0, il = elements.length; i < il; i += 1) {
                current = elements[i];
                if (!nodeName || nodeName.test(current.nodeName)) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    else if (document.evaluate) {
        getElementsByClassName = function(className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
                classesToCheck = "",
                xhtmlNamespace = "http://www.w3.org/1999/xhtml",
                namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
                returnElements = [],
                elements,
                node;
            for (var j=0, jl = classes.length; j < jl; j += 1) {
                classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
            }
            try {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
            }
            catch (e) {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
            }
            while ((node = elements.iterateNext())) {
                returnElements.push(node);
            }
            return returnElements;
        };
    }
    else {
        getElementsByClassName = function (className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
                classesToCheck = [],
                elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
                current,
                returnElements = [],
                match;
            for (var k=0, kl=classes.length; k<kl; k+=1) {
                classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
            }
            for (var l=0, ll=elements.length; l<ll; l+=1) {
                current = elements[l];
                match = false;
                for (var m=0, ml=classesToCheck.length; m<ml; m+=1) {
                    match = classesToCheck[m].test(current.className);
                    if (!match) {
                        break;
                    }
                }
                if (match) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    return getElementsByClassName(className, tag, elm);
};

/****************************************************************************
 *  Helpers
 ****************************************************************************/

String.prototype.reverse = function() {
    return this.split("").reverse().join("");
};

Number.prototype.withCommas = function() {
    var x = 6, 
        y = parseFloat(this).toFixed(2).toString().reverse();
    while (x < y.length) {
	y = y.substring(0, x) + "," + y.substring(x);
	x += 4;
    }
    return y.reverse();
};

Number.prototype.toCurrency = function() {
    return ( arguments[0] ? arguments[0] : "$" ) + this.withCommas();
};

/******************************************************************************
 * error management                                                           *
 ******************************************************************************/

function error( message ) {
    try {
        console.log( message );
    } catch(err) {
        alert( message );
    }
}

function concatObject(obj) {
    str='';
    for(prop in obj)
    {
	str+=prop + " value :"+ obj[prop]+"\n";
    }
    return(str);
}

/* create the cart and load any cookies */

var simpleCart = new Cart();

simpleCart.load();

if ( typeof jQuery !== 'undefined' ) {
    $(document).ready( function() { simpleCart.initialize(); } );
} else if ( typeof Prototype !== 'undefined' ) {
    Event.observe( window, 'load', function() { simpleCart.initialize(); } );
} else {
    window.onload = simpleCart.initialize;
}


