stpettersens/Cart

View on GitHub
cart.min.js

Summary

Maintainability
A
0 mins
Test Coverage
/*
A shopping cart implemented via the client-side in TypeScript.
Copyright 2015 Sam Saint-Pettersen.
Released under the MIT License.
https://github.com/stpettersens/Cart
*/
var Cart=function(){function e(){}return e.isStorageSupported=function(){var e=!1;return"undefined"!=typeof Storage&&(e=!0),e},e.showAlert=function(t){e.alerts&&($("#cart-alert").append('<div id="alert-for-cart" class="alert-success">'+t+".</div>"),setTimeout(function(){$("#alert-for-cart").remove()},2500))},e.reset=function(){e.items=new Array,e.prices=new Array,e.qtys=new Array},e.store=function(t){if(!e.forceCookie&&e.isStorageSupported())localStorage.setItem("cart_item_"+localStorage.length,t.replace(/\:\s*/,":"));else{var r=$.cookie(e.cookie);void 0==r&&(r=""),r+=t+",",$.removeCookie(e.cookie),$.cookie(e.cookie,r,{expires:e.cookieTTL,path:"/"})}},e.removeIt=function(t){if(!e.forceCookie&&e.isStorageSupported()){var r=t.split("(");null!=r[1]&&(t=r[0]);for(var o=localStorage.length-1;localStorage.length-1>=0;){var a=localStorage.getItem("cart_item_"+o);if(-1!=a.search(t)){localStorage.removeItem("cart_item_"+o);break}o--}var c=new Array;for(var s in localStorage)-1!=s.search("cart_item_")&&c.push(localStorage.getItem(s));e.empty(!0);for(var o=0;o<c.length;o++)e.store(c[o])}else{var i=$.cookie(e.cookie);i=i.replace(t+",",""),e.empty(!0),$.cookie(e.cookie,i,{expires:e.cookieTTL,path:"/"}),""==i&&e.empty(!0)}},e.pushFromStorage=function(){for(var t=0;t<localStorage.length;t++){var r=localStorage.getItem("cart_item_"+t).split(":"),o=e.items.indexOf(r[0]);-1==o?(e.items.push(r[0]),e.prices.push(parseFloat(r[1])),e.qtys.push(1)):e.qtys[o]=e.qtys[o]+1}},e.pushUnrelatedFromStorage=function(){e.unrelated=new Array;for(var t=0;t<localStorage.length;t++)-1==localStorage.key(t).search("cart_item_")&&e.unrelated.push(localStorage.key(t)+"=>"+localStorage.getItem(localStorage.key(t)))},e.restoreUnrelated=function(){for(var t=0;t<e.unrelated.length;t++){var r=e.unrelated[t].split("=>");localStorage.setItem(r[0],r[1])}},e.pushFromCookie=function(){var t=$.cookie(e.cookie),r=new Array;void 0!=t&&(r=t.split(","));for(var o=0;o<r.length;o++)if(""!=r[o]){var a=r[o].split(":"),c=e.items.indexOf(a[0]);-1==c?(e.items.push(a[0]),e.prices.push(parseFloat(a[1])),e.qtys.push(1)):e.qtys[c]=e.qtys[c]+1}},e.getNumberItems=function(){e.reset(),!e.forceCookie&&e.isStorageSupported()?e.pushFromStorage():e.pushFromCookie();var t=new Array;if(!e.forceCookie&&e.isStorageSupported())for(var r in localStorage)-1!=r.search("cart_item_")&&t.push(localStorage.getItem(r));else{var o=$.cookie(e.cookie);if(void 0!=o)for(var a=o.split(","),c=0;c<a.length;c++)""!=a[c]&&t.push(a[c])}return t.length},e.renderItems=function(){var t=0,r=e.currency;if(e.reset(),!e.forceCookie&&e.isStorageSupported()?e.pushFromStorage():e.pushFromCookie(),e.items.length>0){$("#cart").append('<table id="cart-contents"><tr><td>Item</td><td>Price</td><td>Qty</td><td>Subtotal</td><td>&nbsp;</td></tr>');for(var o=0;o<e.items.length;o++)$("#cart-contents").append('<tr><td class="item">'+e.items[o]+'</td><td class="price">'+r+" "+e.prices[o].toFixed(2)+'</td><td class="qty">'+e.qtys[o]+'</td><td class="subtotal">'+r+" "+(e.prices[o]*e.qtys[o]).toFixed(2)+'</td><td><button onclick="Cart.removeItem('+o+')">X</button>&nbsp;<button onclick="Cart.changeQty('+o+',true);">+</button>&nbsp;<button onclick="Cart.changeQty('+o+',false);">-</button></td></tr>'),t+=e.prices[o]*e.qtys[o];$("#cart-contents").append("</tr></table>"),$("#cart-contents").append('<p id="total"><br/><strong>Total: '+r+" "+t.toFixed(2)+"</strong></p>"),$("#cart").append('<p><button onclick="Cart.empty();">Empty '+e.cart+"</button></p>"),e.bootstrap&&($("button").addClass("btn"),$("button").addClass("btn-default"),$("#cart-contents").addClass("table"),e.striped&&$("#cart-contents").addClass("table-striped"))}else $("#cart").append("<p><em>Your "+e.cart.toLowerCase()+" is empty.</em></p>");for(var a=new Array,o=0;o<e.items.length;o++)a.push(e.items[o]+"|"+e.currency+" "+e.prices[o].toFixed(2)+"|"+e.qtys[o]);return a},e.empty=function(t){if(!t)var r=confirm("Really empty the "+e.cart.toLowerCase()+"?");if(r||t){if(!e.forceCookie&&e.isStorageSupported())for(var o in localStorage)-1!=o.search("cart_item_")&&localStorage.removeItem(o);else $.removeCookie(e.cookie);$("#cart").empty(),e.renderItems()}},e.changeQty=function(t,r){var o=$(".item:eq("+t+")").text(),a=$(".price:eq("+t+")").text(),c=($(".qty:eq("+t+")").text(),new RegExp("\\"+e.currency+"s*","ig"));r?e.store(o+":"+a.replace(c,"")):e.removeIt(o+":"+a.replace(c,"")),$("#cart").empty(),e.renderItems()},e.removeItem=function(t){e.reset(),!e.forceCookie&&e.isStorageSupported()?(e.pushFromStorage(),e.pushUnrelatedFromStorage(),localStorage.clear(),e.restoreUnrelated()):(e.pushFromCookie(),$.removeCookie(e.cookie)),e.items.splice(t,1),e.prices.splice(t,1);for(var r=0;r<e.items.length;r++)e.store(e.items[r]+":"+e.prices[r]);$("#cart").empty(),e.renderItems()},e.addItem=function(t){var r=new RegExp("\\"+e.currency+"s*","ig"),o=$("#product-"+t+"> .name").text(),a=null;$("#product-"+t).each(function(){a=$("#product-"+t+"> .price").text(),e.store(o+":"+a.replace(r,""))}),e.showAlert("Added "+o+" to "+e.cart.toLowerCase()),e.renderCart(e.page)},e.configure=function(t,r,o,a,c,s){null!=t&&(e.cart=t),null!=r&&(e.forceCookie=r),e.currency=null!=o?o:"$",null!=a&&(e.bootstrap=a),null!=c&&(e.striped=c),null!=s&&(e.alerts=s)},e.renderCart=function(t){e.page=t;var r='<div id="cart-items">';return r+='<a href="'+e.page+'">'+e.cart+"</a>",r+=" ["+e.getNumberItems()+"]",r+="</div><br/><br/>",$("#cart-box").empty(),$("#cart-box").append(r),e.cart+" => "+e.getNumberItems().toString()},e.cart="Cart",e.forceCookie=!1,e.cookie="cart",e.cookieTTL=365,e.bootstrap=!1,e.striped=!1,e.alerts=!1,e}();