﻿/**
 * @abstract Класс WordstatTabsControls
**/

var _wordstat = 1; // STUB потом эти дефинишины сделать либо через базовый класс, либо просто в одно место свести
var _wordstatModeLocal = false;

var objWordstatTabsControls = new Array();


function objGetWordstatTabsControl(strId)
{
    for (x in objWordstatTabsControls)
    {
        if (objWordstatTabsControls[x].GetTabsContainerId() == strId)
        {
            return objWordstatTabsControls[x];
        }
    }
    return null;
}

var typeWordstatTabsControl = "wordstatTabsControl";
function getWordstatTabsControlInst(strControlUniqueIdentifier)
{
    var inst = new Object();
    
    inst.Type = typeWordstatTabsControl;
    
    inst.Id = getObjUniqueId();
    
    Objects[inst.Id] = inst;
    
    inst.Keywords = new Array();

    inst.addKeyword = function ()
    {
        
    }
    
    // wordstatTabsControlInst
    inst.getOuterXML = function()
    {
        var ret = "<wT>";
        
        ret += "<wTn>";
        
        var bGood = false; // STUB типа временный воркэраунд-хак от сохранения пустых вордстаттабов.
        
        for (x in this.TreeNodes)
        {
            var treeNode = this.TreeNodes[x];
            if (treeNode.Nodes.length>0)
            {
                ret += treeNode.getOuterXML();
                bGood = true;
            }
        }
        
        if (bGood == false)
        {
            return "";
        }
        ret += "</wTn>";
        
        ret += "</wT>";
        return ret;
    }
    
    // WordstatTabsControlInst
    inst.LoadXML = function(xml)
    {
        var firstTreeNode = null;
        inst.ClearTreeNodes();
        $('tN', xml).each ( function(index)
                                 {
                                    var treeNode = objGetTreeNodeInst();
                                    inst.AddTreeNode(treeNode);
                                    treeNode.LoadXML(this);
                                    if (firstTreeNode == null)
                                    {
                                        firstTreeNode = treeNode;
                                        if (firstTreeNode.Nodes.length>0)
                                        {
                                            inst.Parent.SetTabName(firstTreeNode.Nodes[0].Values[0]);
                                        }
                                    }
                                 } );
    }
    
    inst.TabsNumber = 0;
    // Идентификатор согласно общей адресации id'шников (ояебу)
    inst.UniqueIndentifier = strControlUniqueIdentifier;
    
    
    inst.SelectedWord = null;
    
    inst.GetTabsContainerId = function ()
    {
        var wordstatTabContainerId = 'wordstat-tab-container-' + this.UniqueIndentifier;
        return wordstatTabContainerId;
    }
    inst.Parent = null;
    inst.GetUniqueTabId = function ()
    {
        var a = 'wordstat-tab-' + this.UniqueIndentifier + "-" + this.TabsNumber;
        this.TabsNumber++;
        return a;
    }
    
    // Работа с нодами и тринодами
    inst.TreeNodes = new Array();
    inst.AddTreeNode = function (treeNode)
    {
        this.CorrectContentHeight();
        this.TreeNodes[this.TreeNodes.length] = treeNode;
        treeNode.Parent = this;
        treeNode.jq.appendTo($('.content', this.jq));
    }
    inst.RemoveTreeNode = function (treeNode)
    {
        for (x in this.TreeNodes)
        {
            var exTreeNode = this.TreeNodes[x];
            
            if (exTreeNode == treeNode)
            {
                delete this.TreeNodes[x];
                exTreeNode.jq.remove();
                break;
            }
        }
    }
    inst.ClearTreeNodes = function()
    {
        for (x in this.TreeNodes)
        {
            var treeNode = this.TreeNodes[x];
            this.RemoveTreeNode(treeNode);
        }
    }
    
    inst.CorrectContentHeight = function()
    {
        //alert(_panelsHeight);
        if($('.word-filter').is(':visible') ){
            $('.content', this.jq).height(_panelsHeight - 94);
        } else {
            $('.content', this.jq).height(_panelsHeight - 57);            
        }
    }
    
    inst.MarkLoading = function()
    {
        //alert('mark loading');
        var strTabUniqueId = 'panelTab-' + inst.Parent.Panel.Index + '-' + inst.Parent.Index;
        $('.' + strTabUniqueId).removeClass("invisible");
    }
    inst.UnMarkLoading = function()
    {
        //alert('mark unloading');
        var strTabUniqueId = 'panelTab-' + inst.Parent.Panel.Index + '-' + inst.Parent.Index;
        $('.' + strTabUniqueId).addClass("invisible");
    }
    inst.ProcessKeyword = function (sKeyword, bClearWord)
    {
        if (bClearWord != false)
        {
            bClearWord = true;
        }
        
        //alert(inst.Type + " :: " + sKeyword);
        
        if (bClearWord == true)
        {
            sKeyword = ClearKeyword(sKeyword);
        }
        
        inst.MarkLoading();
        var tabsContainerId = inst.GetTabsContainerId();
        var tabId = inst.GetUniqueTabId();
    

        //$('#' + tabsContainerId + ' > ul').tabs('add', '#' + tabId, keyword);


        var treeNode = this.TreeNodes[0];
        //this.AddTreeNode(treeNode);
        // вместо него
        //treeNode.jq.appendTo(this.TreeNodes[0].jq);//jqGetSelectedKeywordTab());
        //$('#' + tabsContainerId + ' > ul').tabs('select', $('#' + tabsContainerId + ' > ul > li').length-1);
        
        

        if ((fDebug == true) && (fDebugWordstat == true))
        {
            if (treeNode !=null )
            {
                for(var i =0; i<50; i++)
                {
                    var node = objGetNodeInst();
                    node.SetValue(0, "хуй");
                    treeNode.AddNode(node);
                }
            }
        }
        else
        {
            containerLoadWords(treeNode, null, sKeyword, false);
        }

        //InitialRequest(keyword, $('#' + tabId), this);
    }
    inst.ProcessKeywordEntered = function ()
    {
        var keywordInput = this.jqGetInput();
        var keyword = keywordInput.attr('value');
        this.ProcessKeyword(keyword);
        keywordInput.focus(); keywordInput.select();
    }
    
    inst.jqGetSelectedKeywordTab = function()
    {
        var selectedTabIndex = this.jqTabs.data('selected.tabs');
        var tab = $('ul', this.jq).next('.content').get(0);
        return tab;
    }
    
    inst.jqGetInput = function ()
    {
        var ret = $('input.keyword', this.jq);
        return ret;
    }
    
    inst.Focus = function ()
    {
        //alert('wordstat tab focused');
        if (this.SelectedWord != null)
        {
            this.SelectedWord.Focus();
        }
    }
    
    inst.keyDown = function()
    {
        //alert('wordstat tab down');
        if (this.SelectedWord!= null)
        {
            if (this.SelectedWord.Index < this.Keywords.length-1)
            {
                this.SelectedWord.Unfocus();
                this.SelectedWord = this.Keywords[this.SelectedWord.Index+1];
                this.Focus();
            }
        }
    }
    
    inst.ReloadControl = function (bVisible)
    {
        var strTabUniqueId = 'panelTab-reloader-' + inst.Parent.Panel.Index + '-' + inst.Parent.Index;
        if (bVisible == true)
        {
            $('.' + strTabUniqueId).removeClass('invisible');
        }
        else
        {
            $('.' + strTabUniqueId).addClass('invisible');
        }
    }
    
    inst.SetMessage = function (sMessage)
    {
	var treeNode = null;
	if (inst.TreeNodes.length < 1)
	{
	    treeNode = objGetTreeNodeInst();
	    inst.AddTreeNode(treeNode);
	}
	else
	{
	    treeNode = inst.TreeNodes[0];
	}
	treeNode.SetMessage(sMessage);
    }
    
    var tabsContainerId = inst.GetTabsContainerId();
    var tabId = inst.GetUniqueTabId();
    
    
    var jq  =             $(' ' +
                            '<div id="' + tabsContainerId + '">' +
                            /*'<span style="color: #646464;">Запрос: </span>' +
			    '<input class="keyword bordered" style="border-color: #cfcfcf; color: #808080;" type="text" value="недвижимость" onkeypress="' +
                                'if (getKeyCode(event) == 13)' + 
                                '{' +
                                    'objGetWordstatTabsControl(\'' + tabsContainerId + '\').ProcessKeywordEntered(); return false;' +
                                '}"/>' +
                            ' <button style="background: url(\'img/iEnter.gif\') top left no-repeat; border: none; width:22px; height:18px;" onclick="objGetWordstatTabsControl(\'' + tabsContainerId + '\').ProcessKeywordEntered();"></button>' +
   */
                            //'<div id="statusInformer-' + '11111STUB' + '"></div><br/>' +
			    //'<br/>' + //<button onclick="CopySelectedKeywords();">&lt;&lt;</button><br/>' +
			    //'<ul>' +
                            //    '<li><a href="#' + tabId + '"><span></span></a></li>' +
                            //'</ul>' +
                            '<div class="content" id="' + tabId + '">'+
                            '</div>' +
                            '</div>');
    
    //$('ul', jq).tabs({ });
    //$('ul', jq).tabs('remove', 0);
    inst.jq = jq;
    //inst.jqTabs = $('ul', jq);
    
    inst.jqInputKeyword=$('input.keyword', inst.jq);
    
    inst.SetKeywordInputValue = function (sValue)
    {
        inst.jqInputKeyword.attr("value", sValue);
    }
    
    
    var treeNode = objGetTreeNodeInst();
    inst.AddTreeNode(treeNode);
    
    objWordstatTabsControls[objWordstatTabsControls.length] = inst;
    return inst;    
}



function InitialRequest(keyword, jqTab, objWordstatTab)
{
    var el = GetContainerElementInst(keyword, true, true, true);
    $(el).appendTo(jqTab);   
    $(el).attr('id','wordstat-global-container');
    myload(keyword, el, false, false, objWordstatTab);
}

function myload(keyword, containerGlobal, toggleVisibility, skipFirstWord, objWordstatTab)
{
    setStatus ("Загрузка данных...", true);
        if (toggleVisibility == true)
        {
          $(containerGlobal).toggleClass("invisible");
        }
        if (containerUnloaded(containerGlobal) == true)
        {
            containerLoadWords(containerGlobal, keyword, skipFirstWord);
        }
        else
        {
        }
        return;
}
function containerLoadWords(objTreeNode, objParentNode, keyword, skipFirstWord, pagenumber, getRightWords)
{
    if (getRightWords != true)
    {
        getRightWords = false;
    }
    // pg = 0
    // 50-0
    // 100-50-0
    
    /*
    var p = "0";
    for (var i = 1; i< pagenumber; i++)
    {
        p = i * 50 + "-" + p;
    }
    */
    if (pagenumber == null)
        pagenumber = 1;
    //alert ('ws: ' + pagenumber);
    //alert('containerLoadWords');
    // STUB убрать отсюда ссылку на __regionsCode ?
    var url = "myParser.php?keyword=" + encodeURI(keyword) + "&geo=" + encodeURI(__regionsCode) + "&pagenumber=" + pagenumber;
    //var url = "myParser.xml";
    if (_wordstatModeLocal == true)
    {
        url = "myParser.xml";
        setStatus("Обращаемся к локальному вордстату...", true);
    }
    else
    {
        setStatus("Обращаемся к вордстату в инете...", true);
    }
    
    //alert(url);
    if (objParentNode != null)
    {
        objTreeNode = objParentNode.ParentTreeNode;
        objParentNode.MarkLoading(true);
        objParentNode.ReloadControl(false);
    }
    objTreeNode.Parent.ReloadControl(false);
    objTreeNode.Parent.MarkLoading();
    // старое
    //elContainer = $(elContainer);
    
    //url = "file:///d:/wordstat.xml";
    
    var xepRequest = objGetXEPRequest();
    
    var command = XEPGetSimilar;
    if (getRightWords == true)
    {
        command = XEPGetAssociated;
    }
    xepRequest.AddPart(command, { "keyWord": keyword,
                                        "regions": __regionsCode,
                                        "pageNumber": pagenumber });
    xepRequest.Perform(function (response)
                       {
                            // WIN
                            //alert(response.Status);
                            // Ставим статусы
                            setStatusOK();
                            setStatus ("Разбор полученных данных...", true);
                            
                            var wordsAvailable = false;
                            // STUB Сейчас этот метод переделывается под XEP,
                            // соответственно пока ничего не меняется, просто навесом сверху
                            // разберем пакеты от XEP'а и вставляем инфу в те же массивы, которые разбирались в предыдущей версии
                            if ((response.Status == soapStatusOK)
                                && (response.TheOnlyPart != null)
                                && (response.TheOnlyPart.Status == soapStatusOK))
                            {
				objTreeNode.SetMessage("");
                                // Массив под similar
                                var wordsArrLeft = new Array();
                                var puperIndex = 0;
                                for (x in response.TheOnlyPart.Results)
                                {
                                    var result = response.TheOnlyPart.Results[x];
                                    if (result["wordsAvailable"] != null)
                                    {
                                        wordsAvailable = Boolean(parseInt(result["wordsAvailable"]));
                                    }
                                    else
                                    {
                                        wordsArrLeft[puperIndex] = new Array();
                                        wordsArrLeft[puperIndex]["value"] = result["name"];
                                        wordsArrLeft[puperIndex]["stats"] = result["stats"];
                                        puperIndex++;
                                    }
                                }
                                
                                // Новая рутовая нода
                                var RootNode = objGetNodeInst();
                                
                                // Если рутовая нода передана в стеке, добавляемся к ней
                                if (objParentNode != null)
                                {
                                    RootNode = objParentNode;
                                    lastNode = objTreeNode.GetLastNode();
                                }

                                // Смотрим, а есть ли мальчик
                                if (wordsArrLeft.length > 0)
                                {
                                    // Мальчик есть, начинаем перебирать его члены
                                    for (var i=0; i<wordsArrLeft.length; i++)
                                    {
                                        // Делаем выборку значения и статистики кея 
                                        var word = wordsArrLeft[i]["value"];
                                        var stats = wordsArrLeft[i]["stats"];
                                        
                                        if ((word != null) && (word.length > 0))
                                        {
                                            //alert(word + ' -- ' + stats);
                                            
                                            var node = null;
                                            // Если выбрали первый кей из массива 
                                            if (i == 0)
                                            {
                                                // Смотрим, задана ли в стеке родительская нода, в которую хуярим куеи
                                                if (objParentNode != null)
                                                {
                                                    // Если нода задана, и первый кей из выборки равен кею, хранящемуся в этой ноде, то как бэ скипаем
                                                    if (word == RootNode.Values[0])
                                                    {
                                                        continue;
                                                    }
                                                    // ...в противном случае добавляем новую ноду к рут-ноде (в общем-то, рутнода здесь, если я не ошибаюсь, все равно всегда равно парент-ноде)
                                                    node = objGetNodeInst();
                                                    RootNode.AddNode(node);
                                                }
                                                else
                                                {
                                                    // Если родительская нода не задана, текущей нодой становится рутнода
                                                    node = RootNode;
                                                }
                                            }
                                            else
                                            {
                                                // Если кей не первый, то тупо создаем новую ноду и добавляем ее к руту
                                                node = objGetNodeInst();
                                                RootNode.AddNode(node);
                                            }
                                            // Определившись с тем, кто и где будет новой нодой, а также вставив ее куда следует, заполняем ее значения
                                            node.SetValue(0, word);
                                            node.SetValue(2, stats);
                                        }
                                    }
                                    
                                    
                                    // Ставим радостный статус
                                    setStatus ("Загружено " + wordsArrLeft.length + " слов");
                                    
                                    if (wordsAvailable != true)
                                    {
                                        // Скрываем кнопку "Показать еще"
                                        //objTreeNode.HideMoreButton();
					objTreeNode.HideAssocButton();
                                        // Обновляем индекс "Следующей страницы"
                                    }
                                    else
                                    {
                                        RootNode.SetNextPageNumber(RootNode.NextPageNumber+1);
                                    }
                                    // Отмечаем ноду как загруженную
                                    RootNode.SetLoaded(true);
                                    // Экспандим ее
                                    RootNode.Expand();
                                    
                                    // Если тринода задана, а парентнода через стек не передана, то добавляем нашу рутноду к триноде
                                    if ((objTreeNode !=null) && (objParentNode == null))
                                    {
                                        objTreeNode.AddNode(RootNode);
                                        //RootNode.SetCollapsable(false);
                                    }
                                    //objTreeNode.jq.appendTo(elContainer);
                                    // Снимаем флажок загрузки с парент-ноды, если она таки была указана
                                    // STUB можно ифы оптимизировать :)
                                    if (objParentNode!=null)
                                    {
                                        objParentNode.MarkLoading(false);
                                    }
                                }
                                else
                                {
                                    // Массив пришел пустой // STUB захуярить статусы в XEP'е
                                    objTreeNode.AddMessage('По заданному ключевику запросы отсутствуют');// Проверьте статистику по слову в директе: <a href="http://wordstat.yandex.ru/advq?rpt=ppc&key=&shw=1&tm=&checkboxes=&text=' + keyword + '&regions_text=%C2%F1%E5&regions=">' + keyword + '</a>');
                                    objTreeNode.HideMoreButton();
                                    objTreeNode.HideAssocButton();
                                }
                                
                                // Убираем крутилку ожидания
                                objTreeNode.Parent.UnMarkLoading();
                                // Помечаем контейнер как загруженный. Уже не помню, что это такое
                                //containerMarkLoaded(elContainer);
                            }
                            else
                            {
                                objTreeNode.Parent.UnMarkLoading();
                                
                                if (response.Status == soapStatusOK)
                                {
                                    if (response.TheOnlyPart.Status == soapStatusOK)
                                    {
                                        alert("Неизвестная ошибка запроса к серверу");
                                        setStatus ("ERROR: Неизвестная ошибка запроса к серверу", false, true);
                                    }
                                    else
                                    {
                                        alert("Ошибка запроса к серверу: " + response.TheOnlyPart.StatusMessage); // STUB убрать дубляж фылвпофывфыв
                                        setStatus ("ERROR: " + response.TheOnlyPart.StatusMessage, false, true);
                                    }
                                }
                                else
                                {
                                    alert("Ошибка запроса к серверу: " + response.StatusMessage); // STUB убрать дубляж фылвпофывфыв
                                    setStatus ("ERROR: " + response.StatusMessage, false, true);
                                }
                                if (objParentNode!=null)
                                {
                                    objParentNode.MarkLoading(false);
                                    objParentNode.ReloadControl(true);
                                }
                                else
                                {
                                    objTreeNode.Parent.ReloadControl(true);
                                }
                                //containerMarkUnloaded(elContainer);
                            }
                            tabResize();
                       },
                       function (obj, msg)
                       {
                            // FAIL
                            //alert("ERROR: " + msg + ":" + obj + ":" + exc); // STUB
                            setStatus ("ERROR: " + msg, false, true);
                            // STUB можно ифы оптимизировать :)
                            if (objParentNode!=null)
                            {
                                objParentNode.MarkLoading(false);
                                objParentNode.ReloadControl(true);
                            }
			    objTreeNode.Parent.UnMarkLoading();
                            objTreeNode.Parent.ReloadControl(true);
			    objTreeNode.Parent.SetMessage("Ошибка запроса к серверу");
                            tabResize();
                            //containerMarkUnloaded(elContainer);
                       });
}
function containerMarkLoaded(elContainer)
{
    if ($(elContainer).attr('class').indexOf("unloaded") != -1)
    {
        // STUB сделать ремов вместо этой хуйни, щас нет инета бля
        $(elContainer).attr("class", "words-container");
        $(elContainer).find("img." + emptySignatureClass).remove();
    }
}
function containerMarkUnloaded(elContainer)
{
    $(elContainer).toggleClass("unloaded");
    // STUB обойтись без изъебств
    $(elContainer).find("img." + emptySignatureClass).remove();
}
function containerUnloaded(elContainer)
{
    var a = $(elContainer).attr('class');
    if (a == null)
    {
        return true;
    }
        if ($(elContainer).attr("class").indexOf("unloaded") != -1)
        {
            return true;
        }
        else
        {
            return false;
        }
}
function CopyKeyword2BufferCurrent(strKeyword)
{
	var objBuffer = objGetCurrentBuffer();
	if (objBuffer != null)
	{
		CopyKeyword2BufferSpecified (strKeyword, objBuffer);
	}
}
function CopyKeyword2BufferSpecified(strKeyword, objBuffer)
{
    objBuffer.addKeyword(strKeyword);
}
function ShowKeywordMenu(e)
{
    $('<ul style="left: ' + (e.pageX-20) + 'px; top: ' + (e.pageY-20) + 'px" class="menuKeyword invisible">'
    + '<li><a href="#">Пункт меню 1</a></li>'
    + '<li><a href="#">Пункт меню 2</a></li>'
    + '<li><a href="#">Пункт меню 3</a></li>'
    + '</ul>').appendTo('body');
    $('.menuKeyword').toggleClass('invisible');
}
function HideKeywordMenu()
{
    $('.menuKeyword').remove();
}
function containerAddWord(elContainer, keywordLeft, keywordRight, statsLeft, statsRight, orient, activeLink)
{

    var keywordInst = objGetKeywordInst(keywordLeft, statsLeft, activeLink);
    keywordInst.SetContextMenu(keywordContextMenu);


    $(keywordInst.jq).appendTo(elContainer);
    
    $('a.keyword').draggable({
                    helper: 'clone'
                });
}
var keywordBackcolor = '#fff';
var containerNotLoadedClass = "unloaded";
var emptySignatureClass = "words-load-stub";
var emptySignature = '<img class="' + emptySignatureClass + '" src="img/upload_bar.gif" />';

function containerLoaded(elContainer)
{
    return false;    
}

//STUB убрать emptySignatureFlag
function GetContainerElementInstCode(keyword, visible, emptySignatureFlag, addTableHeaders)
{
    var classPostfix = "";
    if (visible == false)
    {
        classPostfix = " invisible";
    }
    var containerCode = '<div class="words-container' + classPostfix + ' unloaded" cellspacing="0" cellpadding="0">';
                        
                        if (addTableHeaders==true)
                        {
                            containerCode += 
                            'Что искали со словом &laquo;<b>'+keyword+'</b>&raquo;:<br/>' +
                            //'<td>&nbsp;</td>' +
                            //'<td class="words-right-column">Что еще искали люди, искавшие &laquo;'+keyword+'&raquo;:</td>' +
                            //'<td>Stats</td>' +
                        '';
                        
                        }
       containerCode += '<div>' + emptySignature + '</div></div>';
       
    return containerCode;
}
function GetContainerElementInst(keyword, visible, emptySignatureFlag, addTableHeaders)
{
    var containerCode = GetContainerElementInstCode(keyword, visible, emptySignatureFlag, addTableHeaders);
    containerCode.Type = "containerElement";
    return $(containerCode);
}

function SetClipboarded(aLink)
{
    $(aLink).css("background-image", "url('css/img/clipboard_checked.gif')");
}

function jqGetParentWordElement(jqCurrentWordElement)
{
    
}

function markLinkInactive(jqLinkEl)
{
    if (jqLinkEl != null)
    {
        var newEl = $('<span class="keywordInactive">' + jqLinkEl.html() + '</span>');
        newEl.appendTo(jqLinkEl.parent());
        jqLinkEl.remove();
    }
}

function jqGetKeywordElementParent4Container(jqKeywordsContainer)
{
    if (jqKeywordsContainer==null) return null;
    return $('.keyword', jqKeywordsContainer.parent('td').parent('tr').prev('tr'));
}

function addSup(jqKeywordLinkElement, number)
{
    if (jqKeywordLinkElement!=null)
    {
        jqKeywordLinkElement.after('<sup>' + number + '</sup>');
    }
}

function FillDebugKeywords(strElId)
{
    objWordstat = objGetWordstatTabsControl(strElId);

    if (objWordstat != null)
    {
        var treeNode = objGetTreeNodeInst();
        objWordstat.AddTreeNode(treeNode);
        
        for (var i=0; i< 50; i++)
        {
            var node = objGetNodeInst();
            node.SetValue(0, "hui");
            treeNode.AddNode(node);
            for (var i2=0; i2< 3; i2++)
            {
                var subNode = objGetNodeInst();
                subNode.SetValue(0, "subpizda-" + i2);
                node.AddNode(subNode);
                /*
                for (var i3=0; i3< 5; i3++)
                {
                    var subNode2 = objGetNodeInst();
                    subNode2.SetValue(0, "subsubpizda-" + i3);
                    subNode.AddNode(subNode2);
                }
                */
            }
        }
    }
    else
    {
        //alert ('null');
    }
}



var Objects = new Array();

