Pacienti si už po transplantaci slinivky nemusejí píchat inzulin

28. 6. 2023

Sdílet

V těchto dnech je to přesně 40 let od první transplantace slinivky v Institutu klinické a experimentální medicíny (IKEM). Od té doby se zdejší chirurgové vypracovali mezi absolutní světovou špičku. Ročně provedou asi čtyřicet těchto transplantací, přičemž více než 95 procent pacientů následně žije déle než pět let.

Linda Salvequartová se s diabetem 1. typu léčila od devíti let. V dětství žádné problémy nepociťovala, jak sama říká, rodiče hlídali, aby dodržovala režim a aby byla v pořádku. Jenže pak přišla puberta a její „telecí období“, kdy nemoc nijak zvlášť neřešila. „Všichni mi říkali, že to špatně dopadne, ale já tehdy, v patnácti letech, nijak dopředu nepřemýšlela,“ vzpomíná.

Co se dozvíte v článku
  1. „Nemoc udeřila zničehonic“
  2. Život bez inzulinu
  3. Slinivka zároveň s ledvinou
  4. Další možnost? Langerhansovy ostrůvky

„Nemoc udeřila zničehonic“

Jenže nemoc se po pár letech opravdu ozvala, a to velmi rázně. „Jednou odpoledne jsem přišla domů z práce a ani jsem si nemohla zout boty, jak jsem byla oteklá. Nemohla jsem se svléknout,“ říká. Druhého dne proto šla za svým praktickým lékařem a ten ji hned poslal do Prahy do IKEM. Tady už to šlo ráz na ráz.

„Musela jsem na dialýzu, protože takhle rychle nebylo možné sehnat dárce. Nakonec jsem na dialýzu docházela tři čtvrtě roku a pak, 4. ledna 2016, jsem šla na transplantaci slinivky a ledviny,“ popisuje. 

Zánět slinivky břišní má akutní i chronickou formu. Napoví bolesti i oteklé břicho Přečtěte si také:

Zánět slinivky břišní má akutní i chronickou formu. Napoví bolesti i oteklé břicho

Tím však zatím její problémy neskončily. I když většina pacientů odchází z nemocnice do dvou týdnů po transplantaci, ona tu strávila ještě další dva měsíce. Zatímco slinivka se totiž „chytila hned, ledvina ne, zřejmě i kvůli tomu, že předtím chodila na dialýzu. Po čtrnácti dnech se ale i činnost ledviny zlepšila a s tím i stav mladé ženy.

Dobrý konec jejího příběhu ještě podtrhuje to, že se Salvequartová i po transplantaci dvou orgánů mohla stát matkou. Nyní má čtyřletého syna, který se sice kvůli její preeklampsii narodil ve 28. týdnu těhotenství, ale následky si žádné nenese. „Před otěhotněním jsem musela upravit medikaci, s některými imunosupresivy se těhotenství vylučuje, ale jinak jsem vlastně nic měnit nemusela,“ vypráví pacientka.

Jak se transplantuje slinivka?

Celý průběh transplantace pankreatu popsal vedoucí programu transplantace slinivky v IKEM, chirurg Květoslav Lipár.

Nejprve lékaři odebírají orgán od zemřelého dárce. Ten je vždy mladší 50 let. Odebírá se slinivka i s částí dvanáctníku, do kterého jsou pak odváděny trávicí šťávy produkované slinivkou. 

Následuje úprava štěpu, která zabere asi jeden a půl hodiny, a poté vlastní transplantace slinivky a nejčastěji i ledviny. Chirurgové provádějí jeden příčný řez přes celé břicho, případně dva po obou stranách. V obou případech jde o velkou břišní operaci. Celkem celý proces trvá i 12 hodin. „Během jedné osmihodinové směny se opravdu stihnout nedá,“ poznamenal Lipár.

Život bez inzulinu

Podobně dobře dopadnou každý rok operace asi čtyřicítky pacientů v Česku. Země se díky lékařům z IKEM řadí mezi světovou špičku, co se transplantací slinivky týče. Více než 95 procent transplantovaných pacientů žije déle než 5 let a má funkční štěp slinivky, „to znamená, že si nemusí aplikovat inzulin a nemusí dodržovat žádná přísná dietní opatření,“ říká přednosta Kliniky diabetologie IKEM docent Peter Girman.

IKEM se v současnosti řadí mezi přední světová centra v počtu transplantací na milion obyvatel. Každý rok dostane novou slinivku v průměru 35 pacientů. Celkově lékaři v IKEM transplantovali již 760 slinivek. To je obrovský úspěch. Pro zajímavost, náklady na jeden kombinovaný výkon (spolu s transplantací ledviny) sahají k jednomu milionu korun, říká ředitel IKEM Michal Stiborek.

„V souboru nyní máme řadu pacientů, kteří již déle než 20 let nepotřebují injekce inzulinu, nemusí dodržovat diabetickou dietu ani monitorovat glykemie. To nám dalo příležitost sledovat příznivý vliv nově navozené normální glykemie na další vývoj orgánových komplikací diabetu, jako jsou především diabetická retinopatie, neuropatie a ischemická choroba srdeční. Jako variantu jsme také zavedli metodu transplantace izolovaných Langerhansových ostrůvků. Pacientům tak můžeme navrhnou více léčebných postupů, které odpovídají nejen jejich zdravotnímu stavu, ale také jejich osobní volbě,“ popisuje profesor František Saudek.

Zemřelých dárců je přes 250 ročně. Každý může pomoci až deseti nemocným Přečtěte si také:

Zemřelých dárců je přes 250 ročně. Každý může pomoci až deseti nemocným

Transplantace pankreatu se nejprve prováděly pouze současně s transplantací ledviny, a to u osob s velmi špatnou prognózou při konzervativní léčbě a vysokým operačním rizikem. Trvalo ještě dalších 15 let, než se díky systematickému pokroku stala zavedenou léčebnou metodou.

Naposledy se technika transplantace slinivky břišní podstatným způsobem změnila v roce 2010. „Tehdy jsme tento výkon začali provádět kompletně nitrobřišním přístupem a tato změna vedla k podstatnému snížení pooperačních chirurgických komplikací. V posledních deseti letech se také podařilo navýšit celkové roční počty pacientů, kteří transplantaci pankreatu podstoupí,“ říká Květoslav Lipár.

První transplantace slinivky v IKEM

První kombinovanou transplantaci slinivky a ledviny provedli v IKEM chirurgové Ivan Vaněk a Vladimír Kočandrletehdejší ředitel IKEM, 26. června 1983. Letos je to tedy 40 let. 

Pacientkou byla 32letá žena, která od svých 11 let trpěla diabetem 1. typu. V důsledku tohoto onemocnění měla těžce poškozené ledviny i zrak a kvalita jejího života byla značně narušená. Musela dostávat nejen velké dávky inzulinu, ale také pravidelně docházet na hemodialýzu. Po operaci jí oba nové orgány fungovaly 5 měsíců, po které nemusel být podáván inzulin ani prováděna hemodialýza. Následně orgány selhaly kvůli odmítnutí tělem. Pacientka zemřela 10 měsíců po transplantaci v souvislosti s komplikacemi dialýzy.

Slinivka zároveň s ledvinou

Naprostá většina pacientů (asi 85 procent), kteří podstoupí transplantaci slinivky, dostanou současně také ledvinu. Jde o pacienty s cukrovkou 1. typu, kterým právě ledviny selhávají.

Ve zbytku případů počtu se provádí izolované transplantace slinivky bez transplantace ledviny. „Jde o úzkou skupinu diabetiků, kteří nejsou schopni rozeznat hypoglykemie, a proto mohou upadnout do bezvědomí. Tyto stavy je ohrožují na životě a transplantace pankreatu je pro ně často jedinou léčebnou možností,“ doplňuje Girman.

Stovky ledvin, padesátka srdcí, jedno tenké střevo. V IKEM loni transplantovali přes 500 orgánů Přečtěte si také:

Stovky ledvin, padesátka srdcí, jedno tenké střevo. V IKEM loni transplantovali přes 500 orgánů

Další možnost? Langerhansovy ostrůvky

Možností je také transplantace izolovaných Langerhansových ostrůvků. Jde o mikroorgány uložené ve tkáni pankreatu, které produkují inzulin. Představují asi 1 procento objemu tkáně slinivky a před vlastní transplantací se oddělují v laboratoři od zbytku pankreatu, který tvoří zažívací šťávy a pro léčbu cukrovky je zbytečný. V IKEM program transplantace Langerhansových ostrůvků zavedl v roce 2005 profesor František Saudek. Dosud se tu podařilo provést asi 150 těchto transplantací.

Zajímavostí je, že tato operace se provádí jen v lokálním znecitlivění a pacienti při ní zůstávají při vědomí. Jedna z prvních pacientek, která zákrok v IKEM podstoupila, více než 10 let nepotřebovala inzulin a i po 17 letech trvá částečná funkce transplantovaných Langerhansových ostrůvků, uvedl Saudek na tiskové konferenci.

Trpí někdo ve vaší blízké rodině cukrovkou?

Autor článku

Redaktorka serveru Vitalia.cz. Zaměřuje se především na zdravý životní styl, pohyb a zdraví dětí. Mimo novinařinu pracuje také jako lektorka pohybových kurzů pro děti a rodiče.

'; 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 »