forked from wojodesign/simplecart-js
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsimpleCart.min.js
72 lines (71 loc) · 18.9 KB
/
simpleCart.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// (c)2009 The Wojo Group
var NextId=1,Custom="Custom",GoogleCheckout="GoogleCheckout",PayPal="PayPal",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(){this.Version='2.0';this.Shelf=new Shelf();this.items={};this.isLoaded=false;this.pageIsReady=false;this.quantity=0;this.total=0;this.taxRate=0;this.taxCost=0;this.shippingFlatRate=0;this.shippingTotalRate=0;this.shippingQuantityRate=0;this.shippingRate=0;this.shippingCost=0;this.currency=USD;this.checkoutTo=PayPal;this.email="";this.merchantId="";this.cartHeaders=['Name','Price','Quantity','Total'];this.add=function(){if(!this.pageIsReady){this.initializeView();this.update();}
if(!this.isLoaded){this.load();this.update();}
var newItem=new CartItem();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(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;}
this.update();};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();};this.checkout=function(){if(simpleCart.quantity===0){error("Cart is empty");return;}
switch(simpleCart.checkoutTo){case PayPal:simpleCart.paypalCheckout();break;case GoogleCheckout:simpleCart.googleCheckout();break;case Email:simpleCart.emailCheckout();break;default:simpleCart.customCheckout();break;}};this.paypalCheckout=function(){var winpar="scrollbars,location,resizable,status",strn="https://www.paypal.com/cgi-bin/webscr?cmd=_cart"+"&upload=1"+"&business="+this.email+"¤cy_code="+this.currency,counter=1,itemsString="";if(this.taxRate){strn=strn+"&tax_cart="+this.currencyStringForPaypalCheckout(this.taxCost);}
for(var current in this.items){var item=this.items[current];var optionsString="";for(var field in item){if(typeof(item[field])!="function"&&field!="id"&&field!="price"&&field!="quantity"&&field!="name"){optionsString=optionsString+"&"+field+"="+item[field];}}
optionsString=optionsString.substring(1);itemsString=itemsString+"&item_name_"+counter+"="+item.name+"&item_number_"+counter+"="+counter+"&quantity_"+counter+"="+item.quantity+"&amount_"+counter+"="+this.currencyStringForPaypalCheckout(item.price)+"&on0_"+counter+"="+"Options"+"&os0_"+counter+"="+optionsString;counter++;}
if(this.shipping()!=0){itemsString=itemsString+"&item_name_"+counter+"=Shipping"+"&item_number_"+counter+"="+counter+"&quantity_"+counter+"=1"+"&amount_"+counter+"="+this.currencyStringForPaypalCheckout(this.shippingCost);}
strn=strn+itemsString;window.open(strn,"paypal",winpar);};this.googleCheckout=function(){if(this.currency!=USD&&this.currency!=GBP){error("Google Checkout only allows the USD and GBP for currency.");return;}else if(this.merchantId===""||this.merchantId===null||!this.merchantId){error("No merchant Id for google checkout supplied.");return;}
var form=document.createElement("form"),counter=1;form.style.display="none";form.method="POST";form.action="https://checkout.google.com/api/checkout/v2/checkoutForm/Merchant/"+
this.merchantId;form.acceptCharset="utf-8";for(var current in this.items){var item=this.items[current];form.appendChild(this.createHiddenElement("item_name_"+counter,item.name));form.appendChild(this.createHiddenElement("item_quantity_"+counter,item.quantity));form.appendChild(this.createHiddenElement("item_price_"+counter,item.price));form.appendChild(this.createHiddenElement("item_currency_"+counter,this.currency));form.appendChild(this.createHiddenElement("item_tax_rate_"+counter,this.taxRate));form.appendChild(this.createHiddenElement("_charset_",""));var descriptionString="";for(var field in item){if(typeof(item[field])!="function"&&field!="id"&&field!="quantity"&&field!="price")
{descriptionString=descriptionString+", "+field+": "+item[field];}}
descriptionString=descriptionString.substring(1);form.appendChild(this.createHiddenElement("item_description_"+counter,descriptionString));}
document.body.appendChild(form);form.submit();document.body.removeChild(form);};this.emailCheckout=function(){return;};this.customCheckout=function(){return;};this.load=function(){this.items={};this.total=0.00;this.quantity=0;if(readCookie('simpleCart')){var data=unescape(readCookie('simpleCart')).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();this.items[newItem.id]=newItem;}}}
this.isLoaded=true;};this.save=function(){var dataString="";for(var item in this.items){dataString=dataString+"++"+this.items[item].print();}
createCookie('simpleCart',dataString.substring(2),30);};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.finalTotalOutlets=getElementsByClassName('simpleCart_finalTotal');this.addEventToArray(getElementsByClassName('simpleCart_checkout'),simpleCart.checkout,"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"],["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;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;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"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("Remove","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){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;};this.currencySymbol=function(){switch(this.currency){case JPY:return"¥";case EUR:return"€";case GBP:return"£";case USD:case CAD:case AUD:case NZD:case HKD:case SGD:return"$";default:return"";}};this.currencyStringForPaypalCheckout=function(value){if(this.currencySymbol=="$"){return"$"+parseFloat(value).toFixed(2);}else{return""+parseFloat(value).toFixed(2);}};this.valueToCurrencyString=function(value){return parseFloat(value).toCurrency(this.currencySymbol());};this.valueToPercentageString=function(value){return parseFloat(100*value).toFixed(0)+"%";};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;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;};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();}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.taxCost=parseFloat(this.total)*this.taxRate;this.finalTotal=this.shippingCost+this.taxCost+this.total;};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();};}
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.");}
simpleCart.update();};CartItem.prototype.increment=function(){this.quantity=parseInt(this.quantity,10)+1;simpleCart.update();};CartItem.prototype.decrement=function(){if(parseInt(this.quanity,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++){array[x].replace(/||/,"| |");array[x].replace(/\+\+/,"+ +");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();};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=node.className.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.");}};};function ShelfItem(){this.id="s"+NextId++;}
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;}
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="";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);}
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();window.onload=simpleCart.initialize;