Cirhóza jater začíná nenápadně. Na vině bývá alkohol či jiné onemocnění

15. 1. 2020 9:00
42 nových názorů
ručitel
MUDr. Daniel Petr | Odborný garant článku
„Za jaterní cirhózu mohou nejčastěji chronické hepatitidy či alkohol. Možnosti léčby jsou omezené.“

Cirhóza jater je závažné chronické onemocnění, při němž dochází k vážnému poškození jater. Nejčastěji se rozvíjí v důsledku dlouhodobé nadměrné konzumace alkoholu nebo u pacientů, které trápí virová hepatitida typu B a C. Co se týče léčby, zpočátku je důležitá hlavně dieta a celková úprava životosprávy, zatímco v pokročilých stádiích mohou lékaři kromě zmírňování příznaků zvážit také transplantaci jater. 

Co je cirhóza jater?

Co se dozvíte v článku
  1. Co je cirhóza jater?
  2. Příčiny jaterní cirhózy
  3. Cirhóza jater a její stádia
  4. Jaké má cirhóza jater příznaky?
  5. Možné komplikace
  6. Diagnostika
  7. Léčba jaterní cirhózy
  8. Prognóza

Cirhóza jater je závažné jaterní onemocnění, při kterém se u pacientů rozvíjí nekróza jater, zvýšená tvorba vaziva (fibróza jater) a následně také uzlovitá přestavba jaterní struktury. Postupně tak dochází k úplné přeměně jaterní tkáně i jejich cévního řečiště. Ačkoliv jsou tedy játra za normální situace schopná rychle se regenerovat, v případě poškození je tato obnova nedokonalá a nově vzniklá tkáň přestává plnit svou funkci.

Jaterní cirhóza se lidově označuje také jako tvrdnutí jater. Název tohoto onemocnění pochází z řečtiny, kde slovo kirrhos znamená nažloutlý. Lékaři tak označovali nemocné, o kterých se domnívali, že se jim v těle hromadila žluč, což vedlo ke žloutnutí jejich pokožky. Cirhózou poraněná játra totiž začínají být neproniknutelnou překážkou, krev se před nimi hromadí a může se rozvinout také portální hypertenze. [1, 2, 3, 45]

Příčiny jaterní cirhózy

Cirhóza jater může mít řadu různých příčin. Většina lidí si toto onemocnění automaticky spojuje s nadměrnou konzumací alkoholu, ještě častěji jsou však na vině virové hepatitidy typu B a C. Jaterní cirhóza v takovém případě vznikne buď bezprostředně po onemocnění hepatitidou, nebo o něco později jako následek jejího chronického průběhu.

Alkoholická cirhóza jater se projeví zhruba ve 20 % případů. Doba užívání alkoholu a množství, které vede k nevratnému poškození jater, jsou však velice individuální. U mužů se za nebezpečnou považuje konzumace 60 gramů alkoholu denně, ženy mají ovšem daleko nižší toleranci a nebezpečí představuje již 20 gramů.

Další možné příčiny:

  • biliární cirhóza jater – dlouhodobá obstrukce žlučových cest,
  • kardiální cirhóza – nemoc, při níž dochází k chronickému srdečnímu městnání,
  • autoimunitní hepatitida – způsobuje chronické poškozování jater, zánět a jizvení,
  • Wilsonova choroba – vrozená porucha metabolismu mědi,
  • hemochromatóza – onemocnění spojené s nadměrným hromaděním železa v játrech,
  • cystická fibróza,
  • vzácné metabolické poruchy (porfyrie, glykenóza, galaktosemie),
  • toxické poškození jater – léky nebo jedy,
  • kryptogenní (idiopatická) cirhóza – nejasný původ cirhózy.

Jednou z možných příčin cirhózy je také nealkoholická steatóza jater neboli ztukovění. Za tento problém je zodpovědný především zvýšený příjem potravy, ale také snížená citlivost tkání k inzulinu v důsledku nadváhy a genetické predispozice. Prostá steatóza játra výrazně nepoškozuje, pokud je ovšem spojená s chronickým zánětem, může vyústit v cirhózu. Poté hovoříme o nealkoholické steatohepatitidě (NASH). [6, 7, 8, 9, 10]

Cirhóza jater a její stádia

Jak již bylo avizováno výše, alkoholická choroba jater patří mezi nejčastější příčiny jaterní cirhózy. Podle toho, jak moc jsou játra pacienta poškozená, lékaři rozlišují několik stupňů tohoto onemocnění:

  • steatóza jater a steatohepatitida (ztukovatění jater a chronický zánět),
  • steatofibróza jater (nahrazování jaterních buněk vazivem),
  • cirhóza jater (poslední stádium). [11, 12, 13, 14]

Jaké má cirhóza jater příznaky?

Cirhóza jater zpočátku mívá nenápadný průběh a typické příznaky se obvykle dostaví až v pozdějších stádiích, kdy dojde k celkovému narušení funkce jater nebo jejich úplnému selhání. Mezi první nespecifické projevy, které mohou být také známkou mnoha jiných onemocnění, se řadí třeba zvýšená únava, ztráta chuti k jídlu, nadýmání, zácpa, výrazné hubnutí nebo také lehké otoky v oblasti kotníků.

V pozdějších stádiích může cirhózu jater doprovázet poměrně pestrá škála symptomů. Někdy převažuje spíše poškození jaterní tkáně, jindy jsou naopak patrné hlavně projevy poškození krevního řečiště. Mezi charakteristické příznaky cirhózy jater patří:

  • tlak v pravém podžebří,
  • slabost a celkové vyčerpání,
  • nechutenství,
  • úbytek svalové hmoty,
  • ikterus – zežloutnutí kůže,
  • porucha srážlivosti krve,
  • zvýšená krvácivost dásní,
  • krvácení z nosu,
  • krvácení z jícnu,
  • poruchy menstruačního cyklu,
  • pokles libida a potence,
  • gynekomastie a mizející ochlupení na hrudi.

Pokročilá cirhóza jater bývá u pacientů patrná na první pohled. Typické jsou tenké končetiny, velké nafouklé břicho a bledá či zažloutlá kůže, kde se objevují četné pavoučkové névy, podlitiny a petechie. Jazyk a rty bývají výrazně červené, na dlaních se objevuje erytém, pacient má paličkovité prsty a jeho břišní stěna ochabuje, což často vede ke vzniku kýly. Zároveň jsou typické otoky dolních končetin v různém rozsahu. [15, 16, 17, 18, 19]

Jak často konzumujete alkohol?

Možné komplikace

U pacientů trpících jaterní cirhózou se mohou projevit nebezpečné zdravotní komplikace, které také často bývají příčinou jejich předčasného úmrtí. Jedná se například o choroby trávicího ústrojí, jaterní a renální selhání, jaterní encefalopatii (poškození mozkové tkáně) či rakovinu jater, ale nemocní bývají také náchylnější k různým infekcím.

Mezi nejzávažnější komplikace patří portální hypertenze neboli zvýšený tlak v jaterní žíle, který způsobuje vznik jícnových a žaludečních varixů, zvětšení sleziny, selhání ledvin nebo ascites při cirhóze jater (hromadění tekutiny v dutině břišní). Náhlé zhoršení jaterní cirhózy, které vyústí v bezvědomí a často končí smrtí pacienta, se označuje jako jaterní kóma. [20, 21, 22, 23, 24]

Diagnostika

Jelikož cirhóza jater často probíhá bez jakýchkoliv vnějších příznaků, nebo svými symptomy zpočátku připomíná jiné obtíže, diagnostikovat tuto nemoc rozhodně není jednoduché. Pacient obvykle nemá o poškození jater žádné tušení a diagnózu proto může odhalit třeba běžné vyšetření nebo vstupní prohlídka do zaměstnání.

Pokud má lékař podezření na cirhózu jater, nejprve podrobně projde pacientovu anamnézu, následně provede fyzikální vyšetření a odešle nemocného na laboratorní testy. Játra lze dále vyšetřit pomocí ultrazvuku, počítačové tomografie (CT) nebo biopsie. Z důvodu časté přítomnosti varixů je potřeba zkontrolovat také žaludek a jícen. [25, 26, 27, 28, 29]

Selhání jater způsobuje poruchy vědomí, otoky i smrt. Na vině bývá alkohol či infekce
Přečtěte si také:

Selhání jater způsobuje poruchy vědomí, otoky i smrt. Na vině bývá alkohol či infekce

Léčba jaterní cirhózy

Možnosti léčby jsou v dnešní době stále dost omezené. Základním opatřením je okamžitě ukončit působení faktorů, které mají na játra negativní vliv a poškozují je. Jestliže je tedy příčinou vzniku tohoto onemocnění nadměrná konzumace alkoholu, pacient by měl tento zlozvyk zcela odbourat a stát se abstinentem. Pokud je na vině virová hepatitida nebo Wilsonova choroba, je nutné včas zahájit odpovídající léčbu.

Dieta při cirhóze jater

Dále jsou na místě také podpůrná opatření, která zahrnují třeba úpravu životosprávy nebo podávání vitamínů (A, D, E, K) a hepatoprotektiv. Důležitá je také speciální dieta pro cirhotiky, kdy se pacient musí obejít bez přílišného solení, tučných či smažených pokrmů a kořeněných jídel. Strava by naopak měla být bohatá na bílkoviny i vlákninu a rostlinné tuky by měly převládat nad těmi živočišnými. Pokud jde o bylinky na cirhózu jater, lékaři nejčastěji doporučují ostropestřec mariánský, kořen smetánky lékařské nebo také plody kustovnice.

Transplantace jater

V pokročilejších stádiích mohou lékaři zvážit také transplantaci jater. Jelikož se však jedná o složitý proces, který má výrazný vliv na kvalitu pacientova života, je nutné předem provést důkladné testování. Po zákroku musí pacient dodržovat přísnou dietu, nesmí pít alkohol ani kouřit a denně musí konzumovat větší množství léků, které působí na jeho imunitu a pomohou tělu přijmout nový orgán. [30, 31, 32, 33, 34]

Prognóza

Cirhóza jater patří mezi choroby, které nejčastěji trápí pacienty v dospělém produktivním věku. Výzkumy naznačují, že postiženi bývají obvykle příslušníci slabších sociálních vrstev nebo dobře zajištěné ženy ve středním věku, které řeší syndrom opuštěného hnízda prostřednictvím alkoholu.

Počet nemocných se rok od roku zvyšuje a v České republice lékaři každoročně zaznamenají zhruba dva tisíce nových případů jaterní cirhózy. Délka života u pacientů s tímto onemocněním bývá až o deset let kratší než u zdravých jedinců, přičemž ženy umírají dokonce ještě dříve. [35, 36, 37, 38]

Zdroje: wikiskripta.eu, stefajir.cz, nemoci.vitalion.cz, internimedicina.cz, solen.cz, my.clevelandclinic.org, mayoclinic.org, healthline.com, medicalnewstoday.com

Timka (neregistrovaný)

Dobrý den.
Chtěla bych se zeptat na jednu známou. Už minimálně 20let pije alkohol ve větší míře a to hlavně pivo a víno. V poslední době nemá problém za den vypít litr vína, minimálně 4 piva a zhruba 3x týdně vypít půl litru tvrdého alkoholu. Už delší dobu pozoruji, že na to jak je hubená má viditelně nafouknuté břicho. Může se tím pádem jednat o onemocnění jater v pokročilém stádiu??

Dobrý den,
určitě může, ale bez komplexního vyšetření to nelze takto 100% říci.
Každopádně při ztrátě funkce jater dochází postupně k uvolňování volné tekutiny do dutiny břišní a vzniká tzv. ascites = nafouknuté (vyklenuté) břicho.

Anonym (neregistrovaný)
Dobrý den, chtěla bych se zeptat, dlouhou dobu jsem hodně často pila alkohol asi 12 let, před rokem jsem začala mít potíže se zažíváním, stále světle žluté průjmy, byla jsem na kolonoskopii ultrazvuku i gastroskopii vše jsem měla v pořádku ale průjmy neustupovaly tak mi bylo uděláno ct, a prý vše v pořádku jen v sigmatu divertikly. Bolí mě pořád klouby, svaly a záda, krevní obraz mi dělaly za ten rok milionkrát i jaterní testy, asi třikrát jsem měla lehce zvýšené GGT 0.75 prý je to nevýznamná hodnota, ultrazvuk za ten rok jsem měla šestkrát naposled před měsícem vždy játra hladká, nezvětšená, zvyklé echogenity i echostruktury, slezina nezvětšená, Porta bez dilatace a trombozy. Ted poslední krevní obraz v pořádku, jaterní ALT 0,52,AST 0,59,GGT 0,54,bilik 8,9.Beru již měsíc esentiale a milgamu N. Před měsícem jsem začala mít tlak v uších a kolem nich, bolestivý tlak za očima a tlak ve tvářích, smrkám trošku sražené krve včera jsem byla na Orl a podle rentgenu prý vše v pořádku. Už nevím na koho se obrátit. Lékaři už mě mají za blázna pořád mě bolí něco, průjmy žluté stále ale už ne tolik. Chtěla bych se zeptat jestli je možné mít cirhózu když jsem za ten rok nikdy neměla žádný nález na játrech ani na ct a jaterní testy jen třikrát lehce hraniční? Nebo případně jestli je potřeba ještě nějaké vyšetření, tady řekli že jsem zdravá. Moc děkuji za odpověď
MUDr. Thai Bao Han (neregistrovaný)
Dobrý den, vidím, že jste opravdu důkladně vyšetřená, neuzavíral někdy ty průjmy jako funkční potíže, dráždivý tračník? Vaše hodnoty jsou v pořádku. Cirhóza je tedy opravdu nepravděpodobná vzhledem k laboratoři a sonografickému vyšetření. Vzhledem k bolestem kloubů a svalů bych ještě doporučila revmatologické vyšetření, ale spíš mi všechny dohromady vaše obtíže přijdou takové neurčité, všechny vyšetření jsou v pořádku... Doporučuji se všemi zprávami zajít k vašemu obvodnímu lékaři, probrat s ním vše - pokud by opravdu bylo vše v pořádku, možná by pomohla psychoterapie.. To je ale až poslední volba, když se vyloučí všechna možná onemocnění.
Lola (neregistrovaný)

Myslim,ze by nebylo na skodu udelat radne odcerveni - Ivermectin anebo rozemlety hrebicek a kefir - pit na lacno 3 dny a 3 dny pauza,opakovat cely mesic...

  • Našli jste v článku chybu?
'; 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'; } }
'; 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 »