window.i3.cart = {defaults: {optionsRequired: null, statuses: {}, currency: {symbol: '&pound;'}}};

window.i3.cart.calculatePrice = function(object)
{
    var container = $(object).parents('.optionsGroup:first').length > 0 ? $(object).parents('.optionsGroup:first') : $(object).parents('.productDetails:first');
    
    var quantity = i3.std.def(i3.std.string.toNumeric($(container).find('.itemsNo').val()),1);
    var price = $(container).find('.unitPrice').val();
    var priceExVAT = $(container).find('.unitPriceExVAT').val();
    
    var total = quantity*price;
    var totalExVAT = quantity*priceExVAT;
    
    $(container).find('.totalPrice').html(window.i3.cart.defaults.currency.symbol+total.toFixed(2));
    $(container).find('.totalPriceExVAT').html(window.i3.cart.defaults.currency.symbol+totalExVAT.toFixed(2));
}

window.i3.cart.displayStockPopup = function(object, data, message)
{
    var container = $(object).parents('.productDetails:first');
    
    var product_id = $(container).find('.contentId').val();
    var product_type = $(container).find('.contentType').val();
    var qty = i3.std.def(i3.std.string.toNumeric($(container).find('.itemsNo').val()), 1);
    
    data.template = "ecomcart/stock";
    data.params = {'purchase_quantity': qty, 'hash': data.hash, 'content_type': product_type, 'content_id': product_id};
    
    i3.popup.displaySimplePopup(data);
}

window.i3.cart.displayOptionsPopup = function()
{
    window.alert("Please select options for the given product before proceeding");
}

window.i3.cart.displayUpdateStockPopup = function()
{
    var data = {template: "ecomcart/stockUpdate"};
    i3.popup.displaySimplePopup(data);
}

window.i3.cart.alterStockMarkup = function(container, toObject)
{
    for(var key in i3.cart.defaults.statuses)
    {
        var status = i3.cart.defaults.statuses[key];
        if (status.id != toObject.id)
        {
            $(container).find("."+status.css_class).each(function()
            {
                $(this).removeClass(status.css_class).addClass(toObject.css_class);
            })
            
            $(container).find("[class*="+status.css_class+"]").each(function()
            {
                var object = $(this);
                $($(this).attr('class').split(/\s+/)).each(function()
                {
                    if (this.indexOf(status.css_class) != false)
                        $(object).removeClass(this).addClass(this.replace(status.css_class, toObject.css_class));
                });
            });
        }
    }
    
    if(toObject)    
        $(container).find(".stock").html(toObject.title);
}

window.i3.cart.checkStock = function(object, callback)
{
    var container = $(object).parents('.productDetails:first');    
    var link = $(container).find('.addToCart');
    
    if ($(link).is('.disabled.stock'))
    {
        window.alert("Please wait while we check the stock");
        return false;
    }
    
    if ($(container).find('.availableQuantity').length > 0)
    {
        var availableQuantity = $(container).find('.availableQuantity').val();
        
        var productId = $(container).find('.contentId').val();
        var productHash = $(container).data('stock') ? $(container).data('stock').hash : i3.std.def($(container).find('.hash').val(), productId);
        
        if (availableQuantity == '')
        {
            if (!$(container).data('stock'))
            {
                $(link).addClass('disabled stock');
                $.ajax({
                     url:'/pages_actions/std/ecom_product.checkStock.php',
                     type: 'POST',
                     dataType: 'json',
                     data: {'pid': productId},
                     success: function(response)
                     {
                         $(link).removeClass('disabled stock');
                         if(!response.error)
                         {
                             var data = response.data;
                             
                             $(container).data('stock', data);
                             i3.cart.checkStockChoices(object, {'qty': data.qty - data.cart.qty, 'hash': data.hash}, callback);
                         }
                         else
                            window.alert(data.error_message);
                     }
                });
            }
            else
                i3.cart.checkStockChoices(object, {'qty': availableQuantity, 'hash': productHash}, callback);
        }
        else
            i3.cart.checkStockChoices(object, {'qty': availableQuantity, 'hash': productHash}, callback);
    }
    else
        if (callback)
            callback();
}

window.i3.cart.checkStockChoices = function(object, data, callback)
{
    var container = $(object).parents('.productDetails:first');    
    var minimum_qty = $(container).find('.minimumQuantity').val();
    var qty = i3.std.def(i3.std.string.toNumeric($(container).find('.itemsNo').val()), 1);
    
    if (data.qty > 0 || data.duein > 0)
    {
        i3.cart.alterStockMarkup(container, i3.cart.defaults.statuses[1]);
        
        // bought quantity is greater than total quantity of product 
        // or bought quantity is greater than quantity of product in main warehouse
        // or the ammount of products in the cart + bought quantity is greater than quantity of products in main warehouse
        
        if(qty > data.qty || (data.locations ? qty > data.locations[0].qty : false) || (data.locations ? qty + data.cart.qty > data.locations[0].qty : false))
        {
            i3.cart.checkStockChoicesOOS(object, data);
            return false;
        }
        else
        {
            if (data.qty - qty >= 0)
            {
                $(container).find('.availableQuantity').val(data.qty - qty);
                
                if (callback)
                    callback(object);
                    
                return true;
            }
            else
            {
                i3.cart.checkStockChoicesOOS(object, data);
                return false;
            }
        }
    }
    else
    {
        i3.cart.checkStockChoicesOOS(object, data);
        return false;
    }
}

window.i3.cart.checkStockChoicesIS = function(object)
{
        
}

window.i3.cart.checkStockChoicesOOS = function(object, data)
{
    var container = $(object).parents('.productDetails:first');
    var option_groups = i3.cart.getOptionGroups(container);
    
    i3.cart.alterStockMarkup(container, i3.cart.defaults.statuses[2]);
    
    if (data.hash)
    {
        $(option_groups).find('.availableQuantity').val(0);
        $(option_groups).find('.optionSelect[value='+data.hash+']').hide();
        
        $(option_groups).each(function()
        {
            var option_inputs = i3.cart.getOptionInputs(this, true);
            $(option_inputs).removeAttr('checked').removeAttr('selected').removeClass('selected');
        });
    }
    else
    {
        $(option_groups).find('.addToCart').hide();
        $(option_groups).find('.cartForm').hide();
    }
    
	return i3.cart.displayStockPopup(object, data);
}

window.i3.cart.checkOptionChoices = function(object, data, callback)
{
    var container = $(object).parents('.optionsGroup:first').length > 0 ? $(object).parents('.optionsGroup:first') : $(object).parents('.productDetails:first');
    
    $(container).find('.availableQuantity').val(data.stockQty);
    $(container).find('.stockId').val(data.stockId);
    $(container).find('.unitPrice').val(data.price);
    $(container).find('.unitPriceExVAT').val(data.price-data.vat);

    i3.cart.calculatePrice(object);

    if (callback)
        callback();
}

window.i3.cart.getCart = function(callback)
{
    $.ajax({
        url: '/pages_actions/std/ecom_cart.php',
        type: 'POST',
        dataType: 'json',
        data: {'mode': 'view'},
        success: function(cart) {
            if (callback)
                callback(cart);
        }
    });
}

window.i3.cart.repopulateCart = function(callback)
{
    $('.cartDetails').each(function()
    {
        var self = this;
        var data = {'mode': 'output'};
        
        if ($(this).attr('params'))
            $.extend(data, i3.std.string.toObject($(this).attr('params')));
        
        $.ajax({
            url: '/pages_actions/std/ecom_cart.php',
            type: 'POST',
            data: data,
            dataType: 'html',
            success: function(response) {
                $(self).before(response).remove();
                
                if (callback)
                    callback(response);
            }
        });
    });
}

window.i3.cart.addToCart = function(object)
{
    while (i3.popup.array.length > 0)
        $(i3.popup.array.pop()).dialog('close');
    
    var container = $(object).parents('.productDetails:first');
    var link = $(container).find('.addToCart');
    
    var product_id = $(container).find('.contentId').val();
    var qty = i3.std.def(i3.std.string.toNumeric($(container).find('.itemsNo').val()),1);    
    
    i3.cart.changeLink(object, function()
    {
        i3.cart.checkStock(object, function()
        {
            if ($(link).is('.disabled.cart'))
            {
                window.alert("Please wait while we add the item to your cart");
                return false;
            }
            
            $(link).addClass('disabled cart');
            i3.popup.displayAdvancedPopup($(object).attr('href'),{'data_type':'html'},{'data_type':'html','onopen': function()
            {
                $(link).removeClass('disabled cart');
                i3.cart.repopulateCart();
            },'title': 'false'});
        }); 
    });
}

window.i3.cart.generateOptionsHash = function(object, options)
{
    if (!options)
        options = {};
    
    var data = [];
    var container = $(object).parents('.productDetails:first');
    var option_groups = i3.cart.getOptionGroups(container);
    
    data['id'] = i3.std.def(options.id, $(object).attr('contentId'), $(container).find('.contentId').val());
    data['stock_id'] = i3.std.def(options.stockId, $(object).attr('stockId'), $(option_groups).find('.stockId').length > 1 ? $.map($(option_groups).find('.stockId'), function(e) { return $(e).val(); }) : $(option_groups).find('.stockId').val(), 0);
    data['rule_id'] = i3.std.def(options.ruleId, $(object).attr('ruleId'), $(container).find('.ruleId:first').val(),0);
    
    if (options.options)
        data.concat(options.options);
        
    $(".connectTo[value="+$(container).attr('rel')+"]").each(function()
    {
        if (!data['products'])
            data['products'] = [];
            
        data['products'].push(i3.cart.generateOptionsHash(this));
    });
    
    return i3.std.string.btoa(i3.std.array.serialize(data));
}

window.i3.cart.generateLink = function(object, options)
{
    if (!options)
        options = {};
    
    var container = $(object).parents('.productDetails:first');
    var option_groups = i3.cart.getOptionGroups(container);
    
    // 0 - mode = cart
    // 1 - action
    // 2 - product typename
    // 3 - quantity
    // 4 - ruleId
    // 5 - stockId            
    // 6 - optionsHash
    
    var href = i3.std.string.strip(i3.std.def(options.href, $(object).attr('href')),'/');
    var data = href.split('/');
    
    var typename = i3.std.def(options.typename, $(object).attr('typename'), $(object).attr('rel'), $(container).attr('rel'), data[2]);
    var contentId = options.id = typename.split('-')[1];
    var ruleId = options.ruleId = i3.std.def(options.ruleId, $(object).attr('ruleId'), $(container).find('.ruleId:first').val(),0);
    var stockId = options.stockId = i3.std.def(options.stockId, $(object).attr('stockId'), $(option_groups).find('.stockId:first').val(), 0);
        
    var link = [];
    link.push("cart");
    link.push(i3.std.def(options.action, $(object).attr('action'), data[1]));
    link.push(typename);
    
    if (data[3])
        link.push(data[3]);
    else if (!i3.std.def(options.noquantity, $(object).attr('noquantity'), $(object).hasClass('noquantity'), false))
        link.push(i3.std.def(options.quantity, $(object).attr('itemsNo'), $(container).find('.itemsNo:first').val(), 1));
        
    link.push(ruleId);
    link.push(stockId);
    link.push(i3.std.def($(object).attr('optionsHash'), i3.cart.generateOptionsHash(object, options)));
        
    for(var i in link)
        link[i] = i3.std.string.strip(link[i],'/');
    
    return '/'+link.join('/')+'/';    
}

window.i3.cart.changeLink = function(object, callback)
{
    var container = $(object).parents('.productDetails:first');
    
    if (i3.cart.defaults.optionsRequired ? i3.cart.isOptionRequired(object) && !i3.cart.isOptionApplied(object) : false)
        i3.cart.displayOptionsPopup();
    else
    {
        i3.popup.displayLoader();
        i3.cart.changeOption(i3.cart.isOptionApplied(object) ? null : object, function()
        {
            i3.cart.changeRule(i3.cart.isRuleApplied(object) ? null : object, function()
            {
                $(container).find('.addToCart').each(function()
                {                
                    $(this).attr('href', i3.cart.generateLink(this));
                });
                
                if (callback)
                    callback();                
            });
        });
    }
}

window.i3.cart.changeElement = function(object)
{
    $(object).each(function()
    {
        if ($(this).is('.quantity'))
        $(this).focus(function()
        {
            var val = parseInt($(this).val());
            
            if (isNaN(val))
                $(this).data('previous', 0);
            else
                $(this).data('previous', val);
        }).focus();
        
        if ($(this).is('.quantity.action'))
        $(this).change(function()
        {
            var data = {};
            var value = parseInt($(this).val());
            
            if (isNaN(value))
            {
                $(this).val($(this).data('previous'));
                return false;
            }
            
            if ($(this).attr('rel'))
                data.typename = $(this).attr('rel');
            else
                return false;
            
            if ($(this).data('previous') > value)
            {
                if ($(this).hasClass('promotion'))
                    data.action = 'decrease_promotion_item';
                else
                    data.action = 'decrease';
                    
                var val = $(this).data('previous') - value;
                if  (val != 0)
                     data.quantity = val;
                else 
                    return false;
            }
            else
            {
                if ($(this).hasClass('promotion'))
                    data.action = 'increase_promotion_item';
                else
                    data.action = 'increase';
                
                var val = value - $(this).data('previous');
                if  (val != 0)
                     data.quantity = val;
                else 
                    return false;
            }
                        
            window.location = i3.cart.generateLink(this, data);
        });
        
        if ($(this).is('a.action'))
        $(this).click(function(ev)
        {
            ev.preventDefault();
            
            var data = {};
            
            if (!$(this).hasClass('noquantity'))
            {
                var quantity = $(this).siblings('.quantity');
                $(quantity).blur();
                
                var diff = parseInt($(quantity).val()) - quantity.data('previous');
                if (diff != 0)
                    data.quantity = diff;
                else
                    return false;
            }
            
            window.location = i3.cart.generateLink(this, data);
        });    
    });
}

window.i3.cart.changeQuantity = function(object)
{    
    var container = $(object).parents('.productDetails:first');
    var qty = $(container).find('.itemsNo').val();
    var mQty = $(container).find('.minimumQuantity') ? i3.std.string.toNumeric($(container).find('.minimumQuantity').val()) : 1;
    var aQty = $(container).find('.availableQuantity') ? i3.std.string.toNumeric($(container).find('.availableQuantity').val()) : null;
    
    if(!i3.std.string.isNumeric(qty, 'integer'))
    {
        $(container).find('.itemsNo').val(mQty);
        return false;
    }
    
    if(aQty && qty > aQty)
    {
        $(container).find('.itemsNo').val(aQty);
        return false;
    }
    
    if(qty > 999)
    {
        window.alert('Please enter a reasonable amount');
        $(container).find('.itemsNo').val(mQty);
        return false;
    }
    
    if(qty < mQty)
    {
        window.alert('Sorry, but you can not buy less than '+mQty);
        $(container).find('.itemsNo').val(mQty);
        return false;
    }
    
    if (i3.cart.defaults.optionsRequired ? i3.cart.isOptionRequired(object) && !i3.cart.isOptionApplied(object) : false)
    {
        i3.cart.displayOptionsPopup();
        $(container).find('.itemsNo').val(mQty);
        return false;
    }
    
    i3.cart.changeRule(object, function()
    {
        i3.cart.changeOption(object, function()
        {
            i3.cart.calculatePrice(object);
        });
    });
    
    return true;
}

window.i3.cart.isOptionRequired = function(object)
{
    var container = $(object).parents('.productDetails:first');
    var option_groups = i3.cart.getOptionGroups(container);
    var ret = true;
    
    $(option_groups).each(function()
    {
        var connector = true;
        
        $('.connectTo[value='+$(container).attr('rel')+']').each(function()
        {
            return !(connector = i3.cart.isOptionRequired(this));
        });
        
        return ret = (connector ? $(container).find('.optionSelect').length > 0 || $('.connectTo[value='+$(this).attr('rel')+']').length > 0 : false);
    });
    
    return ret;
}

window.i3.cart.isOptionApplied = function(object)
{
    var container = $(object).parents('.productDetails:first');
    var option_groups = i3.cart.getOptionGroups(container);
    var ret = true;
    
    $(option_groups).each(function()
    {
        var connector = true;
        $('.connectTo[value='+$(container).attr('rel')+']').each(function()
        {
            return connector = i3.cart.isOptionApplied(this);
        });
        
        if (connector == false)
            return ret = false;
        
        if (i3.cart.isOptionRequired(object) ? i3.cart.getOptionInputs(container).length != i3.cart.getOptionInputs(container, true).length : false)
            return ret = false;
    });
    
    return ret;
}

window.i3.cart.getOptionGroups = function(container)
{
    var option_groups = $($(container).find('.optionsGroup').length > 0 ? $(container).find('.optionsGroup') : $(container)).filter(function()
    {
        return $(this).find(".optionSelect").length > 0 || $('.connectTo[value='+$(this).attr('rel')+']').length > 0;
    });
    
    return option_groups;
}

window.i3.cart.getOptionInputs = function(container, selected)
{
    var names = [];
    var ret = [];
    
    $(container).find(".optionSelect").each(function()
    {
        if ($(this).attr('name') &&
            ($.inArray($(this).attr('name'), names) == -1 || (!$(this).is("input[type=checkbox], input[type=radio]") && $(this).attr('name').indexOf('[]') != -1)) && 
            (selected ? $(this).is(":checked, [selected], .selected, select") && i3.std.string.isNumeric($(this).val()) : true))
        {
            names.push($(this).attr('name'));
            
            if ($(this).is("select"))
                ret.push($(this).find(":selected"));
            else
                ret.push(this);
        }
    });
    
    return ret;
}

window.i3.cart.changeOption = function(object, callback)
{
    if (object)
    {
        var container = $(object).parents('.productDetails:first');
        var product_id = $(container).find('.contentId').val();
        var option_groups = i3.cart.getOptionGroups(container);
        
        var link = $(container).find('.addToCart');

        if ($(link).is('.disabled.options'))
        {
            window.alert("Please wait while we check the stock for this options set");
            return false;
        }
                
        $(option_groups).each(function()
        {
            var option_group = this;
            var option_inputs = i3.cart.getOptionInputs(option_group, true);
            
            // Generate the hash
            var options = new Array();
            var option_hash = '';
            
            if (i3.cart.isOptionApplied(object))
            {
                $(option_inputs).each(function()
                {
                    if (i3.std.string.isNumeric($(this).val()))
                        options.push(i3.std.string.toNumeric($(this).val()));
                });
                
                options.sort(function(a,b){return a - b;});
                
                if (options)
                $.each(options, function(){
                    if(option_hash.length) option_hash += ',';
                    option_hash += this;
                });
            }
            
            // Do the ajax request
            if (product_id)
            {
                if (i3.cart.isOptionApplied(object) && option_hash)
                {                
                    if (!$(container).data('option#'+product_id+(option_hash ? "#"+option_hash : "")))
                    {
                        $(link).addClass('disabled options');
                        $.ajax({
                            url: '/pages_actions/std/ecom_product.checkOptions.php',
                            data: {"pid": product_id, "hash": option_hash},
                            dataType: 'json',
                            type: "POST",
                            success: function(response)
                            {
                                $(link).removeClass('disabled options');
                                if(!response.error)
                                {
                                    $(container).data('option#'+product_id+(option_hash ? "#"+option_hash : ""), response);
                                    response.hash = option_hash;
                                    
                                    $(container).data('stock', {'qty': response.stockQty, 'hash': option_hash});
                                    
                                    if(response.stockQty > 0)
                                        i3.cart.checkOptionChoices(object, response, callback);
                                    else
                                        i3.cart.checkStockChoicesOOS(object, response);
                                }
                                else
                                    window.alert(response.error_message);
                            }
                        });
                    }
                    else
                    {
                        var data = $(container).data('option#'+product_id+(option_hash ? "#"+option_hash : ""));
                        if(data.stockQty > 0)
                            i3.cart.checkOptionChoices(object, data, callback);
                        else
                            i3.cart.checkStockChoicesOOS(object, data);
                    }
                }
                else
                    if (callback)
                        callback();
            }
        });
    }
    else
        if (callback)
            callback();
}

window.i3.cart.isRuleApplied = function(object)
{
    return false;
}

window.i3.cart.changeRule = function(object, callback)
{
    if (object)
    {
    /* TODO: next build - live update of price
    
    var container = $(object).parents('.productDetails:first');
    var product_id = $(container).find('.contentId').val();
    var rule_id = $(container).find('.ruleId').val();
    var qty = i3.std.string.toNumeric($(container).find('.itemsNo').val());
    
    if (rule_id)
        $.ajax({
            url: '/pages_actions/std/ecom_product.checkRule.php',
            data: {"pid": product_id, "rid": rule_id, "qty": qty},
            dataType: 'json',
            type: "POST",
            success: function(data)
            {
                if(data.error == 0)
                {
                  $('.unitPrice').val(data.price);
                  $('.unitPriceExVAT').val(data.price-data.vat);
                  
                  i3.cart.calculatePrice(object);
                  if (callback)
                    callback();
                }
                else
                    i3.cart.checkStockChoicesOOS(object);
            }
        });
    else
        if (callback)
            callback();*/
    }
    
    if (callback)
        callback();
};
