Praktici začnou nově zjišťovat osteoporózu. Díky léčbě se předejde zlomeninám v pozdějším věku

28. 3. 2023

Sdílet

Aktualizováno: Doplnili jsme vyjádření lékového ústavu. (30. 3. 2023 9:57)
V tuzemsku začíná nová plošná prevence zaměřená na osteoporózu. Od dubna budou lékaři vytipovávat rizikové pacienty a část z nich odesílat na bezplatné vyšetření kostí. Navíc přístroj, který je k tomu nutný, si bude moci pořídit více ordinací včetně praktických lékařů a ambulantních gynekologů, kteří jej zatím nepoužívají.

Změny v prevenci osteoporózy urychlilo rozhodnutí Všeobecné zdravotní pojišťovny (VZP) začít od dubna systematicky hradit vyhledávání rizikových pacientů, vyplňování k tomu pomocného dotazníku i denzitometrii na nových pracovištích. Zástupci VZP i lékaři o novince hovořili na Kongresu primární péče, který se konal poslední březnový víkend v Praze.

Co se dozvíte v článku
  1. Komu a co pojišťovna bude hradit
  2. Rozšíření prevence zatím hradí jen VZP
  3. Denzitometrů výrazně přibude
  4. Praktici chtějí nově předepisovat léky
  5. Co je osteoporóza
  6. Rizikové faktory onemocnění

Důvodem ke změně v úhradách je ten, že pokud je osteoporóza zachycena včas, je velmi dobře léčitelná. A také ten, že pacientů, jejichž kosti ztrácejí pevnost, přibývá. Jenže řada z nich o svém onemocnění neví, protože postupuje pozvolna a léta se nijak neprojevuje. Odhalit by osteoporózu mohlo vyšetření nazvané denzitometrie. 

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

Počet pracovišť, kde jej provádějí, je však tak nízký, že se k němu zájemci někde  nedostanou nebo na něj čekají dlouho. Proto je podle VZP nezbytné aktivně zapojit do diagnostiky a terapie také všeobecné praktické lékaře a ambulantní gynekology.

Komu a co pojišťovna bude hradit

Nový program časného záchytu osteoporózy se týká mužů nad 65 let žen za rok po ukončení menopauzy.  VZP na jeho přípravě spolupracovala s praktickými lékaři i ambulantními gynekology.

VZP jim bude hradit od dubna rozšíření preventivních prohlídek. A to tím způsobem, aby při nich lékař spolu s pacientem vyhodnotili riziko osteoporózy, tedy ubývání kostní hmoty, kvůli němuž se kosti stávají křehčí a snadněji se lámou.

„Zdravotní pojišťovna nám od dubna uhradí to, že vyberu ty správné pacienty a těm následně rozdám každé dva roky při preventivní prohlídce dotazník FRAX, případně je odešlu na vyšetření hustoty kostí. U pacientů s osteoporózou nám nově jednou do roka uhradí klinické vyšetření, tedy kontrolu a předepsání léků. A lékařům, kteří si nově pořídí přístroj, bude hradit také vyšetření kostí,“ popisuje změny předseda Sdružení praktických lékařů Petr Šonka.

Dotazník FRAX je pomocníkem pro hodnocení rizika zlomenin. Je ke stažení na internetu. Má 12 otázek a pacient v něm vyplňuje například to, kolik je mu let, jakou má hmotnost, výšku či zda je kuřák, pije alkohol nebo trpí revmatoidní artritidou.

Jak konkrétně bude zařazen záchyt osteoporózy do preventivních prohlídek u praktiků a gynekologů, popisuje VZP v tiskové zprávě. Půjde o dva způsoby:

  1. Jako součást preventivní prohlídky ve dvouletých intervalech u všeobecného praktického lékaře nebo u gynekologa u žen rok po menopauze až do věku 59 let a u mužů ve věku 65 až 69 let bude provedena anamnéza a jednoduchý dotazník FRAX. Pokud vznikne podezření na onemocnění osteoporózou, bude u pacienta provedeno měření denzitometrem.
  2. U žen nad 60 let a u mužů nad 70 let bude v rámci preventivní prohlídky u všeobecného praktického lékaře nebo u gynekologa indikováno měření denzitometrem. Měření kostní hustoty prostřednictvím denzitometru bude provedeno buď přímo v ordinaci registrujícího lékaře (pokud bude mít v ordinaci přístroj k dispozici), nebo bude pacient odeslán na příslušné specializované pracoviště. Dle výsledku denzitometrického vyšetření bude zvolen další postup, buď pravidelné sledování pacienta, nebo zahájení léčby, nebo odeslání ke klinickému osteologovi či jinému specializovanému lékaři.

Rozšíření prevence zatím hradí jen VZP

Výše uvedené rozšíření preventivních prohlídek zatím proplácí pouze VZP, která předpokládá, že za dva roky do programu nasměřuje 354 milionů korun. Cílem je do něj zapojit za tuto dobu alespoň polovinu ambulantních gynekologů a všeobecných praktických lékařů. Program včasného záchytu osteoporózy chce pojišťovna po dvou letech vyhodnotit a pak se rozhodnout, jak záchyt osteoporózy řešit dál. Tj. zda pokračovat, screening ukončit nebo pozměnit.

Ostatní zdravotní pojišťovny se k tomu, zda se k plošnému programu zaměřeného na včasnou léčbu osteoporózy přidají, zatím nevyjádřily. Jak ale ukázal nedávno příklad zavádění oční prevence u diabetologů, zbylé pojišťovny se zpravidla k VZP přidají, jen s odstupem času. „VZP je průkopníkem a my jí musíme poděkovat, že do toho s námi šla. Nyní čekáme, že ostatní pojišťovny se postupně přidají,“ potvrzuje Petr Šonka.

Klienti ostatních pojišťoven tedy musí oficiálně čekat, je ale dost pravděpodobné, že lékaři začnou dotazníky nabízet i jim. Nebo si o ně mohou pojištěnci říci sami a s lékařem se na zapojení do programu zaměřeného na osteoporózu dohodnout.

Jiná je situace u denzitometrie. Pokud je indikována (třeba i praktikem či gynekologem), všechny zdravotní pojišťovny ji hradí už nyní. Problém ovšem je se na vyšetření dostat, protože denzitometr mají pouze v některých specializovaných pracovištích, takže čekací lhůty mohou být na některých dlouhé. To se ale změní.

Denzitometrů výrazně přibude

VZP již avizovala, že přidá peníze na vyšetření hustoty kostí tak, aby si přístroj k tomu nezbytný pořídilo více pracovišť. „Dnes evidujeme (v ČR, pozn. red.) zhruba 90 pracovišť disponujících celotělovým kostním denzitometrem, do roku 2026 bychom rádi tento počet zvýšili na 160, abychom zajistili dostatečné kapacity k záchytu nemoci,“ potvrzuje Jan Bodnár, náměstek ředitele VZP pro zdravotní péči.

Nově o úhradu vyšetření budou moci žádat také praktičtí lékaři pro dospělé a ambulantní gynekologové. Ti nyní obecně denzitometrii neprovádí, protože na starosti ji mají specialisté v osteologii.

Denzitometrie nebolí, zjistí, zda vás ohrožuje osteoporóza Přečtěte si také:

Denzitometrie nebolí, zjistí, zda vás ohrožuje osteoporóza

„Když se o tom bavíme, kolegové o to zájem mají. Asi to nebudou stovky z nich, ale zatím jednotky. První praktici začnou vyšetření provádět nejspíš na konci letošního roku,“ podotýká Petr Šonka. Několik měsíců totiž potrvá, než lékaři přístroj v hodnotě zhruba dvou milionů nakoupí, proškolí se v jeho používání a vyřídí s pojišťovnou nutné formality kvůli úhradám vyšetření.

Sám o pořízení denzitometru uvažuje, protože v okrese Plzeň-jih, kde má ordinaci, jej zatím nikdo nemá. Podobně zvažuje jeho nákup první místopředseda Sdružení praktických lékařů ČR Michal Bábíček. „Screening osteoporózy určitě budu provádět. Zájem mám i o provoz přístroje, který dokáže stanovit míru osteoporózy, abych mohl následně určit léčbu a vše, co s tím souvisí. Umožní mi to nabídnout pacientům komplexní péči. Nechci být závislý na tom, že pacienta nasměruji do denzitocentra s tím, že budu čekat, až se tam objedná a přijde výsledek,“ vysvětluje Michal Bábíček. Má ordinaci v okrese Chomutov, kde je nyní jeden denzitometr, a to v revmatologické ambulanci, se kterou je podle něj spolupráce příkladná.

Rozhodně to podle Petra Šonky nebude fungovat tak, že přístroj si pořídí každá ordinace. „Provádět by se na jednom přístroji mohlo 15 až 20 vyšetření denně a takovou kapacitu žádný praktik nemá. Takže kromě pacientů té dané ordinace by denzitometrii využívali i pacienti jiných lékařů,“ upřesňuje předseda sdružení lékařů.

Přístroj, s pomocí kterého je možné změřit hustotu kostí

Přístroj, s pomocí kterého je možné změřit hustotu kostí

Autor: Depositphotos

Praktici chtějí nově předepisovat léky

Další novinou je, že praktičtí lékaři by měli začít předepisovat léčiva s obsahem bisfosfonátů. To zatím není možné.

„VZP podala podnět k zahájení hloubkové revize na Státní ústav pro kontrolu léčiv (SÚKL) s cílem přehodnocení preskripčního omezení v případě léčivých přípravků určených k léčbě osteoporózy,“ uvádí pojišťovna v tiskové zprávě.

O podnětu zatím SÚKL nerozhodl. „Ústav jej dostal na konci minulého týdne, nyní ho vyhodnocuje,“ uvádí mluvčí Klára Brunclíková v odpovědi ze dne 30. března. Na první pololetí roku 2023 tedy není hloubková revize bisfosfonátů v plánu. Plán na další období bude Ústav zveřejňovat v červnu, kam pro prošetření podnětu může navržené skupiny léčiv zařadit, dodává mluvčí SÚKL.

 To, zda budou moci bisfosfonáty předepisovat i praktici, ale není možné dle ní předvídat. Budoucí výsledky revizních správních řízení ovlivňují jednání (tj. předkládané důkazy a stanoviska) mnoha účastníků (všech držitelů rozhodnutí o registraci do revize zařazených léčivých přípravků a všech zdravotních pojišťoven), případně také stanoviska odborných společností, vysvětluje Klára Brunclíková. A dodává, že SÚKL dostává průběžně řadu podnětů k hloubkovým revizím úhrady a s podněty přichází také sám z úřední činnosti.

Bisfosfonáty jsou skupina léků, které zabraňují rozpadu kostní tkáně. Osteoporózu proto dokáží zpomalit, nebo na čas i zastavit. Bisfosfonáty se ve formě molekul navážou na již poškozenou kost, kde poškození redukují a hojí. Proces vystavění nové tkáně místo té poškozené ale trvá mnoho let. 

Co je osteoporóza

Osteoporóza je jedna z nejčastějších metabolických chorob, jejíž výskyt stále stoupá. VZP v roce 2022 hradila léčbu tohoto onemocnění 108 tisícům klientům, celkové číslo výskytu nemoci v celé populaci ale může být až pětkrát vyšší. „V Česku jí trpí až 750 tisíc obyvatel, přesná čísla kvůli nedostatečnému záchytu onemocnění nejsou známa,“ podotýká Jan Bodnár.

Jak zvýšit hustotu kostí pomocí stravy a cvičení Přečtěte si také:

Jak zvýšit hustotu kostí pomocí stravy a cvičení

Osteoporóza spočívá v postupném úbytku kostní hmoty. Onemocnění léta nebolí a často se na něj přijde až ve chvíli, kdy se projeví zlomeninou. Ty mohou u pacientů nastat, a to opakovaně, aniž by došlo k nějakému úrazu. „Jednou jsem stála v obchodě a najednou jsem slyšela křupnutí, jako když se zlomí větvička – to mi v nártu praskla kost. Druhou zlomeninu jsem měla v páteři. Delší dobu mě bolela záda v jednom místě, nakonec jsem s tím navštívila lékaře. Rentgen ukázal nalomený obratel,“ popisuje 41letá pacienta Helena, která se s osteoporózou potýká od 15 let. „Snažím se být opatrná, ale kosti se mi lámou samy od sebe,“ dodává.

Zlomeniny postihují různé kosti a zvyšují riziko přidružených komplikací, které mohou pacienta stát i život. „Po zlomenině krčku stehenní kosti umírá na následky a komplikace do roka 20 až 30 procent nemocných,“ upozorňuje Vladimír Palička, předseda odborné Společnosti pro metabolická onemocnění skeletu. „Osteoporóza vede ke snížené mobilitě. Pacienti po zlomenině jsou často upoutáni na lůžko,“ dodává praktický lékař Petr Šonka. Imobilita je pak spojená při nesprávném polohování například s proleženinami nebo zápalem plic

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

Rizikové faktory onemocnění

Zmiňovaná paní Helena je se svou diagnózou osteoporózy už v 15 letech výjimkou, onemocnění většinou postihuje starší pacienty. Riziko stoupá především u žen po menopauze, protože se jim tvoří méně pohlavních hormonů, které zpomalují řídnutí kostí. „Je to choroba, která je do určité míry projevem stárnutí. Od určitého věku kostní hmota všem lidem řídne, my ale chceme vyhledat ty, u kterých je její úbytek extrémní. Program, na kterém jsme se podíleli, by jim měl zlepšit kvalitu života a předcházet komplikacím v podobě zlomenin,“ vysvětluje Petr Šonka. Prevence osteoporózy je proto naprosto zásadní pro prodloužení života, a především života ve zdraví naší populace,“ říká Tom Philipp, předseda Správní rady VZP ČR a zároveň přednosta Kliniky revmatologie a rehabilitace 3. lékařské fakulty Univerzity Karlovy a Fakultní Thomayerovy nemocnice.

U paní Heleny onemocnění přišlo dříve, protože užívala dlouhodobě kortikosteroidy, a to kvůli revmatoidní artritidě, kterou od dětství trpí. Právě toto či jiné zánětlivé onemocnění je dalším faktorem, který výrazně zvyšuje riziko řídnutí kostí. Kosti může poškodit také chemoterapie, užívání imunosupresiv nebo glukokortikoidů.

Prevencí proti osteoporóze je pohyb, dostatečný příjem vápníku i vitaminu D, který se nejlépe získává ze slunečního záření. S prevencí by se přitom mělo začít již dětství, protože na osteoporózu si zakládáme řadu let.

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 »