var Custom="Custom",GoogleCheckout="GoogleCheckout",PayPal="PayPal",Contrassegno="Contrassegno",Email="Email",AustralianDollar="AUD",AUD="AUD",CanadianDollar="CAD",CAD="CAD",CzechKoruna="CZK",CZK="CZK",DanishKrone="DKK",DKK="DKK",Euro="EUR",EUR="EUR",HongKongDollar="HKD",HKD="HKD",HungarianForint="HUF",HUF="HUF",IsraeliNewSheqel="ILS",ILS="ILS",JapaneseYen="JPY",JPY="JPY",MexicanPeso="MXN",MXN="MXN",NorwegianKrone="NOK",NOK="NOK",NewZealandDollar="NZD",NZD="NZD",PolishZloty="PLN",PLN="PLN",PoundSterling="GBP",GBP="GBP",SingaporeDollar="SGD",SGD="SGD",SwedishKrona="SEK",SEK="SEK",SwissFranc="CHF",CHF="CHF",ThaiBaht="THB",THB="THB",USDollar="USD",USD="USD";
function Cart(){
    var me = this;
    me.nextId = 1;
    me.Version = '2.2.2';
    me.Shelf = null;
    me.items = {};
    
    me.isLoaded = false;
    me.pageIsReady = false;
    me.quantity = 0;
    me.total = 0;
    me.taxRate = 0;
    me.taxCost = 0;
    me.shippingFlatRate = 0;
    me.shippingTotalRate = 0;
    me.shippingQuantityRate = 10;
    me.shippingRate = 0;
    me.shippingCost = 0;
    me.currency = EUR;
    me.checkoutTo = "";
    me.paymentBonifico= true;
	me.email = "frutta@tuttafrutta.it";
	me.merchantId = "1";
	me.successUrl = "http://www.tuttafrutta.it";
	me.cancelUrl = "http://www.tuttafrutta.it";
	me.cookieDuration = 2;
	me.storagePrefix = "sc_";
	me.MAX_COOKIE_SIZE = 4000;
	me.cartHeaders = [ "name", "thumb_image" , "Quantity_input" ,  "increment",  "decrement", "Total" , "remove" ];
	me.events = {};
	me.sandbox = false;
	me.paypalHTTPMethod = "GET";  
    me.add = function ( values ) {
        var me=this;
        if( !me.pageIsReady) {
            me.initializeView();
            me.update();
        }
        if( !me.isLoaded) {
            me.load();
            me.update();
        }
        var newItem = new CartItem();
        if( !arguments || arguments.length === 0 ){
            error( 'No values passed for item.');
            return null;
        }
        var argumentArray = arguments;
        if( values && typeof( values ) !== 'string' && typeof( values ) !== 'number'  ){
            argumentArray = values;
        }
        newItem.parseValuesFromArray( argumentArray );
        newItem.checkQuantityAndPrice();
        if( me.trigger('beforeAdd', [newItem] ) === false ){
            return false;
        }
        var isNew = true;
        if( me.hasItem(newItem) ) {
            var foundItem=me.hasItem(newItem);
            foundItem.quantity= parseInt(foundItem.quantity,10) + parseInt(newItem.quantity,10);
            newItem = foundItem;
            isNew = false;
        } else {
            me.items[newItem.id] = newItem;
        }
        me.update();
        me.trigger('afterAdd', [newItem,isNew] );
        return newItem;
    };
    me.remove = function( id ){
        var tempArray = {};
        me.each(function(item){
            if( item.id !== id ){
                tempArray[item.id] = item;
            }
        });
        this.items = tempArray;
    };
    me.empty = function () {
        me.items = {};
        me.update();
    };
    me.find = function (criteria) {
        if( !criteria ){
            return null;
        }
        var results = [];
        me.each(function(item,x,next){  
            fits = true;
            me.each( criteria , function(value,j,name){
                if( !item[name] || item[name] != value ){
                    fits = false;
                }
            });
            if( fits ){
                results.push( item );
            }
        });
        return (results.length === 0 ) ? null : results;
    };
    me.each = function( array , callback ){
        var next,
        x=0, 
        result;
        if( typeof array === 'function' ){
            var cb = array
            items = me.items;
        } else if( typeof callback === 'function' ){
            var cb = callback,
            items = array;
        } else {
            return;
        }
        for( next in items ){
            if( typeof items[next] !== "function" ){
                result = cb.call( me , items[next] , x , next );
                if( result === false ){
                    return;
                }
                x++;
            }
        }
    };
    me.chunk = function(str, n) {
        if (typeof n==='undefined'){ 
            n=2;
        }
        var result = str.match(RegExp('.{1,'+n+'}','g'));
        return result || [];
    };
    me.checkout = function() {
        if( me.quantity === 0 ){
            error("Cart is empty");
            return;
        }
        switch( me.checkoutTo ){
            case PayPal:
                me.paypalCheckout();
                break;
            case GoogleCheckout:
                me.googleCheckout();
                break;
            case Email:
                me.emailCheckout();
                break;
            case Contrassegno:
                me.contrassegnoCheckout();
                break;
            default:
                me.customCheckout();
                break;
        }
    };
    me.paypalCheckout = function() { 

        var form = document.createElement("form"),
        counter=1,
        current,
        item,
        descriptionString;

        form.style.display = "none";
        form.method = me.paypalHTTPMethod =="GET" || me.paypalHTTPMethod == "POST" ? me.paypalHTTPMethod : "GET";
        form.action = me.sandbox ? "https://www.sandbox.paypal.com/cgi-bin/webscr" : "https://www.paypal.com/cgi-bin/webscr";
        form.acceptCharset = "utf-8";


        form.appendChild(me.createHiddenElement("cmd", "_cart"));
        form.appendChild(me.createHiddenElement("rm", me.paypalHTTPMethod == "POST" ? "2" : "0" ));
        form.appendChild(me.createHiddenElement("upload", "1"));
        form.appendChild(me.createHiddenElement("business", me.email ));
        form.appendChild(me.createHiddenElement("currency_code", me.currency));

        if( me.taxRate ){
            form.appendChild(me.createHiddenElement("tax_cart",me.taxCost ));
        }

        if( me.shipping() !== 0){
            form.appendChild(me.createHiddenElement("handling_cart",  me.shippingCost + 2));
        }

        if( me.successUrl ){
            form.appendChild(me.createHiddenElement("return",  me.successUrl ));
        }

        if( me.cancelUrl ){
            form.appendChild(me.createHiddenElement("cancel_return",  me.cancelUrl ));
        }


        me.each(function(item,iter){ 
            counter = iter+1;

            form.appendChild( me.createHiddenElement( "item_name_"		+ counter, item.name		) );
            form.appendChild( me.createHiddenElement( "quantity_"		+ counter, item.quantity	) );
            form.appendChild( me.createHiddenElement( "amount_"			+ counter, item.price		) );
            form.appendChild( me.createHiddenElement( "item_number_"	+ counter, counter			) );

            var option_count = 0; 
            me.each( item , function( value, x , field ){
                if( field !== "id" && field !== "price" && field !== "quantity" && field !== "name" && field !== "shipping" && option_count < 10) {
                    form.appendChild( me.createHiddenElement( "on" + option_count + "_"	+ counter, 	field ) );
                    form.appendChild( me.createHiddenElement( "os" + option_count + "_"	+ counter, 	value ) );
                    option_count++;
                }
            }); 
            form.appendChild( me.createHiddenElement( "option_index_" + counter, option_count) ); 
        }); 
        document.body.appendChild( form );
        form.submit();
        document.body.removeChild( form );

    }; 
    me.googleCheckout = function() {
        var me = this;
        if( me.currency !== EUR){
            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,
        current,
        item,
        descriptionString;
        form.style.display = "none";
        form.method = "POST";
        form.action = "http://www.enotecastringhetto.it/enoteca/ordine.php";
        form.acceptCharset = "utf-8";
        me.each(function(item,iter){
            counter = iter+1;
            form.appendChild( me.createHiddenElement( "item_name_"      + counter, item.name        ) );
            form.appendChild( me.createHiddenElement( "item_quantity_"  + counter, item.quantity    ) );
            form.appendChild( me.createHiddenElement( "item_price_"     + counter, item.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_"                , ""               ) );
            descriptionString = "";
            me.each( item , function( value , x , field ){
                if( field !== "id"      &&
                    field !== "quantity" &&
                    field !== "price" ) {
                    descriptionString = descriptionString + ", " + field + ": " + value;
                }
            });
            descriptionString = descriptionString.substring( 1 );
            form.appendChild( me.createHiddenElement( "item_description_" + counter, descriptionString) );
        });
        if( me.shipping() !== 0){
            form.appendChild(me.createHiddenElement("ship_method_name_1", "Shipping"));
            form.appendChild(me.createHiddenElement("ship_method_price_1", parseFloat(me.shippingCost).toFixed(2)));
            form.appendChild(me.createHiddenElement("ship_method_currency_1", me.currency));
        }
        document.body.appendChild( form );
        form.submit();
        document.body.removeChild( form );
    };
    me.emailCheckout = function() {
        return;
    };
    me.customCheckout = function() {
        var me = this;
        var form = document.createElement("form"),
        counter=1,
        current,
        item,
        descriptionString;
        form.style.display = "none";
        form.method = "POST";
        form.action = "completa_ordine.php";
        form.acceptCharset = "utf-8";
        me.each(function(item,iter){
            counter = iter+1;
            form.appendChild( me.createHiddenElement( "item_name_"      + counter, item.name        ) );
            form.appendChild( me.createHiddenElement( "item_quantity_"  + counter, item.quantity    ) );
            form.appendChild( me.createHiddenElement( "item_price_"     + counter, item.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_"                , ""               ) );
            descriptionString = "";
            me.each( item , function( value , x , field ){
                if( field !== "id"      &&
                    field !== "quantity" &&
                    field !== "price" ) {
                    descriptionString = descriptionString + ", " + field + ": " + value;
                }
            });
            descriptionString = descriptionString.substring( 1 );
            form.appendChild( me.createHiddenElement( "item_description_" + counter, descriptionString) );
        });
        if( me.shipping() !== 0){
            form.appendChild(me.createHiddenElement("ship_extra", "0"));
            form.appendChild(me.createHiddenElement("payment_method", "Bonifico Bancario - intestare a ORTOFRUTTA STRINGHETTO FABRIZIO S.R.L. - CODICE IBAN: IT81P 05728 59540 225570642363"));
            form.appendChild(me.createHiddenElement("ship_method_name_1", "Shipping"));
            form.appendChild(me.createHiddenElement("ship_method_price_1", parseFloat(me.shippingCost).toFixed(2)));
            form.appendChild(me.createHiddenElement("ship_method_currency_1", me.currency));
        }
        document.body.appendChild( form );
        form.submit();
        document.body.removeChild( form );
    };
    me.contrassegnoCheckout = function() {
        var me = this;
        var form = document.createElement("form"),
        counter=1,
        current,
        item,
        descriptionString;
        form.style.display = "none";
        form.method = "POST";
        form.action = "completa_ordine.php";
        form.acceptCharset = "utf-8";
        me.each(function(item,iter){
            counter = iter+1;
            form.appendChild( me.createHiddenElement( "item_name_"      + counter, item.name        ) );
            form.appendChild( me.createHiddenElement( "item_quantity_"  + counter, item.quantity    ) );
            form.appendChild( me.createHiddenElement( "item_price_"     + counter, item.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_"                , ""               ) );
            descriptionString = "";
            me.each( item , function( value , x , field ){
                if( field !== "id"      &&
                    field !== "quantity" &&
                    field !== "price" ) {
                    descriptionString = descriptionString + ", " + field + ": " + value;
                }
            });
            descriptionString = descriptionString.substring( 1 );
            form.appendChild( me.createHiddenElement( "item_description_" + counter, descriptionString) );
        });
        
        form.appendChild(me.createHiddenElement("shipWay", 2));
        if( me.shipping() !== 0){
            form.appendChild(me.createHiddenElement("ship_extra", "2"));
            form.appendChild(me.createHiddenElement("payment_method", "Contrassegno"));
            form.appendChild(me.createHiddenElement("ship_method_name_1", "Shipping"));
            form.appendChild(me.createHiddenElement("ship_method_price_1", (parseFloat(me.shippingCost) + 2).toFixed(2)));
            form.appendChild(me.createHiddenElement("ship_method_currency_1", me.currency));
        }
        document.body.appendChild( form );
        form.submit();
        document.body.removeChild( form );
    };
    me.load = function () {
        var me = this,
        id;
        me.items = {};
        me.total = 0.00;
        me.quantity = 0;
        if( readCookie(simpleCart.storagePrefix + 'simpleCart_' + "chunks") ){
            var chunkCount = 1*readCookie(simpleCart.storagePrefix + 'simpleCart_' + "chunks"),
            dataArray = [],
            dataString = "",
            data = "",
            info,
            newItem,
            y=0;
            if(chunkCount>0) {  
                for( y=0;y<chunkCount;y++){
                    dataArray.push( readCookie( simpleCart.storagePrefix + 'simpleCart_' + (1 + y ) ) );
                }
                dataString = unescape( dataArray.join("") );
                data = dataString.split("++");
            }
            for(var x=0, xlen=data.length;x<xlen;x++){
                info = data[x].split('||');
                newItem = new CartItem();
                if( newItem.parseValuesFromArray( info ) ){
                    newItem.checkQuantityAndPrice();
                    me.items[newItem.id] = newItem;
                }
            }
        }
        me.isLoaded = true;
    };
    me.save = function () {
        var dataString = "",
        dataArray = [],
        chunkCount = 0;
        chunkCount = 1*readCookie(simpleCart.storagePrefix + 'simpleCart_' + "chunks");
        for( var j=0;j<chunkCount;j++){
            eraseCookie(simpleCart.storagePrefix + 'simpleCart_'+ j);
        }
        eraseCookie(simpleCart.storagePrefix + 'simpleCart_' + "chunks");
        me.each(function(item){
            dataString = dataString + "++" + item.print();
        });
        dataArray = simpleCart.chunk( dataString.substring(2) , simpleCart.MAX_COOKIE_SIZE );
        for( var x=0,xlen = dataArray.length;x<xlen;x++){
            createCookie(simpleCart.storagePrefix + 'simpleCart_' + (1 + x ), dataArray[x], me.cookieDuration );
        }
        createCookie( simpleCart.storagePrefix + 'simpleCart_' + "chunks", "" + dataArray.length , me.cookieDuration );
    };
    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.ship_extra               = document.getElementById('testExtra');
        if (me.ship_extra == null) {
            me.ship_extra = 0;
        } else {
            me.ship_extra = me.ship_extra.getAttribute("value");
        }
        me.finalTotalOutlets        = getElementsByClassName('simpleCart_finalTotal');
        me.addEventToArray( getElementsByClassName('simpleCart_checkout') , simpleCart.checkout , "click");
        me.addEventToArray( getElementsByClassName('simpleCart_empty')  , simpleCart.empty , "click" );
        me.Shelf = new Shelf();
        me.Shelf.readPage();
        me.pageIsReady = true;
    };
    me.updateView = function() {
        me.updateViewTotals();
        if( me.cartDivs && me.cartDivs.length > 0 ){
            me.updateCartView();
        }
    };
    me.updateViewTotals = function() {
        var outlets = [ ["quantity"     , "none"        ] ,
        ["total"        , "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,
            element;
            if (arrayName == "shippingCostOutlets") {
                me[outlets[x][0]] = parseFloat(me[outlets[x][0]])+parseFloat(me.ship_extra);
            }
            if (arrayName == "finalTotalOutlets") {
                me[outlets[x][0]] = parseFloat(me[outlets[x][0]])+parseFloat(me.ship_extra);
            }
            for( var y = 0,ylen = me[ arrayName ].length; y<ylen; y++ ){ 
                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][y].innerHTML = "" + outputString;
            }
        }
    };
    me.updateCartView = function() {
        var newRows = [],
        y,newRow,current,header,newCell,info,outputValue,option,headerInfo;
        newRow = document.createElement('div');
        for(var y=0,ylen = me.cartHeaders.length; y<ylen; y++ ){
            newCell = document.createElement('div');
            headerInfo = me.cartHeaders[y].split("_");
            newCell.innerHTML = me.print( headerInfo[0] );
            newCell.className = "item" + headerInfo[0];
            for(var z=1,zlen=headerInfo.length;z<zlen;z++){
                if( headerInfo[z].toLowerCase() == "noheader" ){
                    newCell.style.display = "none";
                }
            }
            newRow.appendChild( newCell );
        }
        newRow.className = "cartHeaders";
        newRows[0] = newRow;
        me.each(function(item, x){
            newRow = document.createElement('div');
            for(var y=0,ylen = me.cartHeaders.length; y<ylen; y++ ){
                newCell = document.createElement('div');
                info = me.cartHeaders[y].split("_");
                outputValue = me.createCartRow( info , item , outputValue );
                newCell.innerHTML = outputValue;
                newCell.className = "item" + info[0];
                newRow.appendChild( newCell );
            }
            newRow.className = "itemContainer";
            newRows[x+1] = newRow;
        });
        for( var x=0,xlen=me.cartDivs.length; x<xlen; x++){
            var div = me.cartDivs[x];
            if( div.childNodes && div.appendChild ){
                while( div.childNodes[0] ){
                    div.removeChild( div.childNodes[0] );
                }
                for(var j=0, jLen = newRows.length; j<jLen; j++){
                    div.appendChild( newRows[j] );
                }
            }
        }
    };
    me.createCartRow = function( info , item , outputValue ){
        switch( info[0].toLowerCase() ){
            case "total":
                outputValue = me.valueToCurrencyString(parseFloat(item.price)*parseInt(item.quantity,10) );
                break;
            case "increment":
                outputValue = me.valueToLink( "+" , "javascript:;" , "onclick=\"simpleCart.items[\'" + item.id + "\'].increment();\"" );
                break;
            case "decrement":
                outputValue = me.valueToLink( "-" , "javascript:;" , "onclick=\"simpleCart.items[\'" + item.id + "\'].decrement();\"" );
                break;
            case "remove":
                outputValue = me.valueToLink( "Rimuovi" , "javascript:;" , "onclick=\"simpleCart.items[\'" + item.id + "\'].remove();\"" );
                break;
            case "price":
                outputValue = me.valueToCurrencyString( item[ info[0].toLowerCase() ] ? item[info[0].toLowerCase()] : " " );
                break;
            default:
                outputValue = item[ info[0].toLowerCase() ] ? 
                typeof  item[info[0].toLowerCase()] === 'function' ?
                item[info[0].toLowerCase()].call(item) :
                item[info[0].toLowerCase()] :
                " ";
                break;
        }   
        for( var y=1,ylen=info.length;y<ylen;y++){
            option = info[y].toLowerCase();
            switch( option ){
                case "image":
                case "img":
                    outputValue = me.valueToImageString( outputValue );     
                    break;
                case "input":
                    outputValue = me.valueToTextInput( outputValue , "onchange=\"simpleCart.items[\'" + item.id + "\'].set(\'" + info[0].toLowerCase() + "\' , this.value);\""  );
                    break;
                case "div":
                case "span":
                case "h1":
                case "h2":
                case "h3":
                case "h4":
                case "p":
                    outputValue = me.valueToElement( option , outputValue , "" );
                    break;
                case "noheader":
                    break;
                default:
                    error( "unkown header option: " + option );
                    break;
            }
        }         
        return outputValue;
    };
    me.addEventToArray = function ( array , functionCall , theEvent ) {
        var outlet, 
        element;
        for(var x=0,xlen=array.length; x<xlen; x++ ){
            element = array[x];
            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;
    };
    me.bind = function( name , callback ){
        if( typeof callback !== 'function' ){
            return me;
        }
        if (me.events[name] === true ){
            callback.apply( me );
        } else if( typeof me.events[name] !== 'undefined' ){
            me.events[name].push( callback );
        } else {
            me.events[name] = [ callback ];
        }
        return me;
    };
    me.trigger = function( name , options ){
        var returnval = true;
        if( typeof me.events[name] !== 'undefined' && typeof me.events[name][0] === 'function'){
            for( var x=0,xlen=me.events[name].length; x<xlen; x++ ){
                returnval = me.events[name][x].apply( me , (options ? options : [] ) );
            }
        }
        if( returnval === false ){
            return false;
        } else {
            return true;
        }
    };
    me.ready = function( callback ){
        if( !callback ){
            me.trigger( 'ready' );
            me.events['ready'] = true;
        } else {
            me.bind( 'ready' , callback );
        }
        return me;
    };
    me.currencySymbol = function() {
        switch(me.currency){
            case CHF:
                return "CHF&nbsp;";
            case CZK:
                return "CZK&nbsp;";
            case DKK:
                return "DKK&nbsp;";
            case HUF:
                return "HUF&nbsp;";
            case NOK:
                return "NOK&nbsp;";
            case PLN:
                return "PLN&nbsp;";
            case SEK:
                return "SEK&nbsp;";
            case JPY:
                return "&yen;";
            case EUR:
                return "&euro;";
            case GBP:
                return "&pound;";
            case CHF:
                return "CHF&nbsp;";
            case THB:
                return "&#3647;";
            case USD:
            case CAD:
            case AUD:
            case NZD:
            case HKD:
            case SGD:
                return "&#36;";
            default:
                return "";
        }
    };
    me.currencyStringForPaypalCheckout = function( value ){
        if( me.currencySymbol() == "&#36;" ){
            return "$" + parseFloat( value ).toFixed(2);
        } else {
            return "" + parseFloat(value ).toFixed(2);
        }
    };
    me.valueToCurrencyString = function( value ) {
        var val =  parseFloat( value ); 
        if( isNaN(val))
            val = 0;
        return val.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 + ">";
    };
    me.hasItem = function ( item ) {
        var current, 
        matches,
        field,
        match=false;
        me.each(function(testItem){ 
            matches = true;
            me.each( item , function( value , x , field ){ 
                if( field !== "quantity" && field !== "id" && item[field] !== testItem[field] ){
                    matches = false;
                }
            });
            if( matches ){
                match = testItem;
            }
        });
        return match;
    };
    me.ln = {
        "en_us": {
            quantity: "Quantità"
            , 
            price: "Prezzo"
            , 
            total: "Totale"
            , 
            decrement: "Decrementa"
            , 
            increment: "Incrementa"
            , 
            remove: "Rimuovi"
            , 
            tax: "IVA"
            , 
            shipping: "Spedizione"
            , 
            image: "Immagine"
        } 
    };
    me.language = "en_us"; 
    me.print = function( input ) {
        var me = this;
        return me.ln[me.language] && me.ln[me.language][input.toLowerCase()] ? me.ln[me.language][input.toLowerCase()] : input;
    };
    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.each(function(item){ 
            if( item.quantity < 1 ){
                item.remove();
            } else if( item.quantity !== null && item.quantity !== "undefined" ){
                me.quantity = parseInt(me.quantity,10) + parseInt(item.quantity,10);
            }
            if( item.price ){
                me.total = parseFloat(me.total) + parseInt(item.quantity,10)*parseFloat(item.price);
            }
        });
        me.shippingCost = me.shipping();
        me.taxCost = parseFloat(me.total)*me.taxRate;
        me.finalTotal = me.shippingCost + me.taxCost + me.total; 
    };
    me.shipping = function(){
        var shipping = 10 ;
        return shipping;
    }
    me.initialize = function() {
        me.initializeView();
        me.load();
        me.update();
        me.ready();
    };
}
function CartItem() {
    while( simpleCart.items["c" + simpleCart.nextId] )  
        simpleCart.nextId++;
    this.id = "c" + simpleCart.nextId;
}
CartItem.prototype = {
    set : function ( field , value ){
        field = field.toLowerCase();
        if( typeof( this[field] ) !== "function" && field !== "id" ){
            value = "" + value;
            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 {
                if( typeof( value ) === "string" ){
                    if( value.match(/\~|\=/) ){
                        error("Special character ~ or = not allowed: " + value);
                    }
                    value = value.replace(/\~|\=/g, "");
                }
                this[field] = value;
                this.checkQuantityAndPrice();
            }
        } else {
            error( "Cannot change " + field + ", this is a reserved field.");
        }
        simpleCart.update();
    },
    increment : function(){
        this.quantity = parseInt(this.quantity,10) + 1;
        simpleCart.update();
    },
    decrement : function(){
        if( parseInt(this.quantity,10) < 2 ){
            this.remove();
        } else {
            this.quantity = parseInt(this.quantity,10) - 1;
            simpleCart.update();
        }
    },
    print : function () {
        var returnString = '',
        field;
        simpleCart.each(this ,function(item,x,name){    
            returnString+= escape(name) + "=" + escape(item) + "||";
        });
        return returnString.substring(0,returnString.length-2);
    },
    checkQuantityAndPrice : function() {
        if( !this.quantity || 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;
            }
        }
        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;
            }
        }
    },
    parseValuesFromArray : function( array ) {
        if( array && array.length && array.length > 0) {
            for(var x=0, xlen=array.length; x<xlen;x++ ){
                array[x] = array[x].replace(/\|\|/g, "| |");
                array[x] = array[x].replace(/\+\+/g, "+ +");
                if( array[x].match(/\~/) ){
                    error("Special character ~ not allowed: " + array[x]);
                }
                array[x] = array[x].replace(/\~/g, "");
                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]);
                }
            }
            return true;
        } else {
            return false;
        }
    },
    remove : function() {
        simpleCart.remove(this.id);
        simpleCart.update();
    }
};
function Shelf(){
    this.items = {};
}
Shelf.prototype = { 
    readPage : function () {
        this.items = {};
        var newItems = getElementsByClassName( "simpleCart_shelfItem" ),
        newItem;
        me = this;
        for( var x = 0, xlen = newItems.length; x<xlen; x++){
            newItem = new ShelfItem();
            me.checkChildren( newItems[x] , newItem );
            me.items[newItem.id] = newItem;
        }
    },
    checkChildren : function ( item , newItem) {
        if( !item.childNodes )
            return;
        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");
                    node.id = newItem.id;
                } else {
                    newItem[data[1]]  = node;
                }
            }
            if( node.childNodes[0] ){
                this.checkChildren( node , newItem );
            }
        }
    },
    empty : function () {
        this.items = {};
    },
    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.");
            }
        };
    }
};
function ShelfItem(){
    this.id = "s" + simpleCart.nextId++;
}
ShelfItem.prototype = {
    remove : function () {
        simpleCart.Shelf.items[this.id] = null;
    },
    addToCart : function () {
        var outStrings = [],
        valueString,
        field;
        for( field in this ){
            if( typeof( this[field] ) !== "function" && field !== "id" ){
                valueString = "";
                switch(field){
                    case "price":
                        if( this[field].value ){
                            valueString = this[field].value;
                        } else if( this[field].innerHTML ) {
                            valueString = this[field].innerHTML;
                        }
                        valueString = valueString.replace( /[^(\d|\.)]*/gi , "" );
                        valueString = valueString.replace( /,*/ , "" );
                        break;
                    case "image":
                        valueString = this[field].src;
                        break;
                    default:
                        if( this[field].value ){
                            valueString = this[field].value;
                        } else if( this[field].innerHTML ) {
                            valueString = this[field].innerHTML;
                        } else if( this[field].src ){
                            valueString = this[field].src;
                        } else {
                            valueString = this[field];
                        }
                        break;
                }
                outStrings.push( field + "=" + valueString );
            }
        }
        simpleCart.add( outStrings );
    }
};
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 = "";
    value = value.replace(/\=/g, '~');
    document.cookie = name + "=" + escape(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){
            var value = unescape(c.substring(nameEQ.length, c.length));
            return value.replace(/\~/g, '=');
        } 
    }
    return null;
}
function eraseCookie(name) {
    createCookie(name,"",-1);
}
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);
};
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();
};
function error( message ){
    try{
        console.log( message );
    }catch(err){
    }
}
var simpleCart = new Cart();
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;

