Pacienti by se třeba při výměně kyčle mohli obejít bez transfúze. Musí ale mít dostatek železa

19. 2. 2024

Sdílet

Autor: Depositphotos
Krev nelze v medicíně ničím nahradit. Její dostatek závisí na dobrovolných dárcích. Část lékařů hledá ještě jiný způsob, jak pokrýt vysokou poptávku po vzácné tekutině. Jejími úsporami. Pokud by se změnila předoperační péče, některé transfúze by nebyly třeba.

Nápad, jak uspořit vzácnou krev, je vlastně velmi jednoduchý. Stačilo by hlídat případnou chudokrevnost, nedostatek krevních destiček nebo poruchu srážlivosti u pacientů před plánovaným velkým operačním zákrokem. Třeba výměnou kyčle. 

Co se dozvíte v článku
  1. V čem spočívá PBM
  2. Příčiny chudokrevnosti
  3. Jak lze chudokrevnost léčit
  4. Komu by PBM pomohl
  5. Jak změnu pocítí pacient
  6. Současná předoperační péče
  7. Kdo změnu péče prosazuje
  8. Proč zatím PBM nefunguje

Po velkých operacích totiž někdy přichází na řadu transfúze, tedy podání krve od dárce. Část odborníků je ale přesvědčena, že pokud by chudokrevní pacienti v předstihu před operací dostali třeba infuze železa, pooperační transfúzi by se vyhnuli.

Pokud by část transfúzí nemuseli lékaři podat, uspořená krev by mohla být použita pro jiné nemocné. Operovaný pacient by také neriskoval některé zdravotní komplikace, například nežádoucí reakce organismu nebo infekce. Bez transfúze se navíc lépe hojí rány, takže pacient může jít dříve domů a péče v nemocnici je levnější. 

V čem spočívá PBM

Princip, který v konečném důsledku vede k úspoře krve, se nazývá Patient Blood Management (PBM). Anglicky je pojmenován proto, že už se nějaký čas používá v zahraničí. Třeba ve Velké Británii, Austrálii, ale i Rakousku a Německu. Poslední dvě jmenované země udávají, že ročně díky němu uspoří desetinu spotřeby darovaných červených krvinek.

Český ekvivalent tohoto termínu není zaveden, lékaři používají management předoperační anémievolně přeložit to lze jako řízené nakládání s krví pacientů.

PBM je spojen s tzv. perioperační péčí, tedy zdravotní péčí o pacienta, který se připravuje na operaci, podstupuje ji či se z ní zotavuje.

PBM nevyžaduje investice do nového vybavení, přestavby oddělení či nákup nových léků, ale změnu organizace práce. 

Lékař v rámci předoperačních vyšetření včas a cíleně zjišťuje, zda pacient není chudokrevný či netrpí poruchou krevního srážení a podobně. Pokud ano, ještě před operací řeší, z jakého důvodu a jak tento stav odstranit, vysvětluje Miloš Bohoněkprimář Oddělení hematologie a krevní transfúze Ústřední vojenské nemocnice Praha a člen výboru Společnosti pro transfúzní lékařství, jež zavedení PBM v českých nemocnicích podporuje.

Včas v tomto případě znamená minimálně šest týdnů či déle před plánovanou operací. V takovém předstihu musí být jasné, zda pacient má nedostatek červených krvinek a krevního barviva, či nikoliv. Optimální je u pacienta možnou chudokrevnost zjišťovat tři měsíce před operací, podotýká Miloš Bohoněk. 

Je to možné, protože velké chirurgické zákroky se plánují i půl roku předem. Tři měsíce pak může lékař využít k tomu, aby chudokrevnost pacienta vyřešil ještě před operací. Pokud se to podaří, zvyšuje se pravděpodobnost, že po operaci nebude třeba pacientovi dávat krev od dárců. 

Příčiny chudokrevnosti

Nejčastější příčinou chudokrevnosti bývá nedostatek železa, dále pak kyseliny listové nebo vitamínu B12. Může to ale být také porucha krvácivosti nebo srážlivosti krve.

Nedostatek vitamínů může být dán špatným složením stravy, ale také poruchou jejich vstřebávání. Chudokrevnost může způsobit také dlouhodobější krvácení a ani nemusí být nijak masivní. Jsou to třeba hemeroidy nebo krvácení z dásní, tzv. paradentóza, říká Miloš Bohoněk. K chudokrevnosti vedou i závažná onemocnění. Mezi ně patří chronické onemocnění ledvin, střev, srdeční selhání či rakovina.

Lékaři zmiňují také pojem tzv. nemocniční anémie. K ní dochází při hospitalizaci a nutnosti častých odběrů krve kvůli diagnostice. Těch je tolik, že se krev nestačí obnovovat. Týká se zejména křehkých pacientů a těch na jednotkách intenzivní péče. 

Onkologické onemocnění, poruchy tvorby kostní dřeně, imunitní nemoci, ale i užívání některých léků pak mohou způsobovat trombocytopenii, tedy stav, kdy je v krvi snížený počet destiček.

Jak lze chudokrevnost léčit

V případě chudokrevnosti by čekala pacienta léčba, například infúze se železem a některými vitamíny. Ta se ale podává ambulantně, není tedy třeba pobyt na nemocničním lůžku, a teoreticky by to šlo i u praktických lékařů. Úpravy krve lze u některých nemocných docílit také podáváním vitamínu v tabletách.

Léčba může spočívat také v podávání injekcí s vitamínem B12 či erytropoetinem (EPO), tedy hormonem, který stimuluje tvorbu červených krvinek.

Lékaři, kteří o zavedení PBM usilují, ale hovoří nejen o léčbě, ale i prevenci chudokrevnosti. Spočívá třeba v menším počtu odběrů krve, pokud je to možné, nebo zmenšením odběrových zkumavek. Samotnou intenzitu krvácení při operaci pak lze snížit třeba využíváním tzv. miniinvazivních operačních postupů – např. laparoskopie, endoskopie či chi­rurgie s využitím robota.

Komu by PBM pomohl

PBM by se týkal pacientů, kteří mají podstoupit velké plánované operace s větší ztrátou krve. Takové se provádějí např. v ortopedii, břišní chirurgii nebo kardiochirurgii.

Také u porodu může dojít k vyšším ztrátám krve a nutnosti transfúze. Těhotné ženy jsou ale specifickou skupinou už jen proto, že řada z nich trpí nedostatkem železa a dalších látek, takže anémie se u nich řeší bez ohledu na možná rizika při porodu.

Naopak u dětí je plánovaných výkonů s možnou velkou ztrátou krve minimální množství, protože dítě má krve méně než dospělý a její větší ztráta je může i přes transfúzi ohrozit na životě. Lékaři proto děti v dokumentech ke koncepci PBM nezmiňují. Děti nejsou významná skupina, které se PBM týká, podotýká hematolog Miloš Bohoněk.

Krevní plazma z ČR končí v zahraničí, a to i u firmy, která k nám léky z ní vůbec nevozí Přečtěte si také:

Krevní plazma z ČR končí v zahraničí, a to i u firmy, která k nám léky z ní vůbec nevozí

Kolika pacientů by se PBM dotkl, nemají odborné společnosti vyčísleno. Anémií obecně v ČR trpí zhruba dvacetina mužů a až pětina žen. Podle Miloše Bohoňka patří k nejčastěji diagnostikovaným onemocněním vůbec. 

Ročně by tedy nejspíš šlo o tisíce nemocných, kteří by procházeli režimem PBM. V ČR se za rok provede zhruba mezi 750 tisíci až 850 tisíci výkonů v celkové anestezii. Určitá část tohoto počtu by se měla dělat s využitím principů optimální perioperační péče. V ČR chybějí data na to, jaká proporce z celkového počtu anestezií to je. Ale bude jistě větší než malá, protože principy se týkají všech tzv. velkých výkonů, podotýká Vladimír Černý, předseda České společnosti anesteziologie, resuscitace a intenzivní medicíny.

Z pohledu poskytovatelů péče by se PBM týkal praktických lékařů pro dospělé. Značnou část předoperačního vyšetření řeší už dnes, po infúzích ale prakticky nesahají, což by se při PBM změnilo. 

Také personál nemocnic by musel být proškolen, jak poskytovat krev dárců účelně, protože zastánci PBM jsou přesvědčeni, že některé transfúze jsou v tuzemsku dnes podávány nadbytečně, nebo by stačily menší. 

Jak změnu pocítí pacient

Pro pacienta by úprava perioperační péče znamenala, že na předoperační vyšetření by musel dříve. Dříve by mu zdravotníci také odebrali vzorek krve, který by odevzdával dvakrát. Nejdříve kvůli zjištění chudokrevnosti, pak kvůli aktuálnímu stavu před operací.

Případné krevní poruchy by pak podle zastánců této praxe měli pacienti řešit co nejblíže bydlišti, takže v ambulancích praktických lékařů, což by znamenalo systémové změny ve vybavení ordinací například pro podávání infúzí nebo v úhradách péče. 

Alternativním řešením je zajištění vyšetření a léčby chudokrevnosti v rámci nemocnice, což by ale pro řadu pacientů znamenalo delší cestování.

Lékaři zachránili Adélku ještě před narozením díky tomu, že jí v děloze dali krevní transfuzi Přečtěte si také:

Lékaři zachránili Adélku ještě před narozením díky tomu, že jí v děloze dali krevní transfuzi

Současná předoperační péče

Předoperační vyšetření se dělá i dnes. Chudokrevnost se při něm ale automaticky nezjišťuje, a pokud ano, rozhodně se o ní neví tři měsíce předem. Panuje úzus, že předoperační vyšetření nemá být starší tří týdnů, takže se dělá těsně před operací, říká primář Miloš Bohoněk.

Předoperační vyšetření zpravidla zahrnuje odběr krve (zjištění krevního obrazu, parametrů krevní srážlivosti, hladiny jednotlivých minerálů, cukrů a tuků a parametrů funkce jater), vyšetření moči, EKG (tj. elektrokardiografii) a interní vyšetření.

Pacienta na ně posílá obvodní lékař, který také připravuje pro nemocnici zprávu. Někdy si předoperační vyšetření zajišťuje samotná klinika, kam pacient nastupuje na operaci.

I dnes při předoperačním vyšetření lékaři mohou na základě výsledků z laboratoře přijít na to, že pacient je chudokrevný. Vyřešit tento stav ale už před operací nestihnou. Respektive těsně před operací jej lze vyřešit, ale jen transfúzí.

Hranice chudokrevnosti

Světová zdravotnická organizace definuje chudokrevnost při hladině hemoglobinu nižší než:

  • u mužů 130 g/l
  • u žen 120 g/l
  • u těhotných 110 g/l

Zdroj: pracovní materiály k zavedení PBM

Kdo změnu péče prosazuje

O to, aby byl princip PBM v ČR zaveden, usilují čtyři odborné lékařské společnosti: 

  • Společnost pro transfúzního lékařství
  • Česká společnost anesteziologie, resuscitace a intenzivní medicíny
  • Společnost bezkrevní medicíny
  • Společnost všeobecného lékařství.

Ze zástupců těchto společností vznikla pod Ministerstvem zdravotnictví pracovní skupina, jež má připravit podklady pro zavedení změny do praxe. Připravujeme takzvanou optimalizaci perioperační péče (péče o pacienta, který se připravuje na operaci, podstupuje ji či se z ní zotavuje, pozn. red.) a koncept PBM je její nedílnou součástí, potvrdil na podzim pro Vitalia.cz Vladimír Černý.

Cílem je, aby nové postupy vydalo Ministerstvo zdravotnictví ve svém věstníku, protože tím by se staly závaznými přinejmenším pro jím zřizované fakultní nemocnice. Jde také o podmínku, která musí být splněna, aby zdravotní pojišťovny začaly řešit, zda nové postupy zahrnout do úhrad. Pracovní skupina také jedná se zdravotními pojišťovnami o případných finančních bonusech pro ta zařízení, která by si PBM a další změny v předoperační a operační péči vzaly za své.

Proč zatím PBM nefunguje

Pootočení zaběhnutých mechanismů je však – s trochou nadsázky řečeno – v českém zdravotnictví mnohdy těžší než vybudovat novou nemocnici na zelené louce.

Pro lékaře je mnohem pohodlnější pacienta přijmout a jeho stav řešit transfúzí před operací, v jejím průběhu či po ní, protože je to rychlejší a zase tolik peněz to nestojí, doplňuje Miloš Bohoněk.

Musela by existovat shoda na posílení kompetence praktických lékařů, protože bez ní se o chudokrevné pacienty efektivně nedokáží postarat.

Změnit postoj a chování poskytovatelů zdravotní péče včetně lékařů je záležitost, která se nepočítá na měsíce, protože PBM nabourává zaběhlé vzorce chování v péči o pacienty, který je u poskytovatelů zdravotní péče a lékařů zarytý pod kůží, říká Vladimír Černý.

Ale nejde jen o přenastavení zaběhnutých a někdy těžkopádných mechanismů. Je to i otázka veřejného pojištění, protože některá část konceptu PBM vyžaduje změny úhrad, upozorňuje anesteziolog. 

Lékaři se snaží domluvit s pojišťovnami, aby dávaly víc peněz ordinacím a zařízením, které by principy předoperační péče pozměnily. Jsem přesvědčen, že to je jediná cesta. Protože pokud poskytovatelé nebudou mít racionální motivaci, práci nezmění, domnívá se Vladimír Černý.

Odborná spolupráce

plk. gšt. MUDr. Miloš Bohoněk, Ph.D.

Primář Oddělení hematologie a krevní transfúze Ústřední vojenské nemocnice a člen výboru Společnosti pro transfúzního lékařství. Je hlavním odborníkem Armády ČR pro hematologii a transfúzní službu.

prof. MUDr. Vladimír Černý, Ph.D., FCCM, FESAIC

Předseda České společnosti anesteziologie, resuscitace a intenzivní medicíny

Autor článku

Redaktorka Vitalia.cz. Vystudovala žurnalistiku a češtinu na Univerzitě Palackého v Olomouci, pracovala v Deníku, na webu TV Nova a iDNES.cz. Píše o zdravotnictví. Je držitelkou novinářských cen Psychiatrické společností ČLS JEP za rok 2021 a 2022. 

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »