﻿var typeKeyword = "objKeyword";
function objGetKeywordInst()
{
    var inst = new Object();
    inst.Id = getObjUniqueId();
    Objects[inst.Id] = inst;
    
    inst.Type = typeKeyword; // StopKeyword
    
    inst.Value = "";
    inst.Stats = -1;
    inst.SetValue = function (sValue, intStats)
    {
        sValue = sValue.replace(new RegExp("[^0-9a-zёйцукенгшщзхъфывапролджэячсмитьбюґїєі!, \"\-]", "gi"), ""); // STUB че-как, покороче русские можно? //

        this.Value = sValue;
        this.Stats = intStats;
        this.jqValue.text(this.Value);
    }
    
    inst.Parent = null;
    inst.SetParent = function (obj)
    {
        this.Parent= obj;
        //$('input', this.jqStopKeywords).addClass('invisible');
    }
    
    
    inst.InitGUIActions = function() {
	    inst.jq.hover(function(e)
	    {
	        $('.addstopkeywords',$(this)).show();
	        $(':text',$(this)).focus(function(){
	            $(this).addClass('focused');
	        })
	        $(':text',$(this)).blur(function(){
	            $(this).removeClass('focused');
	            //$(this).parent().hide();
	        })
	        //inst._contextMenu.Show(inst, e);
	    },function()
	    {
	        if($(':text',$(this)).hasClass('focused')) {
	            $('.addstopkeywords',$(this)).show();
	        } else {
	            $('.addstopkeywords',$(this)).hide();
	        }
	    })
    }
    
    inst.ReinitEventHandlers = function() {
            inst.SetContextMenu(keywordContextMenu);
            inst.MakeDroppable();  
            
            inst.InitGUIActions();
		    
		    
            // HUIS!!! Эта ваще пиздец!!!!
            for (skeyw in inst.StopKeywordsObjects) {
            	inst.StopKeywordsObjects[skeyw].InitGUIActions();
				inst.StopKeywordsObjects[skeyw].HideInput();
            }  
    }
    
    
    inst.StopKeywords = new Array();
    // STUB убрать этот пиздец (StopKeywords - строки, StopKeywordsObjects - объекты)
    inst.StopKeywordsObjects = new Array();
    inst.AddStopKeyword = function (sKeyword)
    {
        this.StopKeywords[this.StopKeywords.length] = sKeyword;
        var stopKey = objGetStopKeywordInst();
        stopKey.SetValue(sKeyword, -1);
        stopKey.SetParent(this);
        this.StopKeywordsObjects[this.StopKeywordsObjects.length] = stopKey;
        stopKey.jq.appendTo(this.jqStopKeywords);
        stopKey.HideInput();

        // HUIS от HUIS до HUIS копипаст из node.js. Сделать универсально для всех экземпляров всех кейвордов
        // STUB только #edit-word-menu-box-stop вместо #edit-word-menu-box поставлено
        // смотри в utils.js
        //$('a.keyword',stopKey.jq).wordMenu(inst,stopKey.Id);
       
            stopKey.jq.hover(function(e)
                {
                    //instId = inst.jq.attr('id');
                    //jQuery('#www').text(stopKey.Id);
                    var offset = $(this).offset();
                    var menu_size = $("#edit-word-menu-box-stop .word-icons").length;
                    if (menu_size > 5)
                    {
                        $("#edit-word-menu-box-stop").css(
                        {
                            width:29*(Math.round(menu_size/2))+'px'
                        })
                    }
                    //$("#edit-word-menu-box");
                    var correctTop = $("#edit-word-menu-box-stop").height();
                    var correctLeft = $(this).width();
                    $("#edit-word-menu-box-stop").css({
                        top: offset.top - correctTop - 3 + 'px',
                        //left: offset.left + correctLeft - 10 + 'px'
                        //top: e.pageY - correctTop - 10 + 'px',
                        left: e.pageX - 3 + 'px'
                    })
                    $("#edit-word-menu-box-stop").click(function(e)
                                                        {
                                                            inst.RemoveKeyword(stopKey.Id);
                                                            e.preventDefault();
                                                        }
                                                        );
                    $("#edit-word-menu-box-stop").hover(function()
                    {
                        $(this).css(
                        {
                            top: offset.top - correctTop - 3 + 'px',
                            //left: offset.left + correctLeft - 10 + 'px',
                            //top: e.pageY - correctTop + 'px',
                            left: e.pageX - 3 + 'px',
                            opacity: 1
                        })
                    }, function()
                    {
                        $(this).css(
                        {
                            opacity: 0.7,
                            top: '-9999px',
                            left: '-9999px'
                        })
                    })
                }, function()
                {
                    $("#edit-word-menu-box-stop").css({
                        top: '-9999px',
                        left: '-9999px'
                    })
                });
        // HUIS
}
    inst.CheckAndAddStopKeyword = function (sKeyword)
    {
        if (this.WordIsKosher(sKeyword) == true)
        {
            this.AddStopKeyword(sKeyword);
        }
    }
    
    inst.RemoveKeyword = function(keyId)
    {
        var key = getObjectById(keyId);
        key.jq.remove();
        for (x in inst.StopKeywordsObjects)
        {
            var key2 =inst.StopKeywordsObjects[x];
            if (key2.Id==key.Id)
            {
                inst.StopKeywordsObjects.splice(x, 1);
                break;
            }
        }
    }
    
    
    inst.MakeDroppable = function()
    {
        this.jqValue.droppable({
                                accept: "*", // STUB исправить звездочку (на .values (?))
                                activeClass: 'droppable-active',
                                hoverClass: 'droppable-hover',
                                over: function(e, ui)
                                {
                                    MarkDragHelperAsMinused();
                                },
                                out: function (e, ui) {
                                    MarkDragHelperAsNormal();
                                }, 
                                drop: function(ev, ui)
                                {
                if (ui.draggable.attr('id') == 'draggableindexPageHelp')
                {
                    // демовый дроп
                    inst.AddStopKeyword('Добавленные');
                    inst.AddStopKeyword('Вами');
                    inst.AddStopKeyword('стоп-слова');
                    SetNeed2BeSaved(true);
                }
                else
                {
                                // STUB ниже - жесткий копипаст. Отрефакторить.
                                                        
                                                  
                    var destPanel = inst.Parent; // STUB тут что-то не то, что в паренте лежит панель, бля, потому что должен таб (по аналогии с вордстатом), но тут вот так, или я что-то путаю. Короче, потом разобраться и привести к интерфейсу все эти .Parent и .Panel
                    var srcPanel = GetAnotherPanel(destPanel);
                    var nodeId = ui.draggable.parent().attr('id');
                    if (nodeId != null)
                    {
                        var node = getObjectById(nodeId);
                        if (node!=null)
                        {
                            var treeNode = node.ParentTreeNode;
                            if (treeNode!= null)
                            {
                                for (x in treeNode.SelectedNodes)
                                {
                                    var n = treeNode.SelectedNodes[x];
                                    if (n!=null) // STUB убрать это после того, как SelectedNodes начнет очищаться от невыделенных элементов вместо забивания их нуллами
                                    {
                                        if (n.Values)
                                        {
                                            var Phrase = n.Values[0];
                                            var Words = inst.GetWordsFromPhrase(Phrase);
                                            for (i in Words)
                                            {
                                                var word = Words[i];
                                                if (inst.WordIsKosher(word, true) == true)
                                                {
                                                    inst.AddStopKeyword(word);
                                                    SetNeed2BeSaved(true);
                                                }
                                                else
                                                {
                                                    //alert('Такое стоп-слово уже есть');
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                                }
                                }
                               );    
    }


    inst.Close = function()
    {
        if (this.Parent !=null)
        {
            this.Parent.RemoveKeyword(this.Id);
        }
    }
    
    
    inst.InputCallback = function (sValue)
    {
        //if (inst.WordIsKosher(sValue) == true)
        //{
            SetNeed2BeSaved(true);
            inst.AddStopKeyword(sValue);
        //}
    }
    
    inst._stopKeywordInputId = "stopKeywordInput-" + inst.Id;
    //inst._stopKeywordInputCode = '<input id="' + inst._stopKeywordInputId + '"></input><button onclick="getObjectById(\'' + inst.Id + '\').CheckAndAddStopKeyword($(\'#'+ inst._stopKeywordInputId+'\').attr(\'value\'));">Добавить стоп</button>';
    
    
    inst._contextMenu = keywordContextMenu;
    inst.SetContextMenu = function(objMenu)
    {
        inst._contextMenu = objMenu;
    }
    
    var code = '<div class="keywordShell" >'
             + ' <a href="#" class="keyword" onclick="var key = getObjectById(\''+inst.Id +'\'); var panel = key.FindParentPanel(); if (panel!=null){ var wTab = GetAnotherPanel(panel).addWordstatTab(key.Value); wTab.ProcessKeyword(key.Value);} return false;"></a>'
             + '<i class="closeButton" onclick="getObjectById(\'' + inst.Id + '\').Close(); return false">X</i>'
             + ' <span class="stopkeywords"> '
             + ' </span> '
             + ' <span class="addstopkeywords"><input type="text" onkeypress="if (getKeyCode(event) == 13){ ProcessStopKeywordInputEnterSTUB(\'' + inst.Id + '\', event); }" /><b class="key-word-minus" onclick="ProcessStopKeywordInputEnterSTUB(\'' + inst.Id + '\', event);"></b></span> '
             // STUB label_1
             //+ '<div class="inputContainer">&nbsp;</div>';
             + ' </div> <div class="clearing"></div> ';
    
    inst.jq = $(code);
    inst.jqValue = $('.keyword', inst.jq);
    inst.jqStopKeywords = $('.stopkeywords', inst.jq);
    //inst.jq.addClass("keywordShell");
    
    inst.InitGUIActions();
    
    /*$('.keywordShell').each(function(){
        $(this).hover(function(){
            $(':text',$(this)).show();
            $(':text',$(this)).focus(function(){
                $(this).parent().get(0).unbind('hover');
            })
        },function(){
            $(':text',$(this)).hide();
        })
    })*/
    
    inst.jqInput = $('.inputContainer', inst.jq);
    
    
    inst._input = objGetFineInputInst(inst._stopKeywordInputId, "", inst.InputCallback);
    // STUB label_1
    //inst._input.jq.appendTo(inst.jqInput);
    
    //inst.jqStats = $('.keyword', inst.jq);
    
    
    inst.HideInput =function()
    {
        inst.jqInput.remove();
    }
    
    
    inst.GetWordsFromPhrase = function (sPhrase)
    {
        var ret = new Array();
        
        ret = sPhrase.split(' ');
        
        return ret;
    }
    
    inst.FindParentPanel = function()
    {
        // STUB копипаст. Сделать прототайпом в фабрике или типа того
        var parent = this.Parent;
        if (parent==null) return null;
        if (parent.Type != typePanel)
        {
            return parent.FindParentPanel();
        }
                else
        {
            return parent;
        }

    }
    
    inst.WordIsKosher = function(sWord, bCheckSWordIsInKeywordsArr)
    {
        //alert('word is kosher start');
        
        if (bCheckSWordIsInKeywordsArr != false) {
			bCheckSWordIsInKeywordsArr = true;
		}

		var keyWords = this.GetWordsFromPhrase(this.Value);
		for (x in keyWords) {
			var k = keyWords[x];

			if ((k.toLowerCase() == sWord.toLowerCase())
					|| (this.KeywordsAreSimilar(k, sWord) == true)) {
				return false;
			}
		}
		if (bCheckSWordIsInKeywordsArr == true) {
			for (x in this.StopKeywords) {
				var stopKeyword = this.StopKeywords[x];
				if ((stopKeyword.toLowerCase() == sWord.toLowerCase())
						|| (this.KeywordsAreSimilar(stopKeyword, sWord) == true)) {
					return false;
				}
			}
		}
        return true;
    }
    
    inst.KeywordsAreSimilar = function (word1, word2)
    {
        var shingleLength = 2;
        var IntersectionValue = shingleLength-1;
        var sameShinglesPercentToDetect = 60;

        var shigles1 = this.GetShingles(word1, shingleLength, IntersectionValue);
        var shingles2 = this.GetShingles(word2, shingleLength, IntersectionValue);

        var sameShinglesPercent = this.CompareShingles(shigles1, shingles2);
        

        return (sameShinglesPercent >= sameShinglesPercentToDetect);
    }
    
    inst.GetShingles = function(sourceKeyword, shingleLength, IntersectionValue)
        {
            var result = new Array();
            var globalOffset = 0;

            while ((globalOffset + shingleLength) <= sourceKeyword.length)
            {
                var newShingle = "";
                for (var localOffset = 0; localOffset < shingleLength; localOffset++)
                {
                    newShingle += sourceKeyword.charAt(globalOffset + localOffset);
                }
                result[result.length] = newShingle; // .length не катит в ие
                globalOffset += shingleLength - IntersectionValue;
            }
            return result;

            
            /*
alert('GetShingles start');
            var result = new Array();
            var globalOffset = 0;

            while ((globalOffset + shingleLength) <= sourceKeyword.length)
            {
                var newShingle = "";
                for (var localOffset = 0; localOffset < shingleLength; localOffset++)
                {
                    newShingle += sourceKeyword[globalOffset + localOffset];
                }
                result[result.length] = newShingle;
                globalOffset += shingleLength - IntersectionValue;
            }
alert('GetShingles finish');
            return result;
            */
        }
        
    inst.CompareShingles = function (shigles1, shingles2)
        {
            //alert("Comparing shingles: " + shigles1 + " : " + shingles2);
            //alert('CompareShingles start');
            var sameShinglesCount = 0;

            var totalShinglesNumber2CalculatePercents = asSize(shigles1); // STUB с определением размеров потом разобраться
            if (asSize(shingles2) > asSize(shigles1))
            {
                totalShinglesNumber2CalculatePercents = asSize(shingles2);
            }

//alert(asSize(shigles1) + " :: " + asSize(shingles2));
            for (x in shigles1)
            {
                var shingle1 = shigles1[""+x];
                for (y in shingles2)
                {
                    var shingle2 = shingles2[""+y];
                    //alert("Comparing two shingles: " + shingle1 + " (" + x + ") -- " + shingle2 + "(" + y + ")");
                    if (shingle1 == shingle2)
                    {
                        sameShinglesCount++;
                        //alert('true');
                    }
                    else
                    {
                        //alert('false');
                    }
                }
            }
    
            //alert ("Same shingles count: " + sameShinglesCount);

            if (sameShinglesCount < 1)
            {
                //alert('CompareShingles finish');
                return 0;
            }

            var sameShinglesPercent = (sameShinglesCount / totalShinglesNumber2CalculatePercents) * 100;

            //alert ("!!! " + sameShinglesCount + " / " + totalShinglesNumber2CalculatePercents + " * 100 = " + sameShinglesPercent);

            return sameShinglesPercent;

            /*
            alert('CompareShingles start');
            var sameShinglesCount = 0;

            for (x in shigles1)
            {
                var shingle1 = shigles1[x];
                for (y in shingles2)
                {
                    var shingle2 = shingles2[y];
                    if (shingle1 == shingle2)
                    {
                        sameShinglesCount++;
                    }
                }
            }
            alert('CompareShingles finish');
            return sameShinglesCount;
            */
        }
    
    inst.LoadXML = function(xml)
    {
        // STUB тут я даже не знаю, нужно это или нет, но вот. Везде то же самое, везде избавляться.
        //xml = '<keyword>' + xml + '</keyword>';
        
        var value = $('v', xml).text();
        var stats = $('kS ', xml).text();
        
        // STUB временный фикс
        value = value.replace(/-/, "");
        inst.SetValue(value, stats);
        
        //alert (inst.Value + " -- " + inst.Stats);
    }
    inst.getOuterXML = function()
    {
        var ret = "<k>";
        
        ret += "<v>" + this.Value + "</v>";
        
        ret += "<kS>" + this.Stats + "</kS>";
        

        ret += "<ksKs>";
        for (x in this.StopKeywordsObjects)
        {
            var stopKeyword = this.StopKeywordsObjects[x];
            
            ret += "<ksK>";
            //alert(stopKeyword.Type);
            ret += "<v>" + stopKeyword.Value + "</v>";
            ret += "<kS>" + stopKeyword.Stats + "</kS>";
            
            ret += "</ksK>";
        }
        
        ret += "</ksKs>";
        
        ret += "</k>";
        
        return ret;
    }
    
    return inst;
}

var typeStopKeyword = "stopKeyword";
function objGetStopKeywordInst()
{
    var inst = objGetKeywordInst();
    inst.Type = typeStopKeyword;
    
    //inst.jq.removeClass("keywordShell");
    //inst.jq.addClass("stopKeywordShell");
    

    
    var code = '<span class="stopKeywordShell"> '
             + '<a id="stopkey-' + inst.Id + '" href="#" class="keyword" onclick="'
             + '    var key = getObjectById(\''+inst.Id +'\');'
             + '    var panel = key.FindParentPanel();'
             + '    if (panel!=null)'
             + '        {'
             + '            var keyValue = key.Parent.Value + \' \' + key.Value.replace(\'-\', \'\');'
             + '            var wTab = GetAnotherPanel(panel).addWordstatTab(keyValue);'
             + '            wTab.ProcessKeyword(keyValue);'
             + '        }'
             + '    return false;">'
						 //+ '<b class="floated-edit-tab">123</b>'
						 + '</a> '
             //+ '<a href="#" class="closeButton" style="float:left; margin-left: 5px; margin-right: 15px;" onclick="getObjectById(\'' + inst.Id + '\').Close(); return false">X</a>'
             + '</span> ';
    
    inst.jq = $(code);
    inst.jqValue = $('.keyword', inst.jq);
    
    inst.InitGUIActions = function() {
	    inst.SetContextMenu(keywordStopContextMenu);
	    inst.jq.hover(function(e)
	    {
	        inst._contextMenu.Show(inst, e);
	        
	    },function()
	    {
	        
	    });
		inst.jq.hover(function(e)
                {
                    //instId = inst.jq.attr('id');
                    //jQuery('#www').text(stopKey.Id);
                    var offset = $(this).offset();
                    var menu_size = $("#edit-word-menu-box-stop .word-icons").length;
                    if (menu_size > 5)
                    {
                        $("#edit-word-menu-box-stop").css(
                        {
                            width:29*(Math.round(menu_size/2))+'px'
                        })
                    }
                    //$("#edit-word-menu-box");
                    var correctTop = $("#edit-word-menu-box-stop").height();
                    var correctLeft = $(this).width();
                    $("#edit-word-menu-box-stop").css({
                        top: offset.top - correctTop - 3 + 'px',
                        //left: offset.left + correctLeft - 10 + 'px'
                        //top: e.pageY - correctTop - 10 + 'px',
                        left: e.pageX - 3 + 'px'
                    })
                    $("#edit-word-menu-box-stop").click(function(e)
                                                        {
                                                            inst.RemoveKeyword(stopKey.Id);
                                                            e.preventDefault();
                                                        }
                                                        );
                    $("#edit-word-menu-box-stop").hover(function()
                    {
                        $(this).css(
                        {
                            top: offset.top - correctTop - 3 + 'px',
                            //left: offset.left + correctLeft - 10 + 'px',
                            //top: e.pageY - correctTop + 'px',
                            left: e.pageX - 3 + 'px',
                            opacity: 1
                        })
                    }, function()
                    {
                        $(this).css(
                        {
                            opacity: 0.7,
                            top: '-9999px',
                            left: '-9999px'
                        })
                    })
                }, function()
                {
                    $("#edit-word-menu-box-stop").css({
                        top: '-9999px',
                        left: '-9999px'
                    })
                });
    }
    
    inst.InitGUIActions();
    
    
    inst._oldSetValue = inst.SetValue;
    inst.SetValue = function (sValue, intStats)
    {
        this._oldSetValue("-" + sValue, intStats);
    }
    
    
    return inst;
}

var _canHideStopKeywordMenuTimerDelay = 1000;
function ShowStopKeywordMenu(e, el, stopKeywordIndex)
{
    return;
    var offset = $('.keyword',el).offset();
    var elX = offset.left + $('.keyword',el).width() - 5 + 'px';
    var elY = offset.top - $('.keyword',el).height() - 10 + 'px';
    _canHideStopKeywordMenu = true; 
    HideStopKeywordMenu();
    
    $(
        '<div style="left: ' + elX + '; top: ' + elY + '" class="edit-word-menu-box menuStopKeyword invisible" onmouseover="_canHideStopKeywordMenu = false;" onmouseout="_canHideStopKeywordMenu = true; _canHideStopKeywordMenuTimer = setTimeout(\'HideStopKeywordMenu()\',_canHideStopKeywordMenuTimerDelay);">'
    //+ '<a href="#" class="toolStripButton smallButton" style="background:url(\'css/img/iEditSmall.gif\') top left no-repeat;"></a>'
		
        + '<a title="Удалить стоп-слово" href="#" class="word-icons word-icons-ico2" onclick="getObjectById(\'' + stopKeywordIndex+ '\').Close(); return false;">Удалить стоп-слово</a>'
        + '</div>'
    ).appendTo('body');
    $('.menuStopKeyword').toggleClass('invisible');
    _canHideStopKeywordMenu = false;
    _canHideStopKeywordMenuTimer = setTimeout("HideStopKeywordMenu()",_canHideStopKeywordMenuTimerDelay);
}
var _canHideStopKeywordMenuTimer;
var _canHideStopKeywordMenu = true;
function HideStopKeywordMenu()
{
    return;
    if (_canHideStopKeywordMenu == true)
    {
        //setTimeout();
        $('.menuStopKeyword').remove();
    }
}
function ProcessStopKeywordInputEnterSTUB(instId, event)
{
        var key = getObjectById(instId);
        var newStopKeyValue = $('.addstopkeywords :text', key.jq).attr('value');
        
        newStopKeyValue = newStopKeyValue.replace("-", " ");
        
        var zhep = explode("-", newStopKeyValue);
        for (y in zhep)
        {
            newStopKeyValue = zhep[y];
            var ins = explode(" ", newStopKeyValue);
            for (x in ins)
            {
                newStopKeyValue = ins[x];
                if (trim(newStopKeyValue) != "")
                {
                    if (key.WordIsKosher(newStopKeyValue, false) == true)
                    {
                        var stopKeyInput = $('.addstopkeywords input', key.jq);
                        key.AddStopKeyword(newStopKeyValue);
                    }
                    else
                    {
                        alert('Такое стоп-слово уже есть');
                    }
                }
            }
        }
            
        stopKeyInput.select();
        stopKeyInput.focus();
}