﻿

var newTableColumnParams = new Array();

var colPar = new Object();




//
// Объект: таблица
//
function NewTable(tableIDName) {
    //***************************************   P R O P E R T I E S   *******************************************************************

    //
    // Ключ таблицы
    //
    var tableID = tableIDName;


    //
    // Ссылка на таблицу, на TBODY
    //
    var table = null;
    var tableBody = null;
    var tablePanel = null;
    var tableCaption = null;
    var tableText = null;

    //
    // Типа хеш - id строки-строка
    //
    var rows = new Object();

    //
    // Шаблон для создания строки:
    // используем header - в него на серваке запишутся необходимые данные
    // клиент просто их использует
    //
    var rowTemplate = null;

    //
    // Ссылка на активную строку
    //
    var selectedRow = null;
    
    //
    // список колонок, который нужно подкрашивать
    //
    var colouredColumns = new Object();

    //***************************************   C O N S T R U C T O R   *******************************************************************

    table = document.getElementById(tableID);
    if (table != null) 
    {
        tableBody = table.getElementsByTagName('TBODY')[0];
        tablePanel = document.getElementById(tableID + "Panel");
        //tableCaption = document.getElementById(tableID + "Caption");
        //tableText = tableCaption.innerHTML;
        rowTemplate = table.getElementsByTagName('THEAD')[0].rows[0];

        // Добавляем в кеш то что сервер передал
        for (var i = 0; i < tableBody.rows.length; i++) {
            rows[tableBody.rows[i].id] = tableBody.rows[i];

        }
    }

    //*******************************************    M E T H O D S ******************************************************************
   
    //
    // установить колонку, которая будет раскрашиваться
    //
    this.SetColourColumns = function(index) {
        colouredColumns[index] = true
    }
    
    //
    //
    //
    this.SelectFirstRow = function() {

        if (tableBody.rows.length > 0)
            selectedRow = tableBody.rows[0];

        if (selectedRow != null)
            selectedRow.className = "NewTableSelectedRow";
    }

    //
    // Установить видимость
    //
    this.OnClick = function(ev) {

        ev = ev || window.event;
        var srcElement = ev.srcElement ? ev.srcElement : ev.target;

        // Реагируем только на клик по ячейке
        if (srcElement.tagName == "TD" || srcElement.tagName == "INPUT") {

            var newSelRow = null;
            if (srcElement.tagName == "TD")
                newSelRow = srcElement.parentNode;
            else
                newSelRow = srcElement.parentNode.parentNode;


            // Игнорируем выделение заголовка
            if (newSelRow != null && newSelRow.className == "NewTableHeaderRow")
                return false;

            // Произошла смена активной строки
            if (newSelRow != selectedRow) {

                if (selectedRow != null)
                    selectedRow.className = ((selectedRow.rowIndex % 2) == 0 ? "NewTableAlternateRow" : "NewTableRow");

                if (newSelRow != null)
                    newSelRow.className = "NewTableSelectedRow";

                //
                selectedRow = newSelRow;

                //
                // Смена активной панели
                //
                if (gridViewManager != null)
                {
                    gridViewManager.SetCurrentGridView(tableID);
                }

            }
        }
    }

    //
    // Очистить выделение
    //
    this.ClearSelection = function()
    {
        if (selectedRow != null)
            selectedRow.className = ((selectedRow.rowIndex % 2) == 0 ? "NewTableAlternateRow" : "NewTableRow");

        selectedRow = null;
    }

    //
    // Получить текущую 
    //
    this.SelectedID = function() {

        if (selectedRow == null)
            return null;
        else
            return selectedRow.id;
    }

    // Получить текущую 
    //
    this.SelectedRow = function() {

        if (selectedRow == null)
            return null;
        else
            return selectedRow;
    }

    //
    // Установить видимость
    //
    this.SetVisible = function(vis) {

        SetVisible(tablePanel, vis);


        var vis = GetVisible(table);

        if (vis == true)
            SetVisible(table, false);
        else
            SetVisible(table, true);
    }
    
    //
    // Определить видимость
    //
    this.GetVisible = function() {
        
        return GetVisible(table);
        
    }


    //
    // Добавить строку
    //
    this.AddRow = function(rowID) {

        // Уже есть такая строка - игнорируем
        var row = rows[rowID];
        if (row != null)
            return;

        // Создаем строку таблицы и добавляем ее        
        row = rowTemplate.cloneNode(true);
        row.className = "NewTableRow";
        row.id = rowID;

        for (var i = 0; i < row.children.length; i++) {

            var langCode = row.children[i].lang;

            // Это кнопка для действия
            if (langCode.substring(0, 7) == 'action:') {
                var action = langCode.slice('action:'.length);
                var classCode = "";
                var value = "";
                if(action == "ModifyOrder" || action == "ModifyPosition")
                {
                   classCode = "EditButton";
                }
                else if(action == "CancelOrder" || action == "ClosePosition")
                {
                   classCode = "DeleteButton";
                }
                else if(action == "LogOut")
                {
                   classCode = "DeleteButton";
                   value = "Logout";
                }
                row.children[i].className = 'NewTableActionCell';
                row.children[i].innerHTML = "<input type='button' class='"+classCode+"' onclick='" + langCode.substring(7) + "();return false;'/>";
            }
            // Обычная ячейка
            else {
                row.children[i].className = row.children[i].lang;
                row.children[i].innerHTML = "&nbsp";
            }
        }

        tableBody.appendChild(row);

        // Добавляем в хеш
        rows[rowID] = row;

        // Вызыаем перекраску
        this.RepaintRows();
    }

    //
    // Удалить строку
    //
    this.RemoveRow = function(rowID) {

        // 
        var row = rows[rowID];

        if (row != null) {

            tableBody.removeChild(row);
            // удаляем запись
            delete rows[rowID];

            // Подкрашиваем выделенную строку
            if (selectedRow == row)
                selectedRow = null;
        }

        // Вызыаем перекраску
        this.RepaintRows();
    }

    //
    // Перекрасить строки
    //
    this.RepaintRows = function() {

        // 
        for (var i = 0; i < tableBody.rows.length; i++) {
            tableBody.rows[i].className = ((i % 2) == 0 ? "NewTableRow" : "NewTableAlternateRow");
        }

        // Подкрашиваем выделенную строку
        if (selectedRow != null)
            selectedRow.className = "NewTableSelectedRow";

        // Количество строк
        //tableCaption.innerHTML = tableText + "&nbsp[" + tableBody.rows.length + "]";

    }


    //
    // Очистить все строки
    //
    this.ClearRows = function() {

        // внутренний буфер очищаем
        rows = new Object();

        var len = tableBody.rows.length;

        var i = 0;
        while (i < len) {
            tableBody.deleteRow(0);
            i++;
        }
        
    }


    //
    // Принять пакет обновлений
    //
    this.UpdatePackage = function(update) {

        var edit = update.edit;
        //
        // Произошло изменение структуры данных в таблице (добавление, удаление строки)
        //
        if (edit) {
            var editActions = edit.split(' ');
            for (var i = 0; i < editActions.length; i++) {
                var newRow = null;
                var descr = editActions[i].split('_');

                //Добавление строки
                if (descr[0] === 'add') {
                    this.AddRow(descr[1]);
                }

                else if (descr[0] === 'rem') {
                    this.RemoveRow(descr[1]);
                }
            }
        }




        //
        var pack = update.cells;
        //Массив id итемов которые нужно обновить
        var idToUpdate = new Array();
        // 
        var color = null;

        for (var i = 0; i < pack.length; i++) {
            var ids = pack[i].id.split('-');

            //            //+++ для тотала
            //            if (ids[0] == "Sum") {
            //                grid.Rows.setFooterText(ids[1], pack[i].text);
            //                continue;
            //            }

            try 
            {
                //Получаем ссылку на строку
                var row = rows[ids[0]];

                //Запомнили (для ячеек)
                idToUpdate[ids[0]] = ids[0];

                //var cell = row.getCellFromKey(ids[1]);
                //var cellElement = cell.Element;

                if (ids[1] == 44 || ids[1] == 43) 
                {
                    var t = 0;
                }

                var cellElement = row.cells[ids[1]];
            }
            catch (e) {
                
                continue;
            }




            //
            // Значение ячейки
            //
            var text = pack[i].text;
            if (text!=null && text!=undefined && cellElement) {
                //
                // Цвет ячейки
                //
                if (colouredColumns[ids[1]]) {
                    if (cellElement.innerHTML > text)
                        color = "#C10C0C";
                    else if (cellElement.innerHTML < text)
                        color = "#1E8C2D";
                    else
                        color = "";

                    //если не равно
                    if (cellElement.style.color != color)
                        cellElement.style.color = color;

                }

                cellElement.innerHTML = text;

            }

            //            //Редактируемость
            //            var editable = pack[i].editable;
            //            if (editable) {
            //                if (editable === "False")
            //                    cell.setEditable(false);
            //                else
            //                    cell.setEditable(true);
            //            }
        }

    }

    if (table != null) 
    {
        // Вызыаем перекраску
        this.RepaintRows();

        // Подписываемся на события
        table.onmousedown = this.OnClick;
    }

    
}

var table = null;

//
// 
//
function testButton_Click() {

    table = new NewTable('myTable');

     
 }

 //
 // 
 //
 function visibleButton_Click() {

     table.ClearRows();
     
//     var vis = table.GetVisible();

//     if (vis == true)
//         table.SetVisible(false);
//     else
//         table.SetVisible(true);

     
 }

 //
 // 
 //
 function hideRowButton_Click(bla,bla1) {

     //
     table.RemoveRow("en");

 }

 //
 // 
 //
 function AddRowButton_Click() {

     //
     table.AddRow("en");

 }

 var showPanel = false;

 //
 //
 //
 function InvertShowPanel(tablePanelName) {

     if (showPanel)
         showPanel = false;
     else
         showPanel = true;

     SetVisible(tablePanelName, showPanel);

 }

 var curActVisPanelCode = null;

 var lastActId = null;
 
 function InvertVisibleForTablePanel(tablePanelName)
 {
    if (document.getElementById(tablePanelName).style.display == "block")
    {
        document.getElementById(tablePanelName).style.display == "none";
    }
    else
    {
        document.getElementById(tablePanelName).style.display == "block";
    }
 }
 
 function GetTablePanelName(visPanelCode)
 {
    if (visPanelCode == "PositionsPanel")
    {
        return document.getElementById("PositionsTablePanel");
    }
    if (visPanelCode == "OrdersPanel")
    {
       return document.getElementById("OrdersTablePanel");
    }
    if (visPanelCode == "InformerPanel")
    {
       return document.getElementById("InformerTablePanel");
    }
    if (visPanelCode == "Level2Panel")
    {
       return document.getElementById("Level2TablePanel");
    }
    if (visPanelCode == "BalancePanel")
    {
      return document.getElementById("BalanceTablePanel");
    }
    if (visPanelCode == "ExpositionPanel")
    {
      return document.getElementById("ExpositionTablePanel");
    }
    if (visPanelCode == "BetsPanel")
    {
        return document.getElementById("BetsTablePanel");
    }
    if (visPanelCode == "NewTradePanel")
    {
        return document.getElementById("NewTradesTablePanel");
    }
    if (visPanelCode == "OrderBookPanel")
    {
        return document.getElementById("OrderBookTablePanel");
    }
    if (visPanelCode == "NewsPanel")
    {
        return document.getElementById("NewsTablePanel");
    }
    return "";
 }

 //
 //
 //
 function PanelCaptionClick(ev) { 
    ev = ev || window.event;
    var srcElement = ev.srcElement ? ev.srcElement : ev.target;

    var actId = null;



    if (srcElement.tagName == "IMG" || srcElement.tagName == "SPAN")
        actId = srcElement.parentNode.id;
    else
        actId = srcElement.id;
    if (srcElement.parentNode.tagName == "SPAN")
        actId = srcElement.parentNode.parentNode.id;



    var visPanel = actId.replace("Thumb", "Panel");
    var visPanelCode = actId.replace("Thumb", "");

    //
    if (lastActId != null)
        document.getElementById(lastActId).getElementsByTagName("IMG")[0].src = panelThumbImage.src;

    //
    //
    //
    if (curActVisPanelCode == visPanelCode) {
        var showTablePanelName = GetTablePanelName(visPanelCode);
        InvertShowPanel(showTablePanelName);

        if (showPanel)
            document.getElementById(actId).getElementsByTagName("IMG")[0].src = panelThumbFreezeImage.src;
        else
            curActVisPanelCode = null;
    }
    else {
        curActVisPanelCode = visPanelCode;

        showPanel = false;
        var showTablePanelName = GetTablePanelName(visPanelCode);
        InvertShowPanel(showTablePanelName);

        document.getElementById(actId).getElementsByTagName("IMG")[0].src = panelThumbFreezeImage.src;
    }
    
    if (visPanelCode != "PositionsPanel" /*&& document.getElementById("PositionsPanelThumb").style.display != "none"*/)
    {
        SetVisible(document.getElementById("PositionsPanelPanel"));
        SetVisible(document.getElementById("PositionsTablePanel"));
    }
    if (visPanelCode != "OrdersPanel" /*&& document.getElementById("OrdersPanelThumb").style.display != "none"*/)
    {
        SetVisible(document.getElementById("OrdersPanelPanel"));
        SetVisible(document.getElementById("OrdersTablePanel"));
    }
    if (visPanelCode != "InformerPanel" /*&& document.getElementById("InformerPanelThumb").style.display != "none"*/)
    {
        SetVisible(document.getElementById("InformerPanelPanel"));
        SetVisible(document.getElementById("InformerTablePanel"));
    }
    /*if (visPanelCode != "Level2Panel" && document.getElementById("Level2PanelThumb").style.display != "none")
    {
        SetVisible(document.getElementById("Level2PanelPanel"));
        SetVisible(document.getElementById("Level2TablePanel"));
    }*/
    if (visPanelCode != "BalancePanel" /*&& document.getElementById("BalancePanelThumb").style.display != "none"*/)
    {
        SetVisible(document.getElementById("BalancePanelPanel"));
        SetVisible(document.getElementById("BalanceTablePanel"));
    }
    if (visPanelCode != "ExpositionPanel" /*&& document.getElementById("ExpositionPanelThumb").style.display != "none"*/)
    {
        SetVisible(document.getElementById("ExpositionPanelPanel"));
        SetVisible(document.getElementById("ExpositionTablePanel"));
    }
    if (visPanelCode != "BetsPanel" /*&& document.getElementById("BetsPanelThumb").style.display != "none"*/)
    {
        SetVisible(document.getElementById("BetsPanelPanel"));
        SetVisible(document.getElementById("BetsTablePanel"));
    }
    if (visPanelCode != "NewTradePanel" /*&& document.getElementById("NewTradePanelThumb").style.display != "none"*/)
    {
        SetVisible(document.getElementById("NewTradePanelPanel"));
        SetVisible(document.getElementById("NewTradesTablePanel"));
    }
    if (visPanelCode != "OrderBookPanel" /*&& document.getElementById("OrderBookPanelThumb").style.display != "none"*/)
    {
        SetVisible(document.getElementById("OrderBookPanelPanel"));
        SetVisible(document.getElementById("OrderBookTablePanel"));
    }
    if (visPanelCode != "NewsPanel" /*&& document.getElementById("NewsPanelThumb").style.display != "none"*/)
    {
        SetVisible(document.getElementById("NewsPanelPanel"));
        SetVisible(document.getElementById("NewsTablePanel"));
    }


    

//    for (var i = 0; i < ev.srcElement.parentElement.children.length; i++) {

//        if (ev.srcElement.parentElement.children[i].id.search("Caption") != -1)
//        {
//            if (ev.srcElement.parentElement.children[i].id.replace("Caption", "Panel") != visPanel) {

//                ev.srcElement.parentElement.children[i].className = 'PassivePanelCaption';
//                SetVisible(document.getElementById(ev.srcElement.parentElement.children[i].id.replace("Caption", "Panel")), false);
//            }                    
//        }


//    }

    //
    SetVisible(document.getElementById(visPanel), true);
    //ev.srcElement.className = 'ActivePanelCaption';

    //
    // Смена активной панели
    //
    if (gridViewManager != null)
        gridViewManager.SelectFirstRow(visPanelCode);

    lastActId = actId;
    
    
 }
