﻿/**
 * @abstract Класс TreeNode
**/
function objGetTreeNodeInst()
{
    var inst = new Object();
    
    inst.Id = getObjUniqueId();
    Objects[inst.Id] = inst;
    
    inst.Type = "treeNode";
    
    inst.objGetNodeInst = function ()
    {
        
    }
        
    inst.SelectedNodes = new Array();
    inst.SelectedNodesCounter = 0;
    inst.SelectNode = function (node)
    {
        if (!this.SelectedNodes[node.Id])
        {
            this.SelectedNodes[node.Id] = node;
            $(node.jqValues).addClass("ui-selected");
            $(':checkbox',$(node.jqValues)).attr('checked',true);
            //alert('node selected: ' + node.Values[0]);
            this.SelectedNodesCounter++;
        }
    }
    inst.UnselectNode = function (node)
    {
        if (this.SelectedNodes[node.Id] != null)
        {
            //this.SelectedNodes[node.Id] = null;
            delete this.SelectedNodes[node.Id];
            this.SelectedNodesCounter--;
            $(node.jqValues).removeClass("ui-selected");
            $(':checkbox',$(node.jqValues)).attr('checked',false);
            //alert('node unselected: ' + node.Values[0]);
        }
    }
    inst.DeselectAllNodes = function()
    {
        for (x in this.SelectedNodes)
        {
            var node = this.SelectedNodes[x];
            if (node != null)
            {
                inst.UnselectNode(node);
            }
        }
    }
    inst.AlertAllSelectedNodes = function()
    {
        for (x in this.SelectedNodes)
        {
            var node = this.SelectedNodes[x];
            if (node != null)
            {
                //alert (node.Values[0]);
            }
        }
    }

    inst.Nodes = new Array();
    inst.AddNode = function (node)
    {
        
        this.Nodes[this.Nodes.length] = node;
        node.SetParentTreeNode(this);
        node.jq.appendTo(this.jqNodesContainer);
        
        

        this.jqNodesContainer.selectable({filter: '.values',
                            selected: function(ev, ui)
                            {
                                inst.SelectNode(getObjectById($(ui.selected).parent('div').attr('id')));
                                $(':checkbox',ui.selected).attr('checked',true);
                            },
                            unselected: function(ev, ui)
                            {
                                inst.UnselectNode(getObjectById($(ui.unselected).parent('div').attr('id')));
                                $(':checkbox',ui.selected).attr('checked',false);
                            }
                        }); // вот это сделать через inst и перенести в момент инициализации, чтобы не лагало, но в ие надо будет подправить верстку, ибо разъедутся панели

// STUB Скопипазженно из node.js
        $('.values', node.jq).draggable(
                    {
                        helper: function()
                        {
                            var value = getObjectById(inst.Id).SelectedNodesCounter;
                            globalDragHelper = $('<div class="draghelper">' + value + '</div>');
                            return globalDragHelper;
                        },
                        cursor: 'pointer',
                        cursorAt: { top: 0, left: 10 },
                                                                    start: function (e, ui)
                                            {
                                                DragginLandedOK = false;
                                            },
                                            stop: function(e, ui)
                                            {
                                                if (DragginLandedOK == true) // STUB это бред, но этому бреду есть объяснение - хитровывернутая функциональность драггаблов, которую в должной мере не реализовать имеющимся на текущий момент инструментарием jquery, отсюда и ручное отслеживание селектед-нод и удачности дропа. Этот камент есть копипаст, по нему можно найти места, где, помимо прочего, эта фишка всплывает
                                                {
                                                    getObjectById(inst.Id).DeselectAllNodes();
                                                }
                                            }
                    });

    }
    
    
    /** @deprecated **/
    inst.AddMessage = function(sMessage)
    {
        $('<span style="width: 80%; text-align: center; border: none;">' + sMessage + '</span>').appendTo(this.jq);
    }
    
    inst.SetMessage = function(sMessage)
    {
        sMessage = trim(sMessage);
        if (sMessage.length>0)
        {
            $('#' + inst.Id + '-messageBox', inst.jq).removeClass("invisible");
            $('#' + inst.Id + '-messageBox', inst.jq).text(sMessage);
        }
        else
        {
            $('#' + inst.Id + '-messageBox', inst.jq).addClass("invisible");
            $('#' + inst.Id + '-messageBox', inst.jq).text('');
        }
    }
    
    // treeNode
    inst.LoadXML = function(xml)
    {
        // STUB избавиться от класса rootnode, щас просто не до того
        $('n', xml).each ( function (index)
                                {
                                    var node = objGetNodeInst();
                                    
                                    SessionLoadObjectsIdsXlatTable[$(this).attr('id')] = node.Id;

                                    var oldParentId = $(this).attr('parentId');
                                    
                                    if (oldParentId != null)
                                    {
                                        var newParentId = SessionLoadObjectsIdsXlatTable[oldParentId];
                                        //alert(newParentId);
                                        if (newParentId != null)
                                        {
                                            var newParentNode = getObjectById(newParentId);
                                            //alert(newParentNode)
                                            newParentNode.AddNode(node);
                                            newParentNode.Expand();
                                            //node.SetParentNode(newParentNode);
                                        }
                                        else
                                        {
                                            alert('Проблема с определением нового id!');
                                        }
                                    }
                                    else
                                    {
                                        inst.AddNode(node);
                                        
                                    }
                                    node.LoadXML(this);
                                } );
    }
    
    
    // treenode
    inst.getOuterXML = function()
    {
        var ret = "<tN>";
        
        ret += "<tNs>"
        
        for (x in this.Nodes)
        {
            var node = this.Nodes[x];
            ret += node.getOuterXML();
        }
        
        ret += "</tNs>"
        
        ret+= "</tN>";
        
        return ret;
    }
    
    inst.jq = $('<div><div id="'+inst.Id+'-messageBox" class="invisible" style="padding: 10px;">&nbsp;</div><div id="'+inst.Id+'" style="padding: 20px; cursor: crosshair">'
                              //+ '<button onclick="getObjectById(\''+inst.Id+'\').CopySelectedKeywords2Ad()">Копировать в объявление</button>'
              + '</div>'
              + '<button class="moreButton " onclick="getObjectById(\'' + inst.Id + '\').ExpandMoreNodes();"><span>Показать еще</span></button>'
              + '<button class="assocButton " onclick="getObjectById(\'' + inst.Id + '\').ExpandSimilarKeywords();"><span>Что еще искали</span></button>'
              + '</div>'
              );
    inst.jqNodesContainer = $('#' + inst.Id, inst.jq);
    
    inst.HideMoreButton = function()
    {
        $('.moreButton', inst.jq).addClass('invisible');
    }
    
    inst.HideAssocButton = function()
    {
        $('.assocButton', inst.jq).addClass('invisible');
    }
    
    inst.ExpandMoreNodes = function()
    {
        var lastNode = inst.GetLastUpperNode();
        var nodeValue = lastNode.Values[0];
        var nextPageNuber = lastNode.NextPageNumber;
        //alert(lastNode + "::" + nodeValue + "::" + nextPageNuber);
        var DelimeterNode = inst.GetLastNode();
        DelimeterNode.MarkAsDelimiter(nodeValue);
        containerLoadWords(inst, lastNode, nodeValue, false, nextPageNuber);
    }
    
    inst.ExpandSimilarKeywords = function()
    {
        var lastNode = inst.GetLastUpperNode();
        var nodeValue = lastNode.Values[0];
        var nextPageNuber = lastNode.NextPageNumber;
        //alert(lastNode + "::" + nodeValue + "::" + nextPageNuber);
        var DelimeterNode = inst.GetLastNode(true);
        DelimeterNode.MarkAsDelimiter("Что еще искали со словом \"" + nodeValue + "\"");
        containerLoadWords(inst, lastNode, nodeValue, false, nextPageNuber, true);
    }
    
    // STUB это черезжопно, но пока так :)
    inst._overNodeFlag = false;
    
    inst.GetCheckedSubNodes = function(pnode)
    {
        var nodes = new Array();
        for (x in pnode.Nodes)
        {
            var node = pnode.Nodes[x];
            if (node.Checked== true)
            {
                nodes[nodes.length] = node;
            }
            var subnodes = this.GetCheckedSubNodes(node);
            
            for (y in subnodes)
            {
                var subnode = subnodes[y];
                nodes[nodes.length] = subnode;
            }
        }
        return nodes;
    }
    inst.CopySelectedKeywords2Ad = function()
    {
        // STUB весь метод и все задействованные в нем переписать, рекурсия ояебуговно
        // STUB возможно предыдщий камент уже не в тему, не знаю, но на .SelectedNodes по-любому надо обратить внимание :)
        
        //STUB а, ебануто, я в курсе 
        //alert(this.Parent.jq.text()); // this.Parent - вкладка вордстата (WordstatTabsControl)
        //alert(this.Parent.Parent.jqContents.text()); // this.Parent.Parent - еще один таб, сразу за ним - панель
        
        // STUB и эта хуйня скопипастена. сделать нормально, через тот метод поиска панели родительской, не помню как называется, но который нужно еще в прототип засунуть во время приведения всего к интерфейсу
        var targetPanel = GetAnotherPanel(this.Parent.Parent.Panel);
        
        if (targetPanel!=null)
        {
            var selectedTab = targetPanel.objGetSelectedTab();
            if (selectedTab.Controls[0].IsCampaignControl == true)
            {
                var campaignControl = selectedTab.Controls[0];
                var selectedAd = campaignControl.GetSelectedAd();
                if (selectedAd!=null)
                {
                    for (x in this.SelectedNodes)
                    {
                        var node = this.SelectedNodes[x];
                        var keyword = node.Values[0];
                        selectedAd.AddKeyword(keyword);
                        //alert(node.Values[0]);
                    }
                }
            }
        }
        
    }
    
    
    inst.GetLastUpperNode = function()
    {
        return this.Nodes[this.Nodes.length-1];
    }
    inst.GetLastNode = function(returnSelfIfNoSubNodes)
    {
        if (returnSelfIfNoSubNodes != true)
        {
            returnSelfIfNoSubNodes = false;
        }
        var lastSubNode = this.Nodes[this.Nodes.length-1].GetLastSubNode();
        if ((lastSubNode != null) || (returnSelfIfNoSubNodes == false))
        {
            return lastSubNode;
        }
        else
        {
            return this.Nodes[this.Nodes.length-1];
        }
    }
    
    return inst;
}

var globalDragHelper = null;

function MarkDragHelperAsPlussed()
{
    if (globalDragHelper!=null)
    {
        globalDragHelper.text("+" + globalDragHelper.text().replace("-","").replace("+",""));
        globalDragHelper.addClass("draghelperPlussed");
        globalDragHelper.removeClass("draghelperMinused");
        DragginLandedOK = true; // STUB это бред, но этому бреду есть объяснение - хитровывернутая функциональность драггаблов, которую в должной мере не реализовать имеющимся на текущий момент инструментарием jquery, отсюда и ручное отслеживание селектед-нод и удачности дропа. Этот камент есть копипаст, по нему можно найти места, где, помимо прочего, эта фишка всплывает
    }
}
function MarkDragHelperAsMinused()
{
    if (globalDragHelper!=null)
    {
        globalDragHelper.text("-" + globalDragHelper.text().replace("-","").replace("+",""));
        globalDragHelper.removeClass("draghelperPlussed");
        globalDragHelper.addClass("draghelperMinused");
        DragginLandedOK = true; // STUB это бред, но этому бреду есть объяснение - хитровывернутая функциональность драггаблов, которую в должной мере не реализовать имеющимся на текущий момент инструментарием jquery, отсюда и ручное отслеживание селектед-нод и удачности дропа. Этот камент есть копипаст, по нему можно найти места, где, помимо прочего, эта фишка всплывает
    }
}
function MarkDragHelperAsNormal()
{
    if (globalDragHelper!=null)
    {
        globalDragHelper.text(globalDragHelper.text().replace("-","").replace("+",""));
        globalDragHelper.removeClass("draghelperPlussed");
        globalDragHelper.removeClass("draghelperMinused");
        DragginLandedOK = false; // STUB это бред, но этому бреду есть объяснение - хитровывернутая функциональность драггаблов, которую в должной мере не реализовать имеющимся на текущий момент инструментарием jquery, отсюда и ручное отслеживание селектед-нод и удачности дропа. Этот камент есть копипаст, по нему можно найти места, где, помимо прочего, эта фишка всплывает
    }    
}