﻿/**
 * @abstract Класс Panel.
**/
var typePanel = "panel";
var typePanelWordstat = "panelWordstat";
var typePanelCampaign = "panelCampaign";

var currentShowedTabIndex = null;

var panelCorrectionHeight = -1;
var _panelsHeight = -1;
// STUB - теперь панели left и right, но они по-прежнему думаю должны поддерживать вставку любых табов
// зы тут был код, теперь его нет, но суть та же самая
function getPanelInst()
{
    var panel = new Object();

                panel.Type = typePanel;
                
                panel.Id = getObjUniqueId();
                Objects[panel.Id] = panel;
                
                // Табы
                panel.Tabs = new Array();
                panel.jqTabs = null;
                
                panel.Index = -1;
                
                // insertTab(objTab)
                panel.insertTab = function (objTab, addCloseIcon)
                {
                    if (addCloseIcon == null)
                    {
                        addCloseIcon = true;
                    }
                    //alert(objTab.Name + ":" + addCloseIcon);
                    this.Tabs[this.Tabs.length] = objTab;
                    objTab.Index = this.Tabs.length-1;
                    var strTabUniqueId = '#panelTab-' + this.Index + '-' + objTab.Index;
                    var strTabUniqueId2 = 'panelTab-' + this.Index + '-' + objTab.Index; // STUB это писал хз кто
                    var strTabUniqueId3 = 'panelTab-reloader-' + this.Index + '-' + objTab.Index; // STUB это писал хз кто
                    
                    //alert('panel: ' + Objects[panel.Id].Type + ', objTab: ' + Objects[objTab.Id].Type);
                    
                    this.jqTabs.tabs('add', strTabUniqueId, '<img src="css/img/ajax-loader-white.gif" class="tabLoader invisible ' + strTabUniqueId2 + '" /><img src="css/img/tabReloader.gif" style="cursor:hand" class="tabReloader invisible ' + strTabUniqueId3 + '" onclick="getObjectById(\'' + objTab.Id + '\').Controls[0].ProcessKeyword(getObjectById(\'' + objTab.Id + '\').Name);" /><b>' + objTab.Name + '</b>' + ((addCloseIcon == true) ? '<img src="css/img/iClose.gif" class="closeButton" onclick="getObjectById(\''+panel.Id+'\').CloseCurrentTab(\'' + objTab.Id + '\'); tabResize(); return false;" style="cursor:pointer; margin-left: 8px; "  />' : ''));
                    //alert('zzz');
                    objTab.jqTabName = $('a[@href*=' + strTabUniqueId+ ']', this.jq).find('b');
                    
                    
                    objTab.jqContents = $(strTabUniqueId);
                    //$('<button onclick="getObjectById(\''+panel.Id+'\').jqTabs.tabs(\'remove\', '+(objTab.Index)+');">X</button>').appendTo(objTab.jqContents);
                    objTab.panelIndex = this.Index; // STUB можно удалить один из, а лучше оба оставить
                    objTab.Panel = this; // STUB можно удалить один из, а лучше оба оставить
                    this.tabSelect(objTab);
                    return objTab.Index;
                }
                
                // insertNewTab(tabName)
                panel.insertNewTab = function (tabName, addCloseIcon)
                {
                    var tab = getPanelTabInst(tabName);
                    this.insertTab(tab, addCloseIcon);
                    return tab;            
                }

                panel.objGetSelectedTab = function ()
                {
                    var tabIndex = this.objGetSelectedTabIndex();
                    return this.Tabs[tabIndex];
                }
                panel.objGetSelectedTabIndex = function ()
                {
                    var tabIndex = this.jqTabs.data('selected.tabs');
                    return tabIndex;
                }
                
                panel.tabSelect = function (objTab)
                {
                    this.jqTabs.tabs('select', objTab.Index);
                }
                
                panel.Focus = function ()
                {
                    //alert('panel ' + this.Index + ' focused');
                    var selectedTab = this.objGetSelectedTab();
                    selectedTab.Focus();
                }
                
                panel.keyDown = function ()
                {
                    //alert('asd');
                    var selectedTab = this.objGetSelectedTab();
                    
                    if (selectedTab!=null)
                    {
                        selectedTab.keyDown();
                    }
                }
                
                panel.CloseTab = function(strTabUniqueId, tabIndex)
                {
                    $(strTabUniqueId).remove();
                    this.jqTabs.tabs('remove', tabIndex);
                    //alert('closing tab: ' + strTabUniqueId + " -- " + tabIndex);
                }
                
                panel.CloseCurrentTab = function(objTabId)
                {
                    var tabIndex = panel.jqTabs.data('selected.tabs');
                    var objTab = Objects[objTabId];
                    if (panel._lastSelectedTabIndex != null)
                    {
                        //panel.jqTabs.tabs('select', index-1);
                        panel.jqTabs.tabs('remove', tabIndex);
                        var Indexes2Del = new Object();
                        for (x in objTab.Controls)
                        {
                            var wsTab = objTab.Controls[x];
                            if (wsTab.Type == typeWordstatTabsControl)
                            {
                                delete Objects[wsTab.Id+""];
                                Indexes2Del[x] = true;
                            }
                        }
                        for (y in Indexes2Del)
                        {
                            delete objTab.Controls[y];
                        }
                    }
                    

/*                    
                    var tabIndex = panel.objGetSelectedTabIndex();
                    
                    alert('Current tab is: ' + tabIndex);
                    this.jqTabs.tabs('select', tabIndex-1);
                    tabIndex = panel.objGetSelectedTabIndex();
                    
                    alert('2. Current tab is: ' + tabIndex);
                    this.jqTabs.tabs('remove', tabIndex);
                           */
                    tabResize();
                }
                
                panel.fDeleteNextSelectedTab = false;
                
                panel.DelTabClicked = function()
                {
                    //alert(panel._lastSelectedTabIndex);//panel.jqTabs.data('selected.tabs'));
                }
                
                panel.MarkNextSelectedTab2Del = function()
                {
                    panel.fDeleteNextSelectedTab = true;
                }
                
                return panel;
            }
            
            
function objGetPanel(panelIndex)
{
    var panel = Panels[panelIndex];
    return panel;
}

var selectedPanel = null;
function makePanelSelected(objPanel)
{
    selectedPanel = objPanel;
    objPanel.Focus();
    return objPanel;
}

// Панели
var Panels = new Array();
function GetAnotherPanel(panel)
{
    for (x in Panels)
    {
        var anotherPanel = Panels[x];
        if (anotherPanel!= panel)
        {
            return anotherPanel;
        }
    }
    return null;
}

function addNewPanel(sPanelType)
{
    if (sPanelType == "")
    {
        sPanelType = typePanelWordstat;
    }
    
    // Создаем объект панели
    var panel = getPanelInst();
    
    // Ставим индекс
    panel.Index = Panels.length;
    // Добавляем панель в общий пул
    Panels[Panels.length] = panel;
                    
    // Генерим jQuery-объект панели
                    
    var panelWidth = $(document).width()/2-20;
                    
    var code;
    // STUB да, это жепь, но со временем ахтунг
    if (sPanelType != typePanelCampaign)
    {
    code = '<div class="tab tabL panel"><div class="box"><div class="inbox">'
            //+ '<a href="#" onclick="getObjectById(\''+panel.Id+'\').addWordstatTab(); return false;" title="Вордстат"><img src="img/ico_wordstat.gif" alt="Вордстат" /></a>&nbsp;'
            //+ '<a href="#" onclick="getObjectById(\''+panel.Id+'\').addCampaignTab(); return false;" title="Кампания"><img src="img/ico_buffer.gif" alt="Кампания" /></a>&nbsp;'
              + '<div class="topPanelBlock">'
              + '<span class="zapros"><strong>Запрос:</strong> </span>'
              + '<input onfocus="this.select()" id="keywordInput" class="keyword fl_l zapros-field" type="text" value="недвижимость" onkeypress="'
              +     'if (getKeyCode(event) == 13)'
              +     '{'
              +         'this.focus(); this.select(); getObjectById(\'' + panel.Id + '\').addWordstatTab($(this).attr(\'value\').escapedHTML()).ProcessKeyword($(this).attr(\'value\').escapedHTML()); ' // STUB тут что-то не возвращается из ProcessKeyword
              +     '}"/>'
              + ' <a href="#" class="likesubmit" onclick="getObjectById(\'' + panel.Id + '\').addWordstatTab($(\'input\', $(this).parent()).attr(\'value\').escapedHTML()).ProcessKeyword($(\'input\', $(this).parent()).attr(\'value\').escapedHTML());tabResize();">Получить статистику по слову</a>'
              // STUB здесь этот блок для синхронности левой панели с правой в нижних паддингах/маргинах topPanelBlock'а (в правой панели он нужен, ну в левой бонусом идет, плюс наверняка пригодится, если изменится ширина инпута левой панели)
              + '<div style="clear: left"></div>'
              + '</div>'
              + '<div class="panelTabAddcontainer"><ul class="panelTabUl">'
              +     '<li><a href="#tmp_tab"><span>Загрузка...</span></a></li>'
              + '</ul>'
							+ '<div class="word-filter">'
							+ '<div class="content-box">'
							+ 'Фильтр по словам <label><input type="checkbox" />1x</label> <label class="checked"><input type="checkbox" />2x</label> <label><input type="checkbox" />3x</label> <label><input type="checkbox" />4x</label> <input type="text" class="typetext" /> <i class="filter-button" title="фильтровать">фильтровать</i>'
							+ '</div>'
							+' </div>'
              + '<div id="tmp_tab"></div>'
              + '</div>'
              + '<div class="campaign-tabs-preambula"><!-- контент вставлять сюда --> '
			  + '<ol>'
			  + '<li>1. <span>Вводите запросы сюда <a href="#" class="img arrow-up" onclick="$(\'#keywordInput\').focus().select(); return false;" title="Перейти к полю ввода ключевых слов">Перейти к полю ввода</a></span></li>'
			  + '<li>2. <span>Перетаскивайте слова в объявления <span id="draggableindexPageHelp" class="img drag-there" title="Попробуйте перетащить этот элемент в одно из рекламных объявлений, находящихся в правой панели">Попробуйте перетащить этот элемент в одно из рекламных объявлений, находящихся в правой панели</span></span></li>'
			  + '<li>3. <span>Запускайте кампании через <a href="#" onclick="$(\'#elama-menu\').click(); return false;" title="Кликните здесь для открытия eLama-меню. Можно, так же, кликать по самому eLama-меню :)">eLama-меню</a></span></li>'
			  + '</ol>'
			  + '<div class="content-row">'
			  + '<a href="#" class="content-cell watch-video" onclick="$(\'#watch-video\').dialog(\'open\')">Смотреть обучающее видео</a>'
			  + '<a href="#" class="content-cell manual" onclick="$(\'#read-man\').dialog(\'open\')">Читать краткое описание</a>'
			  + '</div>'
              + '</div>'
              + '</div>'
              + '</div></div>';
    }
    else
    {
    code = '<div class="tab panel tabR"><div class="box"><div class="inbox">'
              + '<div class="topPanelBlock">'
              + '<a href="#" class="toolStripButton" style="float: left; background-image: url(\'css/img/iAdd.gif\');" onclick="var campaignControl=getObjectById(\''+panel.Id+'\').objGetSelectedTab().Controls[0]; var ad=campaignControl.AddNewAd(); campaignControl.PageToLast(); ad.SetChecked(true); oddShuffle(); return false;" title="Новое объявление">Новое объявление</a>'
	      	  //+ '<a href="#" class="toolStripButton" style="float: left; background-image: url(\'css/img/iAdd.gif\');" onclick="var campaignControl=getObjectById(\''+panel.Id+'\').objGetSelectedTab().Controls[0]; var ad=campaignControl.SetAdsCollapsed(true); return false;" title="Свернуть все">Свернуть все</a>'
	      	  //+ '<a href="#" class="toolStripButton" style="float: left; background-image: url(\'css/img/iAdd.gif\');" onclick="var campaignControl=getObjectById(\''+panel.Id+'\').objGetSelectedTab().Controls[0]; var ad=campaignControl.SetAdsCollapsed(false); return false;" title="Развернуть все">Развернуть все</a>'
              // + '<a href="#" class="toolStripButton" style="float: left; background-image: url(\'css/img/iAdd.gif\');" onclick="for (var i=1; i<=100; i++) { var ad = getObjectById(\''+panel.Id+'\').objGetSelectedTab().Controls[0].AddNewAd(); ad.SetChecked(true); ad.adHeaderInput.SetValue(\'Объявление номер \' + i + \' Елама\'); ad.SetCollapsed(true); oddShuffle(); } return false;" title="Десять новых объявлений">Десять новых объявлений</a>'
              // + '<a href="#" class="toolStripButton" style="float: left; background-image: url(\'css/img/iEdit.gif\');" onclick="getObjectById(\''+panel.Id+'\').objGetSelectedTab().Controls[0].AddNewAd(); return false;" title="Новое объявление">Новое объявление</a>&nbsp;'
              // + '<a href="#" class="toolStripButton" style="float: left; background-image: url(\'css/img/iDelete.gif\');" onclick="getObjectById(\''+panel.Id+'\').objGetSelectedTab().Controls[0].AddNewAd(); return false;" title="Новое объявление">Новое объявление</a>&nbsp;'
              + '<input class="keyword keywordplus" type="text" value="поиск по кампании" onkeypress="'
              +     'if (getKeyCode(event) == 13)'
              +     '{'
              +         'this.focus(); this.select(); getObjectById(\'' + panel.Id + '\').addWordstatTab($(this).attr(\'value\').escapedHTML()).ProcessKeyword($(this).attr(\'value\').escapedHTML()); ' // STUB тут что-то не возвращается из ProcessKeyword
              +     '}"/>'
              + ' <a href="#" class="likesubmit" onclick="getObjectById(\'' + panel.Id + '\').addWordstatTab($(\'input\', $(this).parent()).attr(\'value\').escapedHTML()).ProcessKeyword($(\'input\', $(this).parent()).attr(\'value\').escapedHTML());">Поискать в кампании</a>'
              + '<div style="clear: left"></div>'
              + '</div>'
              + '<a href="#" onclick="Panels[1].Tabs[0].Controls[0].GetExcel(); return false;" class="run_new_camp">Запустить кампанию!</a>'
              + '<div class="panelTabAddcontainer _panelTabAddcontainer"><ul class="panelTabUl">'
              +     '<li><a href="#tmp_tab"><span>Загрузка...</span></a></li>'
              + '</ul></div>'
              + '<div id="tmp_tab"></div>'
              + '</div></div></div>';
    }
    
    var jqPanel = $(code);
                    
    // Добавляем полученный jQuery-объект в дом
    jqPanel.appendTo('#globalPanelsContainer');
                    
    if (panelCorrectionHeight<0)
    {
        panelCorrectionHeight = $('.topPanelBlock').height();//.replace("px","");
        //alert(panelCorrectionHeight);
    }
    
    var max = $(window).height();
    var res = max - panelCorrectionHeight - 27;
    _panelsHeight = res;
		//alert(max);
    //alert (panelCorrectionHeight + "-" + max + "-" + res);
//    jqPanel.attr("height", res);//думаю, что это необязательно, да и бесполезно
    // Инициализируем табы и удаляем темповый таб
    var jqPanelTabs = $('ul.panelTabUl', jqPanel);
    jqPanelTabs.tabs({ });
    jqPanelTabs.tabs('remove', 0);
      
    // Обновляем jQuery-объект панели
    panel.jq = jqPanel;
    panel.jqTabs = jqPanelTabs;
    
    panel.jqTabs.bind('tabsremove', function(event, ui){
        //setStatus('tabsremove: ' + panel.jqTabs.data('selected.tabs'));
        });
    panel.jqTabs.bind('tabsload', function(event, ui){
        // alert('tabsload: ' + ui.index + ":" + panel.jqTabs.data('selected.tabs'));
        });
    panel.jqTabs.bind('tabsselect', function(event, ui){
        //alert('tabsselect: ' + panel.jqTabs.data('selected.tabs'));
         $('.closeButton', panel.jqTabs).addClass('invisible');
        });
    
    panel.jqTabs.bind('tabsshow', function(event, ui) {
        //alert('tabsshow: ' + panel.jqTabs.data('selected.tabs'));
        /*var a = panel.jqTabs.data('selected.tabs');
        if (panel.fDeleteNextSelectedTab == true)
        {
            panel.fDeleteNextSelectedTab = false;
            panel.jqTabs.tabs('remove', a);
        }*/
        panel._lastSelectedTabIndex = panel.jqTabs.data('selected.tabs');
        if (panel.fDeleteNextSelectedTab == true)
        {
            panel.fDeleteNextSelectedTab = false;
            panel.jqTabs.tabs('remove', panel._lastSelectedTabIndex);
        }
        $('.closeButton', ui.tab).removeClass('invisible');
            }
        
    );

    
    
    panel.addWordstatTab = function(sKeyword, bClearKeyword)
    {
        if (bClearKeyword != false)
        {
            bClearKeyword = true;
        }
        if (bClearKeyword == true)
        {
            sKeyword = ClearKeyword(sKeyword);
        }
        if (sKeyword=="")
        {
            sKeyword = "недвижимость";
        }
        
        if (sKeyword.length> 30)
        {
            sKeyword = sKeyword.substr(0,27) + "...";
        }
        
        // STUB addWordstatTab и addCampaignTab следует объеденить
        var objTab = panel.addNewTab(sKeyword);
        var wordstatTab = getWordstatTabsControlInst(objTab.getNextControlId());
        objTab.addControl(wordstatTab);
        wordstatTab.Parent = objTab;
        //alert("objTab: " + objTab.Type + ", wordstatTab: " + wordstatTab.Type);
        return wordstatTab;
    }
    
    panel.addCampaignTab = function(sTabName, addCloseIcon, sASFilter)
    {
        // STUB addWordstatTab и addCampaignTab следует объеденить
        if (sTabName == null)
        {
            sTabName = 'Кампания';
        }

        var objTab = panel.addNewTab(sTabName, addCloseIcon);
        var nextControlId = objTab.getNextControlId();
        var campaignControl = getCampaignControlInst(nextControlId, sASFilter);
        
        campaignControl.SelectAdByIndex(0);
        objTab.addControl(campaignControl);
        campaignControl.Parent = objTab;
        return campaignControl;
    }
                        
    panel.addNewTab = function (tabName, addCloseIcon)
    {
        var tab = panel.insertNewTab(tabName, addCloseIcon);
        return tab;
    }

    if (sPanelType == typePanelCampaign)
    {
        // STUB этпиздец :-/ панели отрефакторить как сучек
        var eLamaTab = '<strong class="eLamaTab">eLama.ru</strong>';
        var yandex = '<strong class="yandex"><b>Я</b>ндекс</strong>';
        var begun = '<strong class="begun">Бегун</strong>';
        var google = '<strong class="google">G<b class="o_e_letter">o</b><b class="o_letter">o</b>g<b class="l_letter">l</b><b class="o_e_letter">e</b></strong>';
        var objElamaTab = panel.addCampaignTab(eLamaTab, false, asElama);
        panel.addCampaignTab(yandex, false, asYandex);
        panel.addCampaignTab(begun, false, asBegun);
        panel.addCampaignTab(google, false, asGoogle);
        
        panel.jqTabs.tabs('select', 0);
        
        if (startup_AutoAddAds == true)
        {
            for (var i=0; i<=2; i++) // Здесь неявно указывается количество создаваемых на старте объявлений
            {
                objElamaTab.AddNewAd();
            }
        }
    }
    return panel;
}

//STUB вот так вот закрываются табы (переменная метится true в обработчике клика по картинке-закрывашке таба)
var _nextShowedTabShouldBeClosed = false;
            
            
            // Табы панелей
            var typePanelTab = "panelTab";
            function getPanelTabInst(tabName)
            {
                var tab = new Object();
                tab.Name = tabName;
                tab.Id = getObjUniqueId();
                Objects[tab.Id] = tab;
                tab.Index = -1;
                tab.Type = typePanelTab;
                //tab.jq = null;
                tab.jqContents = null;
                tab.panelIndex = -1;
                
                tab.jqTabName = null; // Заполняется в panel.insertTab
                
                tab.Panel = null
                
                tab.Controls = new Array();
                
                tab.addContents = function(jqContentsElement)
                {
                    if (jqContentsElement == null)
                    {
                        alert("В метод tab.addContents передан пустой аргумент");
                    }
                    else
                    {
                        // STUB 31 не удалять
                        jqContentsElement.appendTo(this.jqContents);
                        $('.droppable')
                        .droppable({
                            accept: function(draggable)
                            {
                                    return $(draggable).is('a.keyword');
                            },
                            activeClass: 'droppable-active',
                            hoverClass: 'droppable-hover',
                            drop: function(ev, ui) { //alert ('drop2');
                                    $(this).append($(document.createElement('div')).text($(ui.draggable).text()));
                            }
                        });
                    }
                }
                
                tab.SetTabName = function(sNewName)
                {
                    if (this.jqTabName != null)
                    {
                        this.jqTabName.text(sNewName);
                    }
                }
                
                tab.addControl = function (objControl)
                {
                    this.Controls[this.Controls.length] = objControl;                    
                    this.addContents(objControl.jq);
                }
                
                tab.getNextControlId = function ()
                {
                    var ret = this.Panel.Index + "-" + this.Index + "-" + this.Controls.length;
                    return ret;
                }
                
                tab.FindParentPanel = function()
    {
        // STUB копипаст. Сделать прототайпом в фабрике или типа того
        // STUB конкретно в этой сущности берется .Panel вместо .Parent. Привести к единому интерфейсу таки.
        var parent = tab.Panel;
        if (parent==null) return null;
        if (parent.Type != typePanel)
        {

            return parent.FindParentPanel();
        }
        else
        {
            return parent;
        }
    }
                
                tab.Focus = function ()
                {
                    // STUB здесь всегда выделяется первый контрол - бага от неясности, как это все в итоге будет выглядеть
                    var control = this.Controls[0];
                    if (control!=null)
                    {
                        control.Focus();
                    }
                }
                return tab;
            }
            
            
            // работает только для двух панелей
            function switchPanels()
            {
                var panel2select = null;
                if (selectedPanel == null)
                {
                    if (Panels.length < 2)
                    {
                        alert('Панелей меньше двух!');
                        return null;
                    }
                    else
                    {
                        panel2select = Panels[0];
                    }
                }
                else
                {
                for (x in Panels)
                {
                    var panel = Panels[x];
                    if (panel.Index != selectedPanel.Index)
                    {
                        panel2select = panel;
                    }
                }
                }
                makePanelSelected(panel2select);
                return panel2select;
            }
            
            function jqGetPanel(index)
            {
                var jqPanel = $('.panel').get(index);
                return $(jqPanel);
            }
            
            function addNewTab(objPanel, tabName)
            {
                var tab = objPanel.insertNewTab(tabName);
                return tab;
            }
