Jak žít, když už běžné brýle nestačí

30. 10. 2018

Sdílet

Autor: Archív Hany Petrové
Hana Petrová testuje pomůcky pro zrakově postižené a pomáhá ostatním. Sama ví, jak je vhodná kompenzace zraku důležitá a jak dokáže zlepšit život.

„Když brýle nestačí, je to zlé. Nemůžete si přečíst nápisy, nerozeznáte člověka na dva metry,“ říká pracovnice v sociálních službách Hana Petrová, která má sama vážné potíže se zrakem. Možná právě proto si vybrala jako své životní poslání pomáhat nevidomým a slabozrakým. Jako jedna z prvních osob v České republice si mohla vyzkoušet i novinku na trhu OrCam MyEye – kompenzační pomůcku pro nevidomé.

Zhruba do deseti let byla „normální“ zdravá holka. Od páté třídy chodila na sportovní školu a hrála závodně volejbal. Milovala lyžování, malování, jízdu na kole a čtení knížek… Z ničeho nic se jí ale začal zrak postupně zhoršovat.

Jak se u vás začala projevovat oční vada?

Zaregistrovala jsem to právě při hraní volejbalu. Najednou jsem nebyla schopná odhadnout vzdálenost míče. S volejbalem jsem v sedmé třídě musela přestat úplně a viděla jsem natolik špatně, že jsem nebyla schopná číst text z tabule a učebnic. Oční lékařka si se mnou nevěděla rady, dokonce mě chtěla poslat na psychiatrii, protože neshledala žádnou oční vadu. Moje maminka se s tím ale nespokojila. Náhodou našla mezi letáky v čekárně kontakt na základní školu pro děti s vadami zraku v Opavě. Pak už šlo vše velmi rychle – návštěva specialisty, diagnostikování poškození sítnice z důvodu genetické dispozice s ne příliš dobrou prognózou do budoucna.

Vzhledem k tomu, že začátkem devadesátých let postižené děti mezi ty zdravé „nepatřily“, i já jsem do osmé třídy už nastoupila do speciální školy v Opavě. Docela se mi ulevilo, protože dosavadní učitelé, kromě mé třídní učitelky paní Lapčíkové, nebyli na mou přítomnost ve třídě připraveni. Zápisy z tabule mi diktovala spolužačka, a když byla nemocná, musela jsem si půjčovat sešity a vše doplňovat doma. Vadilo, že píšu černým fixem místo propiskou. Vadilo, že nejsem schopná plynule číst. V tělocviku jsem seděla hodiny na lavičce, protože jsme hráli míčové hry. Cítila jsem se i sociálně vyčleněná z kolektivu.

Jak se vám za těchto podmínek podařilo vystudovat?

Nakonec jsem vystudovala obchodní akademii, speciální třídu pro děti s vadami zraku v Opavě, která mi byla doporučena odborníky pro vzdělávání postižených dětí. Vzhledem k tomu, jak špatně jsem viděla a jaké kompenzační pomůcky byly v té době k dispozici, nemůžu tento výběr stále pochopit. Nicméně školu jsem úspěšně ukončila maturitní zkouškou a plynule přešla do invalidního důchodu. Chtěla jsem sice studovat vysokou školu, ale protože jsem nechtěla studovat dále ekonomiku, ale spíše speciální pedagogiku nebo psychologii, neměla jsem potřebné znalosti pro složení přijímacích zkoušek z biologie. Navíc se mi v té době výrazněji zhoršil zrak a měla jsem strach, že studiem si oči zatížím natolik, až zrak ztratím úplně.

Absolvovala jsem tedy rekvalifikační kurz na keramičku ve středisku Dědina, kde se rekvalifikují nevidomí na vhodné profese, a několik let jsem provozovala keramickou dílnu. Vdala jsem se, mám dva syny a po mateřské jsem se již ke keramice nevrátila, ale našla si práci v SONS, kde pracuji více než dva roky. Nejdříve jsem pracovala jako dobrovolník a od ledna 2017 jsem na pozici pracovníka v sociálních službách.

O jakou organizaci se přesně jedná?

Sjednocená organizace nevidomých a slabozrakých České republiky pomáhá osobám se závažnějšími poruchami zraku. Jde o lidi, kterým již brýle nestačí a zhoršené vidění jim působí obtíže v běžných životních situacích. Tito lidé přicházejí do poboček po celé republice a dozvídají se, jaké jsou možnosti kompenzace jejich zraku, na jaké příspěvky a pomoc od státu mají nárok. Využít mohou sociálně-právní poradnu, půjčovnu kompenzačních pomůcek a další sociální služby. Lze se také zapojit do různých aktivit, jež jsou pro ně připravovány, a vymanit se tak ze sociální izolace, kterou zrakové postižení přináší. Mohou si najít nové přátele a s nimi sdílet radosti a strasti života. Organizace SONS spolupracuje s Tyfloservisem a Tyflocentrem, které pomáhají lidem zapojit se znova plně do života, učí je sebeobsluze, prostorové orientaci s bílou holí nebo vodicím psem, Braillovo písmo, práci s počítačem, mobilem a podobně.

SONS také hájí zájmy nevidomých jako celku, například v odstraňování bariér nejen fyzických, ale též informačních. Dále provozuje středisko výcviku vodicích psů a knihovnu pro nevidomé, která převádí knihy do digitální podoby.

Jak zvládáte každodenní realitu?

Můj život vypadá dnes jinak, než jak jsem si jej představovala, dokud jsem dobře viděla. Kvůli omezení spoustu věcí dělat nemůžu, anebo je musím dělat jinak oproti ostatním. Naštěstí nejsem z těch, kteří pláčou nad svým osudem, a ve svém životě se snažím hrát s rozdanými kartami nejlíp, jak to jde. Nehledám důvod, proč něco nejde, ale hledám způsob, jak by to mohlo jít. Můj život je úplně obyčejný, práce, rodina, koníčky, radosti i starosti.

Vzhledem k tomu, že až devadesát procent informací vnímáme zrakem, je vážné poškození zraku velmi omezující. Zkuste si během deset minut svého aktivního života uvědomit, jaké informace vám poskytuje zrak. Zkuste si představit, že nepřečtete téměř žádný text, názvy zboží v obchodě, natož složení, cenu, tabulky na dveřích s otevírací dobou, nápisy na autobusech, vlacích. Nepoznáte člověka na dva metry… Navzdory tomu ti, kdo mě znají, vědí, že funguji úplně normálně a své postižení víceméně ignoruji.

Galerie: Jak vidí lidé s očními vadami

Jak vnímáte možnosti, které se dnes zrakově postiženým nabízejí? Jaké vlastně existují pomůcky?

Díky velkému rozmachu techniky se možnosti kompenzace zraku neustále rozšiřují. Na trhu je dnes velké množství pomůcek. Ať už hmatových, zvětšovacích, tak s hlasovým výstupem. Jde o pomůcky do domácnosti, které pomohou při vaření, pečení, úklidu a běžné samoobsluze (hladinka, která hlídá hladinu nalévané tekutiny, mluvící váhy, metry, speciální odměrky, teploměry, tlakoměry s hlasovým výstupem, komunikační pomůcky – mobilní telefony tlačítkové i dotykové, přizpůsobené pro nevidomé), dále pomůcky pro navigaci – aplikace do mobilu, vysílač, jímž lze identifikovat číslo a směr MHD nebo ozvučit jisté navigační body ve městech, počítače se speciálním softwarem, který buď zvětšuje, nebo odečítá obsah obrazovky, různé zvětšovací lupy, jak klasické optické, tak kamerové kapesní nebo stolní, speciální čtečky, které nevidomým předčítají tištěný text, a třeba i pomůcky pro sport – tandemová kola, zvuková střelba a další.

Mám z toho radost, protože jsem zažila dobu, kdy pomůcky téměř nebyly, a vidím ten obrovský posun kupředu.

Jakým způsobem jsou tyto pomůcky financovány a kdo na ně má nárok?

Vše je hodně o financích, částečně pomáhá stát, z velké části různé dobročinné nadace a organizace. Například nadační fond Světluška. Některé pomůcky proplácí pojišťovna (bílá hůl, hladinka, optické lupy a další), jiné si musí lidé zakoupit sami a na některé mohou požádat o příspěvek stát. Ten pak posoudí zdravotní stav žadatele, zařadí jej do příslušné kategorie mezi těžce slabozraké, prakticky nevidomé, nebo úplně nevidomé, a dle toho pak má nárok na příspěvek na určitou pomůcku. Příspěvek činí až devadesát procent z ceny pomůcky. Ceny pomůcek jsou dost vysoké. Jde o speciální zboží s omezeným počtem spotřebitelů, jejich vývoj je náročný a ceny tomu odpovídají. U počítačů, čteček nebo i tandemového kola jde o desetitisíce za jednu pomůcku.

Takže když člověk potřebuje počítač, čtečku, vodicího psa a mobilní telefon, dostává se na nějakých čtyři sta tisíc korun. Je to drahé, ale tyto výdaje státu mají obrovský význam pro zlepšení kvality života lidí s postižením. Umožní jim to žít důstojněji, znovu pracovat a být méně závislí na pomoci druhých. Ze zákona má každý nárok na osm set tisíc korun za šest let. Po pěti letech má nárok požádat znovu o stejnou pomůcku – třeba počítač, musí však prokázat, že jeho pomůcka již není funkční a není možné ji opravit. Speciálně u počítačů nebo u mobilních telefonů je většina softwaru velmi zastaralá a je vhodné pořídit pomůcku novou. Žádost je na úřadě vždy nutné zdůvodnit, tedy uvést, jak bude pomůcka využívána, zda ji žadatel umí používat, případně zda absolvuje speciální školení a podobně.

V médiích se začíná objevovat nová kompenzační pomůcka OrCam MyEye, kterou jste dostala na testování. Jak se vám s ní fungovalo oproti běžné realitě, na kterou jste zvyklá?

Již čtyři měsíce je v České republice k dispozici unikátní pomůcka OrCam MyEye, kterou vyvinula izraelská společnost. Jde o miniaturní kamerku umístěnou na obroučkách brýlí, která čte texty z různých předloh v reálném čase přímo do ucha. Zvládne nejen knihy, časopisy, dokumenty, letáky, ale také různé cedule, tabule na dveřích i na domech, nástěnky, názvy ulic, čísla domů a zvonky. Pro mě představuje možnost číst si běžné knihy, které by dříve byly nedostupné. Ne všechny (zvlášť ne novinky nebo odborná literatura) jsou dostupné v digitální podobě a na skenování a následnou korekturu celých knih jsem nikdy neměla dost času. OrCam mi velmi zjednodušil život. Už vím, co píší na dveřích družiny, když jdu vyzvednout syna, jednoduše se zorientuji na úřadě, na poliklinice nebo v nemocnici. Dnes už najdu potřebný zvonek, přečtu si upozornění na dovolenou a informaci o zástupu u lékaře, jídelníček ve školce, nástěnku s akcemi školy a podobně.

Zjistila jsem, kolik obchodů, kanceláří a organizací mám ve svém okolí, o kterých jsem ani netušila, protože jsem si nemohla přečíst informační tabule. Mezi další funkce patří rozeznávání čárových kódů, což výrazně pomůže při nakupování, stejně jako rozeznávání bankovek. OrCam také umožňuje nevidomým poznat barvy a má i funkci rozeznávání obličejů.

Kolik tato záležitost stojí a nakolik je u nás dostupná?

Jde o naprostou novinku, která vzbudila velký zájem v řadách zrakově postižených. Stát momentálně řeší její začlenění do příslušné kategorie a testuje cílovou skupinu zrakově postižených, pro kterou by pomůcka byla nejvhodnější. Vláda se však také snaží omezovat příspěvky na pomůcky postižených, proto aktuálně není možné požádat si o dotace na OrCam MyEye.

Je to smutné, protože postižení zraku je velmi omezující, a zároveň na druhou stranu velmi dobře kompenzovatelné. Nevidomí dnes úspěšně studují a pracují v různých oborech. Právě díky kompenzačním pomůckám jsou schopni obstát v konkurenci zdravých. Jsou zvyklí překonávat překážky, pracovat o to usilovněji, o co horší podmínky mají. Jsou loajální zaměstnanci vděční za jakoukoli šanci, ale i schopní živnostníci v různých oborech podnikání.

Cena tohoto zařízení je 134 550 korun. Ovšem málokdo si to může dovolit. Dotace by velmi pomohly. V současné době má OrCam u nás asi šest osob. Organizace SONS se momentálně chystá poskytnout recenze na základě testování přístroje ministerstvu práce a sociálních věcí. Poté by mělo dojít ke konečnému rozhodnutí a případnému schválení dotací, čemuž se stát prozatím brání.

Hana Petrová

Vystudovala speciální třídu pro děti s vadami zraku na Obchodní akademii v Opavě a od roku 2017 pracuje pro organizaci SONS v Novém Jičíně na pozici pracovnice v sociálních službách. Sjednocená organizace nevidomých a slabozrakých České republiky pomáhá osobám se závažnějšími poruchami zraku.

Autor článku

Externí redaktorka a copywriterka píšící pro webové i tištěné magazíny. Zaměřuje se na oblast zdraví, historie medicíny, psychologie, filozofie, etikoterapie a alternativní medicíny.

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