﻿DragginLandedOK = false; // STUB это бред, но этому бреду есть объяснение - хитровывернутая функциональность драггаблов, которую в должной мере не реализовать имеющимся на текущий момент инструментарием jquery, отсюда и ручное отслеживание селектед-нод и удачности дропа. Этот камент есть копипаст, по нему можно найти места, где, помимо прочего, эта фишка всплывает
var ggg = 0;
function objGetNodeInst()
{
    var inst = new Object();
    
    inst.Type = "Node";
    
    inst.Values = new Array();

    inst.SetValue = function (valueIndex, valueValueoyaebu)
    {
        //alert(this.Id + ': setting value ' + valueIndex + ':' + valueValueoyaebu);
        this.Values[valueIndex] = valueValueoyaebu;
        this.UpdateValues();
    }
    
    inst.ParentTreeNode = null;
    inst.SetParentTreeNode = function (treenode)
    {
        this.ParentTreeNode = treenode;
        for (x in this.Nodes)
        {
            var node = this.Nodes[x];
            node.SetParentTreeNode(treenode);
        }
    }
    
    inst.IsLoaded = false;
    inst.SetLoaded = function (bValue)
    {
        this.IsLoaded = bValue;
    }
    
    inst.Expanded = false;
    inst.Expand = function ()
    {
        this.Expanded = true;
$('.expander', this.jq).bind('click mousedown',function(event){
					event.stopPropagation();
				})
        //alert($('.expander', this.jq).get(0).text);
        $($('.expander', this.jq).get(0)).removeClass("collapsed");//text("-");
        $($('.expander', this.jq).get(0)).addClass("expanded");//text("-");
        for (x in this.Nodes)
        {
            var node = this.Nodes[x];
            node.Show();
        }
        this.jqMoreButton.removeClass("invisible");
    }
    inst.Collapse = function()
    {
        if (this.IsCollapsable == true)
        {
$('.expander', this.jq).mousedown(function(event){
					event.stopPropagation();
				})
        this.Expanded = false;
        $($('.expander', this.jq).get(0)).removeClass("expanded");
        $($('.expander', this.jq).get(0)).addClass("collapsed");//text("+");
        for (x in this.Nodes)
        {
            var node = this.Nodes[x];
            node.Hide();
        }
            this.jqMoreButton.addClass("invisible");
        }
    }

    
    
    inst.ToggleExpand = function()
    {
        if (this.Expanded == true)
        {
            this.Collapse();
        }
        else
        {
            if ((this.Nodes.length > 0) || (this.IsLoaded == true))
            {
                this.Expand();
            }
            else
            {
                containerLoadWords(this.ParentTreeNode, this, this.Values[0], false);
            }
        }
    }
    
    inst.Hide = function()
    {
        this.jq.addClass("invisible");
    }
    inst.Show = function()
    {
        this.jq.removeClass("invisible");
    }
    
    
    inst.Checked = false;
    inst.SetChecked = function (bValue)
    {
        //alert('settin check  ' + bValue);
        this.Checked = bValue;
        if (this.Checked == true)
        {
            $('#' + this.GetValueElementId(0), this.jq).addClass("checked");
        }
        else
        {
            $('#' + this.GetValueElementId(0), this.jq).removeClass("checked");
        }
    }
    inst.ToggleChecked = function()
    {
        this.SetChecked(!this.Checked);
    }
    
    inst.CopyKeywordValue2CurrentAd = function()
    {
        
        var treeNode = this.ParentTreeNode;
        // STUB и эта хуйня скопипастена. сделать нормально, через тот метод поиска панели родительской, не помню как называется, но который нужно еще в прототип засунуть во время приведения всего к интерфейсу
        var targetPanel = GetAnotherPanel(treeNode.Parent.Parent.Panel);
        
        var objSelectedAd = targetPanel.objGetSelectedTab().Controls[0].GetSelectedAd();

        inst.CopyKeywordValue2Ad(objSelectedAd);
        return objSelectedAd;
    }
    inst.CopyKeywordValue2Ad = function (objSelectedAd)
    {
        //alert(objSelectedAd + "::" + this.Values[0]);
        objSelectedAd.AddKeyword(this.Values[0]);
    }
    
    inst.GetValueElementId = function (valueIndex)
    {
        var ret = this.Id + "-value-" + valueIndex;
        //alert(ret);
        return ret;
    }

    inst.IsCollapsable = true;
    inst.SetCollapsable = function(bValue)
    {
        this.IsCollapsable = bValue;
        if (this.IsCollapsable == false)
        {
            this.Expand();
            $($('.expander', this.jq).get(0)).addClass("invisible");
        }
    }
    
    inst.NextPageNumber = 1;
    inst.SetNextPageNumber = function (iNumber)
    {
        inst.NextPageNumber = iNumber;
        if (inst.NextPageNumber < 1)
        {
            this.jqMoreButton.addClass("invisible");
        }
    }
    
    inst.GetNestinLevel = function()
    {
        var level = 0;
        if (this.ParentNode != null)
        {
            level = this.ParentNode.GetNestinLevel() + 1;
        }
        return level;
    }
    inst.MarkAsOddNode = function()
    {
        //this.jq.attr("background-color", sColor);
        this.jq.addClass("oddNode");
    }
        

    
    inst.UpdateJQ = function ()
    {
        //var parentSpacer = "";
        var nestinLevel = this.GetNestinLevel();
        
        for (var i=0; i< nestinLevel; i++)
        {
            //parentSpacer += "&nbsp;&nbsp;"
        }

        var code =    '<div id="'+this.Id+'" class="node">'
			+ '<div class="values word-menu-holder">'
			    + '<span class="keywords-quant" id="' + this.GetValueElementId(2) + '">' + this.Values[2]+ '</span><img src="css/img/smartMenuCaller.png" id="nodeContextMenuButton-' + inst.Id + '" class="invisible smartmenu" onclick="var inst=getObjectById(\''+inst.Id+'\'); inst.ParentTreeNode.SelectNode(inst); inst._contextMenu.Show(inst, event, inst.ParentTreeNode.SelectedNodesCounter); return false;"/>' // STUBSTUBSTUB alert(nulll)
                    
			    + '<i href="#" class="expander collapsed" onclick="getObjectById(\'' + this.Id + '\').ToggleExpand(); return false;"></i>'
			    + '<input class="jest" type="checkbox" id="check-' + this.Id + '" />'
			    + '<span id="' + this.GetValueElementId(0) + '" >' + this.Values[0] + '</span>'
			    + '<sup id="' + this.GetValueElementId(1) + '">'+this.Nodes.length+'</sup>'
			    + ' <img class="loader invisible" src="css/img/ajax-loader-white.gif" />'
			+ '</div><div class="nodes"></div><div id="delimiter-' + inst.Id + '" class="delimiter invisible">Разделитель</div>' //label // STUB разделитель можно убрать и генерить on demand
                    + '</div>';
        this.jq = $(code);
        
        var statusBeforeDown;
        
        $('img.smartmenu',this.jq).bind('click mousedown',function(e)
        {
           e.stopPropagation();
        });
        
        $(".values", this.jq).mousedown(function()
        {
            statusBeforeDown = $(this).attr('class');
            inst.ParentTreeNode.SelectNode(inst);
        })
        $(".values", this.jq).click(function()
            {
                //jQuery('#www').text($(':checkbox',$(this)).attr('checked'));
                if(statusBeforeDown.match('ui-selected'))
                {
                    inst.ParentTreeNode.UnselectNode(inst);
                    $(':checkbox',$(this)).attr('checked',false);
                }
                else 
                {
                    inst.ParentTreeNode.SelectNode(inst);
                    $(':checkbox',$(this)).attr('checked',true);
                }
        })
        
        this.jqValues = $('.values', this.jq);
        this.jqNodesContainer = $('.nodes', this.jq);
        this.jqMoreButton = $('.moreButton', this.jq);
    }
    

    
    inst.UpdateValues = function ()
    {
        $('#' + this.GetValueElementId(0), this.jq).text(this.Values[0]);
        $('#' + this.GetValueElementId(1), this.jq).text(this.Values[1]>0 ? this.Values[1] : "");
        $('#' + this.GetValueElementId(2), this.jq).text(this.Values[2]);
    }

    
    inst.Id = getObjUniqueId();


    inst.ParentNode = null;
    inst.SetParentNode = function(node)
    {
        this.ParentNode = node;
        this.UpdateJQ();
    }

    inst._iterator = true;

    inst.Nodes = new Array();
    inst.AddNode = function (node)
    {
        this.Nodes[this.Nodes.length] = node;
        if (this.Expanded == false)
        {
            node.Hide();
        }
        
        if (this.Nodes.length > 0)
        {
            this.SetValue(1, this.Nodes.length);
        }
        else
        {
            this.SetValue(1, "");
        }
        
        this.UpdateValues();
        
        node.SetParentNode(this);
        
        node.SetParentTreeNode(this.ParentTreeNode);
        
        node.jq.appendTo(this.jqNodesContainer);
        
        // STUB эта хуита взята из TreeNode.AddNode. Соотв., в каменте оригинал, ниже - апдейт.
        //$('.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} });
        $('.values', node.jq).draggable({   helper: function()
                                                {
                                                    var value = getObjectById(inst.ParentTreeNode.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, отсюда и ручное отслеживание селектед-нод и удачности дропа. Этот камент есть копипаст, по нему можно найти места, где, помимо прочего, эта фишка всплывает
                                                {
						    if (globalDragHelper.hasClass('draghelperMinused') == false)
						    {
							getObjectById(inst.ParentTreeNode.Id).DeselectAllNodes();
						    }
                                                }
                                            }
                                        });
	
	node._installMenuCall(); // STUB хз почему это здесь, а не в "конструкторе" ноды, но как бы вот, чтобы там это нормально выполнялось, чего-то не хватает, работает только для старшей в триноде ноды
        this._iterator = !this._iterator;
        if (this._iterator == true)
        {
            node.MarkAsOddNode();
        }
    }
    
    inst.GetLastSubNode = function()
    {
        return this.Nodes[this.Nodes.length-1];
    }
    inst.MarkLoading = function(bState)
    {
        //alert('mark loading: ' + bState);
        if (bState == true)
        {
            $('.loader:first', this.jq).removeClass("invisible");
        }
        else
        {
            $('.loader:first', this.jq).addClass("invisible");
        }
    }
    
    inst.ReloadControl = function (bVisible)
    {
        if (bVisible == true)
        {
            $('.expander', this.jq).addClass("reload");
        }
        else
        {
            $('.expander', this.jq).removeClass("reload");
        }
    }
    
    
    inst._lastRootNode = null;
    
    
    // node
    inst.LoadXML = function(xml)
    {
        var index = 0;
        $('v', xml).each ( function (i)
                                {
				    if ($(this).text() == "")
				    {
					return false;
				    }
                                    inst.SetValue(index, $(this).text());
				    if (index >= 2)
				    {
					return false;
				    }
                                    index = 2;
                                    return;
                                } );
    }
    
    inst.getOuterXML = function()
    {
        var parentIdCode = "";
        if (this.ParentNode != null)
        {
            parentIdCode = " parentId=\"" + this.ParentNode.Id + "\"";
        }
        var ret = "<n id=\"" + this.Id + "\"" + parentIdCode + ">";
        
        // STUB здесь и в загрузке ноды будет сделана выгрузка только двух значений из Values - кея и статсы. Переделать и вернуть обратно сохранение и загрузку всех значений из Values
	if (this.Values[0] == null)
	{
	    return "";
	}
        ret += "<v>" + this.Values[0] + "</v>";
        ret += "<v>" + this.Values[2] + "</v>";

        // STUB если оставим вариант со ссылками на айдишники родительских нод в xml, то вложенность в children можно убрать
        ret += "<nCh>";
        
        for (x in this.Nodes)
        {
            var child = this.Nodes[x];
            ret += child.getOuterXML();
        }
        
        ret += "</nCh>";
        
        
        ret += "</n>";
        
        return ret;
    }
    
    inst._contextMenu = keywordContextMenu;
    
    inst.SetContextMenu = function(objMenu)
    {
	inst._contextMenu = objMenu;
    }
    inst.showMenuButton = function()
    {
	zzz
    }
    inst._installMenuCall = function()
    {
	if (this.jqValues != null)
	{
	    this.jqValues.hover(function(e)
				{
				    ////MenuKeywordShow(inst);
				    $('#nodeContextMenuButton-' + inst.Id, inst.jq).removeClass("invisible");
				    //inst._contextMenu.Show(inst, e);
				},
				function(e)
				{
				    ////MenuKeywordShow(inst);
				    $('#nodeContextMenuButton-' + inst.Id, inst.jq).addClass("invisible");
				    //inst._contextMenu.DelayHide();
				});
	}
	else
	{
	    if (fDebug == true)
	    {
		alert('jqvalues null');
	    }
	}
    }
    
    inst.MarkAsDelimiter = function(sValue)
    {
	$('#delimiter-' + inst.Id, inst.jq).removeClass('invisible').text(sValue);
    }
    
    inst.UpdateJQ();
    
    inst._installMenuCall();
    
    inst.jq.objTag = inst;
    
    Objects[''+inst.Id+''] = inst;
    
    return inst;
}