/**
 * Синглтон для таблицы товаров
 * @namespace $G.Catalog
 */
$G.Catalog.Table = function() {

    var SCROLL_DURATION = 200;

    var DWG_HREF = '/dgallery/';
    var DATASHEET_HREF = '/datasheet/';

    var $body = $(), $head = $(), $wrap = $(), $hWrap = $();
    var showAssCountCell = false, showWeightCell = false;

    var eventDispatcher = new $G.EventDispatcher();

    /** @type {Array} Данные рядов */
    var rowsData = [];

    var idToSelect = 0, currentId = 0;
    var _loading = false;

    /**
     * Выравнивает таблицу по высоте окна
     */
    function adjustHeight() {
        $wrap.css({
            height: document.documentElement.clientHeight - $('#cnt-wrap .eshop-h').height() - $G.Catalog.WRAP_HEIGHT_OFFSET,
            overflow: 'auto'
        });
    }

    function adjustStaticHeader() {
        var pos = $wrap.offset();
        var $cells = $head.find('td');
        if (!$hWrap.length) {
            $hWrap = $(document.createElement('div'))
                .addClass('eshop-static-header')
                .appendTo(document.body);
            if (jQuery.browser.mozilla)
                $hWrap.css('left', -1);
            $cells.each(function() {
                $hWrap.append(
                    $(document.createElement('div'))
                        .html(this.innerHTML)
                );
            });
        }
        var $sCells = $hWrap.find('div');
        var c1 = $cells.get(0);
        var dx = 10;
        var h = c1.offsetHeight - 10;
        var ds = $wrap.scrollTop();
        for (var i = 0; i < $cells.length; i++) {
            $cell = $cells.eq(i);
            var pos = $cell.offset();
            $sCells.eq(i).css({
                left : pos.left,
                top : pos.top + ds,
                width : $cell.get(0).offsetWidth - dx,
                height : h
            });
        }
    }

    function setupVisuals() {
        adjustHeight();
    }

    function setupHCells() {
        showAssCountCell = ($head.find('td.ass-count').length > 0);
        showWeightCell = ($head.find('td.weight').length > 0);
    }

    function _loadResponseHandler(data) {
        _loading = false;
        rowsData = data;
        drawRows();
        if (idToSelect)
            selectById(idToSelect);
    }

    /**
     * Рисует строки таблицы по данным
     */
    function drawRows() {
        $body.empty();
        $wrap.scrollTop(0);
        for (var i = 0; i < rowsData.length; i ++) {
            var row = rowsData[i];
            var $row = $(document.createElement('tr')).appendTo($body);
            if (row['child_quant'] > 0)
                $row.addClass('j');
            var ihtml = '';
            var assCount = row['ass_count'];
            if (assCount == 0)
                assCount = '';
            var assCountCell = (showAssCountCell)
                ? '<td class="cont">' + assCount + '</td>'
                : '';
            var weight = row['weight'];
            if (weight == 0) {
                weight = '';
            } else {
                weight = weight.replace('.', ',');
            }
            var weightCell = (showWeightCell)
                ? '<td class="cont">' + weight + '</td>'
                : '';

            var iHTML = '';
            if (row['dwg'])
                iHTML += '<div class="dwg"><a title="Чертежи" rel="dwg" href="' + DWG_HREF + row['dwg'] + '/"><ins><em></em></ins></a></div>';
            if (row['datasheet'])
                iHTML += '<div class="datasheet"><a title="Описание" rel="datasheet" href="' + DATASHEET_HREF + row['datasheet'] + '/"><ins><em></em></ins></a></div>';
            var countHTML = (row['count'] > 0) ? row['count'] : 'под заказ';
            if (row['price'] == 0)
                countHTML = '';
            var btnHTML = '';
            if (row['price'] > 0) {
                var src = (row['in_basket'])
                    ? '/i/catalog/tba.png'
                    : '/i/catalog/tb.png';
                var title = (row['in_basket'])
                    ? 'Убрать из корзины'
                    : 'Добавить в корзину';
                btnHTML += '<a rel="to-basket" href="#' + row['id'] + '"><img src="' + src + '" title="' + title +'" width="24" height="21" alt="o" class="png"></a>';
            }
            var nameCnt = row['name'];
            if (row['description'] !== '') {
                nameCnt += '<br><small>' + row['description'] + '</small>';
            }
            var html = '<td class="n">' + (i + 1) + '</td>' +
                       '<td class="code">' + row['code'] + '</td>' +
                       '<td class="i">' + iHTML + '</td>' +
                       '<td class="name">' + nameCnt + '</td>' +
                       assCountCell +
                       weightCell +
                       '<td class="price">' + $G.GetPrice(row['price']) + '</td>' +
                       '<td class="count">' + countHTML + '</td>' +
                       '<td class="btn">' + btnHTML + '</td>';
            $row.html(html);//.mousedown(function() { return false ;});
            if (row['child_quant'] > 0) {
                $row.click(_rowDblClickHandler);

            } else {
                $row.click(_rowDblClickHandler);
            }
        }
        adjustStaticHeader();
        setupLinks();
    }

    function setupLinks() {
        $body.find('a').click(_linkClickHandler);
    }

    function setupExtLinks() {
        rowsData.splice(0, rowsData.length);
        $body.find('a[rel="to-basket"]').each(function() {
            var hash = this.href.split('#')[1];
            var cells = this.parentNode.parentNode.getElementsByTagName('td');
            rowsData.push({
                id : hash,
                code : cells[1].innerHTML,
                name : cells[2].innerHTML
            });
            $(this).click(_linkClickHandler);
        })
    }

    function _rowDblClickHandler(e) {
        var index = $(this).index();
        if (index > -1) {
            eventDispatcher.dispatchEvent('select', rowsData[index]);
        }
    }

    function _linkClickHandler(e) {
        var rel = this.getAttribute('rel');
        var hash = this.href.split('#')[1];
        switch (rel) {
            case 'datasheet':
            case 'dwg':
            case 'scheme':
                $G.Popup.show(this, 800, 500);
                break;
            case 'to-basket':
                eventDispatcher.dispatchEvent('basket', hash);
                break;
        }

        return false;
    }

    function selectById(id) {
        var index = -1;
        for (var i = 0; i < rowsData.length; i ++) {
            if (rowsData[i].id == id) {
                index = i;
                break;
            }
        }
        var $tr = $body.find('tr').removeClass('selected');
        if (index > -1) {
            var $row = $tr.eq(index).addClass('selected');
            var top = $row.offset().top;
            var wrapTop = $wrap.offset().top;
            var _scrollTop = $wrap.scrollTop();
            var d =  top - wrapTop - $head.height();
            if (d > 0) {
                d = (top + $row.height() * 2) - (wrapTop + $wrap.height());
                if (d < 0)
                    d = 0;
            }

            if (d)
                $wrap.stop().animate({
                    scrollTop: _scrollTop + d
                }, SCROLL_DURATION);

        } else {
            $wrap.scrollTop(0);
        }

    }

    function indexOf(id) {
        for (var i = 0; i < rowsData.length; i ++)
            if (rowsData[i].id == id)
                return i;
        return -1;
    }

    function setBasketStateForId(id, state) {
        var idx = indexOf(id);
        if (idx > -1) {
            var img = $body.find('tr').eq(idx).find('a[rel="to-basket"] img').get(0);
            if (img) {
                if (state) {
                    img.src = '/i/catalog/tba.png';
                    img.title = 'Убрать из корзины';
                } else {
                    img.src = '/i/catalog/tb.png';
                    img.title = 'Добавить в корзину';
                }
            }
        }
    }

    return {
        init: function(wrapObject) {
            $wrap = $(wrapObject);
            $head = $wrap.find('thead');
            $body = $wrap.find('tbody').empty();
            setupHCells();
            setupVisuals();
            $(window).resize(function() {
                adjustHeight();
                adjustStaticHeader();
            });
        },
        initExt: function(wrapObject) {
            $wrap = $(wrapObject);
            $body = $wrap.find('tbody');
            setupExtLinks();
        },
        load: function(id, select) {
            if (_loading)
                return;
            if (currentId != id) {
                _loading = true;
                currentId = id;
                idToSelect = (select != id) ? select : 0;
                $G.getJSON({
                    _do: 'eshop_list',
                     id: id
                }, _loadResponseHandler);
            }

            if (select)
                selectById(select);
        },
        inBasket: function(id, state) {
            setBasketStateForId(id, state);
        },
        filter: function(code, name) {
            code = code.toLowerCase();
            name = name.toLowerCase();
            var rows = $body.get(0).getElementsByTagName('tr');
            for (var i = 0; i < rowsData.length; i++) {
                if (((!code) || (rowsData[i].code.toLowerCase().indexOf(code) > -1)) && ((!name) || (rowsData[i].name.toLowerCase().indexOf(name) > -1))) {
                    rows[i].style.display = 'table-row';
                } else {
                    rows[i].style.display = 'none';
                }
            }
        },
        resetFilter: function() {
            var rows = $body.get(0).getElementsByTagName('tr');
            for (var i = 0; i < rowsData.length; i++)
                rows[i].style.display = 'table-row';
        },
        attachEventListener: function(event, handler) {
            eventDispatcher.attachEvent(event, handler);
        },
        removeEventListener: function(event, handler) {
            eventDispatcher.removeEvent(event, handler);
        }
    }
}();

