var CartEventManager = {
    listeners:{},
    addListener: function(event, callback, scope) {
        var x = {};
        x.callback = callback;
        x.scope = scope;

        if (!this.listeners[event]) {
            this.listeners[event] = []
        }
        this.listeners[event][this.listeners[event].length] = x;
    },
    fireEvent: function(event, obj) {
        if (!this.listeners[event]) {
            this.listeners[event] = []
        }
        for (var i = 0; i < this.listeners[event].length; i++) {
            this.listeners[event][i].callback.call(this.listeners[event][i].scope || window, obj);
        }
    },
    removeListener: function(event, callback) {
        if (!this.listeners[event]) {
            this.listeners[event] = []
        }
        for (var i = 0; i < this.listeners[event].length; i++) {
            if (this.listeners[event][i].callback == callback)
                this.listeners[event][i] = null;
        }
    }
};

var Cart = {
    addItem: function(itemId, count, callback) {
        $.ajax({
            url: '/cart/add/' + itemId + '/' + count + '/',
            success: function(res) {
                CartEventManager.fireEvent('cartadd', res);
                if (callback) callback(res);
            },
            error: function() {
                CartEventManager.fireEvent('carterror', res);
                if (callback) callback(res);
            }
        })
    },
    setItem: function(itemId, count) {
        $.ajax({
            url: '/cart/set/' + itemId + '/' + count + '/',
            success: function(res) {
                CartEventManager.fireEvent('cartset', res);
            },
            error: function() {
                CartEventManager.fireEvent('carterror', res);
            }
        })
    },
    deleteItem: function(itemId) {
        $.ajax({
            url: '/cart/delete/' + itemId + '/',
            success: function(res) {
                CartEventManager.fireEvent('cartdelete', res);
            },
            error: function() {
                CartEventManager.fireEvent('carterror', res);
            }
        })
    },
    clear: function() {
        $.ajax({
            url: '/cart/clear/',
            success: function(res) {
                CartEventManager.fireEvent('cartclear', res);
            },
            error: function() {
                CartEventManager.fireEvent('carterror', res);
            }
        })
    },
    createOrder: function() {
        $.ajax({
            url: '/cart/create/',
            success: function(res) {
                CartEventManager.fireEvent('cartcreateorder', res);
            },
            error: function() {
                CartEventManager.fireEvent('carterror', res);
            }
        })
    }
};

window.Cart = Cart;
window.CartEventManager = CartEventManager;

$(function() {
    (function() {
        var cart = $("#cart");
        var qnt = $("#cart-qnt");
        var qntw = $("#cart-qnt-w");

        var update = function(res) {
            if (res && parseInt(res.count)) {
                qnt.html(res.count);
                cart.fadeIn();
            } else {
                qnt.html("0");
                cart.fadeOut();
            }
        };

        CartEventManager.addListener('cartadd', update);
        CartEventManager.addListener('cartset', update);
        CartEventManager.addListener('cartdelete', update);
        CartEventManager.addListener('cartclear', update);
        CartEventManager.addListener('cartcreateorder', function(res) {
            //alert("Заказ сформирован");
        });
        CartEventManager.addListener('carterror', function(res) {
            //alert("Ошибка при выполнении запроса");
        });
    })();

    $("a[href='#add']").click(function() {
        var lnk = $(this);
        var id = lnk.attr("rel");
        if (!id) return;
        Cart.addItem(id, 1, function() {
            lnk.html("В корзине");
            lnk.attr("rel", null);
            lnk.attr("href", "/cart");
        });

        if (lnk.attr("href") == "#add")
            return false;
    });
    $("a[href='#plus']").click(function() {
        var id = $(this).attr("rel");
        if (!id) return;
        Cart.addItem(id, 1);
        return false;
    });
    $("a[href='#minus']").click(function() {
        var id = $(this).attr("rel");
        if (!id) return;
        Cart.addItem(id, -1);
        return false;
    });
    $("a[href='#remove']").click(function() {
        var id = $(this).attr("rel");
        if (!id) return;
        Cart.deleteItem(id);
        return false;
    });

    //if cart page
    var loc = "" + document.location;
    if (loc.indexOf("/cart") != -1) {
        (function() {
            var ammount = $("#amount");
            var update = function(res) {
                if (res.cart.items.length) {
                    for (var i = 0; i < res.cart.items.length; i++) {
                        var item = res.cart.items[i];
                        $("tr.row-" + item.id_product + " .count").html(item.count + "x");
                    }
                } else {
                    document.location = '/catalog';
                }
                ammount.html(res.amount);
            };
            CartEventManager.addListener('cartadd', update);
            CartEventManager.addListener('cartset', update);
            CartEventManager.addListener('cartdelete', function(res) {
                update(res);
                if (res.product && res.product.id) {
                    $("tr.row-" + res.product.id).fadeOut(function(){
                        $(this).remove();
                    });
                }
            });
        })();
    }
});
