Byznys především? Proč se do ČR stále vozí zakázané melatoninové doplňky stravy?

30. 8. 2022

Sdílet

Autor: Depositphotos
Melatoninové doplňky stravy jsou v ČR nelegální, přesto se tady běžně prodávají. Vede to k začarovanému kruhu opakovaných zákazů prodeje a jejich porušování či obcházení. Zeptali jsme se dovozců a výrobců, proč při takto nastavených pravidlech s doplňky stravy v tuzemsku stále obchodují.

Na Vitalii jsme se již v několika textech věnovali popisu toho, jak funguje český trh s doplňky stravy s melatoninem. Jejich obliba mezi zákazníky roste. Popohnal ji covid-19. Jak jsme dříve psali, covid stojí za přibývajícími potížemi se spánkem a nočními můrami. Právě při těchto potížích lidé mohou po melatoninu sáhnout. Melatonin je hormon, který si tělo tvoří samo a ovlivňuje jím mimo jiné fáze spánku a bdění.

Co se dozvíte v článku
  1. Paradoxy českého trhu s melatoninovými doplňky
  2. Anketa mezi dovozci a výrobci zakázaných doplňků stravy
  3. Otázky části obchodníkům nebyly příjemné
  4. K ohrožení zdraví dle výrobce dojít nemohlo
  5. V ČR si lze volně koupit kromě doplňků stravy i lék s melatoninem

Paradoxy českého trhu s melatoninovými doplňky

Prodej melatoninových doplňků stravy, jež spadají do kategorie potravin, nikoliv léčiv, je ovšem plný paradoxů. V České republice je zakázána jejich výroba, dovoz je ale legální. Ač jde o potraviny, do prodeje promlouvá Státní ústav pro kontrolu léčiv (SÚKL). I když jsou na trhu desítky preparátů, z hlediska SÚKL jsou nelegální a jejich prodej postupně zakazovaný. Navíc, přestože část obchodníků nabízí zákazníkům i melatoniny zakázané SÚKLem, pokuta za to zatím nepadla žádná.

Proč k těmto protichůdnostem dochází? SÚKL považuje melatonin za látku, jež  patří výhradě do léků. Uvádí to na webu ve stanovisku z roku 2016, podle nějž se ústav stále řídí. Léky se do oběhu mohou dostat za výrazně jiných pravidel než potraviny a jejich vstup na trh i prodej jsou mnohem více kontrolované. Navíc pokud jde o lék na recept, jeho užívání je pod lékařským dohledem. A o to u melatoninu SÚKL jde především: Aby jej lidé nebrali dlouhodobě a svévolně.

SÚKL zakazuje doplňky stravy s melatoninem, některé lékárny je nabízejí dál Přečtěte si také:

SÚKL zakazuje doplňky stravy s melatoninem, některé lékárny je nabízejí dál

Dalším příčinou toho, jak český trh s melatoninovými doplňky stravy funguje, jsou nastavená pravidla. Ta SÚKL neumožňují situaci řešit jinak než jednotlivými zákazy ve správním řízení včetně možnosti odvolání se k ministerstvu zdravotnictví. Navíc stačí aby se změnila třeba jen drobnost na obalu potravinového doplňku a z pohledu zákonů a vyhlášek jde o zcela nový výrobek, u kterého musí zakazovací kolečko proběhnout znovu a od začátku.

Výsledkem je, že na trhu s melatoninovými potravinovými doplňky seženete i některé, které už byly zakázány. U několika dalších výrobci opatřili krabičku či dózu s tabletami anglickým dovětkem „new“, tedy „nový“, či jinak pozměnili název výrobku, a ten se prodává dál, protože z pohledu českých úřadů jde o nový preparát. Jinde někteří obchodníci zakázaný melatonin nahradili jiným doplňkem stravy, ale opět s melatoninem. I ten ale, pokud se nezmění legislativa, čeká v budoucnu zákaz. Jsou ale i prodejci, kteří po jednání SÚKLu melatoniny přestali raději úplně nabízet.

Anketa mezi dovozci a výrobci zakázaných doplňků stravy

Otázkou je, proč se na trhu i přes stanovisko SÚKL stále objevují potravinové doplňky stravy s melatoninem. Je totiž jasné, že pokud se nezmění legislativa, i je čeká zákaz prodeje.

Redakce Vitalie se proto rozhodla dát prostor dovozcům a zahraničním výrobcům, aby své počínání vysvětlili. E-mailem oslovila všechny výrobce či dovozce, kterým SÚKL letos jeden či více výrobků zakázal, a zeptala se jich, co na rozhodnutí ústavu říkají i na to, proč výrobky na trh uvádí, když se k nim SÚKL staví jako k nelegálním. Došlo i na citlivou otázku, zda svým jednáním mohou ohrozit zdraví zákazníků.

Jaké otázky jsem výrobcům a dovozcům položili

  • Jaký je váš komentář k rozhodnutí SÚKL? Bránili jste se mu v minulosti např. ve správním řízení? Pokud ano, jakými argumenty?
  • Co pro vás rozhodnutí zákazu prodeje znamená? Co případně znamená pro vaše zákazníky?
  • Proč jste na český trh uvedli doplněk stravy s melatoninem, když podle stanoviska SÚKL z roku 2016 je melatonin farmakologicky účinná látka, která patří do léčiv, nikoliv do doplňků stravy? 
  • Nebylo v tomto kontextu rozhodnutí SÚKL o zákazu prodeje pro vás předvídatelné?
  • Lze situaci chápat tak, že jste na trh vědomě uvedli výrobek, který může představovat riziko pro zdraví zákazníků?

Pozn.: Otázky pro jednotlivé společnosti se mohly ve formulaci mírně lišit. Někteří výrobci/dovozci dostali i otázky navíc. Šlo např. o ty, kteří zakázaný produkt nestáhli z prodeje.

Seznam zakázaných melatoninů za letošní rok, ale i léta minulá, lze dohledat na webu SÚKL. Do ankety redakce zahrnula všechny dovozce/výrobce, kterých se letošní zákaz týkal. Použili jsme veřejně dostupný soupis zakázaných výrobků k 28. červenci. Jde o datum zobrazení seznamu, nikoliv datum pro nabytí právní moci rozhodnutí SÚKL. Na soupisce v tu dobu bylo u zakázaných melatoninů 12 firem.

Dovozci/výrobci, kteří uvedli na trh později zakázaný melatoninový doplněk stravy

  • JutaVit Pharma s. r. o.
  • Brainio s. r. o.
  • KLASIK ČR spol. s. r. o.
  • Cosmix s. r. o.
  • Earplugs s. r. o.
  • Salutem Pharma s. r. o.
  • Woykoff, a. s.
  • Pharma Activ Czech s. r. o.
  • NUTRICIUS s. r. o.
  • Czech Nutrition s. r. o.
  • Adelle Davis
  • Natios Health s. r. o. 

Zdroj: SÚKL, Výrobky přeřazené do skupiny léčiv, rok 2022

E-mail s téměř totožnými otázkami výrobci či dovozci dostali na přelomu července a srpna. Na vyjádření měli formální lhůtu týden, ale mezi zasláním dotazů a vznikem tohoto textu uplynula mnohem delší doba, takže faktickou šanci vyjádřit se měli případní opozdilci delší, a to i s ohledem na období dovolených.

Otázky části obchodníkům nebyly příjemné

Většina oslovených firem na dotazy nereagovala. V jednom případě, a to u společnosti Czech Nutrition automatická zpětná odpověď prozradila, že e-mail putoval po krátké době od doručení do virtuálního koše.

Některé společnosti reagovaly, ale na otázky jejich zástupci neodpověděli. „Vaše dotazy se nás vůbec v současnou chvíli netýkají, a proto na něj nebudeme reagovat,“ píše v e-mailu Roman Krochmalny, manažer společnosti Pharma Active Czech, která je uvedena u pěti letos SÚKLem zakázaných doplňků stravy s melatonine. Firma je následně stáhla z trhu.

Kupujete si doplňky stravy s melatoninem?

„Budu k vám upřímný a zeptám se vás, z jakého důvodu informace potřebujete, jde o článek, nebo zadanou zakázku, která by měla někoho diskreditovat, neboť po pravdě řečeno, z vašeho dotazu cítím, že jde o účelové zaměření, které má vrhat špatné světlo nejen na látku melatonin, ale také na výrobce, dovozce, či prodejce,“ napsal redaktorce zástupce společnosti KLASIK ČR, který se podepsal křestním jménem Petr.

K ohrožení zdraví dle výrobce dojít nemohlo

Odpovědi nakonec zaslaly tři společnosti. Jediná, která komentovala možné negativní ovlivnění zdraví zákazníků, byl slovenský výrobce Adelle Davis. SÚKL tuto společnost uvádí jako výrobce jednoho letos zakázaného melatoninu, a tím je výrobek CalMag s melatoninem.

„V kontextu se stanoviskem SÚKL z roku 2016 chápeme, že legislativa ČR pokládá množství 1mg melatoninu v jedné dávce za léčivo a plně to akceptujeme. Rozhodně však nesouhlasíme, že bychom ohrozili zdraví spotřebitelů, protože legislativa ohledně doplňků a léčiv je v rámci Evropy plovoucí. Tím myslím to, že co je v jednom státě považováno za lék, v jiném státě je pokládáno za doplněk stravy. Proto jsme přesvědčeni, že zdraví spotřebitelů nebylo žádným způsobem ohroženo,“ píše obchodní ředitel společnost Ondrej Švantner.

Adelle Davis byla také jedinou společností, která se vyjádřila k otázce, proč se do ČR doplněk stravy dostal, když pravidla jsou nastavena tak, že melatonin má být jen v lécích. Podle Ondreje Švantnera nejde o přímou obchodní aktivitu výrobce, ale krok jednoho z prodejců, jehož jednání nemohou ovlivnit, nicméně na stažení výrobku byl tento obchodník upozorněn.

„Produkt byl na trh uveden jedním z našich obchodních partnerů ze SR. (…) Pokud jej od nás nakupuje subjekt, který má slovenské identifikační číslo pro daň z přidané hodnoty, nemůžeme vědět, na jaký trh je produkt uveden,“ popisuje Ondrej Švantner s tím, že produkt nebyl určen pro český trh.

„Etiketa je ve slovenském  nebo anglickém jazyce, prodejní cena je stanovená v eurech. Produkt se nenachází na námi provozovaných webech určených pro ČR a rovněž není registrován ani v databázi PDK (jde o jednotný systém číslování přípravků obchodovaných v síti lékáren, pozn. red.), což znamená, že jej jako výrobce neprodáváme a nevyrábíme pro ČR,“ uvádí Ondrej Švantner.

V ČR tento výrobek nabízel ještě na začátku srpna, tedy v době, kdy už měl být stažen, e-shop Muziker.cz slovenské společnosti Muziker, a. s. Proč, to není jasné. Vitalia e-shop oslovila, jeho zástupkyně sice slíbila vyjádření, to ale nepřišlo. E-shop ale následně CalMag s melatoninem z nabídky stáhl.

V ČR si lze volně koupit kromě doplňků stravy i lék s melatoninem

Další dovozci, kteří na e-mail redakce reagovali, otázku, proč později zakázaný melatonin prodávali, nechali bez odpovědi. Uvedli ale, že rozhodnutí SÚKL respektují a prodej zastavili.

„Proti rozhodnutí SÚKL jsme se nijak nebránili a zcela jsme ho respektovali. Jak můžete vidět na našich stránkách, tak veškeré produkty s melatoninem jsou na našich stánkách nedostupné. Všechny tyto produkty se změnili na nedostupné od doby, kdy jsme byli na to SÚKL upozorněni,“ píše Adam Hošek, jednatel společnosti Natios Health.

„SÚKL zakázal prodej všech doplňků s melatoninem, my jsme se tomu nijak nebránili, naopak jsme rozhodnutí přijali a prodej na první vyzvání zastavili. Skladem produkt nemáme již cca 4 měsíce, takže ani prodej a dostupnost možná není,“ sděluje Jakub Chvosta, jednatel společnosti Brainio.

„Náš produkt s melatoninem byl od začátku komunikovaný jako vhodný pro lidi s jet lagem, práci na směny, srovnání biorytmu atd., nikoli k dlouhodobému pravidelnému užívání, což jsme posílali i v návodu s produktem,“ dodává s tím, že zákazníci byly s produktem velmi spokojeni, protože jim pomáhal. „Benefity melatoninu jsou zřejmé, v mnoha zemích a trzích je povolený,“ podotýká Jakub Chvosta.

O vyjádření jsme požádali také profesní sdružení lékárníků. „Doplňky stravy nejsou vázané na výdej v lékárnách, proto mohou být prodávány nejen v lékárně, ale také v kterémkoli obchodě,“ uvádí mluvčí České lékárnické komory Michaela Bažantová na otázku, proč je i přes stanovisko SÚKL prodej doplňků stravy s melatoninem tak hojný.

„Chápeme vyjádření SÚKL, že by přípravky s obsahem melatoninu měly být dostupné pouze jako léčivé přípravky vázané na lékařský předpis. Vyjádření ústavu z roku 2016 k melatoninu však nereflektuje reálný vývoj, protože mezi registrovanými léky již dnes existuje léčivý přípravek, který na recept vázán není,“ upozorňuje Michaela Bažantová v narážce na to, že dle SÚKL užívání melatoninu bez dozoru lékaře může ovlivnit zdraví pacienta.

V současné době se v ČR prodává volně pouze jeden lék s melatoninem, a tím je finský preparát Melatonin Vitabalans 3 mg. Na rozdíl od doplňků stravy prošel klinickými zkouškami, jež prokázaly jeho účinnost, registračním řízením a po celou dobu jeho uvádění na trh je stejně jako u jiných léků u něj sledována jeho bezpečnost.

Autor článku

Redaktorka Vitalia.cz. Vystudovala žurnalistiku a češtinu na Univerzitě Palackého v Olomouci, pracovala v Deníku, na webu TV Nova a iDNES.cz. Píše o zdravotnictví. Je držitelkou novinářských cen Psychiatrické společností ČLS JEP za rok 2021 a 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 »