Přeplatky za léky přijdou automaticky. Ale má pojišťovna vaše číslo účtu nebo adresu?

11. 2. 2023

Sdílet

Autor: Depositphotos
Úřad pro ochranu hospodářské soutěž kontroloval, jak funguje dodávání léků do nemocnic či lékáren. Následně vydal doporučení, z nichž část míří i na pacienty. Radí jim třeba, aby po zdravotních pojišťovnách žádali přeplatky za léky nad ochranný limit. Rada je ovšem zavádějící, protože limity hlídají zdravotní pojišťovny a lidem je vrací automaticky.

Výsledky kontrol u distribuce léčiv zveřejnil Úřad pro ochranu hospodářské soutěže (ÚOHS), neboli antimonopolní úřad, na svém webu 8. února. Ze strany lékárníků se závěr kontrol setkal s kritikou, která by se dala shrnout asi tak, že podle nich vítězí obchod nad odborným zdravotnickým vzděláním.

Co se dozvíte v článku
  1. Co radí ÚOHS spotřebitelům
  2. Generická substituce má výhody
  3. Doplatky si hlídat nemusíte
  4. Jak fungují přeplatky za doplatky
  5. Výše ochranných limitů u doplatků za léky 
  6. Průběžně jen přeplatky nad 200 korun
  7. Co se nezapočítává do limitu

Profesní kritiku ovšem nechme stranou, pro pacienty je na kontrole nejzajímavější něco jiného. A to závěr, ve kterém ÚOHS doporučuje, co v oblasti obchodu s léčivy každý může udělat pro své dobro.

Co radí ÚOHS spotřebitelům

  • Využívat levnější variantu volně zaměnitelných léčiv (generika), 
  • ověřit výši doplatku ve více lékárnách a zvolit nejvýhodnější variantu, 
  • sledovat roční ochranné limity dle věku pojištěnce a žádat přeplatky, 
  • nevytvářet nadbytečné zásoby léčiv.

Zdroj: Tisková zpráva ÚOHS

Na to, aby si lidé nevytvářeli nadbytečné zásoby, opakovaně apelují Ministerstvo zdravotnictví i lékový ústav. Trh s léčivy se měsíce potýká s výpadky medikamentů na recept i těch volně prodejných. Situace je nepřehledná, každá z lékáren jinak zásobená, a tak lidé např. s receptem na důležitá antibiotika či antibiotické kapky do očí musí obtelefonovávat lékárny, obíhat je či žádat řetězce, aby jim prozradily aktuální skladové zásoby na všech pobočkách v okolí. Není proto divu, že k domácímu hromadění léků to svádí.

Mezi lékárníky, lékaři, ale i výrobci léčiv panuje nervozita, jež je zčásti vyvolána připravovanou novelou zákona o léčivech. Uklidnění nepřinášejí ani prohlášení ministerstva a Státního ústavu pro kontrolu léčiv, že léky sem míří v mimořádných dodávkách. Ty ovšem jdou mimo běžný distribuční řetězec, proto není až tak jisté, kdy a kde se objeví. Ani to, zda si je pacient nezaplatí ze svého. Mimořádných dodávek se ovšem kontrola antimonopolního úřadu netýkala.

Antibiotika z mimořádných dodávek si budou zatím platit pacienti ze svého Přečtěte si také:

Antibiotika z mimořádných dodávek si budou zatím platit pacienti ze svého

Generická substituce má výhody

Rada, aby si pacienti nechali léčiva zaměnit, je postavena na principu, že na trhu je řada léků, které si sice jmenují podobně či jinak, obsahují ale stejnou účinnou látku, a to třeba i ve stejných koncentracích. Lékárník proto může zákazníkovi doporučit, aby si koupil lék s jiným názvem, ale stejným účinkem. Taková výměna se odborně nazývá generická substituce. (Existuje ještě pojem generická preskripce a ten značí, že lékař nepředepíše pacientovi konkrétní název léku, ale jen účinnou látku.) Záměnu ovšem lékárník nesmí udělat bez svolení pacienta. Tímto způsobem skutečně lze ušetřit i vyhnout se tomu, že nemocný zůstane bez léku, pokud ten, který běžné užívá, výrobce do ČR aktuálně nedodává.

Řada léků, ačkoliv je na recept, má doplatky. Ty se skutečně mohou mezi lékárnami lišit. Pro to, aby zájemce o něj zjistil, kde je doplatek levnější, ale musí opět telefonovat či obíhat lékárny. Žádný univerzální registr doplatků neexistuje a lékárnické e-shopy léky na recept na dálku prodávat nesmějí. Tato rada je tedy jen pro trpělivé.

Doplatky si hlídat nemusíte

Rada ÚOHS, aby pojištěnci sledovali ochranné limity u doplatků léčiv a žádali přeplatky, je zavádějící. Překročení tzv. ochranných limitů hlídají zdravotní pojišťovny. Pokud limit pojištěnec překročí, má pojišťovna už řadu let povinnost mu přeplatek poslat. Automaticky. Buď na bankovní účet klienta, nebo složenkou. To znamená, že klient si nic hlídat nemusí a o peníze pojišťovnu nežádá.

Pojišťovny musí lidem vracet nadlimitní doplatky za léky. Co udělat pro to, aby vám peníze opravdu přišly? Přečtěte si také:

Pojišťovny musí lidem vracet nadlimitní doplatky za léky. Co udělat pro to, aby vám peníze opravdu přišly?

Co je ovšem důležité, je pohlídat si, zda vaše zdravotní pojišťovna má ideálně vaše číslo účtu nebo platnou doručovací adresu. Zdravotní pojišťovny na to opakovaně upozorňují a apelují, aby toto lidé udělali. My jsme o tom psali například v roce 2021. Zdravotní pojišťovny automaticky neznají čísla účtů klientů ani adresy jejich skutečného pobytu, takže se jim opakovaně stává, že přeplatky nemají kam poslat. Nebo je pošlou a vrací se jim zpět. Adresu nebo číslo účtu jim proto, chcete-li případný přeplatek dostat, musíte říci vy. A to buď elektronicky (např. prostřednictvím aplikací), nebo třeba na pobočce. Nebo se s pojišťovnou poradit na její infolince.

Číslo bankovního účtu mohou klienti nahlásit prostřednictvím webového formuláře, osobně na kterémkoli klientském pracovišti VZP, elektronicky e-mailem na adresu [email protected], formou obecného podání přes aplikaci Moje VZP / VZP Point nebo prostřednictvím datové schránky (i48ae3q), uvádí například největší Všeobecná zdravotní pojišťovna.

Jak fungují přeplatky za doplatky

Co vám určitě také pomůže, je porozumět tomu, jak fungují ochranné limity a co je to onen přeplatek.

Ochranný limit znamená, že vaše pojišťovna na vaše rodné číslo eviduje, kolik jste dopláceli, když jste si vyzvedli lék na recept nebo třeba tzv. potravinu pro zvláštní lékařské účely, kterou vám pojišťovna zčásti hradí.

Limity se liší např. dle věku. Neboli ochranný limit se vztahuje na každého z nás včetně novorozenců. Dokonce i na osoby, které během roku zemřou – v takovém případě je nadlimitní doplatek součástí dědického řízení a pojišťovny jej do něj posílají automaticky. 

Výše ochranných limitů u doplatků za léky 

(za rok)

  • Dospělý 5000 Kč
  • Dítě do 18 let a senior nad 65 let 1000 Kč
  • Senior nad 70 let, invalidní důchodce (s doloženou invaliditou u ZP) 500 Kč

Zdroj: ČPZP

Průběžně jen přeplatky nad 200 korun

Pojišťovna má povinnost část z doplatků za léky a speciální potraviny zahrnout do tzv. ochranného limitu. To je jakási hranice daná součtem všech vašich doplatků. Když jste pod touto hranicí, peníze za doplatky od pojišťovny zpětně nedostanete. Když se ocitnete nad touto hranicí, pojišťovna vám nadlimitní částku vrátí. Doplatky nad limit vrací zpětně, a to vždy jednou za čtvrt roku. Na účet či složenkou je posílá ale až tehdy, když v součtu tyto nadlimitní doplatky dají hodnotu nad 200 korun.

Do 200 korun o ně také nepřijdete, pojišťovna vám je ale „schová“, a to do doby, než přesáhnout právě těch zmiňovaných dvou stovek. Nebo vám vyplatí i nižší částku, ale až na konci kalendářního roku.

Zdravotní pojišťovny odloží vracení desetikorun za lékové přeplatky Přečtěte si také:

Zdravotní pojišťovny odloží vracení desetikorun za lékové přeplatky

Radujete se, že hodně utrácíte za léky, tak to vám pojišťovna bude vracet tisícikoruny? Tak jednoduché to není. Jednak proto, že přeplatky se nevztahují na volně prodejné léky, za které lidé utrácí docela dost. Přeplatky pojišťovny sledují skutečně jen u těch léčiv a potravin, na jejichž úhrady se podílejí i ony samy.

Ne každý doplatek navíc je započítáván do limitu. Nepatří tam třeba doplatky za léky na předpis, které obsahují léčivé látky určené k podpůrné nebo doplňkové léčbě. To ale neplatí u lidí nad 65 let.

Co se nezapočítává do limitu

  • úhrady zdravotnických prostředků
  • poplatky na pohotovosti
  • ceny volně prodejných léčiv

I ten doplatek, který se započítává, vám pojišťovna nemusí započítat v celé výši. Výše doplatků se totiž v lékárnách liší, a tak pojišťovna do limitu zahrnuje jen tu nejnižší hladinu. To znamená, že si vezme všechny doplatky za léky, které obsahují stejnou účinnou látku, a do limitu zahrne ten nejnižší. Tedy doplatek za lék, který si ve skutečnosti nekupujete.

I přesto, že řadě lidí kvůli různým omezením a limitům žádné přeplatky nevzniknou, v součtu pojišťovny vyplácejí desítky milionů korun. Například Zdravotní pojišťovna Ministerstva vnitra ČR uvedla, že jen za třetí čtvrtletí roku 2022 odeslala celkem 58 188 plateb ve výši 42 531 403 korun. V porovnání se stejným obdobím roku 2021 se tato částka na přeplatcích za léky zvýšila o téměř šest milionů korun.

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 »