/**
 * Класс для работы с таблицей в корзине
 */
$G.Catalog.BasketTable = function() {

    var $body = $(), $wrap = $(), $foot = $();
    var rowsData = [];

    var eventDispatcher = new $G.EventDispatcher();

    /**
     * Настраиваем ряды (кнопки и инпуты)
     */
    function setupRows() {
        rowsData.splice(0, rowsData.length);
        $body.find('a[rel="del"]').each(function() {
            var hash = this.href.split('#')[1];
            rowsData.push({ id: hash });
            $(this).click(_delClickHandler);
            var row = this.parentNode.parentNode;
            setupInputRow(row, hash);
        })
    }

    /**
     * Настраиваем ввод количества
     * @param {Object} row DOM-elemnt ряд таблицы
     * @param {String} id идентификатор товара
     */
    function setupInputRow(row, id) {
        var $cell = $('td', row).eq(2);
        var count = $cell.html();
        var inp = document.createElement('input');
        inp.value = inp.defaultValue = count;
        var $input = $(inp)
            .change(function(e) {
                changeCount(this, id);
            })
            .keydown(function(e) {
                if (e.which == 13) {
                    changeCount(this, id);
                    e.preventDefault();
                    return false;
                }
            })
        $cell.empty().append($input);
    }

    /**
     * Хэндлер удаления товара
     */
    function _delClickHandler(e) {
        var hash = this.href.split('#')[1];
        eventDispatcher.dispatchEvent('delete', hash);
        return false;
    }

    /**
     * Смена количества
     * @param {Object} input DOM-element инпут
     * @param {String} id идентификатор товара
     */
    function changeCount(input, id) {
        var value = parseInt(input.value);
        if (value > 0) {
            input.defaultValue = input.value;
            eventDispatcher.dispatchEvent('change_count', id, value);
        } else {
            input.value = input.defaultValue;
        }
    }

    /**
     * Возвращает индекс ряда
     * @param {String} id идентификатор товара
     * @return {Number}
     */
    function indexOf(id) {
        for (var i = 0; i < rowsData.length; i ++)
            if (rowsData[i].id == id)
                return i;
        return -1;
    }

    function updateTotal(){
        var totalPrice = 0;
        //var totalPrice = 0;
        for (var i = 0; i < rowsData.length; i ++){
            $body.find('tr').eq(i).find('td').each(function(j) {
                if(j==4){
                    var txt = $(this).text();
                    txt = txt.replace(/,/,".");
                    totalPrice+=parseFloat(txt);
                }
            })
            //totalPrice+=rowsData[i].price * rowsData[i].count;
        }
        $foot.find('tr').find('td').each(function(i) {
            switch (i) {
                case 1:
                    this.innerHTML = $G.GetPrice(totalPrice, true);
                    break;
                case 2:
                    this.innerHTML = $G.GetPrice(totalPrice);
                    break;
            }
        });

    }



    return {
        /**
         * Инициализация
         * @param {Object} wrapObject DOM-element враппер
         */
        init: function(wrapObject) {
            $wrap = $(wrapObject);
            $body = $wrap.find('tbody');
            $foot = $wrap.find('tfoot');
            setupRows();

        },
        /**
         * Удалить ряд
         * @param {String} id идентификатор товара
         */
        deleteRow: function(id) {
            var idx = indexOf(id);
            if (idx > -1) {
                rowsData.splice(idx, 1);
                $body.find('tr').eq(idx).remove();
                $body.find('tr').each(function(i) {
                    $(this).find('td').first().html(i + 1);
                });
            }
            updateTotal()
        },
        /**
         * Обновить ряд
         * @param {Object} row объект с информацией о товаре
         */
        updateRow: function(row) {
            var idx = indexOf(row.id);
            if (idx > -1) {
                $body.find('tr').eq(idx).find('td').each(function(i) {
                    switch (i) {
                        case 4:
                            this.innerHTML = $G.GetPrice(row['price'] * row['count'], true);
                            break;
                        case 5:
                            this.innerHTML = $G.GetPrice(row['price'] * row['count']);
                            break;
                    }
                });
            }
            updateTotal();
        },
        // Методы для eventDispatcher
        attachEventListener: function(event, handler) {
            eventDispatcher.attachEvent(event, handler);
        },
        removeEventListener: function(event, handler) {
            eventDispatcher.removeEvent(event, handler);
        }
    }
}();

