Dlouhotrvající kašel může značit závažný problém. Kdy vyhledat lékaře?

26. 3. 2021 8:38
20 nových názorů
ručitel
MUDr. Daniel Petr | Odborný garant článku

Kašel patří k velmi rozšířeným příznakům, které se běžně objevují u pacientů jakéhokoli věku, pohlaví i sociální skupiny. Nejčastěji jde ruku v ruce s respiračním onemocněním, v některých případech však může signalizovat i závažnější onemocnění. Pozornost byste mu měli věnovat v momentě, kdy trvá déle než tři týdny a jeho intenzita se nemění či dokonce roste.

Kašel alespoň jednou v životě pravděpodobně zažil každý z nás. Patří totiž k přirozeným obranným reflexům, pomocí kterých se naše tělo zbavuje cizorodých látek a udržuje volné dýchací cesty. Ať už jde o vdechnuté prachové částice dráždící sliznici dýchacího ústrojí anebo o probíhající infekci, kašel zpravidla signalizuje to, že se v našem dýchacím ústrojí nachází něco, co tam nepatří.

Většina z nás má tento příznak spojený s respiračním onemocněním, kdy se suchý kašel postupně mění na vlhký a přidává se k němu rovněž rýma či bolest v krku. Může ale značit celou řadu dalších onemocnění, která mohou být banálnějšího i vážnějšího charakteru. Zvýšenou pozornost by pacienti měli kašli věnovat v momentě, kdy trvá déle než tři týdny. O dlouhotrvajícím kašli či chronickém kašli pak mluvíme v momentě, kdy trvá déle než 8 týdnů. U dětí je tato lhůta o polovinu kratší.

Suchý, nebo vlhký kašel?

Pokud jste v lékárně někdy kupovali kapky či sirupy na kašel, pracovník či pracovnice se vás pravděpodobně zeptali, zda trpíte suchým, nebo naopak vlhkým kašlem. Tušíte, jak je od sebe rozeznat?

Suchý kašel

Suchý kašel zpravidla nastupuje v prvních dnech nemoci, kdy infekce, která je většinou virového charakteru, vnikne do dýchacích cest a způsobí jejich otok a překrvení sliznice. Tím vyvolá pocit, že se v dýchací trubici nachází něco, co tam nepatří, což nutí pacienta kašlat. Suchý kašel je tedy typicky dráždivý až dávivý a vysilující. Záchvaty navíc přicházejí během celého dne a jejich intenzita se zvětšuje v noci.

Pokud se suchý kašel postupně mění na vlhký, během kterého dochází k vykašlávání, můžete očekávat, že brzy vymizí. V případě, že suchý kašel dlouhodobě přetrvává anebo vás kašlání dokonce začne bolet, může se jednat například o příznak alergie, astmatu či jiného onemocnění.

Pro potlačení suchého kašle se podávají antitusika, která mohou být buď kodeinová, anebo nekodeinová.

  • Kodeinová působí centrálně, působí tedy přímo na centrum pro kašel, kde snižují citlivost. Jejich časté podávání však může vést k závislosti. Mezi kodeinové přípravky patří například Stopex, Robitussin či Vicks.
  • Nekodeinová antitusika závislost nevyvolávají. Působí periferně a snižují citlivost. V některých případech mohou rovněž působit i centrálně. Nekodeinovým přípravkem je třeba Tussin, Stoptussin či Ditustat.

Vlhký kašel

Jakmile se suchý kašel změní na vlhký, dochází k vykašlávání hlenu, který se vlivem infekce nahromadil v plicích. Po vykašlání vždy přichází krátká úleva. Ta se dostavuje také v momentě, kdy se pacient nachází v polosedu. Vleže je nutkání kašlat naopak větší.

Kromě virových onemocnění dýchacích cest provází mokrý kašel často také nemoci bakteriálního původu. To ale neznamená, že je nutné automaticky podávat antibiotika.

Na vlhký kašel se používají přípravky, které hlen naředí a usnadní jeho vykašlávání. Jedná se například o Mucosolvan, Bromhexin, ACC, Ambrosan či Sinupret. Vzhledem k tomu, že tyto léky podporují reflex vykašlávání, nevyplatí se je užívat večer před spaním.

Trápí vás chronický kašel?

Akutní kašel

Akutní kašel, tedy ten, který vzniká poměrně náhle a netrvá dlouhou dobu, je zpravidla projevem infekce horních dýchacích cest. Většinou je spojený s rýmou či zvýšenou teplotou. Obvykle bývá virového původu a jeho průběh nebývá komplikovaný. Kromě nachlazení může být rovněž příznakem:

Chronický kašel

Chronický kašel u dospělých i dlouhotrvající suchý kašel u dětí může mít celou řadu příčin, které mohou být banálního i závažného charakteru. Jeho výskyt by se proto neměl podceňovat. Mezi příčiny, které by dlouhotrvající kašel mohly způsobovat, patří:

Astma

Astma je chronické zánětlivé onemocnění, v jehož případě zpravidla hraje podstatnou roli alergie anebo atopie, tedy vrozený sklon k alergii. Nemoc se vyznačuje zvýšenou reaktivitou dýchacích cest a chronickým zánětem, přičemž obojí vede k zúžení průdušek a potížím s dechem. Mezi hlavní příznaky astmatu patří dlouhodobý nevysvětlitelný kašel, který budí nemocného ze spánku. Typické jsou také denní záchvaty kašle bez známek současně probíhající infekce.

Reflux jícnu

Ačkoli toto onemocnění na první pohled nespadá do kategorie nemocí dýchacích cest, má tu své oprávněné místo. Jeho častým a někdy jediným příznakem je chronický kašel. Reflux jícnu vzniká uvolněním dolního svěrače jícnu, který od sebe odděluje jícen a žaludek a zamezuje vniknutí kyselého žaludečního obsahu do jícnu.

Pokud dojde k jeho uvolnění, kyselina chlorovodíková postupně poškozuje sliznici jícnu, což se u pacientů projevuje pálením žáhy, říháním, ale třeba i zápachem z úst. Velmi typickým příznakem však bývá i chronický kašel, který této chorobě zpočátku nebývá přisuzován. Do spojitosti s chorobou jícnu si jej lékaři zpravidla dávají až po vyloučení jiných běžnějších příčin. 

Přesná patofyziologie kašle při gastroezofageálním refluxu není jasná. Může se objevit také u „stresového refluxu“, tedy u pálení žáhy a refluxu, který je důsledkem stresových situací.

Chlamydiové infekce

Za déletrvajícím kašlem mohou stát také chlamydiové infekce, konkrétně pak bakterie Chlamydia pneumoniae, která se šíří vzduchem a je v populaci velice rozšířená. Postihuje primárně plíce a způsobuje chronický, někdy až úporný kašel. Kromě kašle se u nemocného může dostavit také slabost a pocit únavy.

Tento patogen je zákeřný hlavně v tom, že se může rozšířit z plic do celého těla, čímž stoupá riziko chronického průběhu onemocnění.

Rozedma plic (CHOPN)

Chronická obstrukční plicní nemoc, kterou možná znáte pod označením rozedma plic, je závažné onemocnění, jehož důsledkem dochází k zužování průdušek, což omezuje proudění vzduchu, a to zejména ven z plic. Vzduch, který se nedostane ven, následně brání přísunu vzduchu čerstvého. Při usilovném vdechu navíc stoupá tlaku uvnitř plicních sklípků, jejichž stěna se poškozuje, čímž se zmenšuje plocha, na níž dochází k okysličování krve.

Hlavním příznakem onemocnění je kašel, který se vyskytuje téměř od počátku onemocnění a je důsledkem zánětu v dýchacích cestách. Dušnost, která se k příznakům přidává výrazně později, nakonec nemocného naprosto vyřadí z běžného života. Těžší formy CHOPN vedou až ke smrti.

Příčinou onemocnění jsou nejčastěji změny na sliznici, které jsou způsobené zánětlivou reakcí na vdechované škodliviny. Typicky se jedná o tabákový kouř, a to i v podobě pasivního kuřáctví.

Pokud je léčba zahájena v počátečních fázích nemoci, plicní funkce se mohou zlepšit a stejně tak i kvalita života nemocného. Zásadní je ale zanechat kouření. Je rovněž nutné provádět dechové rehabilitace a užívat léky. V pokročilejších fázích nemoci jsou pacienti odkázáni na kyslík, a to formou intermitentní či trvalé oxygenoterapie.

Onkologické onemocnění

Jednou z možných příčin, které způsobují dlouhotrvající kašel, může být nádorové onemocnění, typicky hrtanu či plic. Jeho výskyt se zvyšuje kouřením (aktivním i pasivním), častou konzumací alkoholu, ale také infekcemi lidským papilomavirem.

Kašel je prvním a často i jediným příznakem rakoviny plic. Až v pokročilých stádiích se pak přidává také bolest na hrudi, únava a hubnutí. Objevit se rovněž může vykašlávání krve. Nádorové onemocnění se častěji vyskytuje u kuřáků, zhruba ve 20 % případů však postihuje i jedince, kteří nikdy nekouřili.

Co se týče léčby, tak zatímco v počátečním stádiu je nemoc zcela vyléčitelná, v pokročilejších fázích nemoci pacient obvykle přežívá jen několik měsíců od diagnózy. A to i přes velký pokrok v léčbě.

Další příčiny dlouhotrvajícího kašle

Kromě výše vypsaných příčin může za chronickým kašlem stát například také:

  • alergie,
  • psychické příčiny,
  • vdechnutí cizího tělesa.

Léčba dlouhodobého kašle

Léčba chronického kašle se vždy odvíjí od příčiny, která problém vyvolala. A vzhledem k tomu, že za dlouhodobými obtížemi může v některých případech stát i závažný zdravotní problém, měly by vaše kroky vést přímo k lékaři, který provede diagnostiku a stanoví adekvátní léčbu. Lékaře byste měli navštívit pokaždé, kdy:

  • kašel trvá déle než tři týdny a neustupuje nebo se zhoršuje,
  • vykašláváte krev či narezlý hlen,
  • trpíte záchvatovým kašlem, který trvá s přestávkami alespoň 3 měsíce v roce,
  • kašel je spojený s dušností,
  • kašel doprovází vysoká teplota.

Zdroj: alphega-lekarna.cz, idnes.cz, cipa.cz, lecimekasel.cz, benu.cz

Jak se liší akutní a chronický kašel?
Akutní kašel vzniká náhle a také poměrně rychle odezní. Zpravidla doprovází nachlazení, kdy se k němu může přidat také zvýšená teplota, únava či bolest v krku. Chronický neboli dlouhotrvající kašel je naopak ten, který pacienta trápí v řádech několika týdnů i měsíců, nelepší se, anebo se naopak stále zhoršuje. Může být příznakem některého z vážných onemocnění.
Jak rozlišit suchý a vlhký kašel?
Suchý kašel nastupuje v prvních dnech nemoci jako reakce na infekci, otok a překrvení dýchacích cest. Je dráždivý, někdy dávivý a velmi vysilující. Záchvaty se objevují hlavně v noci. Postupem času přechází ve vlhký kašel, který je typický tím, že během něj pacient vykašlává hlen, jenž se vlivem infekce nahromadil v plicích. Vlhký kašel bývá rovněž znamením toho, že infekce začíná ustupovat.
Jaké má dlouhotrvající kašel příčiny?
Chronický kašel může mít celou řadu banálních i závažných příčin. Kromě alergie, vdechnutí cizího tělesa či chlamydiové infekce za ním mohou stát také život ohrožující onemocnění, jakými jsou třeba astma, chronická obstrukční plicní nemoc anebo rakovina hrtanu či plic. Dlouhotrvající kašel může být také důsledkem psychosomatiky, konkrétně pak špatného psychického stavu.
Kdy vyhledat lékaře?
Vzhledem k tomu, že chronický kašel vypovídá o celé řadě nebezpečných nemocí, nevyplatí se jej podceňovat. Lékaře byste proto měli navštívit vždy, když kašel trvá déle než tři týdny a neustupuje, nebo se dokonce horší, vykašláváte krev či narezlý hlen, trpíte záchvatovým kašlem, který trvá s přestávkami alespoň 3 měsíce v roce, kašel je spojený s dušností anebo ho doprovází vysoká teplota.
Jirka (neregistrovaný)

Dobrý den, od 10.měsíce minulého roku 2024 jsem začal mít záchvaty kašle při kterých jsem nemohl popadnout dech, až jsem sípavě lapal po dechu. To asi po dvou měsících trochu polevilo, jen v průběhu síly kašle. Kašel ale stále přetrvává. Můj lékař mi řekl, že je to virus z klimatizace letadel a prý trvá dlouho, než se ho člověk úplně zbaví. Máme duben doku 2025 a pořád kašlu, doma, MHD v práci a stále ne a ne se ho zbavit. Nebo mám s tím někam zajít?

Dobrý den, rozhodně by bylo vhodné podrobnější vyšetření včetně RTG plic. Zkuste se znovu obrátit na praktického lékaře, jestliže kašel trvá už rok, měl by se vám více věnovat.

Jitka (neregistrovaný)

Dobrý večer, mám strach o manžela, ale nechce k lékaři. Prodělali jsme celá rodina covid. Každý měl jiný průběh. Manžel měl záchvaty kašle, až skoro omdléval. Od té doby pokaždé když je nemocný má takovéto stavy kašle... Ale... 30.12. se necítil dobře. Říkal, že na něj něco leze. No, od 1.1. má stále se zhoršující kašel, je zahleněný, ale včera a dnes opět se stalo, že začal tak kašlat, že zničeho nic chrčel, měl otevřené oči, ale jako by omdlel. Dneska měl v ruce sklenici s vodou, kterou v tom stavu upustil. Když přišel po pár sekundách k sobě, tak nevěděl co se stalo. Myslíte, že je to opravdu pozůstatek covidu? Nebo je to něco vážného. Teplotu nemá, jen je unavený, nemůže spát. Bere ACC Long, koldrex, sinupred, průduškový čaj, inhaluje Vincentku. Při záchvatu kašle si dýchne z inhalatoru ventolin. Jak ho mám přesvědčit, aby šel k lékaři. Přeci to není normální aby upadal do takového stavu. Děkuji za odpověď Jitka

Dobrý den,
takový stav určitě vyžaduje dovyšetření, těžko říct, zda souvisí s Covidem. Určitě je potřeba fyzikálně vyšetřit plíce, udělat RTG snímek, EKG, ev. neurologické vyšetření. Stran přesvědčování vám bohužel moc neporadím. Můžete mu zkusit dát nějaké ultimátum, ale těžko říct, zda na to zareaguje.

Tom (neregistrovaný)

Dobrý den, před 6 týdny jsem prodělal covid. Dva týdny po covidu jsem pokašlával a cítil dušnost na hrudi, lékař mi napsal Levopront kapky a Atrovent N a kašel odezněl. Po týdnu v práci a fyzické zatěži se kašel vrátil a je snad horší než předtím. Nejhorší je to večer před usnutím a poté ráno a opět cítím dušnost na hrudi a jsem zahleněný, nemůže to příznak astma.
Předem děkuji za odpověď

  • 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 »