/****************************************************************************
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.
****************************************************************************/
Alt.INFO = "info";
Alt.ERRR = "error";
Alt.WARN = "warning";
var NextId=1,Custom="Custom",GoogleCheckout="GoogleCheckout",PayPal="PayPal",Email="Email",Euro="EUR",EUR="EUR",USDollar="USD",USD="USD";

function Cart(){

	var me = this;
	/* member variables */
	me.Version = '2.0.1';
	me.Shelf = new Shelf();
	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 = 0;
	me.shippingRate = 0;
	me.shippingCost = 0;
	me.shippingCountry = "";	
	me.shippingRegion = ""; /* it/eu/wl */
	me.shippingMode = "0"; /* senza assicurazione */
	me.currency = EUR;
	me.checkoutTo = PayPal;
	me.email = "";
	me.merchantId	 = "";
	me.cartHeaders = ["Name","Size","Price","Quantity","increment", "decrement","Total", "remove"];
	me.cartHeadersLabel = {"Name":Alt.Lang.cart_name,"Size":Alt.Lang.cart_size,"Price":Alt.Lang.cart_price,"Quantity":Alt.Lang.cart_quantity,"Total":Alt.Lang.cart_total_header, "increment":"&nbsp;", "decrement":"&nbsp;", "remove":"&nbsp;"};


	/* add/remove items to cart */
	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();
		
		/* 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]; 
		} 
	
		newItem.parseValuesFromArray(argumentArray);
		newItem.checkQuantityAndPrice();
		
		var requestQta = parseInt(newItem.quantity,10), 
			maxQta = parseInt(newItem.max_qta,10);
		/* if the item already exists, update the quantity */
		var id = me.hasItem(newItem);
		if(id!==false) {
			var cartQta = parseInt(me.items[id].quantity,10), newQta = cartQta+requestQta;
			if(maxQta>=newQta){
				me.items[id].quantity = newQta;
				if(newQta > 1){
					cartUpdate(String.format(Alt.Lang.cart_msg_update_ok_p, newItem.quantity, newItem.name, newItem.size), Alt.INFO);
				}else{
					cartUpdate(String.format(Alt.Lang.cart_msg_update_ok_s, newItem.name, newItem.size), Alt.INFO);
				}
			}else{
				if(maxQta-cartQta >= 1){
					me.items[id].quantity = maxQta/*-cartQta*/;
					if(me.items[id].quantity>1){
						cartUpdate(String.format(Alt.Lang.cart_msg_update_no_p, newItem.max_qta, newItem.name, newItem.size, me.items[id].quantity), Alt.WARN);
						/* 0-items number 1-items name 2-items size 3- max items avaiable */
					}else{
						cartUpdate(String.format(Alt.Lang.cart_msg_update_no_s, newItem.name, newItem.size), Alt.WARN);
					}					
				}else{
					cartUpdate(Alt.Lang.cart_msg_full, Alt.ERRR);
				}
			}	
		} else {
			if(maxQta>=requestQta){
				me.items[newItem.id] = newItem;
				if(newItem.quantity > 1){
					cartUpdate(String.format(Alt.Lang.cart_msg_update_ok_p, newItem.quantity, newItem.name, newItem.size), Alt.INFO);
				}else{
					cartUpdate(String.format(Alt.Lang.cart_msg_update_ok_s, newItem.name, newItem.size), Alt.INFO);
				}				
			}else{
				newItem.quantity = maxQta;
				me.items[newItem.id] = newItem;
				if(maxQta>1){
					cartUpdate(String.format(Alt.Lang.cart_msg_update_no_p, newItem.max_qta, newItem.name, newItem.size, maxQta), Alt.WARN);
					/* 0-items number 1-items name 2-items size 3- max items avaiable */
				}else{
					cartUpdate(String.format(Alt.Lang.cart_msg_update_no_s, newItem.name, newItem.size), Alt.WARN);
				}
			}			
		}	
		me.update();
	};
	
	
	me.remove = function(id){
		var tempArray = {};
		for(var item in this.items){
			if(item != id){ 
				tempArray[item] = this.items[item]; 
			}
		}
		this.items = tempArray;
	};
	
	me.empty = function () {
		if (confirm(Alt.Lang.cart_confirm_empty)){
			Alt.sc_js.items = {};
			Alt.sc_js.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;
	};

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

	me.checkout = function(){
		if(Alt.sc_js.quantity === 0){
			cartUpdate(Alt.Lang.cart_ship_empty, Alt.ERRR);
			return;
		}
		if(Alt.sc_js.shippingCost===0){
			cartUpdate(Alt.Lang.cart_ship_error, Alt.ERRR);
			return;
		}
		switch(Alt.sc_js.checkoutTo){
			case PayPal:
				Alt.sc_js.paypalCheckout();
				break;
			case GoogleCheckout:
				Alt.sc_js.googleCheckout();
				break;
			case Email:
				Alt.sc_js.emailCheckout();
				break;
			default:
				Alt.sc_js.customCheckout();
				break;
		}
	};
	
	me.paypalCheckout = function(){
		
		var winpar = "scrollbars,location,resizable,status",
		//sandobox --> https://www.sandbox.paypal.com/cgi-bin/webscr
		//real ---> https://www.paypal.com/cgi-bin/webscr
		//strn  = "http://www.altdesign.it/test/cart_output.php?cmd=_cart" +
		strn=Alt.Lang.url_paypal+"cgi-bin/webscr?cmd=_cart&upload=1&business="+Alt.Lang.email_merchand_paypal+"&currency_code="+Alt.sc_js.currency,
/*		strn  = "https://www.paypal.com/cgi-bin/webscr?cmd=_cart" +
			"&upload=1" +
			"&business=info@vipbymiky.com" +
			"&currency_code=EUR",*/
			counter = 1,
			itemsString = "",
			me = this;
		
		if(me.taxRate){
			strn = strn + "&tax_cart=" +  me.currencyStringForPaypalCheckout( me.taxCost );
		}
		
		for(var current in me.items){
			var item = me.items[current];
			
			var optionsString = "";
			for(var field in item){
				//if( typeof(item[field]) != "function" && field != "id" && field != "price" && field != "quantity" && field != "name" && field != "shipping") {
				if(typeof(item[field]) != "function" && field == "size") { // we have only size as optional field
					optionsString = Alt.Lang.cart_size + "=" + item[field] ; 
				}
			}
			//optionsString = optionsString.substring(2);
			
			itemsString = itemsString 	+ "&item_name_" 	+ counter + "=" + item.name  +
									 	  "&item_number_" 	+ counter + "=" + item.code +
										  "&post_id_" 		+ counter + "=" + item.post_id +
										  "&quantity_"		+ counter + "=" + item.quantity +
										  "&amount_"		+ counter + "=" + me.currencyStringForPaypalCheckout(item.price) + 
										  "&on0_" 			+ counter + "=" + Alt.Lang.cart_options + 
										  "&os0_"			+ counter + "=" + optionsString;
			counter++;
		}
		
		if(me.shipping() != 0){
			 itemsString = itemsString 	+ "&item_name_" 	+ counter + "=" + Alt.Lang.cart_shipping + 
									 	  "&item_number_" 	+ counter + "=" + counter +
										  "&quantity_"		+ counter + "=1" + 
										  "&amount_"		+ counter + "=" + me.currencyStringForPaypalCheckout(me.shippingCost);
		} strn = strn + "&cart_size="+counter+itemsString; 
		var requestCheckout = new Request({	method: 'get', url: Alt.Lang.url_cart_output+"?cmd=_cart&custom=niki&cart_size="+counter+itemsString,
			onComplete: function(response) {document.location = strn+"&invoice="+response;}
		}).send();
	};

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

	/******************************************************
				data storage and retrival 
	 ******************************************************/
	
	/* load cart from cookie */
	me.load = function () {
		var me = this;
		/* initialize variables and items array */
		me.items = {};
		me.total = 0.00;
		me.quantity = 0;
		
		/* retrieve item data from cookie */
		if(readCookie('Alt.sc_js')){
			var data = unescape(readCookie('Alt.sc_js')).split('++');
			for(var x=0, xlen=data.length;x<xlen;x++){
			
				var info = data[x].split('||');
				var newItem = new CartItem();
			
				if( newItem.parseValuesFromArray( info ) ){
					newItem.checkQuantityAndPrice();
					/* store the new item in the cart */
					me.items[newItem.id] = newItem;
				}
 			}
		}
		me.isLoaded = true;
	};
	
	/* save cart to cookie */
	me.save = function (){
		var dataString = "";
		for(var item in this.items){
			dataString = dataString + "++" + this.items[item].print();
		}
		createCookie('Alt.sc_js', dataString.substring(2), 30);
	};
	
	

	
		
	/******************************************************
				 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.addEventToArray(getElementsByClassName('simpleCart_checkout'), Alt.sc_js.checkout, "click");
		me.addEventToArray(getElementsByClassName('simpleCart_empty'), Alt.sc_js.empty, "click" );
		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;
			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;
			}
		}
	};
	
	// Alt Design 
	me.getHeaderTranslation = function(headerId) {
		return me.cartHeadersLabel[headerId];
	};
	
	me.updateCartView = function() {
		var x,item,current,info,outputValue,headerInfo,html;
		
		/* create headers row */
		html = '<table cellspacing="0" width="100%"><tr class="cartHeaders"><thead>';
		for(var i=0;i<me.cartHeaders.length;i++){ //patched
			headerInfo = me.cartHeaders[i].split("_");
			html += '<th class="item'+headerInfo[0]+'">';
			html += me.getHeaderTranslation(headerInfo[0]) + '</th>';
		}
		html += '</thead></tr>';

		/* create a row for each item in the cart */
		x=1;
		for(current in me.items){
			html += '<tr class="itemContainer'+ (x%2==0 ? " even" : "") +'">';
			item = me.items[current];
			for(var i=0;i<me.cartHeaders.length;i++){ //patched
				info = me.cartHeaders[i].split("_");
				html += '<td class="item'+info[0].toLowerCase()+'">';
				switch(info[0].toLowerCase()){
					case "total":
						outputValue = me.valueToCurrencyString(parseFloat(item.price)*parseInt(item.quantity,10) );
						break;
					case "increment":
						outputValue = me.valueToLink( me.valueToImageString(Alt.Lang.img_url_add, Alt.Lang.cart_action_add) , "javascript:;" , "onclick=\"Alt.sc_js.items[\'" + item.id + "\'].increment();\"", Alt.Lang.cart_action_add);
						break;
					case "decrement":
						outputValue = me.valueToLink( me.valueToImageString(Alt.Lang.img_url_remove, Alt.Lang.cart_action_remove) , "javascript:;" , "onclick=\"Alt.sc_js.items[\'" + item.id + "\'].decrement();\"", Alt.Lang.cart_action_remove);
						break;
					case "remove":
						outputValue = me.valueToLink( me.valueToImageString(Alt.Lang.img_url_delete, Alt.Lang.cart_action_delete) , "javascript:;" , "onclick=\"Alt.sc_js.items[\'" + item.id + "\'].remove();\"", Alt.Lang.cart_action_delete);
						break;
					case "price":
						outputValue = me.valueToCurrencyString( item[ info[0].toLowerCase() ] ? item[info[0].toLowerCase()] : " " );
						break;
					default: 
						outputValue = item[info[0].toLowerCase()] ? item[info[0].toLowerCase()] : " ";
						break;
				}	
	  
				html += outputValue;
				html += '</td>';
			}			
			
			html += '</tr>';
			x++;
		}
		html += '<tr class="separator"><td style="text-align:right;" colspan="'+(i-2)+'"><strong>'+ Alt.Lang.cart_total +':</strong></td><td class="cartTotals"><strong>'+ me.valueToCurrencyString(me.total) +'</strong></td><td>&nbsp;</td></tr>';
		html += '<tr class="separator"><td align="left" style="text-align:left; font-weight:bold;" colspan="'+i+'">'+ Alt.Lang.cart_ship_compute +'</td></tr>';		
		html += '<tr class="normalRow"><td colspan="4">'+me.getSelectedRegion(me.shippingRegion)+'</td><td colspan="4">&nbsp;</td></tr>';
		html += '<tr class="normalRow"><td colspan="4"><div id="countryContainer">'+me.getSelectedCountry(me.shippingRegion, me.shippingCountry)+'</div></td><td colspan="4">&nbsp;</td></tr>';
		html += '<tr class="normalRow"><td colspan="4"><div id="modeContainer">'+me.getSelectedMode(me.shippingMode)+'</div></td><td colspan="4">&nbsp;</td></tr>';
		html += '<tr class="separator"><td colspan="3">&nbsp;</td><td colspan="'+(i-5)+'"><strong>'+ Alt.Lang.cart_shipping +':</strong></td><td class="cartTotals"><strong>'+ me.valueToCurrencyString(me.shippingCost) +'</strong></td><td>&nbsp;</td></tr>';
		html += '<tr class="finalTotal"><td colspan="'+(i-2)+'"><strong>'+ Alt.Lang.cart_final_total +':</strong></td><td class="cartTotals"><strong>'+ me.valueToCurrencyString(me.finalTotal) +'</strong></td><td>&nbsp;</td></tr>';
		html += '</table>';
		var div = me.cartDivs[0];
		if(div.childNodes[0]){
			div.removeChild(div.childNodes[0]); //delete previous cart
		}
		div.innerHTML = html;		
	};

	me.getSelectedMode = function(shippingMode){
		var modeNotAvaiable = me.shippingRegion=="IT" || me.shippingRegion=="EU";
		return (modeNotAvaiable ? Alt.Lang.cart_ship_mode_msg : Alt.Lang.cart_ship_mode) +
			': <select id="shippingMode" name="shippingMode" size="1" onchange="Alt.sc_js.update();" '+(modeNotAvaiable ? "disabled" : "")+'> ' +
				'<option value="5" '+(shippingMode=="5" ? "selected=\"selected\"" : "")+'">'+ Alt.Lang.cart_ship_mode_yes +'</option>' +
				'<option value="0" '+(shippingMode=="0" ? "selected=\"selected\"" : "")+'>'+ Alt.Lang.cart_ship_mode_no +'</option>' +
			'</select>';
	};
	me.getSelectedRegion = function(regionCode){
var htmlString = Alt.Lang.cart_ship_region;
        htmlString = htmlString + ': <select id="shippingRegion" name="shippingRegion" size="1" onchange="Alt.sc_js.updateCountry();"> ';
        htmlString = htmlString + '<option value="" ';
        if (regionCode==""){
            htmlString = htmlString + 'selected="selected" ';
        }
        htmlString = htmlString + '></option>';
        htmlString = htmlString + '<option value="IT" ';
        if (regionCode=="IT"){
            htmlString = htmlString + 'selected="selected" ';
        }
        htmlString = htmlString + '>'+ Alt.Lang.cart_ship_zones.IT.label +'</option>';
        htmlString = htmlString + '<option value="EU" ';
        if (regionCode=="EU"){
            htmlString = htmlString + 'selected="selected" ';
        }       
        htmlString = htmlString + '>'+ Alt.Lang.cart_ship_zones.EU.label +'</option>';
        htmlString = htmlString + '<option value="WL" ';
        if (regionCode=="WL"){
            htmlString = htmlString + 'selected="selected" ';
        }       
        htmlString = htmlString + '>'+ Alt.Lang.cart_ship_zones.WL.label +'</option>';       
        htmlString = htmlString + '</select>';
        return    htmlString;		
	};
	me.getSelectedCountry = function(regionCode, countryCode){
      if(regionCode!=""){
            var zones = Alt.Lang.cart_ship_zones[regionCode].zones, selectField = Alt.Lang.cart_ship_country + ': <select id="shippingCountry" name="shippingCountry" size="1" onchange="Alt.sc_js.update();"><option value="" ';
            if(countryCode==""){
                selectField += ' selected="selected" ';
            }
            selectField += '></option>';
            for(var zone in zones){
                selectField += '<option value="'+ zone +'" ';
                if(countryCode==zone){
                 selectField += ' selected="selected" ';
                }
                selectField += '>'+ zones[zone] +'</option>';
               
            }
            selectField +='</select>';
            return selectField;
        }else{
            return Alt.Lang.cart_ship_country + ': <select id="shippingCountry" name="shippingCountry" size="1" onchange="Alt.sc_js.update();"></select>';

        }
	};	
	me.updateCountry = function(){
		me.shippingRegion = document.getElementById("shippingRegion").value;
		document.getElementById("countryContainer").innerHTML = me.getSelectedCountry(me.shippingRegion, "");
		document.getElementById("modeContainer").innerHTML = me.getSelectedMode("5");
		me.update();
	};		
	
	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 EUR:
				return "&euro;";
			case USD:
				return "&#36;";
			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, tooltip){
		if( value.match(/<\s*img.*src\=/) ){
			return value;
		} else {
			return "<img alt=\"" + tooltip + "\" src=\"" + value + "\" />";
		}
	};
	
	me.valueToTextInput = function(value , html){
		return "<input type=\"text\" value=\"" + value + "\" " + html + " />";
	};
	
	me.valueToLink = function(value, link, html, title){
		title = title ? title : "";
		return "<a href=\"" + link + "\" " + html + " title=\"" + title + "\">" + 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(!Alt.sc_js.isLoaded){
			Alt.sc_js.load();
		} 
		if(!Alt.sc_js.pageIsReady){
			Alt.sc_js.initializeView();
		}
		me.updateTotals();
		me.updateView();
		me.save();
	};
	
	me.updateTotals = function() {
		me.total = 0 ;
		me.quantity  = 0;
		for( var current in me.items ){
			var item = me.items[current];
			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 qta = parseInt(me.quantity,10), countryField = null, regionField = null, modeField = null, shipping = 0, modeField = 5;
		if(qta===0){return 0;}
		
		regionField = document.getElementById("shippingRegion");
		countryField = document.getElementById("shippingCountry");
		if(regionField){
			switch(regionField.value){
				case "EU":
					switch(countryField.value){
						case "zone_1":
							shipping = 20;							
							break;
						case "zone_2":
							shipping = 25;
							break;
						case "zone_3":
						case "zone_4":
						case "zone_5":
							shipping = 33;
							break;
						default:
							shipping = 0;							
					}			
					break;
				case "WL":
					modeField = document.getElementById("shippingMode");
					modeField = parseInt(modeField.value,10);
					if(qta<=5){
						switch(countryField.value){
							case "zone_0":
								shipping = 35 + modeField;
								break;
							case "zone_1":												
								shipping = 30 + modeField;
								break;
							case "zone_2_1":
							case "zone_2_2":							
							case "zone_2_3":
							case "zone_2_4":
								shipping = 50 + modeField;
								break;
							case "zone_3_1":
							case "zone_3_2":							
							case "zone_3_3":
							case "zone_3_4":
							case "zone_3_5":
							case "zone_3_6":
								shipping = 60 + modeField;
								break;
							case "zone_4_1":
							case "zone_4_2":							
							case "zone_4_3":
							case "zone_4_4":
							case "zone_4_5":
							case "zone_4_6":
							case "zone_4_7":
							case "zone_4_8":
							case "zone_4_9":
								shipping = 66 + modeField;
								break;	
							case "zone_5_1":
							case "zone_5_2":							
							case "zone_5_3":
							case "zone_5_4":
							case "zone_5_5":
							case "zone_5_6":
							case "zone_5_7":
							case "zone_5_8":
							case "zone_5_9":
							case "zone_5_10":
							case "zone_5_11":
							case "zone_5_12":
							case "zone_5_13":
							case "zone_5_14":
							case "zone_5_15":
								shipping = 83 + modeField;
								break;	
							case "zone_6_1":
							case "zone_6_2":							
							case "zone_6_0":
								shipping = 62 + modeField;
								break;									
							default:
								shipping = 0;							
						}
					}else{
						switch(countryField.value){
							case "zone_0":
								shipping = 51 + modeField;
								break;							
							case "zone_1":
								shipping = 43 + modeField;
								break;
							case "zone_2_1":
							case "zone_2_2":							
							case "zone_2_3":
							case "zone_2_4":
								shipping = 60 + modeField;
								break;
							case "zone_3_1":
							case "zone_3_2":							
							case "zone_3_3":
							case "zone_3_4":
							case "zone_3_5":
							case "zone_3_6":
								shipping = 95 + modeField;
								break;
							case "zone_4_1":
							case "zone_4_2":							
							case "zone_4_3":
							case "zone_4_4":
							case "zone_4_5":
							case "zone_4_6":
							case "zone_4_7":
							case "zone_4_8":
							case "zone_4_9":
								shipping = 96 + modeField;
								break;	
							case "zone_5_1":
							case "zone_5_2":							
							case "zone_5_3":
							case "zone_5_4":
							case "zone_5_5":
							case "zone_5_6":
							case "zone_5_7":
							case "zone_5_8":
							case "zone_5_9":
							case "zone_5_10":
							case "zone_5_11":
							case "zone_5_12":
							case "zone_5_13":
							case "zone_5_14":
							case "zone_5_15":
								shipping = 128 + modeField;
								break;	
							case "zone_6_1":
							case "zone_6_2":							
							case "zone_6_0":
								shipping = 98 + modeField;
								break;								
							default:
								shipping = 0;							
						}
					}									
					break;
				default:
					switch(countryField.value){
						case "special":
							shipping = 15;							
							break;
						case "normal":
							shipping = 11;							
							break;
						default:
							shipping = 0;
					}
			}
			me.shippingRegion = regionField.value;
			me.shippingCountry = countryField.value;
			me.shippingMode = modeField+"";
		}else{
			me.shippingRegion = "";
			shipping = 0;
		}
		
		return shipping;
	};
	
	me.initialize = function() {
		Alt.sc_js.initializeView();
		Alt.sc_js.load();
		Alt.sc_js.update();
	};
				
}

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

	function CartItem() {
		this.id = "c" + NextId++;
	}
	
	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;
				this.checkQuantityAndPrice();
			}			
		} else {
			error("Cannot change " + field + ", this is a reserved field.");
		}
		Alt.sc_js.update();
	};
	
	CartItem.prototype.increment = function(){
		var newQta = parseInt(this.quantity,10) + 1;
		if(newQta > this.max_qta){
			cartUpdate(Alt.Lang.cart_msg_full, Alt.ERRR);
		}else{
			this.quantity = newQta;
			Alt.sc_js.update();
		}
	};
	
	CartItem.prototype.decrement = function(){
		if( parseInt(this.quantity,10) < 2 ){
			this.remove();
		} else {
			this.quantity = parseInt(this.quantity,10) - 1;
			Alt.sc_js.update();
		}
	};
	
	CartItem.prototype.print = function () {
		var returnString = '';
		for( var field in this ) {
			if( typeof( this[field] ) != "function" ) {
				returnString+= escape(field) + "=" + escape(this[field]) + "||";
			}
		}
		return returnString.substring(0,returnString.length-2);
	};
	
	
	CartItem.prototype.checkQuantityAndPrice = function() {
		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); 
			
			this.max_qta = ("" + this.max_qta).replace(/,*/gi, "" );
			this.max_qta = parseInt( ("" + this.max_qta).replace( /[^(\d|\.)]*/gi, "") , 10); 
			
			if( isNaN(this.quantity) ){
				error('Quantity is not a number.');
				this.quantity = 1;
			}
			if(isNaN(this.max_qta)){
				error('Max Quantity is not a number.');
				this.max_qta = 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;
			}
		}
	};
	
	
	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]);
				}
			}
			return true;
		} else {
			return false;
		}
	};
	
	CartItem.prototype.remove = function() {
		Alt.sc_js.remove(this.id);
		Alt.sc_js.update();
	};
	


/********************************************************************************************************
 *			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 x=0;x<newItems.length;x++){ //patched
			var newItem = new ShelfItem();
			this.checkChildren( newItems[x] , 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 = Alt.sc_js.Shelf.addToCart(newItem.id);
					Alt.sc_js.addEventToArray( tempArray , addFunction , "click");
					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( Alt.sc_js.Shelf.items[id]){
				Alt.sc_js.Shelf.items[id].addToCart();
			} else {
				error( "Shelf item with id of " + id + " does not exist.");
			}
		};
	};
	

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


	function ShelfItem(){
		this.id = "s" + NextId++;
	};
	
	ShelfItem.prototype.remove = function () {
		Alt.sc_js.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 = "";
				
				switch(field){
					case "price":
						if(this[field].value){
							valueString = this[field].value; 
						} else if(this[field].innerHTML) {
							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;
					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);
			}
		}
		
		Alt.sc_js.add(outStrings);
	};
	


/********************************************************************************************************
 * Thanks to Peter-Paul Koch for these cookie functions (http://www.quirksmode.org/js/cookies.html)
 ********************************************************************************************************/
function createCookie(c,d,e){var a="";if(e){var b=new Date();b.setTime(b.getTime()+(e*24*60*60*1000));a="; expires="+b.toGMTString()}document.cookie=c+"="+d+a+"; path=/"}function readCookie(b){var e=b+"=";var a=document.cookie.split(";");for(var d=0;d<a.length;d++){var f=a[d];while(f.charAt(0)==" "){f=f.substring(1,f.length)}if(f.indexOf(e)===0){return f.substring(e.length,f.length)}}return null}function eraseCookie(a){createCookie(a,"",-1)};

/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/	
var getElementsByClassName=function(b,a,c){if(document.getElementsByClassName){getElementsByClassName=function(j,m,h){h=h||document;var d=h.getElementsByClassName(j),l=(m)?new RegExp("\\b"+m+"\\b","i"):null,e=[],g;for(var f=0,k=d.length;f<k;f+=1){g=d[f];if(!l||l.test(g.nodeName)){e.push(g)}}return e}}else{if(document.evaluate){getElementsByClassName=function(o,r,n){r=r||"*";n=n||document;var g=o.split(" "),p="",l="http://www.w3.org/1999/xhtml",q=(document.documentElement.namespaceURI===l)?l:null,h=[],d,f;for(var i=0,k=g.length;i<k;i+=1){p+="[contains(concat(' ', @class, ' '), ' "+g[i]+" ')]"}try{d=document.evaluate(".//"+r+p,n,q,0,null)}catch(m){d=document.evaluate(".//"+r+p,n,null,0,null)}while((f=d.iterateNext())){h.push(f)}return h}}else{getElementsByClassName=function(r,u,q){u=u||"*";q=q||document;var h=r.split(" "),t=[],d=(u==="*"&&q.all)?q.all:q.getElementsByTagName(u),p,j=[],o;for(var i=0,e=h.length;i<e;i+=1){t.push(new RegExp("(^|\\s)"+h[i]+"(\\s|$)"))}for(var g=0,s=d.length;g<s;g+=1){p=d[g];o=false;for(var f=0,n=t.length;f<n;f+=1){o=t[f].test(p.className);if(!o){break}}if(o){j.push(p)}}return j}}}return getElementsByClassName(b,a,c)};

/********************************************************************************************************
 *  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 );
	}
}


Alt.sc_js = new Cart();

/*if( typeof jQuery !== 'undefined' ) jQuery(document).ready(function(){Alt.sc_js.initialize();}); 
else if( typeof Prototype !== 'undefined') Event.observe( window, 'load', function(){Alt.sc_js.initialize();});
else window.onload = Alt.sc_js.initialize;*/
window.addEvent('domready',function(){Alt.sc_js.initialize();});

function cartUpdate(message, msgType){
	var icon = "";
	switch (msgType){
		case Alt.INFO:
			icon = '<img src="'+ Alt.Lang.img_url_info +'" />';
			break;
		case Alt.ERRR:
			icon = '<img src="'+ Alt.Lang.img_url_error +'" />';
			break;
		case Alt.WARN:
			icon = '<img src="'+ Alt.Lang.img_url_warning +'" />';
			break;
		default:
			break;
	}
	Alt.notimooManager.show({
		title: Alt.Lang.cart_msg_title,
		message: icon+'<p>'+ message +'</p>'
	});	
}

function addToCart(qta_field_id, prod_id, price, size, max_qta, title, post_id){
	var qta = document.getElementById(qta_field_id).value;
	Alt.sc_js.add('name='+title , 'price='+price , 'quantity='+qta, 'size='+size, 'code='+prod_id, 'max_qta='+max_qta, 'post_id='+post_id);
}