Regulace reklamy na zdravotnické prostředky omezí šmejdy. Advokát vysvětluje, proč být ve střehu

5. 8. 2021

Sdílet

Autor: Vitalia.cz / Karel Choc
ROZHOVOR – Regulace reklamy zdravotnických prostředků a výrobků cílících na zdraví u nás dosud chyběla. Od května platí nová právní úprava. „Je to správný krok, problém je v legislativním přílepku, který může způsobit zmatky,“ komentuje advokát Adam Přerovský.

Reklama na zdravotnické prostředky v ČR doposud neměla, na rozdíl od léčivých přípravků, speciální právní úpravu a podléhala tak obecným pravidlům. Nový zákon vešel v platnost koncem května 2021. „Nad rámec klasické regulace reklamy zdravotnických prostředků se český zákonodárce rozhodl pro rozšíření okruhu regulovaných výrobků i na produkty, které sice nejsou zdravotnickými prostředky či léčivými přípravky, ale jejichž propagace cílí na lidské zdraví. Smyslem nového ustanovení má být zefektivnění boje proti tzv. šmejdům deklarujícím ničím nepodložený efekt na lidské zdraví,“ popisuje Adam Přerovský z globální advokátní kanceláře Dentons.

Háček je v tom, že při určitém právním výkladu může nová regulace dopadat na velké množství výrobků, které více či méně souvisejí se zdravým životním stylem anebo jejichž použití je v praxi doporučováno zdravotníky či známými osobnostmi. „Může se tedy například jednat o obecně známé reklamy na zubní kartáčky, potraviny, sportovní náčiní a podobně,“ vysvětluje advokát.

Co se vlastně od května změnilo?

Máme tu zcela novou právní úpravu regulace reklamy zdravotnických prostředků, která navazuje a v mnohém až do detailu kopíruje regulaci reklamy na léčivé přípravky. Tu již nějakou dobu upravuje zákon o regulaci reklamy, který rozlišuje v zásadě dvě kategorie – reklamu cílící na širokou veřejnost a reklamu určenou pro odborníky, lékaře, lékárníky ap. Nová regulace zdravotnických prostředků tuto systematiku převzala a z velké části používá i stejné pojmy.

Chyběla podle vás v ČR podobná regulace?

Jsem přesvědčen, že je to správný krok. Dosud se propagace těchto zdravotnických a jiných podobných prostředků pohybovala v jakési šedé zóně. Dozorovými orgány byly krajské živnostenské úřady, které na podobnou kontrolu nemají odborné ani časové kapacity. Tato problematika byla na okraji jejich zájmu a k šetření a rozhodování v oblasti zdravotnických prostředků téměř nedocházelo. Přitom se jedná o výrobky, které mají vliv na lidské zdraví, podobně jako léčiva.                                                     

Nově reklamu na zdravotnické prostředky bude vedle Rady pro rozhlasové a televizní vysílání monitorovat Státní ústav pro kontrolu léčiv (SÚKL). Ten disponuje potřebnými prostředky i odborností, lze tedy očekávat větší množství šetření z jeho strany, a výrobci, distributoři a koncoví prodejci by se na to měli připravit.

Jak? Co to pro ně znamená?

Do dnešní doby se tím nemuseli tak intenzivně zabývat, teď by se měli seznámit s novou právní úpravou a dát si do pořádku marketingové materiály tak, aby s ní byly v souladu. Dosud se řešilo v podstatě jen to, zda reklama není klamavá, agresivní a podobně, tedy zda neodporuje obecné právní regulaci reklamy a pravidlům ochrany spotřebitele. Nyní je její obsah přesněji vymezen a jednotlivé společnosti musí nové legislativě přizpůsobit svou obchodní a marketingovou politiku.

Regulace reklamy na zdravotnické prostředky

Reklama zaměřená na odborníky

  • Může být šířena pouze prostřednictvím komunikačních prostředků určených převážně pro tyto odborníky, zejména v odborných publikacích a videích, přičemž její obsah je značně omezen.
  • Zcela zakázané jsou jakékoliv dary nebo jiný prospěch poskytovaný či nabízený odborníkům, ledaže je nepatrné hodnoty a má vztah k vykonávané odborné činnosti. To neplatí o poskytování vzorků, pokud jde pouze o potřebné množství a vzorky jsou náležitě označeny.
  • Omezení se, podobně jako u regulace reklamy léčivých přípravků, vztahují rovněž na kongresy a jiná setkání. Na těch může sponzor poskytovat bezplatně pohoštění, ubytování a dopravu pouze přiměřeně účelu setkání a nesmí jej rozšířit na jiné osoby než odborníky.

Reklama zaměřená na širokou veřejnost

  • Zcela zakázána je propagace zdravotnických prostředků určených pouze pro použití zdravotnickým pracovníkem a dále pak těch, které mohou být vydány pouze na poukaz nebo žádanku vystavenou lékařem.
  • U ostatních podléhá reklama mnohým omezením. Kromě obecných požadavků, jako je zákaz klamavé či srovnávací reklamy, nesmí reklama na zdravotnické prostředky např. bagatelizovat potřebu porady s lékařem, naznačovat, že klinická účinnost je zaručená nebo že nepoužitím zdravotnického prostředku může být nepříznivě ovlivněn zdravotní stav.
  • Zákon se rovněž zaměřuje na časté reklamní praktiky, jako je doporučení odborníků či známých osobností či zavádějící ilustrace změny na těle v důsledku použití zdravotnického prostředku (typicky například fotografie „před“ a „po“).
  • Nepřípustné je taktéž poskytování vzorků široké veřejnosti.

Zdroj: Advokátní kancelář Dentons

Velkou změnou je také to, že nová právní úprava se vztahuje jak na zdravotnické prostředky, tak na další kategorii – tzv. „výrobky cílící na zdraví“. Tedy produkty, které sice nejsou léčivými přípravky ani zdravotnickými prostředky, ale výrobce by je tak třeba rád prezentoval. O co se jedná?

Jde o poměrně široký a ne zcela jasný pojem. V tuto chvíli se domnívám, že se může jednat o jakýkoli výrobek, který nějakým způsobem přímo či nepřímo cílí na zdraví člověka. A je zakázána taková reklama, která by naznačovala, že daný výrobek léčivým přípravkem anebo zdravotnickým prostředkem je. Sem by mohly spadat například praktiky některých multi-level marketingových firem, kde si babička koupí ohřívač na záda nebo hřejivou deku s tím, že jí to zdravotně pomůže. Takové výrobky nebude možné propagovat jako zdraví prospěšné.

Co všechno lze do této kategorie zahrnout?

To ukáže až praxe dozorových orgánů, zejména pak SÚKLu, jak široce bude pojem „výrobek cílící na zdraví“ vykládán. Bude to myslím směřovat zejména na tzv. šmejdy, respektive na praktiky, kterými se snaží přesvědčit spotřebitele, aby si zakoupili něco, co nemá prokázaný zdraví prospěšný účinek. Takoví prodejci pak mají v praxi neférovou výhodu oproti řádným výrobcům nebo distributorům skutečných zdravotnických prostředků, kteří musí projít procesem registrace a následně se na ně vztahuje přísná regulace.

A lze předpokládat, že řada neseriózních prodejců se bude snažit novou právní regulaci obejít, protože téma zdraví dnes táhne a pomalu všechno, co si dnes dokážeme představit, je prezentováno jako „zdraví prospěšné“, například různé „zdravotní“ polštáře…

Nebo třeba židle?

Přesně tak, vždyť teď, kdy byla velká část našich občanů doma na home office kvůli covidu, se na nás valily reklamy na „zdravé sezení“ a zakoupení „zdraví prospěšných“ židlí. Některé z nich přitom opravdu mohou být registrovány jako zdravotnický prostředek, ale řada z takových výrobků zdravotnickým prostředkem není, přestože jsou takto více či méně prezentovány. Myslím, že SÚKL bude mít co dělat… Nebude jednoduché udělat v tom pořádek a nastavit jasnou hranici.


Autor: Vitalia.cz / Karel Choc

„Za nejproblematičtější považuji nově zavedený zákaz propagace výrobků pomocí známých osobností, které by díky svému společenskému postavení mohly podpořit jejich prodej,“ říká Adam Přerovský. „Může třeba fitness tyčinku doporučovat známý sportovec propagující zdravý životní styl?“

Zákon tedy zakazuje jednak reklamu, kdy se „výrobek cílící na zdraví“ prezentuje jako léčivý přípravek anebo zdravotnický prostředek, přestože jím není. Ale také zakazuje různá zdravotní tvrzení u některých dalších výrobků, které nemusí nutně cílit na zdraví…

Toto ustanovení bylo – poměrně nešťastně – vloženo do zákona na poslední chvíli pozměňovacím návrhem několika poslanců a je poněkud nejasné v tom, čeho se má týkat. Rozšiřuje omezení reklamy na „všechny ostatní výrobky, jež nejsou léčivými přípravky, zdravotnickými prostředky či jinými výrobky, u kterých zákon o regulaci reklamy stanoví jiný právní režim“. K nim říká následující: reklama nesmí naznačovat, že se používáním těchto výrobků zlepší či zachová zdravotní stav, také nesmí naznačovat, že naopak nepoužitím výrobku může být zdravotní stav nepříznivě ovlivněn. V neposlední řadě nesmí doporučovat výrobek s odvoláním na doporučení vědců, zdravotnických odborníků či veřejně známých osobností, které by mohly podpořit prodej takového výrobku.

Za nejproblematičtější považuji nově zavedený zákaz propagace výrobků pomocí známých osobností, které by díky svému společenskému postavení mohly podpořit jejich prodej. Zákon tento nový zákaz poměrně nepochopitelně neváže pouze na výrobky cílící na zdraví, o kterých jsme již dříve hovořili, ale může se teoreticky jednat o jakýkoli výrobek propagovaný veřejně známou osobností, byť nemá se zdravím nic společného. V tomto bodě vnímám novou právní úpravu jako legislativně nedotaženou a věřím, že dozorové orgány budou k tomuto přistupovat rozumně a že v brzké době dojde ke korekci zákona.

Čistým jazykovým výkladem by tato část nové úpravy hypoteticky zakazovala propagaci jakýchkoli produktů pomocí veřejně známých osobností. Věřím, že toto nebylo úmyslem zákonodárce.

A pod toto mohou spadnout stovky či tisíce výrobků.

Jaké například?

Nevíme, jak to bude posuzovat SÚKL, ale mohlo by jít třeba o různou elektroniku, fitness náramky, aplikace, software na cvičení, sportovní náčiní, kosmetiku a drogerii, ale možná i určité potraviny, doplňky stravy, kojeneckou výživu apod. Může třeba fitness tyčinku doporučovat známý sportovec propagující zdravý životní styl? Může někdo propagovat lifestylové alkoholické nápoje typu Hard Seltzer jako zdravější alternativu ke klasickému alkoholu? Není ani jasné, zda je možné třeba odkázat na odborné studie při propagaci těchto výrobků. Odpovědi zatím neznáme a jsem osobně zvědavý, jakým způsobem bude SÚKL a Rada pro rozhlasové a televizní vysílání takové situace vyhodnocovat.

Otázka je také, co přesně spadá pod pojem „reklama“. Je znám případ, kdy za reklamu byly označeny i zpravodajské články týkající se konkrétního léku. Znamená to, že média budou mít problém psát o zdravotní problematice?

To by bylo přehnané. Opět to není jednoznačné, ale z mého chápání judikatury Soudního dvora Evropské unie a podle obecné definice reklamy se vždycky musí jednat o to, že cílem daného článku či jiného mediálního obsahu je podpořit prodej daného produktu. Pokud má článek pouze informativní charakter a necílí na podporu prodeje, neměl by být vnímán jako reklama. Mohou ovšem existovat hraniční situace a nelze zcela vyloučit, že se tím bude SÚKL v budoucnu zabývat, a to zejména v době covidové pandemie, kdy média chrlí velké množství rádoby odborného obsahu o účincích celé řady léků a zdravotnických prostředků či jiných alternativ k léčbě post-covidových syndromů.

Jak tedy novou právní úpravu hodnotíte? Pomůže v boji proti šmejdům a pro koho bude přínosná?

Nová právní úprava regulace reklamy zdravotnických prostředků je určitě vítaná. Výrobcům, distributorům i spotřebitelům dává poměrně jasně najevo, co se může a co se nesmí. Dalším velkým přínosem je sjednocení kompetence Státního ústavu pro kontrolu léčiv jak v oblasti dohledu a kontroly nad samotnou registrací, tak následným prodejem a propagací zdravotnických prostředků. Je určitě dobré, že zde bude jeden úřad, který bude tyto otázky řešit.

Pokud jde o efekt, který to bude mít na trh, tak ze dne na den se zřejmě nic dramatického nestane. SÚKL má novou pravomoc a bude se seznamovat se situací. Tipuji, že v horizontu tří až pěti let lze očekávat, že si posvítí na nejzávažnější případy, které klamou spotřebitele reklamou o účincích a efektech daného produktu. A bude se snažit trh narovnat, aby řádní výrobci a prodejci nebyli v nevýhodě oproti pofiderním producentům a distributorům. Hranice je velmi tenká a byznys je to miliardový, narovnání poměrů a ochrana spotřebitelů by měly být hlavním cílem.

Doplnění k rozhovoru:

Na základě upozornění Jana Hoferka z webu Právní prostor (děkujeme) a dalšího ověřování se posléze ukazuje, že výklad zákona je komplikovanější. Platí, že dozor nad novými pravidly bude provádět SÚKL, pokud jde o reklamu na zdravotnické prostředky a diagnostické zdravotnické prostředky in vitro. SÚKL je však příslušný pouze k dozoru nad léčivými přípravky a zdravotnickými prostředky, nikoli nad „výrobky cílícími na zdraví“. Dozor nad reklamou na tyto výrobky, s výjimkou televizní a rozhlasové reklamy, mají vykonávat krajské živnostenské úřady (potažmo ve druhém stupni ministerstvo průmyslu a obchodu).

Jak Advokátní kanceláři Dentons potvrdila zástupkyně SÚKLu z oddělení kontroly zdravotnických prostředků, orgánem dozoru nad reklamou na výrobky cílící na zdraví uvedené v ustanovení § 5n zákona není SÚKL, ale krajské živnostenské úřady. Je otázka, zda jsou si živnostenské úřady této nové kompetence vůbec vědomy a do jaké míry budou schopny vykonávat dozorovou činnost nad „výrobky cílícími na zdraví“. Do budoucna by dle Adama Přerovského bylo praktické, aby veškerou pravomoc v oblasti zdraví vykonával jeden úřad a dozorová činnost nebyla roztříštěna mezi několik úřadů.

Adam Přerovský. Advokát, působí v globální advokátní kanceláři Dentons. Zaměřuje se na všechny oblasti soutěžního a antimonopolního práva, smluvního práva a ochrany spotřebitele, právní poradenství v oblasti farmaceutického a zdravotnického průmyslu, technologií a duševního vlastnictví.

Autor článku

Redaktorka, editorka, dlouholetá šéfredaktorka serveru Vitalia.cz (do června 2022)

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »