// Cart JavaScript Document

    // Set up ajax promise object with basic about function
    var ajaxCartRemovePromise = {abort:function() {}};
    var ajaxCartQuantityPromise = {abort:function() {}};
    var ajaxCartHeaderUpdatePromise = {abort:function() {}};
    var ajaxCartUpdatePromise = {abort:function() {}};

	$(document).ready(function() {
		"use strict";
        
        // On cart item remove
        $('.cart').on('click','a.remove',function(event) {
            //
            event.preventDefault();
            
            // Get cart item id
            var cartRef  = $(this).parent().parent().parent().data('cart-ref');
            var cartItem = $(this).parent().data('id');
            
            //
            remove_cart_item(cartRef,cartItem);
        });
	});

	// Remove a cart item
    function remove_cart_item(cartRef,cartItem) {
        
        // Check for cart
        if($('#cart-'+cartRef).length > 0) {
            
            // Add removing class
            $(this).parent().addClass('removing');
            
            // Abort any unfinished ajax call
            ajaxCartRemovePromise.abort();

            // Run a post ajax call
            ajaxCartRemovePromise = $.ajax({
                type: "POST",
                url: rootRelativity+'edit/modules/cart/cart.ajax.php',
                dataType: "json",
                timeout: 10000,
                cache: false,
                data: {
                    type: 'remove-item',
                    rootrelativity: rootRelativity,
                    variantrelativity: variantRelativity,
                    cartref: cartRef,
                    cartitem: cartItem,
                }
            });

            // On complete
            ajaxCartRemovePromise.done(function(data) {
                
                // Update carts
                if(data.results == 'REMOVED') {
                    
                    // Check for eec flag and gtm
                    if(data.item.eec === true && window.google_tag_manager) {
                        
                        // Push product remove from cart
                        window.dataLayer = window.dataLayer || [];
                        window.dataLayer.push({
                            'event': 'eec.removeFromCart',
                            'ecommerce': {
                                'remove': {  
                                    'products': [{
                                        'id': ''+data.item.id+'',
                                        'name': ''+data.item.product+'',
                                        'price': data.item.price,
                                        'brand': ''+data.item.brand+'',
                                        'category': ''+data.item.category+'',
                                        'variant': ''+data.item.variant+'',
                                        'quantity': data.item.quantity
                                    }]
                                }
                            }
                        });
                    }
                    
                    //
                    update_header_cart(cartRef);
                    update_cart(cartRef);
                }
            });

            // Runs if ajax call fails and prints any errors
            ajaxCartRemovePromise.fail(function(request,status,error) {
                //
                if(status !== 'abort') {
                    alert('Error: '+request.responseText);
                }
                else if(request.responseText !== undefined) {
                    console.log('Error: '+request.responseText);
                }
            });
        }
    }

	// Update cart item quantity
    function update_cart_item_quantity(cartRef,cartItem,quantity) {
        
        // Check for cart
        if($('#cart-'+cartRef).length > 0) {
            
            // Abort any unfinished ajax call
            ajaxCartQuantityPromise.abort();

            // Run a post ajax call
            ajaxCartQuantityPromise = $.ajax({
                type: "POST",
                url: rootRelativity+'edit/modules/cart/cart.ajax.php',
                dataType: "json",
                timeout: 10000,
                cache: false,
                data: {
                    type: 'update-item-quantity',
                    rootrelativity: rootRelativity,
                    variantrelativity: variantRelativity,
                    cartref: cartRef,
                    cartitem: cartItem,
                    quantity: quantity,
                }
            });

            // On complete
            ajaxCartQuantityPromise.done(function(data) {
                
                // Update carts
                if(data.results == 'UPDATED') {
                    
                    // Check for eec flag and gtm
                    if(data.item.eec === true && window.google_tag_manager) {
                        
                        // Set default event
                        var eecEvent     = "addToCart";
                        var eecContainer = "add";
                        
                        // Check for quantity change down
                        if(data.change < 0) {
                            
                            // Reverse quantity change
                            data.change = data.change*-1;
                            
                            // Set as remove
                            eecEvent = "removeFromCart";
                            eecContainer = "remove";
                        }
                        
                        // Push product quantity update
                        window.dataLayer = window.dataLayer || [];
                        window.dataLayer.push({
                            'event': 'eec.'+eecEvent,
                            'ecommerce': {
                                eecContainer: {  
                                    'products': [{
                                        'id': ''+data.item.id+'',
                                        'name': ''+data.item.product+'',
                                        'price': data.item.price,
                                        'brand': ''+data.item.brand+'',
                                        'category': ''+data.item.category+'',
                                        'variant': ''+data.item.variant+'',
                                        'quantity': data.change
                                    }]
                                }
                            }
                        });
                    }
                    
                    //
                    update_header_cart(cartRef);
                    update_cart(cartRef);
                }
            });

            // Runs if ajax call fails and prints any errors
            ajaxCartQuantityPromise.fail(function(request,status,error) {
                //
                if(status !== 'abort') {
                    alert('Error: '+request.responseText);
                }
                else if(request.responseText !== undefined) {
                    console.log('Error: '+request.responseText);
                }
            });
        }
    }

	// Update header cart
    function update_header_cart(cartRef) {
        
        // Check for cart
        if($('#header-cart-'+cartRef).length > 0) {
            
            // Abort any unfinished ajax call
            ajaxCartHeaderUpdatePromise.abort();

            // Run a post ajax call
            ajaxCartHeaderUpdatePromise = $.ajax({
                type: "POST",
                url: rootRelativity+'edit/modules/cart/cart.ajax.php',
                dataType: "json",
                timeout: 10000,
                cache: false,
                data: {
                    type: 'update-header-cart',
                    rootrelativity: rootRelativity,
                    variantrelativity: variantRelativity,
                    cartref: cartRef
                }
            });

            // On complete
            ajaxCartHeaderUpdatePromise.done(function(data) {
                
                // Update header cart
                if(data.results != '') {
                    //
                    $('#header-cart-'+cartRef).html(data.results);
                }
            });

            // Runs if ajax call fails and prints any errors
            ajaxCartHeaderUpdatePromise.fail(function(request,status,error) {
                //
                if(status !== 'abort') {
                    alert('Error: '+request.responseText);
                }
                else if(request.responseText !== undefined) {
                    console.log('Error: '+request.responseText);
                }
            });
        }
    }

	// Update cart
    function update_cart(cartRef) {
        
        // Check for cart
        if($('#cart-'+cartRef).length > 0) {
            
            // Abort any unfinished ajax call
            ajaxCartUpdatePromise.abort();

            // Run a post ajax call
            ajaxCartUpdatePromise = $.ajax({
                type: "POST",
                url: rootRelativity+'edit/modules/cart/cart.ajax.php',
                dataType: "json",
                timeout: 10000,
                cache: false,
                data: {
                    type: 'update-cart',
                    rootrelativity: rootRelativity,
                    variantrelativity: variantRelativity,
                    cartref: cartRef
                }
            });

            // On complete
            ajaxCartUpdatePromise.done(function(data) {
                
                // Update cart
                if(data.results != '') {
                    //
                    $('#cart-'+cartRef).html(data.results);
                }
            });

            // Runs if ajax call fails and prints any errors
            ajaxCartUpdatePromise.fail(function(request,status,error) {
                //
                if(status !== 'abort') {
                    alert('Error: '+request.responseText);
                }
                else if(request.responseText !== undefined) {
                    console.log('Error: '+request.responseText);
                }
            });
        }
    }