﻿var typeCampaignControl = "campaignControl";

function getCampaignControlInst(controlId, sASFilter)
{
    var inst = new Object();
    
    inst.Type = typeCampaignControl;
    
    inst.ASFilter = sASFilter;
    
    inst.Index = controlId;
    
    inst.IsCampaignControl = true;
    
    inst.Id = getObjUniqueId();
    Objects[inst.Id] = inst;
    var jq = $('<div><div style="text-align: left; padding-left: 5px; padding-top: 10px;" class="pagingConsole">Загрузка...</div>'
             //+ '<button onclick="getObjectById(\'' + inst.Id + '\').AddNewAd();">+</button>'
             //+ '&nbsp;<button onclick="getObjectById(\'' + inst.Id + '\').LoadExcel();" disabled="disabled">Excel</button>'
             //+ '<button onclick="">Excel</button>'
             + '<div class="content">&nbsp;</div>'
             + '</div>'
                );
    inst.jq = jq;
    inst.jqContents = $('.content', inst.jq);;
    
    inst.Contols = new Array();
    inst.addContents = function (jqObject)
    {
        jqObject.appendTo(this.jqContents);
    }
    
    inst.MoveLeft = function()
    {
        var ad = inst.Ads[0];
        if (ad!=null)
        {
            var Ads = ad.ParentAds;
            if (Ads !=null)
            {
                
            }
        }
        
    }
    inst.LoadExcel = function()
    {
        $.post("saveAds.php",{ 
        action: "postmsg"
    }, function(xml) {
        addMessages(xml); 
        }); 
    }
    
    inst.Ads = new Array();
    inst.AddNewAd = function()
    {
        var ads = getAdTransparentInst();
        
        var adElama = getAdControlInst();
        adElama.SetAS(asElama);
        ads.AddAd(adElama, true);
        
        var adYandex = getAdControlInst();
        adYandex.SetAS(asYandex);
        ads.AddAd(adYandex);
        
        var adBegun = getAdControlInst();
        adBegun.SetAS(asBegun);
        ads.AddAd(adBegun);
        
        var adGoogle = getAdControlInst();
        adGoogle.SetAS(asGoogle);
        ads.AddAd(adGoogle);

        var campaignControls = getObjectsByType(typeCampaignControl);
        for (x in campaignControls)
        {
            var ctrlCampaign = campaignControls[x];
                if ((ctrlCampaign.ASFilter == null) || (ctrlCampaign.ASFilter == asElama))
                    ctrlCampaign.AddAd(adElama);
                if ((ctrlCampaign.ASFilter == null) || (ctrlCampaign.ASFilter == asYandex))
                    ctrlCampaign.AddAd(adYandex);
                if ((ctrlCampaign.ASFilter == null) || (ctrlCampaign.ASFilter == asBegun))
                    ctrlCampaign.AddAd(adBegun);
                if ((ctrlCampaign.ASFilter == null) || (ctrlCampaign.ASFilter == asGoogle))
                    ctrlCampaign.AddAd(adGoogle);
        }
        
        switch (this.ASFilter)
        {
            case asElama:
                return adElama;
            case asYandex:
                return adYandex;
            case asBegun:
                return adBegun;
            case asGoogle:
                return asGoogle;
            default:
                return adElama;
        }
    }
    
    inst._visibleAdsCurrentIndex = 0;
    inst._visibleAdsCurrentLimit = 5;

    inst.RebuildAdsVisibleStatsNStuff = function() // STUB Заменить везде вызов RebuildAdsVisibleStatsNStuff() на вызов RebuildPagingConsoleGUI()
    {
        inst.RebuildPagingConsoleGUI();
    }
    
    inst.PageLeft = function() // STUB Свести эти два метода в один
    {
        var ctrls = getObjectsByType(typeCampaignControl); // inst.ClearAdsGUI();
        for (x in ctrls)
        {
            var ctrl = ctrls[x];
            ctrl.ClearAdsGUI();

            if (ctrl._visibleAdsCurrentIndex>0)
            {
                if (ctrl._visibleAdsCurrentIndex>=ctrl._visibleAdsCurrentLimit)
                {
                    ctrl._visibleAdsCurrentIndex -= ctrl._visibleAdsCurrentLimit;
                }
                else
                {
                    ctrl._visibleAdsCurrentIndex = 0;
                }
            }
            else
            {
                // STUB может впендюрить циклическую прокрутку?
            }
            ctrl.RefillWithAds();
        }
    }
    inst.PageRight = function() // STUB Свести эти два метода в один
    {
        var ctrls = getObjectsByType(typeCampaignControl); // inst.ClearAdsGUI();
        for (x in ctrls)
        {
            var ctrl = ctrls[x];
            ctrl.ClearAdsGUI();

            if (ctrl._visibleAdsCurrentIndex<ctrl.Ads.length)
            {
                if (ctrl._visibleAdsCurrentIndex<(ctrl.Ads.length - ctrl._visibleAdsCurrentLimit))
                {
                    ctrl._visibleAdsCurrentIndex += ctrl._visibleAdsCurrentLimit;
                }
                else
                {
                    ctrl._visibleAdsCurrentIndex = ctrl.Ads.length-1;
                }
            }
            else
            {
                // STUB может впендюрить циклическую прокрутку?
            }

            ctrl.RefillWithAds();
        }
    }
    inst.PageToLast = function()
    {
        var x = Math.ceil(inst.Ads.length/inst._visibleAdsCurrentLimit);
        //alert(x);
        inst.PageTo(x-1);
    }
    inst.PageTo = function(intX)
    {
        var ctrls = getObjectsByType(typeCampaignControl); // inst.ClearAdsGUI();
        for (x in ctrls)
        {
            var ctrl = ctrls[x];
            ctrl.ClearAdsGUI();

            ctrl._visibleAdsCurrentIndex = intX * inst._visibleAdsCurrentLimit;

/*
            if (ctrl._visibleAdsCurrentIndex<ctrl.Ads.length)
            {
                if (ctrl._visibleAdsCurrentIndex<(ctrl.Ads.length - ctrl._visibleAdsCurrentLimit))
                {
                    ctrl._visibleAdsCurrentIndex += ctrl._visibleAdsCurrentLimit;
                }
                else
                {
                    ctrl._visibleAdsCurrentIndex = ctrl.Ads.length-1;
                }
            }
            else
            {
                // STUB может впендюрить циклическую прокрутку?
            }
                                        */
            ctrl.RefillWithAds();
        }
    }

    inst.RebuildPagingConsoleGUI = function()
    {
        var adsCount = this.Ads.length;
        var totalPages = Math.ceil(adsCount/inst._visibleAdsCurrentLimit);
        var x = 0;
        var code = "";
        //alert('totalpages: ' + totalPages + ' ('+adsCount+'/'+inst._visibleAdsCurrentLimit+')');
        if (totalPages>1)
        {
            while (x < totalPages)
            {
                if (x * inst._visibleAdsCurrentLimit == inst._visibleAdsCurrentIndex)
                {
                    code += '&nbsp;' + (x+1);
                }
                else
                {
                    code += '&nbsp;<a href="#" onclick="getObjectById(\'' + inst.Id + '\').PageTo(' + x + ');" style="color: #3969ef;">' + (x+1) + '</a>';
                }
                x++;
            }
        }
        //code += '&nbsp;(<span class="currentVisibleAdIndexLabel">1</span>/<span class="totalAdsCountLabel">2</span>)';
        //code += '&nbsp;(<span class="currentVisibleAdIndexLabel">1</span>/<span class="totalAdsCountLabel">2</span>)';
        var dest = $('.pagingConsole', inst.jq);
        dest.html(code);
        
        //$('.currentVisibleAdIndexLabel', inst.jq).html(inst._visibleAdsCurrentIndex);
    
        //$('.totalAdsCountLabel', inst.jq).text(inst.Ads.length);
    }
    inst.RefillWithAds = function()
    {
        var x = inst._visibleAdsCurrentIndex;
        while ((x < (inst._visibleAdsCurrentIndex + inst._visibleAdsCurrentLimit)) && (x<this.Ads.length))
        {
            var ad = inst.Ads[x];
            ad.jq.appendTo(this.jqContents);
            ad.ReinitEventHandlers();
            
                //alert('olo');
                ad.MakeDroppable();
            
            x++;
        }
        inst.RebuildAdsVisibleStatsNStuff();
    }
    inst._toggleAdBackground = false;
    inst.AddAd = function (ad, skipRebuildGUIStats)
    {
        if (skipRebuildGUIStats != true)
    {
            skipRebuildGUIStats = false;
        }
        this.CorrectContentHeight();
        this.Ads[this.Ads.length] = ad;
        ad.Parent = this;
        
        if (this.Ads.length <= inst._visibleAdsCurrentLimit)
        {
        ad.jq.appendTo(this.jqContents);
        }
        
        if (ad.IsDroppable == false)
        {
        ad.MakeDroppable();
        }
        
        if (this._toggleAdBackground == true)
        {
            ad.MarkOdd();
        }
        this._toggleAdBackground = !this._toggleAdBackground;
        
        if (skipRebuildGUIStats == false)
        {
            inst.RebuildAdsVisibleStatsNStuff();
        }
        inst.RebuildPagingConsoleGUI();
    }
    
    inst.CorrectContentHeight = function()
    {
    	var correct_console_height = this.Ads.length > inst._visibleAdsCurrentLimit ? 26 : 0;
        $('.content', this.jq).height(_panelsHeight - 76 - correct_console_height);
    }
    
    inst.SelectAdByIndex = function (intIndex)
    {
        var ad2select = this.Ads[intIndex];
        if (ad2select != null)
        {
            ad2select.SetChecked(true);
        }
    }
    inst.GetSelectedAd = function ()
    {
        for (x in this.Ads)
        {
            var ad = this.Ads[x];
            if (ad.Checked == true)
            {
                return ad;
            }
        }
        return null;
    }
    
    inst.ChildCheckChanged = function (sender)
    {
        if (sender.Checked == true)
        {
            for (x in this.Ads)
            {
                var ad = this.Ads[x];
                if (ad != sender)
                {
                    ad.SetChecked(false);
                }
            }
        }
    }
    inst.ClearAdsGUI = function()
    {
        var x = inst._visibleAdsCurrentIndex;
        while ((x < (inst._visibleAdsCurrentIndex + inst._visibleAdsCurrentLimit)) && (x<this.Ads.length))
        {
            var ad = inst.Ads[x];
            ad.jq.remove();
            ad.SetReinitNedded(true);
            
            /*
            var ad = del[x];
            ad.Close();
   */
            x++;
        }
    }
    inst.Clear = function()
    {
        var del = new Array();
        for (x in this.Ads)
        {
            var ad = this.Ads[x];
            del[del.length] = ad;
        }
        for (x in del)
        {
            var ad = del[x];
            ad.Close();
        }
    }
    inst.RemoveAd = function(adId)
    {
        var ad = getObjectById(adId);
        ad.jq.remove();
        for (x in this.Ads)
        {
            var ad2 = this.Ads[x];
            if (ad2.Id==ad.Id)
            {
                this.Ads.splice(x, 1);
            }
        }
    }
    
    inst.FindParentPanel = function()
    {
        // STUB копипаст. Сделать прототайпом в фабрике или типа того
        var parent = this.Parent;
        if (parent==null) return null;
        if (parent.Type != typePanel)
        {
            return parent.FindParentPanel();
        }
        else
        {
            return parent;
        }
    }
    // campaignControl
    inst.LoadXML = function(xml)
    {
        this.Clear();
        
        $('ad', xml).each ( function(index)
                                 {
                                    var ad = getAdControlInst();
                                    ad.LoadXML(this);
                                    var destinationAds = null;
                                    
                                    var existingAdses = getObjectsByType(typeAds);
                                    
                                    for (exAdsIndex in existingAdses)
                                    {
                                       var currentExistingAds = existingAdses[exAdsIndex];
                                        if (ad._loadingTimeGroupId == currentExistingAds._loadingTimeGroupId)
                                        {
                                            destinationAds = currentExistingAds;
                                            if (fDebug == true)
                                            {
                                                if (currentExistingAds == null)
                                                {
                                                    setStatus("Ошибка хлатирования(tm) айдишника Адса объявы");
                                                    continue;
                                                }
                                            }
                                            break;
                                        }
                                    }
                                    if (destinationAds == null)
                                    {
                                        var destinationAds = getAdTransparentInst();
                                        destinationAds._loadingTimeGroupId = ad._loadingTimeGroupId;
                                    }
                                    
                                    destinationAds.AddAd(ad, ad.AS == asElama);
                                    inst.AddAd(ad);
                                 } );
        inst.RebuildAdsVisibleStatsNStuff();
    }
    
    inst.getOuterXML = function()
    {
        var ret = "<cpT>";
        
        ret += "<ads>";
        
        for (x in this.Ads)
        {
            var ad = this.Ads[x];
            ret += ad.getOuterXML();
        }
        
        ret += "</ads>";

        ret += "</cpT>";
        
        return ret;
    }
    
    inst.GetExcel = function()
    {

        // keywords
        // header
        // text
        // url
        
        
        var adsCode = "";
        for (x in this.Ads)
        {
            var ad = this.Ads[x];
        
            for (y in ad.Keywords)
            {
                var keyword = ad.Keywords[y];
                adsCode += " " + keyword.Value;
                for (z in keyword.StopKeywords)
                {
                    var stopKeywordValue = keyword.StopKeywords[z];
                    adsCode += " -" + stopKeywordValue;
                }
            }
            
            adsCode += ";" + ad.adHeaderInput.Value;
            adsCode += ";" + ad.adTextInput.Value;
            adsCode += ";" + ad.adUrlInput.Value;
            
            adsCode +="^";
        }
                $.post("saveAds.php", { 'data': adsCode 
                       },
                    function(msg)
                    {
                        var urls = msg.split('^');
                        
                        for (x in urls)
                        {
                            var url = urls[x];
                            if (url!="")
                            {
                                window.open(url,'name'+x,'options');
                            }
                        }
                    }, "text");
                
    }
    
    
    inst.SetAdsCollapsed = function(bValue)
    {
        if (bValue != true)
        {
            bValue = false;
        }
        for (x in inst.Ads)
        {
            inst.Ads[x].SetCollapsed(bValue);
        }
    }
    
    return inst; // STUBSTUB
    inst.jqContents.droppable({ // STUB копипаста ad.js 
            accept: "*", // STUB исправить звездочку (на .values (?))
            activeClass: 'droppable-active',
            hoverClass: 'droppable-hover',
            over: function (e, ui) {
                MarkDragHelperAsPlussed();
            },
            out: function (e, ui) {
                MarkDragHelperAsNormal();
            }, 

            drop: function(ev, ui) {
                    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)
                                        {   
                                            inst.AddKeyword(n.Values[0]);
                                        }
                                    }
                                }
                            }
                        }
                    }
            /*  
                document.getElementById("display").innerHTML =  $(ui.draggable).children("li:first").text(); 
    
                var lid = ($(ui.draggable).children("li:first"));
            
                var removeLink = document.createElement("a"); 
                removeLink.innerHTML = "remove";
                removeLink.href = "#";
                removeLink.onclick = function() 
                {     
                    $(".drop").children().remove("#"+lid[0].id);
                    $(this).remove();       
                }
  
                $(this).append($(ui.draggable).clone().children("li:first").addClass("blocker"));  
                $(this).append(removeLink);
                */
            }
        });
    
    return inst;
}

