//JS Object : update the cart by ajax actions var ajaxCart = { //override every button in the page in relation to the cart overrideButtonsInThePage : function(){ //for every 'add' buttons... $('.ajax_add_to_cart_button').unbind('click').click(function(){ var idProduct = $(this).attr('rel').replace('ajax_id_product_', ''); ajaxCart.add(idProduct, null, false, this); return false; }); //for product page 'add' button... $('body#product p#add_to_cart input').unbind('click').click(function(){ ajaxCart.add( $('#product_page_product_id').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null); return false; }); //for 'delete' buttons in the cart block... $('.ajax_cart_block_remove_link').unbind('click').click(function(){ // Customized product management var customizationId = 0; var productId = 0; var productAttributeId = 0; if ($($(this).parent().parent()).attr('name') == 'customization') // Reverse two levels: a >> div >> li var customizableProductDiv = $($(this).parent().parent()).find("div[@id^=deleteCustomizableProduct_]"); else var customizableProductDiv = $($(this).parent()).find("div[@id^=deleteCustomizableProduct_]"); if (customizableProductDiv && $(customizableProductDiv).length) { $(customizableProductDiv).each(function(){ var ids = $(this).attr('id').split('_'); if (typeof(ids[1]) != 'undefined') { customizationId = parseInt(ids[1]); productId = parseInt(ids[2]); if (typeof(ids[3]) != 'undefined') productAttributeId = parseInt(ids[3]); return false; } }); } // Common product management if (!customizationId) { //retrieve idProduct and idCombination from the displayed product in the block cart var firstCut = $(this).parent().parent().attr('id').replace('cart_block_product_', ''); firstCut = firstCut.replace('deleteCustomizableProduct_', ''); ids = firstCut.split('_'); productId = parseInt(ids[0]); if (typeof(ids[1]) != 'undefined') productAttributeId = parseInt(ids[1]); } // Removing product from the cart ajaxCart.remove(productId, productAttributeId, customizationId); return false; }); }, // try to expand the cart expand : function(){ if ($('#cart_block #cart_block_list').hasClass('collapsed')) { $('#cart_block #cart_block_summary').slideUp(200, function(){ $(this).addClass('collapsed').removeClass('expanded'); $('#cart_block #cart_block_list').slideDown({ duration: 600, complete: function(){$(this).addClass('expanded').removeClass('collapsed');} }); }); // toogle the button expand/collapse button $('#cart_block h4 span#block_cart_expand').fadeOut('slow', function(){ $('#cart_block h4 span#block_cart_collapse').fadeIn('fast'); }); // save the expand statut in the user cookie $.ajax({ type: 'GET', url: baseDir + 'modules/blockcart/blockcart-set-collapse.php', async: true, data: 'ajax_blockcart_display=expand' + '&rand=' + new Date().getTime() }); } }, // cart to fix display when using back and previous browsers buttons refresh : function(){ //send the ajax request to the server $.ajax({ type: 'GET', url: baseDir + 'cart.php', async: true, cache: false, dataType : "json", data: 'ajax=true&token=' + static_token, success: function(jsonData) { ajaxCart.updateCart(jsonData) }, error: function(XMLHttpRequest, textStatus, errorThrown) { //alert("TECHNICAL ERROR: unable to refresh the cart.\n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus); } }); }, // try to collapse the cart collapse : function(){ if ($('#cart_block #cart_block_list').hasClass('expanded')) { $('#cart_block #cart_block_list').slideUp('slow', function(){ $(this).addClass('collapsed').removeClass('expanded'); $('#cart_block #cart_block_summary').slideDown(700, function(){ $(this).addClass('expanded').removeClass('collapsed'); }); }); $('#cart_block h4 span#block_cart_collapse').fadeOut('slow', function(){ $('#cart_block h4 span#block_cart_expand').fadeIn('fast'); }); // save the expand statut in the user cookie $.ajax({ type: 'GET', url: baseDir + 'modules/blockcart/blockcart-set-collapse.php', async: true, data: 'ajax_blockcart_display=collapse' + '&rand=' + new Date().getTime() }); } }, // add a product in the cart via ajax add : function(idProduct, idCombination, addedFromProductPage, callerElement, quantity, whishlist){ if (addedFromProductPage && !checkCustomizations()) { alert(fieldRequired); return ; } //disabled the button when adding to do not double add if user double click if (addedFromProductPage) { $('body#product p#add_to_cart input').attr('disabled', 'disabled').removeClass('exclusive').addClass('exclusive_disabled'); $('.filled').removeClass('filled'); } else $('.ajax_add_to_cart_button').attr('disabled', 'disabled'); //send the ajax request to the server $.ajax({ type: 'GET', url: baseDir + 'cart.php', async: true, cache: false, dataType : "json", data: 'add&ajax=true&qty=' + ( (quantity && quantity != null) ? quantity : '1') + '&id_product=' + idProduct + '&token=' + static_token + ( (parseInt(idCombination) && idCombination != null) ? '&ipa=' + parseInt(idCombination): ''), success: function(jsonData) { // add appliance to whishlist module if (whishlist && !jsonData.errors) WishlistAddProductCart(whishlist[0], idProduct, idCombination, whishlist[1]); //apply 'transfert' effect var elementToTransfert = null; if (callerElement && callerElement != null) $(callerElement).parents().each( function() { if ($(this).is('.ajax_block_product')) elementToTransfert = $(this); }); else elementToTransfert = $(addedFromProductPage ? 'div#image-block' : ('.ajax_block_product_id_' + idProduct) ); elementToTransfert.TransferTo({ to: $('#cart_block').get(0), className:'transferProduct', duration: 800, complete: function () { ajaxCart.updateCart(jsonData); //reactive the button when adding has finished if (addedFromProductPage) $('body#product p#add_to_cart input').removeAttr('disabled').addClass('exclusive').removeClass('exclusive_disabled'); else $('.ajax_add_to_cart_button').removeAttr('disabled'); } }); }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("TECHNICAL ERROR: unable to add the product.\n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus); //reactive the button when adding has finished if (addedFromProductPage) $('body#product p#add_to_cart input').removeAttr('disabled').addClass('exclusive').removeClass('exclusive_disabled'); else $('.ajax_add_to_cart_button').removeAttr('disabled'); } }); }, //remove a product from the cart via ajax remove : function(idProduct, idCombination, customizationId){ //send the ajax request to the server $.ajax({ type: 'GET', url: baseDir + 'cart.php', async: true, cache: false, dataType : "json", data: 'delete' + '&id_product=' + idProduct + '&ipa=' + ((idCombination != null && parseInt(idCombination)) ? idCombination : '') + ((customizationId && customizationId != null) ? '&id_customization=' + customizationId : '') + '&token=' + static_token + '&ajax=true', success: function(jsonData) { ajaxCart.updateCart(jsonData) }, error: function() {alert('ERROR: unable to delete the product');} }); }, //hide the products displayed in the page but no more in the json data hideOldProducts : function(jsonData) { //delete an eventually removed product of the displayed cart (only if cart is not empty!) if($('#cart_block #cart_block_list dl.products').length > 0) { var removedProductId = null; var removedProductData = null; var removedProductDomId = null; //look for a product to delete... $('#cart_block_list dl.products dt').each(function(){ //retrieve idProduct and idCombination from the displayed product in the block cart var domIdProduct = $(this).attr('id'); var firstCut = domIdProduct.replace('cart_block_product_', ''); var ids = firstCut.split('_'); //try to know if the current product is still in the new list var stayInTheCart = false; for (aProduct in jsonData.products) { //we've called the variable aProduct because IE6 bug if this variable is called product //if product has attributes if (jsonData.products[aProduct]['id'] == ids[0] && (!ids[1] || jsonData.products[aProduct]['idCombination'] == ids[1])) { stayInTheCart = true; // update the product customization display (when the product is still in the cart) ajaxCart.hideOldProductCustomizations(jsonData.products[aProduct], domIdProduct); } } //remove product if it's no more in the cart if(!stayInTheCart) { removedProductId = $(this).attr('id'); //return false; // Regarding that the customer can only remove products one by one, we break the loop } }); //if there is a removed product, delete it from the displayed block cart if (removedProductId != null) { var firstCut = removedProductId.replace('cart_block_product_', ''); var ids = firstCut.split('_'); $('#'+removedProductId).addClass('strike').fadeTo('slow', 0, function(){ $(this).slideUp('slow', function(){ $(this).remove(); //if the cart is now empty, show the 'no product in the cart' message if($('#cart_block dl.products dt').length == 0) { $('p#cart_block_no_products:hidden').slideDown('fast'); $('div#cart_block dl.products').remove(); } }); }); $('dd#cart_block_combination_of_' + ids[0] + (ids[1] ? '_'+ids[1] : '') ).fadeTo('fast', 0, function(){ $(this).slideUp('fast', function(){ $(this).remove(); }); }); } } }, hideOldProductCustomizations : function (product, domIdProduct) { var customizationList = $('#cart_block #cart_block_list ul#customization_' + product['id'] + '_' + product['idCombination']); if(customizationList.length > 0) { $(customizationList).find("li").each(function(){ $(this).find("div").each(function() { var customizationDiv = $(this).attr('id'); var tmp = customizationDiv.replace('deleteCustomizableProduct_', ''); var ids = tmp.split('_'); if ((parseInt(product.idCombination) == parseInt(ids[2])) && !ajaxCart.doesCustomizationStillExist(product, ids[0])) $('#' + customizationDiv).parent().addClass('strike').fadeTo('slow', 0, function(){ $(this).slideUp('slow'); $(this).remove(); });; }); }); } var removeLinks = $('#cart_block_product_' + domIdProduct).find('a.ajax_cart_block_remove_link'); if (!product.hasCustomizedDatas && !removeLinks.length) $('#' + domIdProduct + ' span.remove_link').html(' '); }, doesCustomizationStillExist : function (product, customizationId) { var exists = false; $(product.customizedDatas).each(function() { if (this.customizationId == customizationId) { exists = true; // This return does not mean that we found nothing but simply break the loop return false; } }); return (exists); }, //refresh display of vouchers (needed for vouchers in % of the total) refreshVouchers : function (jsonData) { $(jsonData.discounts).each(function(){ //fix ie6 bug (one more item 'undefined' in IE6) if (this.id != undefined && $('#bloc_cart_voucher_' + this.id).length == 1) { $('#bloc_cart_voucher_' + this.id + ' td.price').text(this.price); } }); if (jsonData.discounts.length == 0) $('#vouchers').remove(); }, // Update product quantity updateProductQuantity : function (product, quantity) { $('dt#cart_block_product_' + product.id + (product.idCombination ? '_' + product.idCombination : '') + ' .quantity').fadeTo('fast', 0, function() { $(this).text(quantity); $(this).fadeTo('fast', 1, function(){ $(this).fadeTo('fast', 0, function(){ $(this).fadeTo('fast', 1, function(){ $(this).fadeTo('fast', 0, function(){ $(this).fadeTo('fast', 1); }); }); }); }); }); }, //display the products witch are in json data but not already displayed displayNewProducts : function(jsonData) { //add every new products or update displaying of every updated products $(jsonData.products).each(function(){ //fix ie6 bug (one more item 'undefined' in IE6) if (this.id != undefined) { //create a container for listing the products and hide the 'no product in the cart' message (only if the cart was empty) if ($('div#cart_block dl.products').length == 0) $('p#cart_block_no_products:visible').fadeTo('fast', 0, function(){ $(this).slideUp('fast').fadeTo(0, 1); }).before('