Semix, výrobce potravin, který přírodě vrací víc, než si bere

Sdílet

Autor: Semix
Společnost, která jednak zásobuje pekaře i cukráře, ale přináší do obchodů také řadu vlastních zdravých produktů. Nově například klíčené luštěniny a obiloviny. A také firma, která velmi dbá na kvalitu svých produktů a péči o přírodu.

Přestože před čtvrt stoletím začínali s pekárenskými směsmi, dnes je jejich portfolium výrazně širší. Sypou jednu novinku za druhou, i proto, že mají nový závod na klíčené obiloviny a luštěniny, také více inklinují k přírodě, o níž se s výjimečnou péčí starají, a rovněž sázejí na bio. Vnímají ho totiž jako nejlepší cestu pro zdravý život.

O tom, jak a proč vznikla moravskoslezská firma Semix a čemu se aktuálně věnuje, jsme si povídali s jedním z jejích majitelů i zakladatelů Kamilem Lisalem.

Před lety našli cestu, po níž nikdo nekráčel

V roce 1995 vytušil Kamil Lisal spolu se svými dvěma kamarády mezeru na trhu, a to v pekařské a cukrářské výrobě. Založili firmu Semix, pronajali si prostory na výrobu, koupili starou míchačku a začali s výrobou pekařských a cukrářských směsí. To se posléze ukázalo jako dobrý směr, neboť s výrobou těchto produktů pokračují úspěšně až do současnosti.

„V počátcích, kdy jsme neměli finance na zaměstnance, jsme prakticky veškeré činnosti ve firmě vykonávali sami, od ekonomické oblasti přes míchání a balení směsí, distribuci až po samotný prodej. Dnes už s úsměvem vzpomínáme, jak jsme Škodou 120 rozváželi pytle směsí a nabízeli je pekařům po celé republice,“ vrací se k začátkům podnikání Kamil Lisal.

Nejúspěšnějším prodejním aktiklem byla svého času směs na klasickou třenou bábovku. „V počátcích se také hodně prodávaly směsi na drobné pečivo a zlepšující přípravky, aby pečivo dobře nakynulo, bylo příjemně vláčné a drželo dobře tvar,“ upřesňuje.

Časem začali v Semixu vyrábět výrobky z kynutého těsta, pudinky, instantní knedlíky a bramborové halušky. Začali zpracovávat mák – a stali se největším zpracovatelem máku v České republice. Patří jim i jedno významné prvenství, jsou autory stabilizátoru tvarohu Tvarogen. „Nikdo před námi tento produkt neznal a nepoužíval. Originální myšlenka zajistit stabilizaci pekařsky problematického tvarohu se ukázala jako hlavní tahoun rozvoje firmy. Trvalo mnoho let, než konkurence přišla s kopiemi našeho Tvarogenu,“ pyšní se originálním produktem jednatel společnosti.

Gastro zkusili a opustili, vrhli se na cereálie

V minulosti majitelé Semixu zkusili podnikat i v segmentu gastronomie, který ale po uvážení opustili. Své síly napnuli k výrobě sortimentu zdravých potravin, který je opravdu baví a vidí v něm budoucnost.

„Byl to přirozený vývoj, jelikož jsme nechtěli být závislí pouze na pekařích. Při jedné z našich cest na pekařské veletrhy v zahraničí jsme narazili na cereální lupínky, kterými jsme byli doslova uchváceni,“ vypráví Kamil Lisal. A uchvátily i zákazníky, kteří do té doby o cereálních lupíncích věděli hlavně z amerických filmů.

I dnes se v Semixu obilovinám hojně věnují. Před dvěma lety dokonce vybudovali samostatnou výrobní halu na klíčené obiloviny a luštěniny. V tomto segmentu totiž vidí obrovský potenciál, považují ho za klíčový. „Tyto produkty mají skvělé nutriční hodnoty a jsou pro zdraví velmi přínosné. U našich výrobků se snažíme obecně minimalizovat obsah cukru a hledat jeho vhodnou alternativu,“ říká jednatel.

I bio je baví čím dál víc

Zájem o biopotraviny v České republice stoupá. Tento trend podporují také v Semixu.

„Rádi bychom přispěli k tomu, aby si lidé u nás oblíbili kvalitní produkty v biokvalitě, které jsou tím nejlepším pro zachování našeho zdraví. Náš sortiment zdravých produktů si našel svou cestu již do pětatřiceti zemí světa, mezi kterými je například Arábie, Bělorusko, Izrael, Japonsko i Austrálie,“ netají se hrdostí na svou českou firmu Kamil Lisal a doplňuje:

„Slovo biopotravina je dnes často vnímáno jako něco zvláštního určeného pro specifickou skupinu zákazníků. Biopotraviny jsou však zcela normální potraviny, které k výrobě nepotřebují chemikálie a lidstvo je konzumuje během svého celého historického vývoje. My rozhodně podporujeme cestu bioprodukce, kterou vnímáme jako zdravou variantu pro každého, a to je promítáno také do naší výroby, kde jsme držiteli BIO certifikátu. Bohužel si v ČR spotřebitelné často plně neuvědomují zdravotní benefity bioprodukce, tedy potravin bez chemie.“ 

Semix

Firma začala před dvaceti šesti lety s výrobou směsí určených pro pekaře, cukráře a mlékaře. Postupem času přešli k nadčasovému sortimentu zahrnujícímu snídaňové a svačinové cereálie prodávané koncovým zákazníkům pod značkou Zdravý život, dnes nabízejí pestrý mix od kaší přes polévky a koktejly po nejrůznější výrobky ze slaného i sladkého müsli. Semix vlastní nebo má v pronájmu celkem šest přírodních, volně přístupných areálů.

Společnost byla založena třemi kamarády v pronajatých prostorech, dnes má dvě stě dvacet pět zaměstnanců a vyváží zboží do třiceti pěti států světa.

Kamil Lisal nemá radost z toho, že běžnému spotřebiteli stále často vyhovují složitě zpracované a zároveň hodně slazené výrobky a slovo „bio“ považuje někdy chybně jen za módní výstřelek. „Za nás určitě i nadále chceme jít cestou bioprodukce, jelikož chceme sami nabízet zákazníkům to, co vnímáme jako nejlepší cestu pro zdravý život. Zdravotně přínosnější je rozhodně konzumace prvotních potravin termicky ošetřených, bez dalších složitých úprav, které mají zachován žádoucí obsah živin a jsou bez éček,“ říká.

Přírodu obnovují a mají k ní úctu

S tímto přístupem souvisí i minimalizace uhlíkové stopy tím, že většinu surovin pro výrobu svých produktů obstarávají od tuzemských dodavatelů. A možná vás to překvapí, ale Semix o přírodě a úctě k ní jen planě nemluví. Již dlouhé roky se o její ochranu aktivně zajímá a podporuje ji jako málokterá firma. Péči o přírodu totiž vnímá jako závazek, kterým přírodě chce navracet její štědrost.

„Planeta není nevyčerpatelná, a pokud nebudeme jednat proaktivně v její ochraně, nezbude zde nic pro další generace. Kvalita surovin pro výrobu potravin odráží prostředí, ze kterého suroviny pocházejí. Z těchto důvodů jsme dlouhodobě aktivní v ochraně české přírody. Dovedete si představit, že společnost v budoucích desetiletích dospěje k všeobecné digitalizaci, automatizaci, robotizaci, umělé inteligenci. Samá dokonalost. Ale nebude slyšet zpět a hlasy ptáků, nebudou kvákat žáby a poletovat motýli. Tak to přece nechceme,“ říká Kamil Lisal.

Koně, motýly, mokřady…

V roce 2006 proto s kolegy začali skupovat nivní louky a společně na nich budovat chráněná území pro klidný život a rozmnožování obojživelníků, hmyzu, ptáků i obratlovců. Od konce roku 2019 se po jejich loukách dokonce prohání stádo třinácti exmoorských koní, divokého původního plemene koně domácího, kterému hrozilo vyhynutí.

„Mezi náš největší ekologický počin patří jednoznačně obnova oblasti Kozmických ptačích luk, kterou jsme postupně od roku 2006 získali do soukromého vlastnictví, abychom o ni mohli systematicky pečovat. Hlavním záměrem tohoto projektu bylo obnovit základní funkci říční krajiny, podpořit její retenční schopnosti, vytvořit nové tůně, obnovit aluviální louky a šetrné hospodářství. To vše bylo nutné načasovat tak, abychom nenarušili hnízdění ptáků a vývojový cyklus motýlů,“ líčí se zaujetím Kamil Lisal. Jak moc se jim v této aktivitě daří, si můžete prohlédnout na stránkách natura.semix.cz.

Kromě Kozmických ptačích luk je firma aktivní i v dalších šesti přírodních lokalitách, v nichž se snaží obnovit původní ráz krajiny. Jedná se o Raduňský mokřad, Kobeřické motýlí stráně, U Strejkova lomu, Mločí jezírka a Louku u kruháče. Při péči o přírodu pomáhají i zaměstnanci Semixu, kteří v těchto oblastech například sází stromky a keře. „Věřím, že i pro širokou veřejnost je návštěva těchto volně dostupných oblastí zajímavým zážitkem,“ říká Kamil Lisal s tím, že všichni jsou vítáni.

Autor článku

Redaktorka serveru Vitalia.cz se zaměřuje zejména na kvalitu potravin a kvalitu jejich prodeje. Věnuje se také zdravotní problematice.

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