function Cart(config) {
var $ = jQuery;
Cart.instance = this; // this may be a list on the future;
this.cartElem = $("#cart1")[0];
this.cartElem.cartObj = this;
this.contentBox = $("#cart1 .cart-content");
this.itemsBox = $("#cart1 .cart-items");
this.items = {};
this.empty = !config.has_products;
this.visible = false;
$(".cart-buy", this.cartElem).button({ icons: { primary: 'ui-icon-cart'} });
if (!this.empty) {
$(this.cartElem).show();
this.visible = config.visible;
this.addToList(config.products, true)
}
}
(function($){
// Forbidding the user to request more the one action on the cart
// simultaneously because the cart in the cookie doesn't supports it.
Cart.prototype.ajax = function(config){
var me = this;
this.disabled = true;
var completeCallback = config.complete;
config.complete = function(){
me.disabled = false;
if (completeCallback) completeCallback();
};
$.ajax(config);
}
Cart.prototype.addToList = function(products, clear) {
if( clear ) this.itemsBox.empty();
var me = this;
this.productsLength = products.length;
for( var item,i=0; item=products[i]; i++ ) {
this.items[item.id] = { price:item.price, quantity:item.quantity };
this.updateTotal();
var liId = "cart-item-"+item.id;
var li = $("#"+liId);
if( !li[0] ) li = $('
\n').appendTo(this.itemsBox);
li.empty();
$('
' +
''+ item.name +' ' +
'' +
' '+ (item.price ? '× '+ item.price : '') +'
' +
' remove '
).appendTo(li);
var input = $("input", li)[0];
input.lastValue = input.value;
input.productId = item.id;
input.ajustSize = function() {
var len = this.value.toString().length;
if(len > 2) len--;
this.style.width = len+"em";
};
input.ajustSize();
input.onchange = function() {
me.updateQuantity(this, this.productId, this.value);
};
// TODO: Scroll to newest item
var liBg = li.css("background-color");
li[0].style.backgroundColor = "#FF0";
li.animate({ backgroundColor: liBg }, 1000);
}
if (!clear && this.empty) $(this.cartElem).show();
if((!clear && this.empty) || (this.visible && clear)) {
this.contentBox.hide();
this.show(!clear);
}
this.empty = false;
}
Cart.prototype.updateQuantity = function(input, itemId, quantity) {
if(this.disabled) return alert(shoppingCartPluginL10n.waitLastRequest);
quantity = parseInt(quantity);
input.disabled = true;
var originalBg = input.style.backgroundImage;
input.style.backgroundImage = "url(/images/loading-small.gif)";
var me = this;
if( quantity == NaN ) return input.value = input.lastValue;
this.ajax({
url: '/plugin/shopping_cart/update_quantity/'+ itemId +'?quantity='+ quantity,
dataType: 'json',
success: function(data, status, ajax){
if ( !data.ok ) {
log.error(data.error);
input.value = input.lastValue;
}
else {
input.lastValue = quantity;
me.items[itemId].quantity = quantity;
me.updateTotal();
}
},
cache: false,
error: function(ajax, status, errorThrown) {
log.error('Add item - HTTP '+status, errorThrown);
input.value = input.lastValue;
},
complete: function(){
input.disabled = false;
input.style.backgroundImage = originalBg;
input.ajustSize();
}
});
}
Cart.prototype.removeFromList = function(itemId) {
$("#cart-item-"+itemId).slideUp(500, function() {$(this).remove()});
delete this.items[itemId];
this.updateTotal();
}
Cart.addItem = function(itemId, link) {
if(this.instance.disabled) return alert(shoppingCartPluginL10n.waitLastRequest);
if ( this.productsLength > 100 ) {
// This limit protect the user from losing data on cookie limit.
// This is NOT limiting to 100 products, is limiting to 100 kinds of products.
alert(shoppingCartPluginL10n.maxNumberOfItens);
return false;
}
link.intervalId = setInterval(function() {
$(link).addClass('loading');
steps = ['w', 'n', 'e', 's'];
if( !link.step || link.step==3 ) link.step = 0;
link.step++;
$(link).button({ icons: { primary: 'ui-icon-arrowrefresh-1-'+steps[link.step]}})
}, 100);
var stopBtLoading = function() {
clearInterval(link.intervalId);
$(link).removeClass('loading');
$(link).button({ icons: { primary: 'ui-icon-cart'}});
};
this.instance.addItem(itemId, stopBtLoading);
}
Cart.prototype.addItem = function(itemId, callback) {
var me = this;
this.ajax({
url: '/plugin/shopping_cart/add/'+ itemId,
dataType: 'json',
success: function(data, status, ajax){
if ( !data.ok ) log.error('Shopping cart data failure', data.error);
else me.addToList(data.products);
},
cache: false,
error: function(ajax, status, errorThrown) {
log.error('Add item - HTTP '+status, errorThrown);
},
complete: callback
});
}
Cart.removeItem = function(itemId) {
if(this.instance.disabled) return alert(shoppingCartPluginL10n.waitLastRequest);
if( confirm(shoppingCartPluginL10n.removeItem) ) this.instance.removeItem(itemId);
}
Cart.prototype.removeItem = function(itemId) {
if ($("li", this.itemsBox).size() < 2) return this.clean();
var me = this;
this.ajax({
url: '/plugin/shopping_cart/remove/'+ itemId,
dataType: 'json',
success: function(data, status, ajax){
if ( !data.ok ) log.error(data.error);
else me.removeFromList(data.product_id);
},
cache: false,
error: function(ajax, status, errorThrown) {
log.error('Remove item - HTTP '+status, errorThrown);
}
});
}
Cart.toggle = function(link) {
if(this.instance.disabled) return alert(shoppingCartPluginL10n.waitLastRequest);
link.parentNode.parentNode.cartObj.toggle();
}
Cart.prototype.toggle = function() {
this.visible ? this.hide(true) : this.show(true);
}
Cart.prototype.show = function(register) {
if(register) {
this.ajax({
url: '/plugin/shopping_cart/show',
dataType: 'json',
cache: false,
error: function(ajax, status, errorThrown) {
log.error('Show - HTTP '+status, errorThrown);
}
});
}
this.visible = true;
this.contentBox.slideDown(500);
$(".cart-toggle .str-show", this.cartElem).hide();
$(".cart-toggle .str-hide", this.cartElem).show();
}
Cart.prototype.hide = function(register) {
if(register) {
this.ajax({
url: '/plugin/shopping_cart/hide',
dataType: 'json',
cache: false,
error: function(ajax, status, errorThrown) {
log.error('Hide - HTTP '+status, errorThrown);
}
});
}
this.visible = false;
this.contentBox.slideUp(500);
$(".cart-toggle .str-show", this.cartElem).show();
$(".cart-toggle .str-hide", this.cartElem).hide();
}
Cart.prototype.updateTotal = function() {
var total = 0;
var currency, sep = "";
for( var itemId in this.items ) {
var item = this.items[itemId];
if( item.price ) {
currency = item.price.replace(/^([^0-9]+).*$/, "$1");
sep = item.price.charAt(item.price.length-3);
var price = item.price.replace(/[^0-9]/g,"");
total += item.quantity * parseFloat(price);
}
}
total = Math.round(total).toString().replace(/(..)$/, sep+"$1")
$(".cart-total b", this.cartElem).text( ( (total!=0) ? currency+" "+total : "---" ) );
}
Cart.clean = function(link) {
if(this.instance.disabled) return alert(shoppingCartPluginL10n.waitLastRequest);
if( confirm(shoppingCartPluginL10n.cleanCart) ) link.parentNode.parentNode.parentNode.cartObj.clean();
}
Cart.prototype.clean = function() {
var me = this;
this.ajax({
url: '/plugin/shopping_cart/clean',
dataType: 'json',
success: function(data, status, ajax){
if ( !data.ok ) log.error(data.error);
else{
me.items = {};
$(me.cartElem).slideUp(500, function() {
$(me.itemsBox).empty();
me.hide();
me.updateTotal();
me.empty = true;
});
}
},
cache: false,
error: function(ajax, status, errorThrown) {
log.error('Remove item - HTTP '+status, errorThrown);
}
});
}
Cart.send_request = function(form) {
if($(form).valid())
Cart.instance.send_request($(form).serialize());
return false;
}
Cart.prototype.send_request = function(params) {
var me = this;
this.ajax({
type: 'POST',
url: '/plugin/shopping_cart/send_request',
data: params,
dataType: 'json',
success: function(data, status, ajax){
if ( !data.ok ) display_notice(data.error.message);
else {
me.clean();
display_notice(data.message);
}
},
cache: false,
error: function(ajax, status, errorThrown) {
log.error('Send request - HTTP '+status, errorThrown);
},
complete: function() {
$.colorbox.close();
}
});
}
Cart.colorbox_close = function() {
$.colorbox.close();
}
$(window).bind('beforeunload', function(){
log('Page unload.');
Cart.unloadingPage = true;
});
$(function(){
$.ajax({
url: "/plugin/shopping_cart/get",
dataType: 'json',
success: function(data) {
new Cart(data);
$('.cart-add-item').button({ icons: { primary: 'ui-icon-cart'} })
},
cache: false,
error: function(ajax, status, errorThrown) {
// Give some time to register page unload.
setTimeout(function() {
// page unload is not our problem.
if (Cart.unloadingPage) {
log('Page unload before cart load.');
} else {
log.error('Error getting shopping cart - HTTP '+status, errorThrown);
if ( confirm(shoppingCartPluginL10n.getProblemConfirmReload) ) {
document.location.reload();
}
}
}, 100);
}
});
});
})(jQuery);