Proč se v Česku nepodaří vymýtit rakovinu děložního hrdla

25. 11. 2022

Sdílet

Autor: Depositphotos
KOMENTÁŘ: Rakovina děložního hrdla je dnes díky prevenci a očkování považována za vymýtitelné onemocnění. Chodit na každoroční prohlídku ke gynekologovi je tedy klíčové. V posledních 12 letech ale část ordinací začala vybírat vstupní poplatky i poplatky spojené s preventivní prohlídkou. Nejsou však pro ženy bariérou, která jim brání zajít na preventivní návštěvu lékaře?

Prevence je jednou z důležitých cest ke zdravé společnosti. Proto se jí dostává náležité pozornosti a státní instituce na podpoře preventivních programů nešetří.

Co se dozvíte v článku
  1. Na kampaních podporujících prevenci se nešetří
  2. Prevencí lze téměř vymýtit i rakovinu
  3. O co usiluje WHO
  4. Anketa ve 48 gynekologických ordinacích
  5. Pokud je problém, mají si ženy stěžovat
  6. Za prevenci pojišťovna platí 1147 korun

Zdálo by se, že cesta k prevenci může, a vlastně i musí být jednoduchá, umetená úhradami zdravotních pojišťoven a štědrými příspěvky klientům z jejich bonusových programů. Korunovaná reklamními kampaněmi za desítky milionů korun z veřejných peněz. Na druhé straně ovšem hacena ignorací ze stany lidí, kteří na preventivní prohlídky přesto všechno prostě nechodí. 

Rakovině děložního čípku se dá velmi dobře předcházet, říká lékařka Přečtěte si také:

Rakovině děložního čípku se dá velmi dobře předcházet, říká lékařka

Ale co když tyto představy tak úplně neplatí a s prevencí to může být trošku jinak? Co když se někdy prevence nedaří ne kvůli nezodpovědným budoucím pacientům, ale občas i kvůli přístupu samotných lékařů? 

Nad těmito otázkami se zamyslím v následujícím komentáři věnovaném snaze vymýtit rakovinu děložního hrdla, chcete-li děložního čípku. A také tomu, jak tuto snahu nahlodávají různé druhy plateb, které po ženách postupem času začala požadovat řada gynekologů ve svých ordinacích.

Na kampaních podporujících prevenci se nešetří

Všeobecná zdravotní pojišťovna (VZP) letos v květnu oznámila, že startuje novou kampaň zaměřenou na prevenci za desítky milionů korun. Až do konce roku proto nabádá lidi k návštěvě lékaře, aniž by měli akutní potíže, formou různých typů mediální reklamy nebo třeba adresným zvaním, kdy zasílá těm, kteří nechodí na preventivní prohlídky, dopisy domů.

Pojišťovna také nedávno oznámila, že využije změny zákona a navýší bonusový program pro klienty, který je rovněž zaměřen na různé druhy prevence. Za rok jim chce za sportovní aktivity či nehrazená preventivní vyšetření uhradit až miliardu korun.

VZP nově zavede příspěvek na saunu či masáž, vrátí také bonus na dentální hygienu Přečtěte si také:

VZP nově zavede příspěvek na saunu či masáž, vrátí také bonus na dentální hygienu

V říjnu roku 2021 spustilo Ministerstvo zdravotnictví kampaň zaměřenou na prevenci s názvem Dřív než bude pozdě. A aktuálně běží další část jeho kampaně podporující očkování proti covidu s názvem Očkujme se pro život beze strachu, u níž média uvádějí cenu (jako většího celku aktivit) až 50 milionů korun.

Uvedené příklady neukazují žádný nový fenomén. Kampaně na podporu toho, aby lidé včas udělali něco pro své zdraví, se opakují pravidelně. Příklady ovšem ukazují, že vábení k prevenci není levná záležitost.  

Kromě peněz stojí také úsilí odborníků a lékařů, kteří se lidem opakovaně snaží vysvětlit, jaké druhy preventivních prohlídek máme, které z nich jsou hrazeny z veřejného zdravotního pojištění a proč je důležité na ně chodit. A také to, že když lidé podceňují prevenci, přichází nemoci, jejichž léčba je mnohem nákladnější než preventivní prohlídka nebo třeba očkování.

Prevencí lze téměř vymýtit i rakovinu

Jednou z oblastí, která se dočkává pozornosti, je také prevence rakoviny děložního hrdla. Světová zdravotnická organizace (WHO) v roce 2018 vyhlásila výzvu k vytvoření globální strategie pro urychlení eliminace tohoto onemocnění. Cílem iniciativy je dosažení světa (téměř) bez rakoviny děložního čípku. V praxi to znamená dosáhnout ve všech zemích světa míry incidence rakoviny děložního čípku menší než 4 případy na 100 000 žen. V ČR to ještě před několika lety bylo za rok 20 nových onemocnění na 100 000 žen.

O co usiluje WHO

Podle WHO by svět měl do roku 2030 dosáhnout toho, že:

  • Alespoň 90 % žen se zachyceným onemocněním děložního čípku (s předrakovinovým stavem i invazivním karcinomem) bude adekvátně léčeno.
  • Alespoň 90 % dívek ve věku 15 let bude naočkováno proti HPV (lidskému papilomaviru), původci drtivé většiny případů rakoviny děložního čípku.
  • Alespoň 70 % dospělých žen ve věku 35 let a opakovaně ve věku 45 let bude testováno vysoce precizními a průkaznými metodami.
  • Globální úmrtnost v důsledku karcinomu děložního čípku se sníží o 30 %.

Zdroj: Tisková zpráva HPV College

K vytyčeným cílům se hlásí také lékaři z ČR. Pomyslně se pod ni podepsala skupina odborníků, kteří založili iniciativu HPV College, jejíž cílem je zvýšit u veřejnosti povědomí o infekci HPV, tedy lidském papilomaviru.

„Eliminaci rakoviny děložního čípku nebrání v ČR žádné nepřekonatelné skutečnosti. Vše záleží na dostatečné osvětě a ochotě veřejnosti účastnit se preventivních programů. Tomu často brání nedostatečná znalost souvislosti infekce HPV s rozvojem rakoviny a antivakcinační kampaně,“ uvedl v minulosti lékař Vladimír Dvořák, předseda České gynekologické a porodnické společnosti a mluvčí HPV College. Účast žen na gynekologické prevenci se neustále zlepšuje, ale stále je velké množství zejména starších žen, které se domnívají, že již na gynekologické prohlídky nemusí chodit. Právě u těch žen, které je neabsolvují, je největší výskyt karcinomů v pokročilých stádiích,“ doplnil.

Snaha o téměř úplné vymýcení rakoviny děložního hrdla se opírá o možnost nechat se proti lidskému papilomaviru naočkovat (v ČR je to možné od roku 2006), využít lepší diagnostické testy a chodit jednou ročně na hrazené preventivní prohlídky ke gynekologovi, kde ženám lékaři provádí mimo jiné stěr z čípku. Výsledky vyšetření mohou odhalit změny později vedoucí k rozvoji onkologické nemoci.

Anketa ve 48 gynekologických ordinacích

Jenže zatímco na jedné straně se jedni lékaři snaží veřejně apelovat na ženy, aby tyto možnosti využívaly, na druhé straně jim část gynekologů snahu komplikuje. Před 12 lety jsem upozornila na tehdy spíše ojedinělou snahu přilepšit si různými druhy poplatků. 

Loni jsem obvolala 48 gynekologických ambulancí po celé zemi a v roli potenciální zájemkyně o registraci se na možné poplatky opět vyptávala. Nějakou formu platby od pacientky chtěli v 21 ambulancích.

Hledali jsme gynekologa bez poplatků. Najít jde, dá to ale práci Přečtěte si také:

Hledali jsme gynekologa bez poplatků. Najít jde, dá to ale práci

Šokující ovšem bylo, že ve čtyřech ordinacích mi řekli, že mě bez poplatku nezaregistrují nebo mi neprovedou preventivní prohlídku. Minimálně druhá záležitost (podmiňování prevence platbou pacientky) je za hranou zákona.

Vybírání poplatků se tak může, teoreticky, stát překážkou pro to, aby ženy chodily na prevenci. Za poslední tři měsíce se mi ozvalo sedm čtenářek a jeden čtenář, kteří mě žádali o to, abych jim sdělila, které že dvě pražské ordinace poplatky nevybírají. Podobné dotazy mi chodily už loni, letos na podzim se ale jejich četnost zvýšila, což může souviset se skokovým zdražováním.

O tom, že by kvůli poplatkům lékaře nenavštěvovaly, sice čtenářky nepíší, ze žádostí lze ale vyčíst, že je vybíraní poplatků trápí. „Po přestěhování do Prahy před dvěma lety jsem vždy narazila pouze na ordinace, které tyto poplatky požadovaly, takže se mi spíše vyplácelo dojíždět ke svému gynekologovi do Olomouce, ale je trošku únavné strávit kvůli preventivní prohlídce 6 hodin na cestě,“ píše například čtenářka, která se podepsala jako Nela.

Pokud je problém, mají si ženy stěžovat

Po zkušenosti z ankety se snažím na takto nastavené poplatky upozorňovat na tiskových konferencích věnovaných prevenci, pořádaných zdravotními pojišťovnami či Ministerstvem zdravotnictví. A pokaždé dostanu podobnou odpověď. 

„Popisujete zcela nestandardní a nelegální chování. Pokud klientka má takový problém, má se na nás obrátit, případně na zdravotní pojišťovnu, u které je registrovaná. Pokud je platba vyžadována v souvislosti s nárokovou zdravotní službou, na kterou je nárok dle zákona 48 o veřejném zdravotním pojištění, zahájíme u takového lékaře kontrolu,“ sdělil mi nedávno ředitel VZP Zdeněk Kabátek. Pokud je to o administrativních poplatcích, to samozřejmě není nic, co by bylo v rozporu se zdravotními službami. Pokud vás tedy klientky oslovují, musí oslovit i zdravotní pojišťovnu,“ dodal s tím, že klientka může mít v ruce buď doklad o zaplacení, nebo se může na pojišťovnu obrátit i bez něj.

Platíte u svého gynekologa roční poplatek?

V minulosti jsem s vybíráním poplatků opakovaně konfrontovala také Vladimíra Dvořáka, jenž je citován výše a sto jí v čele gynekologické společnosti. Ten mi ale vždy uvedl, že vybírání plateb nemůže vyloučit, ale on sám tuto věc nezaregistroval a ženy si na něj nestěžují.

Lékař Vladimír Dvořák provozuje soukromou gynekologickou kliniku v Brně. I ji jsem ze zvědavosti zahrnula do loňské ankety. Vstupní nebo registrační či poplatky v ní nevybírali. Z webu lze vyčíst, že klinika ale poskytuje řadu nadstandardních služeb, které nejsou hrazeny z veřejného zdravotního pojištění, takže si je klientky platí (a v těchto případech oprávněně) samy.

Právě v Brně se na rozdíl od Prahy ukázala situace s poplatky u gynekologů překvapivě odlišná, alespoň dle mé ankety. Zatímco v Praze z 19 oslovených ordinací většina poplatky vybírala (dvě nikoliv), a to ve výši stokorun i částky nad 1000 korun, v Brně z 11 oslovených ordinací buď poplatky nevybírali, nebo si řekli o pár desítek korun za plastová zrcadla (až na jednu výjimku, kdy lékař chtěl 700 korun roční poplatek).

Za prevenci pojišťovna platí 1147 korun

Proč jsou poplatky u gynekologů tak rozšířené, těžko říci. Na rozdíl od dentistů ale mají ambulantní gynekologové hrazené z veřejného pojištění širší spektrum péče. A za prevenci dostávají vyšší částky. Například VZP gynekologovi za preventivní prohlídku pošle 1147 korun, zubaři (bez osvědčení o soustavné účasti v systému celoživotního vzdělávání) za prevenci zaplatí 398 korun.

Důvodem vybírání poplatků může být třeba to, že poplatky ženy tolerují a nebombardují kvůli nim zdravotní pojišťovny stížnostmi, jak to ostatně zmínil Zdeněk Kabátek. Tolerují si je vzájemně i gynekologové. Tedy až na výjimky, kterým takové chování vadí. I takové totiž v anketě byly.

Předejdeme rakovině? Test ji zjistí mnohem dřív Přečtěte si také:

Předejdeme rakovině? Test ji zjistí mnohem dřív

Systém výběru různých poplatků je zaběhnutý možná i proto, že Vladimír Dvořák, který často za gynekology promlouvá, je v řadě profesních funkcí – je předsedou České gynekologické a porodnické společnosti (ČGPS), Sdružení soukromých gynekologů ČR, Sekce kolposkopie a cervikální patologie ČGPS nebo Rady poskytovatelů Ministerstva zdravotnictví. 

Případná změna v chování lékařů proto může být přes něj hůře prosaditelná, byť tedy v tomto případě se jedná pouze o moji spekulaci.

Gynekologové nejsou jediní, kdo poplatky vybírá. V poslední době přibývá také soukromých rehabilitačních pracovišť, kde žádají zaplatit třeba i několik set korun při první návštěvě. Někdy takovou platbu chtějí jednou za rok, jinde pokaždé, když pacient přijde s předpisem procedur od lékaře. O poplatek je žádají, ačkoliv samotnou rehabilitaci hradí zdravotní pojišťovna. Kdo jej nezaplatí, může mít na některých pracovištích smůlu, protože si jej nevezmou do péče.

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 »