Proč nemáme levná česká jablka? Cenu ovlivňují faktory, které si málokdo uvědomuje

15. 10. 2021

Sdílet

Autor: Nina Havlová
Velký český pěstitel Bohemia Apple dodává jablka zejména do řetězců. Pro Vitalia.cz vysvětluje, jak to ovlivňuje cenu tohoto ovoce v obchodech. Připomeneme si také nejoblíbenější odrůdy jablek a jejich optimální využití.

V ČR se letos očekává oproti loňskému roku zhruba o sedm procent vyšší úroda jablek v produkčních sadech. A díky poměrně příznivému počasí by měla být jablka oproti loňsku také o něco větší i kvalitnější. Výkupní cena jablek od pěstitelů proto meziročně mírně poklesla, pěstitelům ale naproti tomu výrazně vzrostly náklady.

Co se dozvíte v článku
  1. Pěstitel jablek dodává do maloobchodních sítí
  2. I požadavky řetězců ovlivňují ceny jablek
  3. Proč nemáme levnější česká jablka?
  4. Odrůdy jablek pro různé příležitosti využití

Pěstitel jablek dodává do maloobchodních sítí

S rostoucími náklady se potýkají zejména průmysloví producenti jablek, například společnost Bohemia Apple z Tuchorazi. Podle výkonného ředitele společnosti Štěpána Cháry se zvýšily ceny energie, pohonných hmot či obalových materiálů zhruba o 30 procent a v některých případech až o 47 procent. To však představuje pouze část nákladů na produkci jablek.

Bohemia Apple pěstuje jablka na celkem 216 hektarech, letošní produkce by měla dosáhnout asi 14 000 tun, přičemž na tuzemský trh by měla uvedená společnost dodávat jablka po celý kalendářní rok. S jablky z Bohemia Apple se mohou spotřebitelé setkat prakticky jen ve velkých maloobchodních sítích, v letošní nabídce je přitom celkem osm odrůd jablek, včetně nově pěstované odrůdy Braeburn.

Právě s dodávkami do řetězců jsou ale spojeny náklady, o nichž většina spotřebitelské veřejnosti (ale bohužel ani nákupčí řetězců) téměř nic netuší.

I požadavky řetězců ovlivňují ceny jablek

Každý řetězec má totiž své vlastní požadavky na barvu nebo velikost jablek, vlastní etikety, odlišné přepravky i barvy proložek mezi plody. To klade značné nároky na třídění jablek, ale také na jejich identifikaci, dopravu a dodržení obchodníky požadované kvality.

Rozdíl v ceně různobarevných proložek přitom činí téměř 100 procent (od 2,30 koruny do 3,90 koruny), do nákladů je třeba započítat odlišné etikety, cenu krabic fólií (kolem 15 až 17 korun za kus), a samozřejmě investice do technologií (třídící linky, haly s udržovanou teplotou, jedinečný software na označování jablek, u nichž je dohledatelný nejen výrobce, ale i datum sklizně, řádek v sadu, z něhož byla jablka sklizena, a dokonce i jednotliví česáči).

Cena jednoho kusu speciálních přepravek s unikátním čárovým kódem pak činí 3500 korun, další náklady představují sítě nad stromy jako forma ochrana vůči krupobití.

Proč nemáme levnější česká jablka?

Vše výše uvedené v praxi znamená, že jablka takto produkovaná a ošetřená mají svou cenu a jablko, byť jde o nejkonzumovanější ovoce v ČR, by nemělo být a v budoucnosti také nebude symbolem nejlevnějšího ovoce. V zahraničí, například v Itálii, se ostatně podle pěstitelů výkupní cena kilogramu jablek pohybuje kolem 2,50 eur, tedy přes 60 korun, v ČR lze přitom jablka nakoupit zhruba za 15 korun, a někdy i levněji (opět mluvíme o výkupních cenách, nikoli konečné ceně pro zákazníky).

Tak či tak je vhodné dodat, že cena jablek by mohla být i nižší, pokud by podmínky pro jejich produkci, ale i často laické požadavky nákupčích řetězců (například na minimální procentuální podíl té které barvy nebo specifické kódy a samolepky), a nakonec i preference části spotřebitelů, kteří vyžadují jednobarevná a stejně velká jablka, nesměřovaly k unifikaci nakupovaných i prodávaných jablek. Tomu lze mimo jiné čelit osvětou nákupčích i spotřebitelů, o což se ostatně v Bohemia Apple také snaží.

To se ostatně týká i ošetřování plodů. V praxi totiž není zas tak rozhodující, kolik postřiků se na ovocné stromy aplikuje, ale především výsledky monitoringu látek, které sklizené plody obsahují. Obecně lze přitom konstatovat, že spotřebitelé v ČR by se „ovocnářské chemie“ bát neměli – podle legislativy se v plodech kontroluje pět potenciálně rizikových látek, které se v podmínkách ČR pohybují hluboko pod stanovenými limity a v řadě vzorků nejsou ani detekovatelné. Konkrétně v případě Bohemia Apple jsou navíc na přísné požadavky na kvalitu a složení jablek již řadu let zvyklí, neboť dodávali suroviny nadnárodní společnosti Nestlé pro dětskou výživu.

Odrůdy jablek pro různé příležitosti využití

Jak již bylo řečeno, společnost Bohemia Apple dodává na trh celkem osm odrůd jablek, z nichž každá má svá specifika a odlišné optimální použití. I pro zákazníka je výhodou tyto odlišnosti znát a při nákupu jablek, pokud je dostatečně široká nabídka, se jimi řídit. Základní charakteristiku oblíbených odrůd jablek přitom zveřejnil server Vitalia.cz už v minulosti, není ale na škodu si ty hlavní opětovně zopakovat:

Golden delicious

Základní barva je zelenožlutá, později zlatožlutá, někdy s narůžovělým až slabě oranžovým líčkem. Chuť je navinule sladká, příjemně aromatická, při dobrém vyzrání plodů výborná. Velice dobrá na pečení ovocných buchet. Můžou sloužit i jako náplně do koláčů. Jejich červenou mutací vznikla jablka vhodná do ovocných salátů.

Jonagored

Slupka hladká, slabě mastná, žlutozelené zbarvení je překryto červenou barvou. Jablka Jonagold mají měkčí, přesto ale křupavou a šťavnatou dužinu. Chuť plodu je aromatická, nasládlá, jemně kyselá s vyváženým poměrem cukrů a kyselin. Nejlépe můžeme jablka této odrůdy využít na pečení štrúdlů, výroby přesnídávek, odšťavnění, případně jiné pečení.

Red delicious

Barva plodu je tmavě červená s typickými, výraznými hrbolky v oblasti kalichu, který se nachází naproti stopce. Existuje mnoho barevných mutací této odrůdy, jako například Red Cup nebo Jeromine. Dužina plodu je pevná, šťavnatá, křupavá a sladká, někdy i trochu kyselá. Tato odrůda se hodí zejména do salátů a studené kuchyně. Před jídlem se doporučuje loupat ovoce ze slupky, je příliš hustá a houževnatá.

Braeburn

Pravděpodobně náhodný kříženec vznikl ve volné přírodě na Novém Zélandu křížením odrůd Lady Hamilton a Coxova reneta. Zelená slupka plodu je překryta tmavě oranžovou krycí barvou. Plody jsou mimořádně odolné proti otlačení, což je dělá velmi dobře skladovatelnými. Jablka Braeburn mají navinule sladkou a středně šťavnatou dužinu pevné konzistence a krémové barvy. Tato odrůda se skvěle hodí na pečení. Braeburn jablka jsou odolná vůči mrazům a jiným chorobám.

Granny Smith

Odrůda si velmi rychle získala světový význam. Plody jsou sytě zelené barvy, se slabým voskovým povlakem. Dužina je pevná, bílé barvy a středně šťavnatá. Chuť plodu je kyselá, osvěžující a s typickým aroma po trávě. Granny Smith se hodí zejména do salátů a studené kuchyně. Díky kyselosti jsou plody vhodné i na pečení, nejlépe do štrúdlu.

Idared

Plody jsou intenzivní červené barvy. Slupka hladká, slabě mastná, žlutozelené zbarvení je překryté červenou barvou ve formě líčka. Jablka jsou velmi dobře skladovatelná ve skladech s řízenou atmosférou, ale i v chladírnách. Dužina jablka je jemná, středně šťavnatá, bílá, sladce navinulá a aromatická. Idared je ideální na dlouhodobá uskladnění a přímou konzumaci.

Gala

Gala se pěstuje od roku 1960 a dnes patří z globálního hlediska k nejvíce vysazovaným odrůdám. Plody červené barvy jsou středně velké. Existuje mnoho barevných mutací odrůdy Gala. Mezi nejznámější patří Royal, Gala Must, Schniga, Backet, Royal Baut a Brookfild. Dužina plodu je křupavá, aromatická, sladká a šťavnatá. Gala je vhodná na odšťavnění či pečení. Zároveň se skvěle hodí i na sušení.

Bohemia

Plody jsou velké, kulovité a mimořádně kvalitní. Slupka je zbarvena tmavě červenou barvou. Dužina je nasládlá a chruplavá.

Autor článku

Agrární analytik, novinář na volné noze se zaměřením na zemědělství, potravinářství a životní prostředí.

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