var
Custom="Custom",Cartout="Cartout",Webform="Webform",WebformMembers="WebformMembers",Email="Email",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(){

	/* member variables */
	this.Version		= '2.0.1';
	this.Shelf		= new Shelf();
	this.items		= {};
	this.isLoaded		= false;
	this.pageIsReady	= false;
	this.quantity		= 0;
	this.total		= 0;
	this.discountTotal	= 0;
	this.taxRate		= 0;
	this.taxCost		= 0;
	this.shippingFlatRate	= 0;
	this.shippingTotalRate	= 0;
	this.shippingQuantityRate = 0;
	this.shippingRate	= 0;
	this.shippingCost	= 0;
	this.currency		= JPY;
	this.cartoutTo		= Cartout;
	this.checkoutTo		= Webform;
	this.checkoutMembersTo	= WebformMembers;
	this.email		= "";
	this.merchantId		= "";
	this.cartHeaders	= [];
	this.cartoutURL		= "https://www.ragnet.co.jp/live_spot/order/cart/";
	this.checkoutURL	= "https://www.ragnet.co.jp/live_spot/order/form/";

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

	this.add = function () {

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

		if( !this.isLoaded ) { 
			this.load(); 
			this.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();
		
		/* if the item already exists, update the quantity */
		/*if( this.hasItem(newItem) ) {
			var id=this.hasItem(newItem);

			//上限数量
			if( parseInt(this.items[id].quantity,10) + parseInt(newItem.quantity,10) <= parseInt(this.items[id].maxquantity,10) ){
				this.items[id].quantity= parseInt(this.items[id].quantity,10) + parseInt(newItem.quantity,10);
			}
		} else {
			this.items[newItem.id] = newItem;
		}
		this.update(); */

		//上限数量（総量）

		var maxquantity = parseInt(newItem.maxquantity,10);
		var quantity = 0;
		var itemnum = '';
		for( var current in simpleCart.items ){

			var item = simpleCart.items[current];

			itemnum += item.id + '\n'

			if( item.liveid == newItem.liveid ) {
				quantity += parseInt(item.quantity,10);

				if(parseInt(item.maxquantity,10) > parseInt(newItem.maxquantity,10)) {
					maxquantity = parseInt(item.maxquantity,10);
				}
			}
		}

		if( quantity < maxquantity ){
			if( this.hasItem(newItem) ) {
				var id = this.hasItem(newItem);
				this.items[id].quantity = parseInt(this.items[id].quantity,10) + parseInt(newItem.quantity,10);
			} else {
				this.items[newItem.id] = newItem;
			}
			simpleCart.update();
		} else {
			alert('ご購入枚数はお一人様'+maxquantity+'枚までとなっております。');
		}
	};
	
	
	this.remove = function( id ){
		var tempArray = {};
		for( var item in this.items ){
			if( item != id ){ 
				tempArray[item] = this.items[item]; 
			}
		}
		this.items = tempArray;
	};
	
	
	this.empty = function () {
		simpleCart.items = {};
		simpleCart.update();
	};

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

	this.cartout = function() {
		simpleCart.PostCheckout(simpleCart.cartoutURL);
	};

	this.checkout = function() {
		simpleCart.PostCheckout(simpleCart.checkoutURL,"general");
	};

	this.checkoutMembers = function() {
		simpleCart.PostCheckout(simpleCart.checkoutURL,"members");
	};
	
	this.PostCheckout = function(checkoutURL,viewMode) {
		
		var counter = 1;

		var form = document.createElement( "form" );
		document.body.appendChild( form );

		var input = document.createElement( "input" );
		input.setAttribute( "type" , "hidden" );
		input.setAttribute( "name" , "view" );
  		input.setAttribute( "value" , viewMode );
		form.appendChild( input );

		for( var current in this.items ){
			var item = this.items[current];
			for( var field in item ){
				if( typeof( item[field] ) != "function" && field != "url"){

					var input = document.createElement( "input" );
					input.setAttribute( "type" , "hidden" );

					switch ( field ) {
						case "id":
							input.setAttribute( "name" , "item_number_" + counter );
  							input.setAttribute( "value" , counter );
							break;
						case "name":
							input.setAttribute( "name" , "item_name_" + counter );
  							input.setAttribute( "value" , item[field] );
							break;
						default:
							input.setAttribute( "name" , field + "_" + counter );
  							input.setAttribute( "value" , item[field] );
					}

					form.appendChild( input );
				}
			}
			counter++;
		}

		/*if( this.shipping() != 0){
			 itemsString +=
			 	+ "&item_name_"		+ counter + "=Shipping" +
				"&item_number_" 	+ counter + "=" + counter +
				"&quantity_"		+ counter + "=1" +
				"&amount_"		+ counter + "=" + this.currencyStringForWebformCheckout( this.shippingCost );
		}*/

		form.setAttribute( "action" , checkoutURL );
		form.setAttribute( "method" , "post" );
		form.submit();
	};

	this.createXMLHttpRequest = function() {

		/* リクエスト生成 */

		if (window.XMLHttpRequest) {
			return new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			try {
				return new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					return new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e2) {
					return null;
				}
			}
		} else {
			return null;
		}
	};

	/******************************************************
		data storage and retrival 
	 ******************************************************/
	
	/* load cart from cookie */
	this.load = function () {
		/* initialize variables and items array */
		this.items = {};
		this.total = 0.00;
		this.quantity = 0;
		
		/* retrieve item data from cookie */
		if( readCookie('Cart') ){
			var data = unescape(readCookie('Cart')).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 */
					this.items[newItem.id] = newItem;
				}
 			}
		}
		this.isLoaded = true;
	};
	
	
	
	/* save cart to cookie */
	this.save = function () {
		var dataString = "";
		for( var item in this.items ){
			dataString = dataString + "++" + this.items[item].print();
		}
		createCookie('Cart', dataString.substring( 2 ), 30 );
	};

	/******************************************************
		 view management 
	 ******************************************************/
	
	this.initializeView = function() {
		this.totalOutlets 		= getElementsByClassName('simpleCart_total');
		this.quantityOutlets 		= getElementsByClassName('simpleCart_quantity');
		this.cartDivs 			= getElementsByClassName('simpleCart_items');
		this.taxCostOutlets		= getElementsByClassName('simpleCart_taxCost');
		this.taxRateOutlets		= getElementsByClassName('simpleCart_taxRate');
		this.shippingCostOutlets	= getElementsByClassName('simpleCart_shippingCost');
		this.discountTotalOutlets	= getElementsByClassName('simpleCart_discountTotal');
		this.finalTotalOutlets		= getElementsByClassName('simpleCart_finalTotal');
		
		this.addEventToArray( getElementsByClassName('simpleCart_cartout') , simpleCart.cartout , "click");			//カートを見る
		this.addEventToArray( getElementsByClassName('simpleCart_checkout') , simpleCart.checkout , "click");			//購入画面へ
		this.addEventToArray( getElementsByClassName('simpleCart_checkout_Members') , simpleCart.checkoutMembers , "click");	//購入画面へ
		this.addEventToArray( getElementsByClassName('simpleCart_empty') , simpleCart.empty , "click");
		
		this.Shelf.readPage();
			
		this.pageIsReady = true;
		
	};

	this.updateView = function() {
		this.updateViewTotals();
		if( this.cartDivs && this.cartDivs.length > 0 ){ 
			this.updateCartView(); 
		}
	};

	this.updateViewTotals = function() {
		var outlets = [ ["quantity" , "none"] , 
				["total" , "currency"] , 
				["shippingCost"	, "currency"] ,
				["taxCost" , "currency"] ,
				["discountTotal" , "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 this[ arrayName ] ){
				switch( outlets[x][1] ){
					case "none":
						outputString = "" + this[outlets[x][0]];
						break;
					case "currency":
						outputString = this.valueToCurrencyString( this[outlets[x][0]] );
						break;
					case "percentage":
						outputString = this.valueToPercentageString( this[outlets[x][0]] );
						break;
					default:
						outputString = "" + this[outlets[x][0]];
						break;
				}
				this[arrayName][element].innerHTML = "" + outputString;
			}
		}
	};
	
	this.updateCartView = function() {
		var newRows = [],
			x,newRow,item,current,header,newCell,info,outputValue,option,headerInfo;
		
		/* create headers row */
		newRow = document.createElement('div');
		for( header in this.cartHeaders ){
			newCell = document.createElement('div');
			headerInfo = this.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 this.items ){
			newRow = document.createElement('div');
			item = this.items[current];
			
			for( header in this.cartHeaders ){
				
				newCell = document.createElement('div');
				info = this.cartHeaders[header].split("_");
				
				switch( info[0].toLowerCase() ){
					case "name":
						outputValue = "<a href=\"" + item.url + "\">" + item.name + "</a>";
						break;
					case "total":
						outputValue = this.valueToCurrencyString(parseFloat(item.price)*parseInt(item.quantity,10) );
						break;
					case "increment":
						outputValue = this.valueToLink( "+" , "javascript:;" , "onclick=\"simpleCart.items[\'" + item.id + "\'].increment();\"" );
						break;
					case "decrement":
						outputValue = this.valueToLink( "-" , "javascript:;" , "onclick=\"simpleCart.items[\'" + item.id + "\'].decrement();\"" );
						break;
					case "remove":
						outputValue = this.valueToLink( "削除" , "javascript:;" , "onclick=\"simpleCart.items[\'" + item.id + "\'].remove();\"" );
						break;
					case "price":
						outputValue = this.valueToCurrencyString( item[ info[0].toLowerCase() ] ? item[info[0].toLowerCase()] : " " );
						break;
					default: 
						outputValue = item[ info[0].toLowerCase() ] ? 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 = this.valueToImageString( outputValue );		
							break;
						case "input":
							outputValue = this.valueToTextInput( outputValue , "onchange=\"simpleCart.items[\'" + item.id + "\'].set(\'" + outputValue + "\' , this.value);\""  );
							break;
						case "div":
						case "span":
						case "h1":
						case "h2":
						case "h3":
						case "h4":
						case "p":
							outputValue = this.valueToElement( option , outputValue , "" );
							break;
						case "noheader":
							break;
						default:
							error( "unkown header option: " + option );
							break;
					}
				
				}		  
				newCell.innerHTML = outputValue;
				newCell.className = "item" + info[0];
				newRow.appendChild( newCell );
			}			
			newRow.className = "itemContainer";
			newRows[x] = newRow;
			x++;
		}
		
		
		
		for( current in this.cartDivs ){
			
			/* delete current rows in div */
			var div = this.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] );
			}
			
			
		}
	};

	this.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 );
			}
		}
	};
	
	
	this.createHiddenElement = function ( name , value ){
		var element = document.createElement("input");
		element.type = "hidden";
		element.name = name;
		element.value = value;
		return element;
	};
	
	
	
	/******************************************************
		Currency management
	 ******************************************************/
	
	this.currencySymbol = function() {		
		switch(this.currency){
			case JPY:
				return "&yen;";
			case EUR:
				return "&euro;";
			case GBP:
				return "&pound;";
			case USD:
			case CAD:
			case AUD:
			case NZD:
			case HKD:
			case SGD:
				return "&#36;";
			default:
				return "";
		}
	};
	
	
	this.currencyStringForWebformCheckout = function( value ){
		if( this.currencySymbol() == "&#36;" ){
			return "$" + parseFloat( value ).toFixed(2);
		} else {
			return "" + parseFloat(value ).toFixed(2);
		}
	};
	
	/******************************************************
				Formatting
	 ******************************************************/
	
	
	this.valueToCurrencyString = function( value ) {
		var num = new String( value ).replace(/,/g, "");
		while(num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
		return num + "円";
	};
	
	this.valueToPercentageString = function( value ){
		return parseFloat( 100*value ) + "%";
	};
	
	this.valueToImageString = function( value ){
		if( value.match(/<\s*img.*src\=/) ){
			return value;
		} else {
			return "<img src=\"" + value + "\" />";
		}
	};
	
	this.valueToTextInput = function( value , html ){
		return "<input type=\"text\" value=\"" + value + "\" " + html + " />";
	};
	
	this.valueToLink = function( value, link, html){
		return "<a href=\"" + link + "\" " + html + " >" + value + "</a>";
	};
	
	this.valueToElement = function( type , value , html ){
		return "<" + type + " " + html + " > " + value + "</" + type + ">";
	};
	
	/******************************************************
		重複アイテム処理
	 ******************************************************/
	
	this.hasItem = function ( item ) {
		for( var current in this.items ) {
			var testItem = this.items[current];
			var matches = true;

//var fields = '';
			for( var field in item ){
				if( typeof( item[field] ) != "function"	&& 
					field != "quantity" && 
					field != "id" ){
					if( item[field] != testItem[field] ){
						matches = false;
					}
//fields += matches + '\n';
				}
			}
//alert(fields);
			if( matches ){
				return current; 
			}
		}
		return false;
	};

	/******************************************************
		カートアップデート管理
	 ******************************************************/

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

	this.updateTotals = function() {
		this.total = 0 ;
		this.quantity  = 0;
		for( var current in this.items ){
			var item = this.items[current];
			if( item.quantity < 1 ){
				item.remove();

				/*バグ修正 break;を追加*/
				break;
			} else if( item.quantity !== null && item.quantity != "undefined" ){
				this.quantity = parseInt(this.quantity,10) + parseInt(item.quantity,10);
			}
			if( item.price ){
				this.total = parseFloat(this.total) + parseInt(item.quantity,10)*parseFloat(item.price);
			}
		}
		this.shippingCost = this.shipping();
		this.discountTotal = this.discount();
		this.taxCost = parseFloat(this.total)*this.taxRate;
		this.finalTotal = this.shippingCost + this.taxCost + this.total + this.discountTotal;
	};

	// 割引関数
	this.discount = function(){
		var discount = 0;
		if( parseInt(this.quantity,10)===0 )
			return 0;
		for( var current in this.items ){
			var item = this.items[current];

			if( item.discount ){
				discount -= parseInt(item.discount);
			}
		}
		return discount;
	}

	// 送料計算関数
	this.shipping = function(){
		if( parseInt(this.quantity,10)===0 )
			return 0;
		var shipping = 	parseFloat(this.shippingFlatRate) +
					  	parseFloat(this.shippingTotalRate)*parseFloat(this.total) +
						parseFloat(this.shippingQuantityRate)*parseInt(this.quantity,10),
			nextItem,
			next;
		for(next in this.items){
			nextItem = this.items[next];
			if( nextItem.shipping ){
				if( typeof nextItem.shipping == 'function' ){
					shipping += parseFloat(nextItem.shipping());
				} else {
					shipping += parseFloat(nextItem.shipping);
				}
			}
		}
		return shipping;
	}

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

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

function CartItem() {
	this.id = "c" + Math.floor(Math.random()*100000000);
}
	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.");
		}
		simpleCart.update();
	};

	CartItem.prototype.increment = function(){

		//上限数量
		/*if( parseInt(this.quantity,10) < parseInt(this.maxquantity,10) ){
			this.quantity = parseInt(this.quantity,10) + 1;
			simpleCart.update();
		}*/

		//上限数量（総量）

		var maxquantity = parseInt(this.maxquantity,10);
		var quantity = 0;
		var itemnum = '';
		for( var current in simpleCart.items ){

			var item = simpleCart.items[current];

			itemnum += item.id + '\n'

			if( item.liveid == this.liveid ) {
				quantity += parseInt(item.quantity,10);

				if(parseInt(item.maxquantity,10) > parseInt(this.maxquantity,10)) {
					maxquantity = parseInt(item.maxquantity,10);
				}
			}
		}

		if( quantity < maxquantity ){
			this.quantity = parseInt(this.quantity,10) + 1;
			simpleCart.update();
		} else {
			alert('ご購入枚数はお一人様'+maxquantity+'枚までとなっております。');
		}
	};

	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" ) {
				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);
			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;
			}
		}
	};

	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() {
		simpleCart.remove(this.id);
		simpleCart.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 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");
					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" + Math.floor(Math.random()*100000000);
}
	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 = "";

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

		simpleCart.add( outStrings );
	};

/********************************************************************************************************
*	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()+(1*24*3600*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().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 );
	}
}

var simpleCart = new Cart();

window.onload = simpleCart.initialize;
