Bechtěrevova choroba

Chronická bolest zad, ztuhlost v dolní části páteře a těžká únava. To jsou jen některé z nepříjemných příznaků Bechtěrevovy choroby, jejíž rozvoj vede ke strukturálnímu poškození páteře, funkčnímu handicapu a významnému snížení kvality života pacientů. Onemocnění sice není možné zcela vyléčit, ale nemocným může kromě farmakologické léčby pomoci také pravidelné cvičení, dlouhodobá rehabilitace a fyzikální terapie.

Co je Bechtěrevova choroba?

Bechtěrevova nemoc, která se označuje také jako ankylozující spondylitida, Marieho-Strümpellova nemoc či morbus Bechterevi, je chronické zánětlivé onemocnění, jež se řadí mezi spondylartritidy. Svá pojmenování tato choroba získala podle lékařů Vladimira Bechtěreva, Adolfa Strümpella a Pierra Marieho, kteří potíže s ní spojené popsali jako první.

Onemocnění postihuje axiální skelet, projevuje se tuhnutím kloubů a nepříjemnými bolestmi především v oblasti páteřních obratlů a postupem času vede k osifikaci kloubních pouzder i vazů. Později dochází také k ankylóze jednotlivých segmentů nebo případně celé páteře, která může ztuhnout prakticky v jakémkoliv postavení. Nejvíce postižena jsou přitom následující kloubní spojení:

  • invertebrální,
  • kostovertebrální,
  • skloubení křížové a kyčelní kosti,
  • disky a vazy páteře,
  • kořenové či periferní klouby.

Ačkoliv nemoc často začíná nenápadně, postupem času postiženého začne omezovat v pohybu a výrazně se projeví také na jeho držení těla. Člověka trpícího Bechtěrevovou chorobou totiž trápí silné bolesti zad, jeho klouby jsou poškozovány, vazy tuhnou a jednotlivé obratle srůstají, čímž pacient ztrácí svou pohyblivost a je nucen být neustále v předklonu. To samozřejmě výrazně snižuje kvalitu jeho života.

Výskyt

Podle statistiky se s Bechtěrevovou chorobou ve střední Evropě potýká zhruba 0,5–1 % populace, přičemž muži bývají postiženi až třikrát častěji než ženy. Poprvé o sobě toto chronické onemocnění většinou dává vědět v pozdní adolescenci nebo časné dospělosti, tedy mezi 18. a 30. rokem života. Vzhledem k pomalu se rozvíjejícím příznakům však bývá diagnostika zpočátku poměrně obtížná.

Příčiny onemocnění

Ačkoliv přesná příčina vzniku Bechtěrevovy nemoci stále nebyla objasněna, lékaři již dlouho vědí, že významnou roli při rozvoji tohoto onemocnění hraje dědičnost. Nejedná se sice o genetickou chorobu v tom smyslu, že by se jednoduše přenášela z rodičů na děti, u více než 90 % pacientů, kteří se s ankylozující spondylitidou potýkají, však byla prokázána přítomnost antigenu HLA-B27.

Jako HLA antigeny se označují molekuly na povrchu buněk, podle nichž imunitní systém člověka dokáže rozeznat vlastní buňky od těch cizích. Existuje velké množství těchto antigenů, přičemž konkrétně HLA-B27 se vyskytuje zhruba u 7 % obyvatelstva. Pravděpodobnost onemocnění Bechtěrevovou nemocí je u pacientů s tímto antigenem oproti zbytku populace až 300krát vyšší.

Přítomnost antigenu HLA-B27 samozřejmě ještě nemusí znamenat, že se u člověka Bechtěrevova choroba objeví. Patří ovšem mezi rizikové faktory, které mohou mít na rozvoj onemocnění vliv, přičemž konkrétní sestava antigenů se dědí z rodičů na děti stejným způsobem jako krevní skupiny, takže trpí-li ankylozující spondylitidou někdo z vašich příbuzných, je možné, že s ním rizikový antigen sdílíte.

Samotný antigen HLA-B27 nicméně rozvoj Bechtěrevovy nemoci způsobit nedokáže. K jejímu vzniku jsou třeba další vnější činitelé. Lékaři uvažují o tom, že na vině by mohla být kombinace s infekcí, kterou organismus pacienta sice úspěšně překoná, ale později jejím vlivem začne napadat vlastní buňky. Konkrétní faktory, které jsou ke vzniku onemocnění zapotřebí, však prozatím neznáme.

Bechtěrevova nemoc: stádia

Chronický zánět, jenž nemoc doprovází, se rozvíjí řadu let a dlouhodobě dráždí napadené oblasti. Průběh onemocnění a intenzita jednotlivých příznaků se však u jednotlivých pacientů může značně lišit. Zatímco u někoho může choroba postupovat velice rychle a záhy způsobuje funkční handicap, pro jiné případy je typické, že k nástupu závažnějších projevů dochází až v pozdním věku.

Konkrétní stádia nemoci jsou určována dle postižení různých částí páteře tvorbou kostěných výběžků (syndesmofyty). Vzhledem k tomu, že u každého pacienta onemocnění probíhá trochu jinak, stupeň nemoci charakterizuje spíše partie, které jsou Bechtěrevovou chorobou postiženy, než aby vyjadřoval její závažnost. Lékaři pak rozlišují tyto fáze:

  • I. stádium – suspektní sakroileitida,
  • II. stádium – definitivní RTG prokázaná sakroileitida,
  • III. stádium – postižení bederní páteře,
  • IV. stádium – postižení hrudní páteře,
  • V. stádium – postižení krční páteře.

Jaké má Bechtěrevova choroba příznaky?

Prvním projevem ankylozující spondylitidy, který pacienti zaznamenají, bývá většinou zánětlivá bolest zad spojená se ztuhlostí v dolní části páteře. Bolest se nejprve objevuje v křížobederní oblasti, tedy na místě skloubení křížové kosti a pánve (sakroiliakální skloubení), odkud postupně vyzařuje také do hýždí a zadní strany stehen.

Bolest a celková ztuhlost bývají nejhorší ve chvíli, kdy je pacient v klidu, takže například v noci a ráno po probuzení, při celodenním sezení v práci nebo po dlouhém cestování autem, autobusem či vlakem. Vzhledem k tomu, že se nepříjemný pocit při fyzické aktivitě zmírňuje, nemoc někdy pacienty budí ze spánku a nutí je vstávat uprostřed noci, aby se protáhli a ulevili si mírným rozcvičením páteře.

Chronickým zánětem v rámci Bechtěrevovy choroby bývá obvykle postižen axiální skelet, někdy se ovšem jedná také o periferní klouby, a to hlavně o kyčle, ale i kloub ramenní a kolenní. Postupem času se tedy nepříjemná bolest šíří také na další oblasti páteře, směrem od beder až ke krční páteři. Někdy se zároveň může objevit bolest hrudníku, a to především při dýchání zhluboka.

Rozvoj nemoci je postupný a trvá mnoho let, než dojde do konečného stádia. Páteř se s přibývajícím věkem stává méně ohebnou, pacient si nejprve nedokáže dosáhnout rukama na kolena a později se už vůbec nemůže předklonit. U menší části nemocných způsobuje Bechtěrevova choroba ankylózu páteře, což je označení pro nepohyblivý srůst v důsledku tvorby syndesmofytů. V posledním stádiu pak páteř může mít charakter tuhé neohebné tyče (tzv. bambusová páteř).

Pokud dojde k manifestaci onemocnění v mladém věku, u pacientů mohou nejprve vznikat otoky velkých kloubů na končetinách a bolest v oblasti páteře se dostaví až vzápětí. Co se týče periferních příznaků, častá je nesymetrická oligoartritida s preferencí na dolních končetinách, ale může se objevit také daktylitida (tzv. párkovitý prst).

Mimokloubní příznaky

Kromě charakteristickým symptomů v podobě bolesti zad a ztuhlosti mívá Bechtěrevova nemoc projevy také na dalších částech těla. Jelikož se jedná o chronický zánět, dostavit se mohou jeho celkové příznaky, jako je například těžká únava nebo zvýšená teplota. 

Zhruba 40 % případů ankylozující spondylitidy je pak spojeno se zánětem oční duhovky a řasnatého tělíska, což se odborně označuje jako iridocyklitida. Tyto zdravotní komplikace se u pacientů projevují především nepříjemnou bolestí oka a zvýšenou citlivostí na světlo (fotofobie). Kromě toho se však nemocní potýkají také s mnoha dalšími obtížemi, kam patří například:

Bechtěrevova nemoc: diagnostika

Odhalení ankylozující spondylitidy není snadné a lékařům může delší dobu trvat (klidně i několik měsíců), než se jim podaří najít skutečnou příčinu obtíží. Včasná diagnostika je přitom velice důležitá, jelikož pomáhá alespoň částečně zlepšovat průběh onemocnění a zároveň snižuje riziko rozvoje dalších zdravotních komplikací.

Základem diagnostiky je samozřejmě odebrání pacientovy anamnézy, kdy je nutné lékaři zodpovědět různé otázky týkající se klinických projevů nemoci a současného zdravotního stavu. Důležité je informovat lékaře o všech užívaných medikamentech, ale také o rodinném výskytu nejrůznějších zdravotních problémů včetně rozvoje Bechtěrevovy choroby u některého z příbuzných.

Poté je na řadě fyzikální vyšetření, kdy se lékař zaměří hlavně na oblast páteře a zhodnotí její pohyblivost. K tomu se používá například Mennelův manévr či Schoberův test. Kromě toho je však nutné vyšetřit i velké klouby (kyčle, ramena, kolena) a pátrá se i po dalších projevech Bechtěrevovy nemoci.

Důležitou součástí vyšetření je odběr krve a zhodnocení laboratorních výsledků. Podle počtu bílých krvinek, koncentrace C-reaktivního proteinu a dalších parametrů je pak možné prokázat přítomnost rizikového antigenu HLA-B27 a posoudit celkové zánětlivé změny v pacientově organismu.

Dalším způsobem, který slouží k odhalení ankylozující spondylitidy, jsou zobrazovací metody. Charakteristický je hlavně rentgenový nález sakroileitidy, tedy kostěných erozí, sklerotizace nebo změn šíře kloubní štěrbiny. U mladších pacientů je však po kratším trvání symptomů rentgenový nález normální a časnou diagnostiku tak umožní magnetická rezonance, jež dokáže odhalit strukturální změny charakteru sklerózy, erozí a depozice tuku, ale i ankylózu.

Pokud se skutečně prokáže, že pacienta trápí Bechtěrevova nemoc, návštěvy u lékaře tím rozhodně nekončí. Právě naopak, je nutné docházet na pravidelné kontroly, kde odborník posoudí, jak nemoc postupuje, jak vypadají změny na páteři či kloubech a zda je léčba účinná, nebo bude nutné ji nějakým způsobem upravit. Dále může pacient přijít do kontaktu s celou řadou specialistů, kam patří třeba oftalmolog, ortoped nebo neurolog, kteří mu pomohou lépe zvládat doprovodné komplikace.

Léčba Bechtěrevovy nemoci

Ankylozující spondylitida je závažné onemocnění, které není možné zcela vyléčit. Terapie spočívá v kombinaci farmakologického a nefarmakologického přístupu, přičemž nejdůležitější je aktivní přístup ze strany pacienta včetně pravidelného cvičení a dlouhodobé rehabilitace. S léčbou je pak nutné začít co nejdříve, aby byly výsledky co nejlepší a rozvoj onemocnění se podařil co nejvíce zpomalit.

Pacienty často zajímá, zda existuje u Bechtěrevovy nemoci léčba, která by byla vhodná pro každého. Terapie by však měla být individualizována podle konkrétních příznaků a jejich závažnosti, podle manifestace nemoci (axiální či periferní postižení, entezitidy, extraartikulární příznaky) a podle celkového klinického stavu s ohledem na věk, pohlaví a další přidružená onemocnění.

Farmakologická léčba

Co se týče medikamentózní léčby, používané skupiny léků slouží k potlačení zánětlivé aktivity v organismu pacienta, potlačení imunitního systému, který reaguje přehnaně proti vlastním buňkám, a zpomalení progrese Bechtěrevovy choroby. Patří sem především tyto základní skupiny léčiv:

  • nesteroidní antirevmatika (NSA),
  • imunosupresivní léky,
  • kortikoidy.

Přesný typ užívaných medikamentů a jejich dávkování vždy závisí na zdravotním stavu konkrétního pacienta. Léky pak musí být průběžně upravovány v závislosti na výsledcích pravidelných kontrol a konzultacích s ošetřujícím lékařem.

Bechtěrevova nemoc: biologická léčba

V současné době se výrazně rozvíjí biologická léčba pomocí inhibitorů tumor nekrotizujícího faktoru-a (TNF-a). Jedná se o několik různých přípravků (infliximam, etanercept), které dokáží potlačit abnormální reakci imunitního systému, přičemž tak činí cíleně a na základě detailních poznatků o tom, co imunitní reakci spouští a jaký je její průběh. Aby však mohla být tato léčba nasazena, pacient musí splňovat určitá kritéria.

Díky biologické léčbě je následně možné zmírnit jednotlivé příznaky Bechtěrevovy choroby. Tyto medikamenty zároveň zpomalují postup onemocnění, vrací pacienta do normálního života bez neustálé bolesti a minimalizují rozvoj nežádoucích účinků, které jsou typické například pro některé imunosupresivní léky. Efektivitu této terapie je ovšem nutné pravidelně kontrolovat.

Mezi výhody biologické léčby patří především rychlý nástup účinků (často již během několika dní), její cílené působení a prokazatelně pozitivní výsledky, kdy terapie opravdu dokáže zastavit nebo alespoň zpomalit postup onemocnění. Nevýhodou je však omezená dostupnost této léčby.

Bechtěrevova nemoc: cviky

Klasickou léčbu je nutné doplnit o pravidelné rehabilitace a fyzikální terapii, čemuž je nutné věnovat se dlouhodobě (v ideálním případě by se měla stát každodenní součástí života). Pacient by přitom měl vždy dbát na doporučení lékaře či fyzioterapeuta, který vyhotoví rehabilitační program takovým způsobem, aby se soustředil na konkrétní obtíže a měl co největší možný účinek.

Kromě rehabilitací mohou ke zmírnění obtíží přispět také odborně prováděné masáže a různá dechová cvičení, přičemž svou roli hraje i nácvik správného držení těla a udržování obratnosti. Dále je nutné dbát na to, aby pacient při usínání vždy zaujímal vhodnou polohu, a jako doplňková terapie dobře poslouží cvičení ve vodě, které vede k uvolnění napětí a zlepšuje pohybový rozsah pacienta.

Rázová vlna

Léčba pomocí rázové vlny sice nedokáže onemocnění zastavit ani zpomalit, přináší však pacientům alespoň částečnou úlevu od bolesti. Na postižené místo se v tomto případě přikládají speciální hlavice generátoru vysokotlakých impulzů. Ty jsou krátké a intenzivní, rozrušují a rozpouští vápenaté usazeniny v měkkých tkáních a zlepšují prokrvení v dané oblasti, čímž dochází ke snížení napětí a zmírnění bolesti.

Chirurgická léčba

Přibližně jedna třetina pacientů trpících ankylozující spondylitidou se potýká s postižením kyčelních kloubů, které mohou v některých případech vyžadovat totální náhradu. Takový stav je typický hlavně pro nemocné, u nichž se choroba rozvinula již v mladším věku. U pacientů s těžkými deformitami páteře pak mohou lékaři uvažovat o korektivní osteotomii a stabilizaci.

Zdroje: revmaticke-nemoci.cz, wikiskripta.eu, internimedicina.cz

Co je Bechtěrevova choroba?
Jako Bechtěrevova nemoc či ankylozující spondylitida se označuje chronické zánětlivé onemocnění, které postihuje především axiální skelet a vede k osifikaci kloubních pouzder i vazů. Poprvé o sobě tato choroba dává vědět mezi 18. a 30. rokem života, přičemž až třikrát častěji bývá postižena mužská část populace.
Co vede k rozvoji Bechtěrevovy choroby?
Přesná příčina vzniku ankylozující spondylitidy prozatím nebyla objasněna. Svou roli však při rozvoji tohoto onemocnění hraje dědičnost, jelikož u více než 90 % pacientů, kteří se s Bechtěrevovou chorobou potýkají, byla prokázána přítomnost antigenu HLA-B27. Samotný antigen však nemoc způsobit nedokáže a na vině je tedy pravděpodobně kombinace s působením vnějších činitelů.
Jaké má Bechtěrevova nemoc příznaky?
Prvotním příznakem většinou bývá zánětlivá bolest zad spojená se ztuhlostí v dolní části páteře. Bolest se nejprve objevuje v křížobederní oblasti, odkud postupně vyzařuje také do hýždí a zadní strany stehen, přičemž nejhorší je ve chvíli, kdy je pacient delší dobu v klidu. Postupem času se bolest šíří směrem od beder ke krku, páteř se stává méně ohebnou a u pacienta se rozvíjí funkční handicap. Kromě toho se mohou dostavit i další obtíže, jako je otok velkých kloubů, zánět oční duhovky a řasnatého tělíska nebo silná únava.
Jak se Bechtěrevova nemoc léčí?
Ankylozující spondylitidu nelze zcela vyléčit. Terapie spočívá v kombinaci farmakologického a nefarmakologického přístupu, přičemž důraz je kladen hlavně na aktivní přístup ze strany pacienta. Podávají se různé léky, jako jsou nesteroidní antirevmatika či imunosupresivní přípravky, další možností je biologická léčba a důležitá je také pravidelná rehabilitace. Kromě toho mohou pacientům pomoci odborné masáže, dechová cvičení, terapie ve vodě a nácvik správného držení těla.
'; 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 »