Potraviny potřebným. Auta s chlazením umožní darovat i čerstvé potraviny

9. 3. 2022

Sdílet

Autor: Depositphotos
Stále roste počet lidí, kteří se musí spolehnout na potravinovou pomoc. Tuto situaci potvrzují i potravinové banky, které pomáhají už více než 200 000 potřebným. Nově díky daru od řetězce Albert získaly sedm moderních dodávek, které budou svážet neprodané jídlo z obchodů. Důležité je, že auta jsou vybavena chlazením, proto se k lidem v nouzi dostane více čerstvých, a tím i zdravějších potravin než dosud.

Potravinové banky distribuují tuny pomoci

Co se dozvíte v článku
  1. Potravinové banky distribuují tuny pomoci
  2. Potravinové banky v ČR
  3. Co se neprodá, je třeba darovat včas a v dobrém stavu
  4. K darování se hodí jen některý sortiment
  5. Díky chladicím vozům bude možné darovat i čerstvé potraviny
  6. Albert a potravinová pomoc
  7. Počet klientů potravinových bank roste

Potravinové banky, v České republice soustředěné pod Českou federaci potravinových bank, se dlouhodobě věnují pomoci potřebným. V poslední době jejich činnost stále více nabývá na významu. V době nejsilnějších dopadů covidové epidemie pomáhaly s distribucí potravin, ale i ochranných pomůcek.

„Rok 2021 byl pokračováním náročného období, a to nejen v souvislosti s pandemií. Hned na začátku roku jsme intenzivně pomáhali s distribucí potravin, které nemohly zamířit do zavřených škol. Těch se povedlo zachránit několik stovek tun. Následně jsme se postarali o distribuci ochranných pomůcek lidem v nouzi. Rozvezli jsme do celé republiky přes 7 milionů roušek a 3 miliony respirátorů,“ uvádí Veronika Láchová, ředitelka České federace potravinových bank.

Potravinové banky v ČR

  • V ČR funguje 15 potravinových bank a centrální logistické centrum.
  • Potřeba potravinové pomoci v ČR za r. 2021 stoupla o více než 30 %.
  • Potravinové banky dodávají potraviny do 1175 organizací, které je pak předávají lidem v nouzi.
  • Mezi odběratele potravinové pomoci přibylo v roce 2021 hodně měst a obcí.
  • Hodnota potravin, které banky shromáždily, je přes 425 milionů Kč.
  • Česká federace potravinových bank získala ocenění Neziskovka roku 2021 v kategorii Střední neziskovka.

Potravinové banky jsou neziskové organizace a v České republice existují od roku 1992. Mezi jejich stálé podporovatele patří ministerstvo zemědělství (loni se připojilo i ministerstvo životního prostředí), ale také některé obchodní řetězce, jejichž partnerství je pro zajištění chodu potravinových bank nezbytné. Největším firemním dárcem se za loňský rok stal Albert, který dodal 1900 tun pomoci, což představuje 3,8 milionu porcí jídla. O jaké potraviny se jedná a jak celý proces probíhá?

Co se neprodá, je třeba darovat včas a v dobrém stavu

Pomoc maloobchodních řetězců spočívá v darování zejména neprodaných potravin. Kromě podpory potřebným se tak předchází plýtvání jídlem. Nastavit celý proces efektivně ale není jednoduché. Všechny zapojené složky přitom musí myslet zejména na bezpečnost darovaných potravin a dodržování pravidel, které zajišťují, že se k lidem dostanou produkty v nezávadném stavu.

Situace se liší podle jednotlivých prodejen, záleží tu na více parametrech. Například na velikosti a sortimentu obchodu; jiné přebytky mohou vzniknout tam, kde lidé dělají velké týdenní nákupy, oproti menším prodejnám. Je potřeba reagovat individuálně, potravinové banky si zboží svážejí někde jednou týdně, jinde téměř denně, třeba pětkrát do týdne.

Dosud se jednalo zejména o trvanlivé potraviny, ale zde již mnohde dosáhli maxima možného. „V segmentu suchých potravin už nemáme rezervu, darujeme, co se dá,“ říká Jiří Mareček, ředitel komunikace obchodů Albert.

U čerstvých potravin je darování podstatně složitější. Řetězce samozřejmě nabízejí zboží k prodeji, co nejdéle je to možné. „Pak se musíme postarat o to, aby potravina šla do potravinové banky ještě ve vyhovující kvalitě a bylo stále možné ji bez problému konzumovat,“ popisuje mluvčí.

K darování se hodí jen některý sortiment

Maloobchodní řetězec má detailně stanovený postup, jak a které potraviny připravit k darování, kterého se prodejny drží. Je přesně určeno, které potraviny a kdy se k tomuto účelu vybírají a jakou formou se darují. Například ovoce a zelenina se vybírá podle momentálního stavu, vždy však musí jít o zboží vhodné ke spotřebě. Plody mohou mít jen drobné vady, může jít třeba o seschlost nebo třeba zlomenou mrkev a podobně.

Většinou se jedná o pravidelné odběry, v případě potřeby se obchodníci domlouvají s potravinovými bankami na mimořádném svozu. Důležitá je i zpětná vazba, řetězce se zajímají o to, zda potraviny byly v pořádku a v adekvátním množství. Může se totiž také stát, že bankám určitý sortiment schází, nebo naopak darovaný počet převyšuje poptávku, a potraviny by přicházely vniveč.

Velký potenciál v darování je podle Jiřího Marečka například v pečivu. Tento sortiment rychle podléhá zkáze. „Nyní, co neprodáme, vozíme například do farem, kde přebytky zkrmí zvířata. Ale samozřejmě naše primární cíle jsou nastaveny na darování lidem, je to dobré jídlo a mělo by sloužit pro lidskou spotřebu. U pečiva je to obtížné, i ke konci otevírací doby musíte mít na krámě lepší než základní nabídku. Zákazník ji očekává, i když přijde deset minut před zavírací dobou. Nevyhneme se tedy určitým zbytkům.“ Podobné je to prý u ovoce a zeleniny. Také rychle podléhá zkáze, ale když se dobře vytřídí, je ještě mnoho, co lze darovat. A je to něco, co nutričně lidem v nouzi chybí. Čerstvé potraviny jsou zdravé potraviny. Jíst rýži a těstoviny je možné, ale nemělo by to být všechno,“ říká mluvčí Alberta.

Díky chladicím vozům bude možné darovat i čerstvé potraviny

Prostor tedy nyní obchodníci vidí hlavně v čerstvých potravinách, které hrají v našich jídelníčcích velmi důležitou roli. „Jejich darování je ale náročnější z hlediska logistického řetězce, tedy skladování a chlazení i během přepravy. Proto Albert potravinovým bankám věnuje dodávky s chladicí vestavbou,“ komentuje Jiří Mareček dar speciálně upravených aut.

Galerie: Potraviny ze supermarketů do potravinových bank

„Tímto způsobem chceme také pomoci lidem v nouzi jíst o něco zdravěji,“ dodává mluvčí. V tomto směru je důležitá i osvěta, protože zkušenosti ukazují, že tito lidé často neumí s potravinami nakládat a připravit si kvalitní, a přitom cenově dostupné jídlo. V tom jim pomáhá například i nadační fond Albert a projekt Zdravá 5, který učí nakupovat a vařit lidi v nouzi.

Dodávky, které před pár dny Albert předal zástupcům potravinových bank, mají chladicí vestavbu a izolované stěny, a je tedy možné dodržet teplotní řetězec daných potravin. „Tato auta nám významně pomohou s distribucí svozů,“ říká Veronika Láchová z České federace potravinových bank. Albert tak dosud věnoval celkem již deset takových vozů, což při slavnostním předávání velmi ocenili zástupci jednotlivých regionálních potravinových bank. Doposud nebyly podobně vybavené dodávky standardem, například v Brně měli zatím k dispozici jen jedno malé auto s chlazením. Každý z vozů uveze čtyři palety čerstvých potravin. „Významné je vybavení aut chladicími jednotkami. Díky tomu se může hodně navýšit darování čerstvých potravin. Umožňuje to svážet mnohem více ovoce, zeleniny, mléčných výrobků a dalších potravin, které mají velmi krátkou životnost, ale současně mohou lidem velmi pomoci,“ popisuje Veronika Láchová.

Albert tímto krokem navazuje na dar tří dodávek v loňském a předloňském roce, které pomáhají v Praze a Středočeském kraji, Jihočeském a Pardubickém kraji. Letos darované dodávky směřují do pražské a středočeské, jihomoravské, ostravské, karlovarské, ústecké a zlínské potravinové banky a potravinové banky Central.

Albert a potravinová pomoc

Počet klientů potravinových bank roste

Důležitost činnosti potravinových bank se ukázala během covidové epidemie a rovněž v poslední době. Vzhledem ke zdražování potravin roste počet klientů, kteří u nich hledají pomoc se zajištěním jídla.

Během posledních dnů se pak banky intenzivně zapojily do podpory pro ukrajinské uprchlíky. „Všech 15 potravinových bank pomáhá regionálním krizovým štábům a snaží se zajistit základní potraviny a drogerii,“ uvedla Veronika Láchová.

Pro pomoc všem potřebným lidem by federace do budoucna chtěla získat ještě velké nákladní auto: „Banky mají centrální logistické centrum, kde máme velké chladicí i mrazicí prostory, ale je problém následně dostat velké objemy těchto potravin do regionů. Zatím řešíme podobnou přepravu dodavatelsky, což je logisticky náročné a drahé. Budeme se tedy snažit získat také nákladní auto, které pojme 15 až 20 palet, pro přepravu chlazených potravin v rámci ČR,“ uzavírá ředitelka České federace potravinových bank.

Chcete mít každé ráno v mailu přehled aktuálních článků z Vitalia.cz? Objednejte si náš mailový servis a žádná důležitá informace vám neuteče. Objednat si lze i týdenní přehled nebo také newsletter To hlavní, páteční souhrn nejdůležitějších článků ze všech našich serverů. Newslettery si můžete objednat na této stránce.

Autor článku

Redaktorka, editorka, dlouholetá šéfredaktorka serveru Vitalia.cz (do června 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 »