var typeAds = "Ads";

var asElama = "elama";
var asYandex = "yandex";
var asBegun = "begun";
var asGoogle = "google";

/**
 *  Возвращает экземпляр "класса" (js lol stupid)
 */
function getAdTransparentInst()
{
    var inst = new Object();
    
    inst.Type = typeAds;
    
    inst.Id = getObjUniqueId();
    Objects[inst.Id] = inst;


    inst._loadingTimeGroupId = null;

    inst.Ads = new Object();

    inst.AdExists = function (sAsSignature)
    {
        var ad = inst.GetAd[sAsSignature];
        if (ad == null)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    inst._primarySrc = null;
    inst.AddAd = function (objAd, bPrimarySrc)
    {
        if (bPrimarySrc!=true)
        {
            bPrimarySrc = false;
        }
        
        if (inst.AdExists(objAd.AS) == false)
        {
            inst.Ads[objAd.AS] = objAd;
            objAd.ParentAds = inst;
            objAd.SetQueryFullSynchronizationCallback(inst.AdQueryFullSynchronizationCallback);
        }
        
        if (bPrimarySrc == true)
        {
            inst._primarySrc = objAd;
        }
        
        return inst.GetAd(objAd.AS);
    }
    
    inst.GetAd = function (sAsSignature)
    {
        return inst.Ads[sAsSignature];
    }

    inst.RemoveAd = function (adId)
    {
        for (x in inst.Ads)
        {
            var ad = this.Ads[x];
            if (ad.Id==adId)
            {
                delete inst.Ads[x];
            }
        }
    }

    adUpdateValueTypeHeader = "header";
    adUpdateValueTypeText = "text";
    adUpdateValueTypeUrl = "url";
    adUpdateValueTypeCheckState = "checkState";
    adUpdateValueTypeCollapsedState = "collapsedState";
    adUpdateClearAdsGUI = "clearAdsGUI";
    adUpdatePagingIndex = "pagingIndex";
    adUpdateRefillWithAds = "refillCampaignControlsWithAds";

    inst.SpreadChanges2Ads = function (srcAd, adUpdateValueType)
    {
        for (x in inst.Ads)
        {
            var ad = inst.Ads[x];
            if (ad==null)
            {
            }
            else
            {
                if (srcAd!=null)
                {
                if (ad.Id != srcAd.Id)
                {
                    if ((ad.IsLocked() == true)
                        // Ниже типы изменений, которые должны синхронизироваться вне зависимости от Locked-статуса отдающих/принимающих объяв
                        || (adUpdateValueType == adUpdateValueTypeCheckState)
                        || (adUpdateValueType == adUpdateValueTypeCollapsedState)
                        )
                    {
                        switch (adUpdateValueType)
                        {
                            case adUpdateValueTypeHeader:
                                if (srcAd.AS == asElama)
                                {
                                    ad.adHeaderInput.SetValue(srcAd.adHeaderInput.Value);
                                }
                                break;
                            case adUpdateValueTypeText:
                                if (srcAd.AS == asElama)
                                {
                                    ad.adTextInput.SetValue(srcAd.adTextInput.Value);
                                }
                                break;
                            case adUpdateValueTypeText:
                                if (srcAd.AS == asElama)
                                {
                                    ad.adUrlInput.SetValue(srcAd.adUrlInput.Value);
                                }
                                break;
                            case adUpdateValueTypeCheckState:
                                if (ad.Checked != srcAd.Checked)
                                {
                                    ad.SetChecked(srcAd.Checked);
                                }
                                break;
                            case adUpdateValueTypeCollapsedState:
                                if (ad.IsCollapsed() != srcAd.IsCollapsed())
                                {
                                    ad.SetCollapsed(srcAd.IsCollapsed());
                                }
                                break;
                            default:
                                if (srcAd.AS == asElama)
                                {
                                    ad.adHeaderInput.SetValue(srcAd.adHeaderInput.Value);
                                    ad.adTextInput.SetValue(srcAd.adTextInput.Value);
                                    ad.adUrlInput.SetValue(srcAd.adUrlInput.Value);
                                }
                                break;
                        }
                    }
                }
            }
                else
                {
                    switch (adUpdateValueType)
                    {
                        case adUpdateClearAdsGUI: // STUB пизданутенько 
                                //alert('adUpdateClearAdsGUI');
                                var campaignControls = getObjectsByType(typeCampaignControl);
                                for (x in campaignControls)
                                {
                                    var ctrl = campaignControls[x];
                                    ctrl.ClearAdsGUI(); 
                                }
                                break;
                        case adUpdateRefillWithAds:
                                //alert('adUpdateRefillWithAds');
                                var campaignControls = getObjectsByType(typeCampaignControl);
                                for (x in campaignControls)
                                {
                                    var ctrl = campaignControls[x];
                                    ctrl.RefillWithAds();
                                }
                                break;
                            default: setStatus("Неизвестный тип сообщение Spreadin'Changes™");
                            break;
                    }
                }
            }
        }
    }

    inst.AdQueryFullSynchronizationCallback = function (objAd) // objAd - sender ofcuz
    {
        if (inst._primarySrc != null)
        {
            inst.SpreadChanges2Ads(inst._primarySrc, adUpdateValueTypeHeader);
            inst.SpreadChanges2Ads(inst._primarySrc, adUpdateValueTypeText);
            inst.SpreadChanges2Ads(inst._primarySrc, adUpdateValueTypeUrl);
        }
    }


    inst.Close = function()
    {
        for (x in inst.Ads)
        {
            var ad = inst.Ads[x];
            ad.Close(true);
        }
    }

    return inst;    
}