V doplňcích stravy nemá melatonin co dělat, přesto u nás jejich prodej kvete

4. 3. 2022

Sdílet

Autor: Depositphotos
Prodej doplňků stravy s obsahem hormonu melatoninu provázejí kontroverze. Podle lékového ústavu v potravinách melatonin nemá co dělat. Jenže legislativa jejich dovoz umožňuje a kontroly těchto doplňků stravy jsou tak zdlouhavé, že se trh nedaří vyčistit. Přitom volný prodej melatoninu nebývale roste.

Je to problém, který naplno odhalily až dopady pandemie covidu. A nyní jej zmapovala redaktorka serveru Vitalia.cz. Řeč je o prodeji potravinových doplňků s melatoninem.

Co se dozvíte v článku
  1. Po covidu přibylo lidí s poruchami spánku
  2. Prodej doplňků stravy s melatoninem roste
  3. SÚKL: melatonin má být jen v lécích
  4. Rizika užívání melatoninu
  5. V ČR se melatoninové doplňky vyrábět nesmí, dovoz je ale povolen
  6. Kontroly prodlužuje odvolání. Ministerstvo nestíhá lhůty
  7. Kvůli melatoninu se budou měnit zákony

Po covidu přibylo lidí s poruchami spánku

Melatonin je hormon, někdy též nazývaný jako hormon spánku či tmy, který se tvoří v mozku a je důležitý pro správný biorytmus spánku a bdění. Zároveň jde o látku, kterou výrobci přidávají do léčiv a doplňků stravy, jež mají ovlivňovat kvalitu spánku či dobu, kdy se spánek dostaví.

Poruchy spánku přitom patří k jednomu z rozšířených vedlejších důsledků pandemie viru SARS-CoV-2. Ukazují to alespoň první data ze stále probíhajícího průzkumu organizovaného Národním ústavem duševního zdraví (NÚDZ). Jak již dříve serveru Vitalia.cz řekla lékařka Tereza Dvořáková z Centra spánkové medicíny a chronobiologie NÚDZ, potíže se spánkem ve formě například nespavosti, nočních můr, atypického chování ve spánku nebo naopak nadměrné denní spavosti udává po covidu 70 % pacientů.

S nástupem pandemie se proto začaly zvyšovat prodeje léčiv a doplňků stravy, jež jsou zaměřeny na kvalitu spánku. Pacienti přitom často jdou cestou nejmenšího odporu: sáhnou po volně prodejných preparátech. Mezi ně patří i doplňky stravy s melatoninem. Velké řetězce lékáren, které Vitalia.cz oslovila v lednu, potvrdily, že prodeje meziročně skokově narostly.

Prodej doplňků stravy s melatoninem roste

Například společnost Česká lékárna holding, pod niž spadá síť lékáren Dr. Max a distributor léčiv Via Pharma, prodala předloni 38 000 kusů přípravků s melatoninem. Loni už to bylo bezmála 79 000 kusů. Nárůst potvrzuje také síť lékáren Benu. Češi za přípravky na podporu spánku, kam patří i doplňky s melatoninem, podle Benu lékáren loni utratili celkově 87 milionů korun. „Poslední dva roky tato kategorie roste, za rok 2021 dokonce dynamikou +38,4 %,“ uvedla mluvčí Benu Česká republika Veronika Lucká Loosová.

Potíž je ale v tom, že melatonin do doplňků stravy nepatří a tyto výrobky by se v ČR neměly prodávat. Tedy čistě teoreticky, protože jak zjistil server Vitalia.cz, legislativa a kontrola prodeje u těchto produktů pokulhává.

SÚKL: melatonin má být jen v lécích

Nejvyšší léková autorita, kterou je v ČR Státní ústav pro kontrolu léčiv (SÚKL), již v roce 2016 konstatovala, že melatonin „patří mezi farmakologicky účinné látky a její užívání bez dozoru lékaře může negativně ovlivnit zdraví pacienta, a to i při podávání nižších denních dávek“. A dále: „S ohledem na farmakologické účinky látky melatonin považuje SÚKL přípravky, které tuto látku obsahují, za léčivé přípravky.“ Citace jsou ze stanoviska zveřejněného na webu SÚKL.

Navíc vyhláška o doplňcích stravy a složení potravin zakazuje látku melatonin používat při výrobě potravin, tedy i doplňků stravy.

Rizika užívání melatoninu

  • Interakce s jinými léčivy – např. estrogen obsažený v hormonální antikoncepci nebo některá antidepresiva mohou způsobit zvýšení hladiny melatoninu v krvi, proto mohou zvýšit účinek potravinového doplňku s melatoninem.
  • Zvýšená ospalost – užívání melatoninu může ovlivnit činnosti vyžadující zvýšenou pozornost, jakým je například řízení dopravního prostředku nebo obsluha některých strojů.

Zdroj: SÚKL

Jak je tedy možné, že potravinové doplňky s melatoninem jsou volně dostupné na trhu a jejich nabídka je tak pestrá?

Jedním z vysvětlení je vysoký zájem distributorů, prodejců a zákazníků. „Ke změně právních předpisů nedošlo, jedná se o aktivitu trhu,“ potvrzuje mluvčí ministerstva zdravotnictví (MZ) Ondřej Jakob na otázku, proč se v minulosti v ČR melatonin téměř neprodával a nyní jsou tu stovky různých druhů výrobků, jejichž ceny začínají v řádech desetikorun.

V ČR se melatoninové doplňky vyrábět nesmí, dovoz je ale povolen

Druhým důvodem je legislativa. Zákaz používat melatonin platí jen u výroby potravinových doplňků na území ČR. Nevztahuje se na dovezené zboží ze zemí, kde je přidávání melatoninu do potravin (kam doplňky stravy formálně spadají) legální. 

„Používání melatoninu v doplňcích stravy je tolerováno například v Německu a na Slovensku. S ohledem na jednotný evropský trh dovozu těchto výrobků do ČR nelze zabránit. Nelze tedy zabránit ani přílivu nových výrobků s obsahem melatoninu,“ říká mluvčí SÚKL Klára Brunclíková.

Zákaz prodeje vede přes individuální kontroly melatoninových doplňků stravy ze strany SÚKL. „Výrobky obsahující léčivou látku melatonin šetří SÚKL vždy jednotlivě,“ dodává jeho mluvčí.

Kontroly přicházejí buď na základě podnětu, nebo vyplývají z vlastní činnosti ústavu. Podle SÚKL téměř všechny končí stejně: ve správním řízení, kde se posuzuje, zda jde u doplňku stravy ve skutečnosti o léčivo. A většina správních řízení končí rozhodnutím, že jde o lék. SÚKL pak dovozci nařídí daný potravinový doplněk stáhnout.

Kontroly prodlužuje odvolání. Ministerstvo nestíhá lhůty

Jenže správní řízení je zdlouhavé a dovozci mají možnost odvolat se na MZ. To nyní vede takových řízení ve vztahu k melatoninových doplňkům 12. „Odvolání výrazně přibylo v minulém roce. V roce 2019 byla MZ doručena 2 odvolání a stejně tak v roce 2020. V roce 2021 ji bylo už 9,“ popisuje mluvčí MZ Ondřej Jakob.

Na rozhodnutí má MZ v těchto případech 60 dnů. Ministerstvo ale lhůty nestíhá. „Rozhodování v tzv. ‚hraničním‘ řízení (tj. řízení, ve kterém je posuzováno, zda je výrobek léčivým přípravkem ve smyslu zákona o léčivech) je jak v prvním stupni, tak v odvolacím řízení náročné (z pohledu odborného posouzení), a lhůtu se proto nedaří dodržovat. V posledních dvou letech pak došlo v důsledku pandemie k dalšímu prodloužení doby správních řízení,“ dodává Ondřej Jakob.

Přitom dokud není odvolací řízení ukončeno, výrobek s melatoninem se smí prodávat dál. 

Ale ani po zákazu prodeje nemusí trh o doplněk stravy přijít. Stačí, aby výrobce či dovozce pozměnil texty na obalu, popřípadě v příbalovém letáku nebo složení obsažených látek. „Jakákoliv změna ve složení výrobku nebo v textech na jeho obalu a v příbalové informaci v důsledku znamená, že jde o výrobek jiný než ten, který byl předmětem rozhodnutí. V takovém případě, pokud je zde důvod, musí SÚKL rozhodnout znovu,“ podotýká Klára Brunclíková.

Kvůli melatoninu se budou měnit zákony

Z výše uvedených důvodů vyplývá, že možnost kontroly a stahování doplňků stravy s melatoninem nejsou dostatečně efektivní. Navíc, pokud je výrobek zakázaný, protože ve skutečnosti jde o lék, hrozí sice jeho dovozci za další prodej pokuta až 20 milionů korun, jak ale uvedl na dotazy Vitalia.cz SÚKL, žádná sankce zatím nikdy nepadla. „SÚKL zatím za nelegální obchodování s nelegálními léčivými přípravky obsahujícími látku melatonin pokutu neudělil,“ uvádí Klára Brunclíková.

To, že situace není v pořádku, MZ ví a v budoucnu chce věc řešit změnou legislativy. Kdy k ní dojde, to zatím není jasné. „Ministerstvo zdravotnictví ve spolupráci s SÚKL se této oblasti intenzivně věnuje a hledá nové legislativní řešení dané problematiky tak, aby bylo možné efektivněji rozhodovat v hraniční agendě,“ dodává mluvčí MZ.

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 »