Rodič u nemocného dítěte není návštěva, může zůstat i v noci, vzkazuje nemocnicím ministerstvo

13. 6. 2023

Sdílet

Autor: Depositphotos
Ministerstvo zdravotnictví vydalo metodický pokyn, ve kterém říká, jak by se nemocnice měly chovat k rodičům, kteří mají hospitalizované dítě. Podle pokynu dítě má právo na jejich nepřetržitou přítomnost, nemocnice nemůže upřednostňovat jen jednoho z rodičů a nelze přítomnost rodičů chápat jako návštěvu, která má právo přijít jen v určité hodiny.

„Poskytování zdravotních služeb může být pro dítě náročnou životní zkušeností, jelikož se podrobuje zdravotním výkonům, které někdy doprovází strach nebo bolest. Pokud je však v přítomnosti rodiče, má to velice pozitivní dopad nejen na jeho psychiku, ale i psychiku samotných rodičů,“ vysvětluje vydání pokynu ministr zdravotnictví Vlastimil Válek.

O metodickém pokynu Ministerstvo zdravotnictví média informovalo v úterý 13. června, kdy jej také zveřejnilo a od kdy je také možné se dle něj řídit. Úřad pokyn vydal jako reakci na podnět veřejného ochránce práv, který se spory mezi rodiči a personálem nemocnice zabýval opakovaně. A to zejména v době, kdy ještě zástupkyní ombudsmana byla Monika Šimůnková.

„Metodický pokyn je jakousi ‚kuchařkou‘ pro všechny poskytovatele zdravotních služeb v řešení přítomnosti zákonných zástupců a osob blízkých při poskytování zdravotních služeb u dětských pacientů,“ uvádí Vlastimil Válek. Ostatně samo ministerstvo je zřizovatelem fakultních nemocnic a některých léčeben.

Kojené dítě zůstalo na JIP bez matky. Zastání žena našla v kanceláři ombudsmana Přečtěte si také:

Kojené dítě zůstalo na JIP bez matky. Zastání žena našla v kanceláři ombudsmana

Vše pro malého pacienta

Důležitý je samozřejmě i pro rodiče. V poslední době totiž přibývalo nedorozumění a konfliktů v situacích, kdy zaměstnanci nemocnic rodiče vykázali z pokoje dítěte či jim neumožnili být při vyšetření nebo podání anestezie. Spory se vyhrotily zejména za covidové pandemie, kdy nemocnice načas návštěvám zcela zavřely brány. Z aktuálního metodického pokynu ale jasně vyplývá, že k takovému jednání by nemocnice měla přistupovat pouze tehdy, pokud je to nezbytné. A měla by omezení kontaktu mezi léčeným dítětem a jeho blízkým zdůvodnit.

Metodický pokyn, byť vytvořený ministerstvem, sice nemůže stát nad zákony, výrazně ale napomůže sjednotit postupy nemocnic při uplatňování práva léčeného dítěte na přítomnost rodičů či jiných blízkých. U hospitalizovaného dítěte totiž nemusí být jen rodič, ale i sourozenci, prarodiče nebo třeba pěstouni a ti, kterým dítě do opatrování svěřil soud. Blízkými osobami se rozumí také přímí příbuzní a metodický pokyn zmiňuje také partnera rodiče, a to i registrovaného.

Jaké jsou vaše zkušenosti s chováním lékařů a zdravotníků v nemocnicích?

To samozřejmě neznamená, že se u postele malého pacienta sejdou všichni hromadně. Napovídá to ale, že rodiče může u lůžka vystřídat někdo jiný. A to nad rámec návštěvního režimu. Zároveň dokument ale také zcela logicky podotýká, že rodiče či jiné blízké nelze k přítomnosti u lůžka malého pacienta nutit. „Je nutné respektovat jejich (rodičů, pozn. red.) rozhodnutí nebýt u dítěte přítomen nepřetržitě,“ říká doporučení.

U dítěte nemusí být jen máma

Důležité je, že ministerský dokument hovoří o tom, že by nemocnice neměly preferovat jen jednoho z rodičů. „Při výkonu práva dítěte na nepřetržitou přítomnost zákonného zástupce nelze aplikovat striktní jazykový výklad (…) zákona (…), že právo dítěte na nepřetržitou přítomnost zákonného zástupce se týká toliko jednoho ze zákonných zástupců. (…) je třeba konstatovat, že toto právo se vztahuje k oběma zákonným zástupcům,“ uvádí dokument.

„Je nicméně pochopitelné, že zajistit nepřetržitou přítomnost obou zákonných zástupců může být v každodenní praxi s ohledem na provozní a prostorová omezení náročné. Proto je nutné individuálně vyhodnocovat, kdy je nepřetržitá přítomnost obou zákonných zástupců možná, kdy je naopak nutno ji omezit a jaké omezení je v takovém případě nezbytné. Nemůže však docházet k situaci, kdy druhému zákonnému zástupci poskytovatel kontakt s dítětem omezí nad nezbytnou míru nebo mu v kontaktu zcela zabrání. Poskytovatel zdravotních služeb přitom zásadně nemůže upřednostňovat některého ze zákonných zástupců nebo osob blízkých na základě pohlaví, např. výlučně či přednostně umožnit nepřetržitou přítomnost pouze matce, nikoliv však otci,“ stojí dále v pokynu. 

Zároveň je tam ale uvedeno, že výjimkou jsou případy, kdy nemocnice „uvede legitimní cíl, kterým rozdílné zacházení odůvodní a ve vztahu k němuž by takový rozdílný přístup byl shledán přiměřeným a nezbytným“.

Ze strany ministerstva nejde o první pokus spory mezi nemocnicemi a rodiči nemocných dětí, mnohdy vystresovanými a zoufalými. Metodický pokyn vydalo ministerstvo už v době covidu, kdy jej vedl Adam Vojtěch. A už tehdy nemocnice dokument upozorňoval, že rodiče nejsou pouhou návštěvou, kterou je možné vykázat jen do určité části dne.

Současný ministerský metodický pokyn je ale širší a popisuje detailněji situace, do nichž se dítě a jeho blízcí mohou dostat. Věnuje se proto také psychiatrické péči nebo poskytování akutní lékařské pomoci na JIP či v podobě resuscitace, tedy oživování. I v takových případech mají dle pokynů ministerstva rodiče právo u dítěte zůstat. V případě fatálního konce se totiž následně dokáží se ztrátou dítětelépe vyrovnat. Třeba i proto, že na vlastní oči viděli, že zdravotníci pro jeho záchranu udělali vše, co bylo v jejich silách.

Když musí dítě do nemocnice… Kdy můžete s ním a jak je to s ošetřovným? Přečtěte si také:

Když musí dítě do nemocnice… Kdy můžete s ním a jak je to s ošetřovným?

Vybrané pasáže metodického pokynu 

A co ještě metodický pokyn říká? Níže jsme vybrali některé pasáže, které považujeme za důležité. Slovosled i pořadí pokynů mohou být vůči originálu upraveny. Celé znění dokumentu najdete na webu Ministerstva zdravotnictví.

  • Děti do dovršení 18 let věku jsou při poskytování zdravotních služeb zvláště zranitelnou skupinou pacientů. () Separace dítěte od rodičů představuje zásadní stresor. Naproti tomu přítomnost rodičů (nebo jiných osob blízkých) u dítěte, kterému jsou poskytovány zdravotní služby, má pozitivní vliv na psychiku dítěte i samotných rodičů a dokáže výrazně zvýšit kompetence rodičů při péči o dítě v domácím prostředí. To je mimořádně důležité obzvlášť v případě chronicky nemocných dětí.
  • Udělení každého informovaného souhlasu, ať už písemnou, nebo ústní formou, by měla předcházet časná a srozumitelná edukace.
  • Tam, kde je to možné, je žádoucí zákonnému zástupci nebo osobě blízké nabídnout zapojení do ošetřování dítěte.
  • Zákon o zdravotních službách pak v § 28 odst. 3 písm. e) bodu 1 a 3 zakotvuje právo dítěte na nepřetržitou přítomnost zákonného zástupce a přítomnost jiné osoby blízké nebo osoby určené pacientem při poskytování zdravotních služeb. () Přítomnost (uvedených, pozn. red.) osob () nelze považovat za pouhou návštěvu, nýbrž se fakticky jedná o právo dítěte na doprovod při poskytování zdravotních služeb, který může být přítomen také přímo při provádění zdravotních výkonů.
  • Poskytovatelé jednodenní nebo lůžkové péče mají () povinnost umožnit pobyt zákonného zástupce společně s hospitalizovaným dítětem, pokud to umožňuje vybavení zdravotnického zařízení a zároveň nebude narušeno poskytování zdravotních služeb anebo takový pobyt není na základě jiného právního předpisu vyloučen.
  • Výjimku představují infekční oddělení, kdy lze přítomnost doprovodu dítěte v nezbytném rozsahu podmínit, omezit či případně vyloučit. Tuto přítomnost je možné také podmínit individuálním posouzením lékaře či odborné komise.
  • Zákonnému zástupci je umožněna nepřetržitá přítomnost u dítěte i při poskytování intenzivní péče, a to i tehdy, pakliže zákonný zástupce z podstaty věci o dítě v danou chvíli nemůže pečovat.
  • Nepřetržitou přítomnost zákonného zástupce lze s ohledem na stavebně-technické a provozní omezení či epidemiologicko-hygienický režim omezit na operačním sále zejména v průběhu zákroku jako takového. Potřebná předoperační příprava by měla být zpravidla prováděna v prostorách, kde je přítomnost doprovodu dítěte umožněna. Naproti tomu doprovod dítěte na samotný operační sál zpravidla nevstupuje. Přítomnost doprovodu u dítěte je v takovém případě znovu umožněna až po skončení operace.
  • Lékař poskytující anesteziologickou péči má vždy možnost v odůvodněných případech přítomnost doprovodu při poskytování anesteziologické péče odmítnout, a to i v případech, kdy bylo poskytování této péče již zahájeno. Přítomnost doprovodu u dětí v rámci úvodu do anestezie nesmí vést ke snížení kvality a bezpečnosti poskytované anesteziologické anebo chirurgické péče.
  • U dětí do 6 let je pobyt tzv. průvodce hrazen z veřejného zdravotního pojištění; u starších dětí si pobyt ve zdravotnickém zařízení hradí zákonný zástupce sám, pakliže úhradu neodsouhlasí zdravotní pojišťovna.
  • V případech, kdy je objektivně možná přítomnost pouze jednoho zákonného zástupce, primárním kritériem je v takové situaci přání dítěte. Pokud dítě ovšem není schopno projevit v této otázce svou vůli, je na rodičích, aby našli v této otázce shodu. Pokud rodiče nejsou schopni vzájemné shody dosáhnout a nastalá situace narušuje poskytování zdravotních služeb dítěti či jinému pacientovi, je poskytovatel () oprávněn v nezbytné míře omezit přítomnost některého či obou rodičů. O možnosti takového postupu poskytovatel rodiče předem poučí. Jakmile ovšem mezi rodiči nastane shoda na tom, kdo z nich bude u dítěte přítomen, poskytovatel je povinen tuto přítomnost opětovně umožnit.
  • Právo dítěte na přítomnost osob () není absolutní a uplatní se, jen pokud výkon tohoto práva: 1. nebyl vyloučen či omezen zákonem o zdravotních službách či jiným právním předpisem, 2. nenarušuje poskytování zdravotních služeb dítěti nebo jiným pacientům a nezasahuje nepřiměřeně do práv jiných pacientů, 3. probíhá v souladu s vnitřním řádem poskytovatele.
  • Poskytovatel může právo na přítomnost doprovodu dítěte ze zákona omezit například v případech, kdy doprovod projevuje známky infekčního onemocnění či intoxikace nebo pokud se projevuje agresivně nebo násilně. Takto omezit lze však pouze přítomnost osoby, na kterou se takové omezení vztahuje, a pouze po dobu, po kterou vykazuje zmíněné projevy.
  • Dále platí, že přítomnost osob () má být () vyloučena v případě podezření, že je dítě danou osobou zneužíváno nebo týráno, popřípadě že je touto osobou ohrožován jeho zdravý vývoj.
  • Dítě s odpovídající volní a rozumovou vyspělostí může také projevit vůli, aby konkrétní zákonný zástupce či osoba blízká naopak u něj přítomni nebyli, a to buď zcela, nebo například po určitý čas. V takovém případě je nutné toto přání respektovat.
  • V zájmu transparentnosti je žádoucí, aby jakékoli omezení či vyloučení přítomnosti osob () u dítěte při poskytování zdravotních služeb bylo poskytovatelem vždy řádně zdokumentováno a odůvodněno
  • Poskytovatel může požadovat úhradu prokazatelně vynaložených nákladů (); tyto mohou zahrnovat například náklady na proškolení zdravotnického personálu, instruktáž doprovodu dítěte, popřípadě náklady na zajištění dohledu nad nimi; v odůvodněných případech může poskytovatel požadovat úhradu nákladů na osobní ochranné prostředky, pokud tyto přesahují rámec běžných provozních výdajů zdravotnického zařízení. Poskytovatel ovšem nemůže úhradou těchto nákladů podmínit vlastní výkon práva na přítomnost doprovodu dítěte při poskytování zdravotních služeb. Úhrada prokazatelně vynaložených nákladů () musí být přitom stanovena jednoznačně a transparentně a nesmí zahrnovat služby, které jsou nabízeny účelově pouze s cílem vybírání poplatku nebo vytvoření překážky výkonu tohoto práva, nebo skryté platby, které zastírají svůj pravý účel.
  • Jestliže žádný ze zákonných zástupců (případně osob blízkých) po delší dobu nejeví zájem o doprovázení dítěte při poskytování zdravotních služeb, poskytovatel by () měl by o této skutečnosti bez zbytečného odkladu informovat orgán sociálně-právní ochrany dětí, pro který je tato informace impulsem k řešení situace dítěte.
  • Přítomnost otce by měla být (nejpozději) bezprostředně po narození dítěte umožněna u vaginálního porodu, u plánovaného císařského řezu a dle možností i při akutním císařském řezu. 
  • Přítomnost doprovodu dítěte při poskytování psychiatrické péče je a priori přípustná. () V rozporu s právem na přítomnost doprovodu není, pokud ošetřující lékař vymezí v rámci individuálního léčebného plánu aktivity, u kterých není účast zákonného zástupce vhodná z terapeutického hlediska (např. účast na komunitě, pokud se zákonným zástupcem není pracováno jako s jejím členem).
  • Obecně je žádoucí umožnit přítomnost doprovodu dítěte i v průběhu jeho transportu (do zdravotnického zařízení, pozn. red.). Přítomnost doprovodu dítěte však může být v některých případech během transportu z prostorových nebo technických důvodů omezena. () V případě transportu dítěte tedy o možnosti transportu doprovázející osoby rozhoduje osoba zodpovědná za bezpečnost a dodržení všech příslušných předpisů.

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 »