Hrazená prevence osteoporózy pokračuje, dosud se do ní zapojily desetitisíce lidí

23. 10. 2023

Sdílet

V Česku už půl roku běží plošné a bezplatné vyhledávání pacientů s osteoporózou. Provádí jej praktici a gynekologové. Výsledkem je zatím 26 tisíc lidí vyšetřených denzitometrem, zároveň přibylo pracovišť, která toto vyšetření na pojišťovnu nabízí. Program pokračuje a potrvá nejméně do roku 2025.

Program včasného záchytu pacientů s osteoporózou spustila Všeobecná zdravotní pojišťovna (VZP) 1. dubna letošního roku. Nyní do něj jsou zapojeni již všichni praktičtí lékaři a gynekologové. 

Co se dozvíte v článku
  1. Jak se zapojit do programu
  2. Co je dotazník FRAX
  3. Více denzitometrických pracovišť
  4. Léky nově i od praktika
  5. Průběžné výsledky programu
  6. Léčí se jen zlomek nemocných
  7. Rychlý orientační test

Program se týká žen od jednoho roku po menopauze a mužů starších 65 let. Účast jim lékaři nabízí automaticky v rámci preventivních prohlídek. Zapojení do programu je dobrovolné.

V tuto chvíli plošný záchyt lékaři provádí jen u klientů VZP a Zdravotní pojišťovny ministerstva vnitra. Vitalia.cz to uvedl předseda Sdružení praktických lékařů Petr Šonka„Je to pilotní projekt VZP, která tento potřebný program spustila a je v něm průkopníkem. K ní se již přidala i Zdravotní pojišťovna ministerstva vnitra a máme informaci, že další zdravotní pojišťovny přibudou příští rok,“ popisuje lékař.

Kdo by měl užívat hormony na zmírnění příznaků menopauzy a pro koho se vůbec nehodí? Přečtěte si také:

Kdo by měl užívat hormony na zmírnění příznaků menopauzy a pro koho se vůbec nehodí?

Aktivní nabídka prevence tedy zatím míří jen na část lidí, kterým osteoporóza hrozí. Lékaři prevenci sice mohou nabídnout i klientům jiných pojišťoven, práci navíc ale od nich nedostanou zatím proplacenou. Motivace k tomu je proto nižší. Na druhou stranu, nasazení léčby i vyšetření hustoty kostní hmoty jsou v indikovaných případech hrazené všem, takže léčba je proplácená všem pacientům bez ohledu na to, kterou zdravotní pojišťovnu si zvolili.

Jak se zapojit do programu

Účast v programu plošného záchytu osteoporózy znamená pohovor, při kterém se lékař zeptá na rodinnou anamnézu, pacientovi dá vyplnit jednoduchý dotazník známý pod zkratkou FRAX, případně jej odešle na tzv. denzitometrii, tedy vyšetření hustoty kostní hmoty. To trvá zpravidla 15 až 20 minut, funguje na principu slabého rentgenového záření a zaměřuje se zpravidla na dvě místa – bederní páteř a část stehenní kosti. 

Vyšetření se pacienti nemusí obávat. Je nebolestivé, celková radiační dávka je u něj nižší než u běžného rentgenového snímku a výhodou je, že pacient se při něm nemusí ani svlékat.

Na toto vyšetření pak lékaři díky programu automaticky (v rámci preventivní prohlídky) posílají ženy nad 60 let a muže nad 70 let.

Co je dotazník FRAX

Jde o formulář o 12 otázkách. Dostupný je také onlineZjišťuje základní informace o pacientovi (věk, váha, výška atd.), jeho životosprávu (konzumaci alkoholu, kouření), dosavadní anamnézu pacienta (zejména prodělané zlomeniny) a také rodinnou anamnézu (zlomeniny u rodičů). Vyplnění dotazníku trvá deset minut. 

FRAX vyhodnocený lékařem umožňuje určit riziko vzniku osteoporotické zlomeniny v následujících deseti letech, a je tak vodítkem k posouzení, zda není třeba u pacienta provést denzitometrické vyšetření.

Více denzitometrických pracovišť

Spuštění programu ale neznamená jen více prověřovaných lidí na riziko osteoporózy. Neobešel by se bez navyšování počtu pracovišť, jež provádí denzitometrii.

Letos v dubnu, kdy VZP program spustila, jich bylo v ČR 90, nyní jich bude už přes sto a stále přibývají. „Pro zajištění dostatečné kapacity pro preventivní denzitometrii bychom potřebovali navýšit tento počet alespoň na 160 celotělových kostních denzitometrů. Od nového roku jich bude díky programu v provozu kolem 130. Předpokládám, že k číslu 160 se přiblížíme v průběhu roku 2024,“ říká Jan Bodnár, náměstek ředitele VZP pro zdravotní péči.

Mapa ukazuje, kolik pracovišť s denzitometrem a ve kterém kraji bude fungovat od 1. ledna 2024. Jde o pracoviště zapojená do programu časného záchytu osteoporózy.

Mapa ukazuje, kolik pracovišť s denzitometrem a ve kterém kraji bude fungovat od 1. ledna 2024. Jde o pracoviště zapojená do programu časného záchytu osteoporózy.

Autor: VZP

Z mapy, kterou VZP poskytla médiím, jde vyčíst, že nejvíce denzitometrických pracovišť bude na počátku příštího roku v Praze, Jihomoravském a Moravskoslezském kraji. 

Nové přístroje budou přibývat zejména v ordinacích praktických lékařů a ambulantních gynekologů. Vybaveny jimi již jsou některá radiologická pracoviště, interny či pracoviště klinické osteologie.

Petr Šonka doplňuje, že o pořízení denzitometru je mezi lékaři zájem, a to navzdory tomu, kolik stojí. „Jde o částku kolem dvou milionů korun, která pro běžnou ordinaci praktického lékaře představuje opravdu obrovskou investici. Většina přístrojů, které si praktik pořizuje, jsou v řádech desítek tisíc korun,“ popisuje Petr Šonka. Sám má ordinaci v Přešticích na Plzeňsku a chce si v ní zřídit i denzitometrické pracoviště.

Neznamená to ale, že denzitometry budou ve všech ordinacích. Jejich pořízení musí VZP schválit. Ta již má za sebou některá rozhodnutí a počítá ještě s jedním kolem schvalování žádostí. Při něm VZP zohledňuje hustotu zalidnění i velikost kraje. Cílem je, aby denzitometrická pracoviště byla zastoupena po celém území ČR.

Aktuální seznam pracovišť již vybavených denzitometrem najdete na webu VZP.

Obáváte se ztráty hustoty kostí?

Léky nově i od praktika

Kromě vyhledávání pojištěnců v riziku osteoporózy a zřizování nových pracovišť má program ale ještě jeden dopad. Praktičtí lékaři již požádali Státní ústav pro kontrolu léčiv (SÚKL), aby jim umožnil předepisovat tzv. bisfosfonáty a denosumab. Recepty na něj nyní mohou vydávat ambulantní gynekologové či některé další odbornosti včetně osteologů a hepatologů, praktičtí lékaři ale nikoliv.

„Jde nám o předepisování základní léčby pro nekomplikované pacienty, sofistikovanější léčba samozřejmě zůstává dál v rukou příslušných ambulantních specialistů,“ říká pro Vitalia.cz Petr Šonka s tím, že pokud by léky mohli předepisovat i praktici, uvolnily by se tím ruce specialistům (např. osteologům, revmatologům, endokrinologům nebo ortopedům) k řešení složitějších zdravotních stavů. SÚKL ovšem tuto změnu praktikům zatím neschválil, podle Petra Šonky a Jana Bodnára ale existuje příslib, že by k tomu mělo dojít. Ideálně od ledna 2024.

Lékaři při předepisování medikace rozlišují, zda má pacient osteopenii, což je stav, kdy kostní hmota je řidší, ale ne natolik, aby tento stav splňovat parametry onemocnění osteoporózou. Takovým pacientům lékař předepíše vitamín D a vápník.

Trpíte osteoporózou? Čím dřív začnete cvičit, tím lépe Přečtěte si také:

Trpíte osteoporózou? Čím dřív začnete cvičit, tím lépe

Pacientům, kteří mají již diagnostikovanou osteoporózu, pak přidají ještě zmiňované bisfosfonáty. Ty mají podobu pilulek s užíváním jednou denně. Další možností je biologická léčba účinnou látkou nazvanou denosumab. Ta má podobu podkožních injekcí. Stejně jako bisfosfonáty patří i denosumab k základní léčbě osteoporózy. Jejím cílem je zabránit úbytku pevné kostní hmoty a tím také případným zlomeninám.

Průběžné výsledky programu

VZP na tiskové konferenci ve středu 18. října novináře informovala, že za pět měsíců se do programu plošného záchytu osteoporózy zapojilo 33 244 klientů

Z toho počet těch, kteří vyplnili FRAX dotazník a nebyli odeslání na vyšetření hustoty kostí, činil 6946 klientů. 26 298 pacientům pak lékaři dali žádanku na denzitometrické vyšetření.

Předběžná data také ukazují, že preventivní odeslání na denzitometrii u části pacientů skutečně potvrdí osteoporózu. „Zatím máme údaje z několika referenčních pracovišť, které říkají, že záchyt onemocnění se pohybuje okolo deseti až patnácti procent,“ říká klinický osteolog Richard Pikner, jenž je primářem Oddělení klinické biochemie a hematologie v Klatovské nemocnici a také místopředsedou odborné Společnosti pro metabolická onemocnění skeletu.

Jde o předběžné výsledky, neboť VZP chce program vyhodnotit celkově až v létě roku 2025.

Graf ukazuje po jednotlivých krajích, kolik klientů VZP se od dubna do srpna 2023 zapojilo do programu včasného záchytu osteoporózy. Celkem šlo o 33 244 pojištěnců.

Graf ukazuje po jednotlivých krajích, kolik klientů VZP se od dubna do srpna 2023 zapojilo do programu včasného záchytu osteoporózy. Celkem šlo o 33 244 pojištěnců.

Autor: VZP

Léčí se jen zlomek nemocných

Důvody pro program i rozšiřování sítě pracovišť vybavených celotělovými kostními denzitometry a předepisování léčby praktiky jsou nasnadě: mezi lidmi je stále vysoký počet těch, kteří osteoporózu mají a neví o ní. 

Jen VZP, u níž je zaregistrováno zhruba 60 procent pojištěnců, léčí s osteoporózou 114 tisíc klientů. Odhady, o kterých pojišťovna informovala na tiskové konferenci, ale hovoří až o 750 tisících lidí s osteoporózou v celé ČR. 

Osteoporóza je onemocnění, jež nebolí a léta se nijak neprojevuje. Často je proto odhalena až ve chvíli, kdy přijde zlomenina. Přitom kdyby se na onemocnění přišlo dříve, nemuselo by k ní díky léčbě vůbec dojít.

Rychlý orientační test

Napoví, zda patříte mezi ohrožené osteoporózou.

  • Utrpěl/a váš otec nebo vaše matka zlomeninu kyčle?
  • Utrpěl/a jste po 50. roce věku zlomeninu dolního konce předloktí, pažní kosti, bércové kosti, pánve, nebo dokonce kyčle či zlomeninu obratle? 
  • Snížila se vaše tělesná výška od 20 let věku o více než 6 cm?
  • Léčíte se pro zánětlivé kloubní choroby, roztroušenou sklerózu, závažné onemocnění ledvin, jater nebo střev? 
  • Užíváte nebo užíval/a jste dlouhodobě kortikoidy v tabletách nebo v infuzích?

Pokud na jednu nebo více otázek v dotazníku odpověděli „ano, poraďte se svým lékařem.

Zdroj: pacientské sdružení Revma Liga

Zlomeniny u člověka s osteoporózou vznikají i bez příčiny. Navíc mohou postihovat téměř všechny kosti včetně obratlů či krčků stehenních kostí. Jenže právě zlomeniny páteře mohou znamenat velkou bolest i neblahé následky v podobě poškození nervů či míchy. Některé zlomeniny obratlů se navíc mohou projevit jen bolestí, a tak se na ně nemusí hned přijít. A i když se o nich ví a zhojí se, páteř zůstává trvale poškozena třeba sesednutím obratlů.

Zlomenina krčku je pak velkým strašákem zejména pro seniory. V řadě případů totiž končí smrtí. Data říkají, že do roku od zlomeniny krčku umírá 15 až 20 procent pacientů. Ulehnutí na lůžko totiž může vést napříkad k zápalu plic či jiným infekcím, které imobilního člověka ve vyšším věku a s podlomeným zdravím zabijí.

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 »