var Pozzit = Pozzit || {};

Pozzit.Basket = function(){
    var self = this,
        summary = $('#basket-summary'),
        items = {},
        total = $('td.total', '#basket');

    var updateSummary = function(o){
        if(o.count > 0)
            summary.css('visibility', 'visible');
        if(o.count == 0)
            summary.css('visibility', 'hidden');

        $('.qty', summary).text(o.count);
        $('.price', summary).text('£' + o.basket_total / 100);
    };
   
    var updateBasket = function(id, o){
        if(items[id] !== undefined) {
            if(o.deleted == 1) {
                if(o.count == 0) {
                    $('#basket').replaceWith('<p>Your basket is empty</p>');
                    items = {};
                    return;
                }
                items[id].deleteMe(); 
                delete items[id];
            }
            else {
                items[id].update(o.item_total);
            }

            total.text('£' + o.basket_total / 100); 
        }
    };

    var public_api = function(){
        var api = {
            // expect JSON object with new quantities in.
            ajaxUpdate: function(id, qty) {
                $.ajax({
                    url: '/basket/update_ajax',
                    type: 'POST',
                    dataType: 'json',
                    data: {
                        item: id,
                        qty: qty
                    },
                    success: function(o){
                        updateBasket(id, o);
                        updateSummary(o);
                    }
                });
            },
            addItem: function(id, qty) {
                $.ajax({
                    url: '/basket/add_ajax',
                    type: 'POST',
                    dataType: 'json',
                    data: {
                        item: id,
                        qty: qty
                    },
                    success: function(o) {
                        // We don't currently have a way of adding an item while the basket is on show so no point updating it.
                        updateSummary(o);
                    }
                });
            },
            delItem: function(id) {
                $.ajax({
                    url: '/basket/del_ajax',
                    type: 'POST',
                    dataType: 'json',
                    data: {
                        item: id
                    },
                    success: function(o) {
                        updateBasket(id, o); 
                        updateSummary(o);
                    }
                });
            }
        };

        return api;
    }();

    $.extend(self, public_api);

    (function() {
        $('tr.item', '#basket').each(function(){
            var tr  = $(this),
                id  = $('input[name=item]', tr).val(),
                api = {};

            (function(){
                var td    = $('td:nth-child(3)', tr),
                    dBut  = $('<img src="/static/images/icons/delete.png">'),
                    aBut  = $('<img src="/static/images/icons/add.png">'),
                    input = $('input[name=qty]', td);

                aBut.click(function(){
                    // AJAX increment
                    input.val( parseInt(input.val()) + 1 );

                    self.ajaxUpdate(id, input.val());
                    
                });
                dBut.click(function(){
                    // AJAX decrement
                    if( parseInt(input.val()) > 1 ) {
                        input.val( parseInt(input.val()) - 1);
                        self.ajaxUpdate(id, input.val());
                    }
                });

                input.keypress(function(e){
                    // Any charcode outside of those for 0-9.
                    if(e.charCode < 48 || e.charCode > 57) {
                        e.preventDefault();
                    }
                });
                input.change(function(e){
                    self.ajaxUpdate(id, input.val()); 
                });

                input.before(dBut);
                input.after(aBut);
                $('input[type=image]', td).remove();
            })();

            api.update = function(p) {
                $('td.price', tr).text('£' + p / 100);
            };

            (function(){
                var td    = $('td:nth-child(5)', tr),
                    form  = $('form', td),
                    img   = $('<img src="' + $('input[type=image]', form).attr('src') + '">');

                img.click(function(){
                    self.delItem(id);
                });

                form.replaceWith(img);
            })();

            api.deleteMe = function() {
                tr.remove();
            };

            items[id] = $.extend(this, api);
        });
    })();

    return self;
};
