var ajaxCart = {
    overrideButtonsInThePage: function () {
        $('.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;
        });
        $(document).ready(function () {
            $('.ajax_add_to_cart_button').click(function () {
                $('#popcart').show('fast');
            });
            $('a#closepop').click(function () {
                $('#popcart').fadeOut('slow');
            })
            $('a.return').click(function () {
                $('#popcart').hide('fast');
            })
        });
        $('body#product p#add_to_cart input').unbind('click').click(function () {
            $('#popcart').show('fast');
            ajaxCart.add($('#product_page_product_id').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null);
            return false;
        });
        $('.ajax_cart_block_remove_link').unbind('click').click(function () {
            var customizationId = 0;
            var productId = 0;
            var productAttributeId = 0;
            if ($($(this).parent().parent()).attr('name') == 'customization') 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;
                    }
                });
            }
            if (!customizationId) {
                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]);
            }
            ajaxCart.remove(productId, productAttributeId, customizationId);
            return false;
        });
    },
    refresh: function () {
        $.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) {}
        });
    },
    add: function (idProduct, idCombination, addedFromProductPage, callerElement, quantity, whishlist) {
        if (addedFromProductPage && !checkCustomizations()) {
            alert(fieldRequired);
            return;
        }
        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');
        $.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) {
				var attributes = '';
				$('#attributes :selected').each(function(i, selected) { 
					attributes += $(selected).text() + ', '; 
				});				   
			   
				$('#cart_block_combination a').html(attributes.slice(0, -2));
                if (whishlist && !jsonData.errors) WishlistAddProductCart(whishlist[0], idProduct, idCombination, whishlist[1]);
                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));
                ajaxCart.updateCart(jsonData);
                if (addedFromProductPage) $('body#product p#add_to_cart').removeClass('youpi').addClass('youpi');
                else $('.ajax_add_to_cart_button').addClass('youpi');
                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);
            }
        });
    },

    remove: function (idProduct, idCombination, customizationId) {
        $.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');
            }
        });
    },
    hideOldProducts: function (jsonData) {
        if ($('#cart_block #cart_block_list dl.products').length > 0) {
            var removedProductId = null;
            var removedProductData = null;
            var removedProductDomId = null;
            $('#cart_block_list dl.products dt').each(function () {
                var domIdProduct = $(this).attr('id');
                var firstCut = domIdProduct.replace('cart_block_product_', '');
                var ids = firstCut.split('_');
                var stayInTheCart = false;
                for (aProduct in jsonData.products) {
                    if (jsonData.products[aProduct]['id'] == ids[0] && (!ids[1] || jsonData.products[aProduct]['idCombination'] == ids[1])) {
                        stayInTheCart = true;
                        ajaxCart.hideOldProductCustomizations(jsonData.products[aProduct], domIdProduct);
                    }
                }
                if (!stayInTheCart) {
                    removedProductId = $(this).attr('id'); {
                        ajaxCart.refresh(jsonData)
                    };
                }
            });
            if (removedProductId != null) {
                var firstCut = removedProductId.replace('cart_block_product_', '');
                var ids = firstCut.split('_');
                $('#' + removedProductId).addClass('strike').fadeTo('fast', 0, function () {
                    $(this).slideUp('speed', function () {
                        $(this).remove();
                        if ($('#cart_block dl.products dt').length == 0) {
                            $('p#cart_block_no_products:hidden').slideDown(001);
                            $('div#cart_block dl.products').remove();
                        }
                    });
                });
                $('dd#cart_block_combination_of_' + ids[0] + (ids[1] ? '_' + ids[1] : '')).fadeTo('fast', 0, function () {
                    $(this).hide('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).hide('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('<a class="ajax_cart_block_remove_link" href="' + baseDir + 'cart.php?delete&id_product=' + product['id'] + '&ipa=' + product['idCombination'] + '&token=' + static_token + '" title="' + removingLinkText + '"> </a>');
    },
    doesCustomizationStillExist: function (product, customizationId) {
        var exists = false;
        $(product.customizedDatas).each(function () {
            if (this.customizationId == customizationId) {
                exists = true;
                return false;
            }
        });
        return (exists);
    },
    refreshVouchers: function (jsonData) {
        $(jsonData.discounts).each(function () {
            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();
    },
    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, function () {
                                $(this).fadeTo('fast', 1, function () {
                                    $(this).fadeTo('fast', 0, function () {
                                        $(this).fadeTo('fast', 1, function () {
                                            $(this).fadeTo('fast', 0, function () {
                                                $(this).fadeTo('fast', 1);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    });
                });
            });
        });
    },
    displayNewProducts: function (jsonData) {
        $(jsonData.products).each(function () {
            if (this.id != undefined) {
                if ($('div#cart_block dl.products').length == 0) $('p#cart_block_no_products:visible').fadeTo('fast', 0, function () {
                    $(this).slideUp(001).fadeTo(0, 1);
                }).before('<dl class="products"></dl>');
                var domIdProduct = this.id + (this.idCombination ? '_' + this.idCombination : '');
                var domIdProductAttribute = this.id + '_' + (this.idCombination ? this.idCombination : '0');
                if ($('#cart_block dt#cart_block_product_' + domIdProduct).length == 0) {
                    var productId = parseInt(this.id);
                    var productAttributeId = (this.hasAttributes ? parseInt(this.attributes) : 0);
                    var content = '<dt class="hidden" id="cart_block_product_' + domIdProduct + '">';
                    content += '<a href="' + this.link + '" title="' + this.name + '"><img src="' + this.image_dir + this.id_image + '-medium.jpg" alt="' + this.name + '"></a>';
                    content += '<span class="quantity-formated"><span class="quantity">' + this.quantity + '</span>x</span>';
                    var name = (this.name.length > 12 ? this.name.substring(0, 10) + '...' : this.name);
                    content += '<a href="' + this.link + '" title="' + this.name + '">' + this.name + '</a>';
                    content += '<span class="remove_link"><a class="ajax_cart_block_remove_link" href="' + baseDir + 'cart.php?delete&id_product=' + productId + '&token=' + static_token + (this.hasAttributes ? '&ipa=' + parseInt(this.idCombination) : '') + '"> </a></span>';
                    content += '<span class="price">' + this.priceByLine + '</span>';
                    content += '</dt>';
                    if (this.hasAttributes) content += '<dd id="cart_block_combination_of_' + domIdProduct + '" class="hidden"><a href="' + this.link + '" title="' + this.name + '">' + this.attributes + '</a>';
                    if (this.hasCustomizedDatas) content += ajaxCart.displayNewCustomizedDatas(this);
                    if (this.hasAttributes) content += '</dd>';
                    $('#cart_block dl.products').append(content);
                } else {
                    var jsonProduct = this;
                    if ($('dt#cart_block_product_' + domIdProduct + ' .quantity').text() != jsonProduct.quantity) {
                        $('dt#cart_block_product_' + domIdProduct + ' .price').text(jsonProduct.priceByLine);
                        ajaxCart.updateProductQuantity(jsonProduct, jsonProduct.quantity);
                        if (jsonProduct.hasCustomizedDatas) {
                            customizationFormatedDatas = ajaxCart.displayNewCustomizedDatas(jsonProduct);
                            if (!$('#cart_block ul#customization_' + domIdProductAttribute).length) {
                                if (jsonProduct.hasAttributes) $('#cart_block dd#cart_block_combination_of_' + domIdProduct).append(customizationFormatedDatas);
                                else
                                $('#cart_block dl.products').append(customizationFormatedDatas);
                            } else
                            $('#cart_block ul#customization_' + domIdProductAttribute).append(customizationFormatedDatas);
                        }
                    }
                }
                $('#cart_block dl.products .hidden').slideDown(001).removeClass('hidden');
                var removeLinks = $('#cart_block_product_' + domIdProduct).find('a.ajax_cart_block_remove_link');
                if (this.hasCustomizedDatas && removeLinks.length) $(removeLinks).each(function () {
                    $(this).remove();
                });
            }
        });
    },
    displayNewCustomizedDatas: function (product) {
        var content = '';
        var productId = parseInt(product.id);
        var productAttributeId = typeof(product.idCombination) == 'undefined' ? 0 : parseInt(product.idCombination);
        var hasAlreadyCustomizations = $('#cart_block ul#customization_' + productId + '_' + productAttributeId).length;
        if (!hasAlreadyCustomizations) {
            if (!product.hasAttributes) content += '<dd id="cart_block_combination_of_' + productId + '" class="hidden">';
            content += '<ul class="cart_block_customizations" id="customization_' + productId + '_' + productAttributeId + '">';
        }
        $(product.customizedDatas).each(function () {
            var done = 0;
            customizationId = parseInt(this.customizationId);
            productAttributeId = typeof(product.idCombination) == 'undefined' ? 0 : parseInt(product.idCombination);
            if ($('#cart_block').find("div[@id^=deleteCustomizableProduct_" + customizationId + "_]").length) return ('');
            content += '<li name="customization"><div class="deleteCustomizableProduct" id="deleteCustomizableProduct_' + customizationId + '_' + productId + '_' + (productAttributeId ? productAttributeId : '0') + '"><a class="ajax_cart_block_remove_link" href="' + baseDir + 'cart.php?delete&id_product=' + productId + '&ipa=' + productAttributeId + '&id_customization=' + customizationId + '&token=' + static_token + '"> </a></div><span class="quantity-formated"><span class="quantity">' + parseInt(this.quantity) + '</span>x</span>';
            $(this.datas).each(function () {
                if (this['type'] == CUSTOMIZE_TEXTFIELD) {
                    $(this.datas).each(function () {
                        if (this['index'] == 0) {
                            content += this.truncatedValue;
                            done = 1;
                            return false;
                        }
                    })
                }
            });
            if (!done) content += customizationIdMessage + customizationId;
            if (!hasAlreadyCustomizations) content += '</li>';
            if (customizationId) {
                $('#uploadable_files li div.customizationUploadBrowse img').remove();
                $('#text_fields li input').attr('value', '');
            }
        });
        if (!hasAlreadyCustomizations) {
            content += '</ul>';
            if (!product.hasAttributes) content += '</dd>';
        }
        return (content);
    },
    updateCart: function (jsonData) {
        if (jsonData.hasError) {
            var errors = '';
            for (error in jsonData.errors)
            if (error != 'indexOf') errors += jsonData.errors[error] + "\n";
            alert(errors);
        }
        ajaxCart.updateCartEverywhere(jsonData);
        ajaxCart.hideOldProducts(jsonData);
        ajaxCart.displayNewProducts(jsonData);
        $('#cart_block dl.products dt, #cart_block dl.products dd').removeClass('last_item').removeClass('first_item').removeClass('item');

        $('#cart_block dl.products dt:first, #cart_block dl.products dd:first').addClass('first_item');
        $('#cart_block dl.products dt:not(:first,:last), #cart_block dl.products dd:not(:first,:last)').addClass('item');
        $('#cart_block dl.products dt:last, #cart_block dl.products dd:last').addClass('last_item');



        ajaxCart.refresh;
        ajaxCart.overrideButtonsInThePage();
    },
    updateCartEverywhere: function (jsonData) {
        $('.ajax_cart_total').text(jsonData.productTotal);
        $('.ajax_cart_shipping_cost').text(jsonData.shippingCost);
        $('.cart_block_wrapping_cost').text(jsonData.wrappingCost);
        $('.ajax_block_cart_total').text(jsonData.total);
        if (jsonData.nbTotalProducts > 0) {
            $('.ajax_cart_no_product:visible').hide();
            $('.ajax_cart_quantity').text(jsonData.nbTotalProducts);
            $('.ajax_cart_quantity:hidden').fadeIn('fast');
            $('.ajax_cart_total:hidden').fadeIn('fast');
            $('.ajax_cart_productadded:hidden').show('fast');
            if (jsonData.nbTotalProducts > 1) {
                $('.ajax_cart_product_txt:visible').hide();
                $('.ajax_cart_product_txt_s:hidden').show();
            } else {
                $('.ajax_cart_product_txt:hidden').fadeIn('fast');
                $('.ajax_cart_product_txt_s:visible').fadeOut('fast');
            }
        } else {
            $('.ajax_cart_quantity:visible,.ajax_cart_productadded:visible, .ajax_cart_product_txt_s:visible, .ajax_cart_product_txt:visible, .ajax_cart_total:visible').fadeOut('slow', function () {
                $('.ajax_cart_no_product:hidden').fadeIn('slow');
            });
        }
    }
}
$(document).ready(function () {
    ajaxCart.overrideButtonsInThePage();
    ajaxCart.refresh();
});
