Začínal s umělými květinami, teď vytváří jedny z nejkrásnějších vánočních trhů

24. 7. 2017
Doba čtení: 11 minut

Sdílet

Ilustrační obrázek
Autor: Karel Choc, Internet Info, podle licence: Rights Managed
Ilustrační obrázek
Díky píli a odvaze vybudoval z ničeho vyhledávanou firmu. Jeho práci znáte z vánočních trhů i obchodních center nejen v ČR. Zdobí i jinde v Evropě nebo Rusku.

Kdo se bojí, nesmí do lesa ani do byznysu. Své o tom ví majitel firmy S.O.S. – Dekorace. Začínal od nuly a dnes má renomé v Evropě i Asii.

Když se na začátku 90. let vrátil z povinné vojenské služby, nastoupil jako kulisák ve Státní opeře Praha. Po několikatýdenní špatné zkušenosti z divadla odešel a nechal se zaměstnat jako skladník ve firmě, která v Česku distribuovala umělé květiny. Rakouský majitel dobře platil a ambiciózní mladík se poměrně rychle vypracoval na vedoucí pozici. Už tehdy se setkal s výrobou malé vánoční dekorace, která se zanedlouho měla stát jeho profesním osudem. Po pár letech ale firma začala stagnovat. Protože Jakub cítil možnost růstu a bylo mu líto, že to majitel firmy nevnímá, dohodl se se dvěma svými kolegy na odchodu a založili vlastní konkurenční podnik.

Psal se rok 1996 a získat bankovní úvěr na rozjezd nové firmy bylo prakticky nemožné. Zakázek bylo málo a dík za to, že firma rozjezd vůbec přežila, patří svého času ostře sledované podnikatelce Libuši Barkové. Ta si nechala vyzdobit nevěstinec i svůj dům a investovala nemalé peníze. Kromě výroby dekorací si na sebe tři začínající podnikatelé vydělávali prakticky vším, čím mohli. Lakovali okna, pokládali dlažbu, sekali trávníky. Ne všechno ale uměli a ne všechny zakázky tehdy dopadly podle očekávání. Vždycky když to vypadalo, že už je konec, přišla nějaká zajímavá zakázka a zase se jelo dál. Jakuba série vzestupů a pádů neodradila a firmu chtěl za každou cenu udržet. Bohužel byl jediný. Kluci byli po dvou letech válčení unavení a už se jim podnikat nechtělo. A já je ještě nutil investovat tehdy závratných 70 000 korun do inzerátu ve Zlatých stránkách, které firma ani neměla. Nakonec jsme se dohodli na ukončení spolupráce, já odkoupil jejich podíly a šel prosit rodiče o těch 70 000. Že za ně chci pořídit velkou reklamu v telefonním seznamu, jsem si tenkrát nemohl dovolit ani vyslovit. Máma by mě zabila, popisuje nelehké začátky Jakub Olbert, zakladatel a ředitel společnosti S.O.S. – Dekorace.

Utajená investice se ale velmi rychle ukázala být skvělým tahem. Firma začala dostávat víc a víc zakázek a mohla pomalu začít růst. A spolu s tím rostla i chuť jejího majitele pouštět se do větších a větších realizací. V Praze tehdy začala vyrůstat nová nákupní centra a on se bez uzardění snažil navázat kontakty se světovými obchodními řetězci. Jel jsem takhle jednou kolem IKEA a usmyslel si, že příští vánoční výzdobu v jejich obchodním domě udělám já. Stačil telefonát a skutečně jsem dostal příležitost odprezentovat své plány. Jednání bylo nekonečně dlouhé. Já totiž neměl nic konkrétního, hodně jsem si vymýšlel a místo grafických návrhů jsem přinesl spoustu fotek z časopisů a maloval do nich fixou. Ačkoli se to zdálo nemožné, IKEA se mnou nakonec smlouvu podepsala. Manažer mi později přiznal, že už sice měl vybranou jinou firmu, ale že jsem ho svým vystupováním odzbrojil a jednoduše ukecal, vzpomíná podnikatel a dodává, že i on sám byl tehdy v šoku. A hodnotu zakázky ve výši 1,1 milionu korun nedokázal ani nahlas vyslovit.

Uzavřít takový kontrakt byla od něj drzost vlastně dvojnásobná. Na realizaci totiž neměl peníze a mohl se do ní pustit jen díky tomu, že IKEA kývla na vyplacení 40% zálohy. Za to mohla firma nakoupit materiál a nabrat brigádníky. Už ale nezbylo na jejich platy a oni se museli smířit s tím, že pro ně paní Olbertová denně vařila a oni pracovali jen za stravu a s úpisy v kapsách. Peníze dostali až později, když nábytkářská firma uhradila všechny faktury. Risk se ale vyplatil a na základě spokojenosti se vyvinula mnohaletá spolupráce. Moje podnikatelská historie je plná takových kotrmelců a infarktových momentů. Dlouho jsem se například pokoušel získat zakázku pro TESCO. Tam mi nikdy nedali šanci ani na osobní schůzku, a když konečně přišla, sedl jsem na motorku a cestou na ni z desek vytrousil připravenou prezentaci. Na místě jsem musel zase improvizovat a ono to zabralo. Díky této tragikomické nehodě jsem úplně rozboural sešněrovanou korporátní náladu a druhý den mi firma potvrdila zakázku v sedmi jejích obchodních domech v Česku a na Slovensku, líčí Jakub Olbert.

V Rusku se nepodniká snadno, ale mají nás tam rádi

Firma se postupně rozrůstala a začala dostávat i zakázky od filmových produkcí. Její hlavní potenciál ale spočíval ve výrobě vánočních dekorací. Důležitým milníkem se proto stal rok 2006, kdy firma S.O.S. – Dekorace poprvé připravila vánoční trhy na pražském Staroměstském náměstí. Právě Jakub Olbert přišel s nápadem, že se bude vánoční strom rozsvěcet na etapy za zvuku hudby a povýšil moment slavnostního rozsvěcení na velkolepou show. Rok poté byly vánoční trhy v centru Prahy vyhlášeny čtvrtými nejkrásnějšími v Evropě. Společně s tím se firma začala etablovat v západních zemích a pronikla do Německa, Rakouska, Francie, Monaka nebo Španělska. V expanzi do zahraničí nám znovu hodně pomohl risk, když jsme si hned při první účasti na mezinárodním veletrhu Christmasworld ve Frankfurtu pronajali třetí největší stánek. Vytvořili jsme velmi efektní prezentaci a na rozdíl od konkurentů ji návštěvníkům dovolili fotit. K tomu jsme na stánku vytvořili pěkný bar a pořádali večírky pro subdodavatele a některé konkurenty. Navázali jsme díky tomu spolupráci s mnoha partnery, s nimiž pracujeme dodnes, říká Jakub Olbert.

Bohužel začaly problémy s francouzskými dodavateli a firma se musela poohlédnout po jiných. Její majitel tedy sedl na letadlo do Číny a začal navazovat nové obchodní kontakty v Asii. Obrat směrem na východ nespočíval jen v nákupu materiálu od čínských dodavatelů, ale také postupném vstupu na trhy v Rusku a postsovětských zemích. Není to tam vůbec snadné. Jakožto majitel v Rusku působící firmy musím mít jejich pracovní povolení, složit zkoušku z ruštiny, ale třeba i podstoupit testy na AIDS a tak dále. Navíc musím podle zákona minimálně tři měsíce v roce v Rusku pobývat. K tomu si vezměte tamní klimatické podmínky. Leckdy instalujeme venkovní výzdobu v –30 stupních. Přesto všechno se nám tam podniká dobře. Lidi jsou tam ještě ochotní pracovat rukama a jsou obětaví, to už na západě i u nás hodně vymizelo. Navíc nás pořád považují za bratry a jsou nám naklonění, náš despekt k Rusům proto považuji za zbytečný, vysvětluje podnikatel. K tomu ale jedním dechem dodává, že dělat byznys v Rusku je pořádný adrenalin. Člověk se nesmí ani náznakem nad nikoho povyšovat, je nutné použít dostatečnou dávku diplomacie a nikomu takzvaně nešlápnout na kuří oko. A bez dohod s celníky a dalšími státními úředníky to také nejde.

Kdo se ale systému dokáže přizpůsobit, ten má dveře otevřené. Ruské velikášství se projevuje v rozpočtech, které jsou i desetkrát větší než na západě. A jednotlivá města nebo obchodní řetězce se předhánějí v tom, kdo bude mít pestřejší výzdobu. Pobočku v Petrohradu firma otevřela teprve před třemi lety a loni už měla obrat 80 milionů rublů. Právě v Rusku S.O.S. – Dekorace vytvořila například největší mašli na světě. Zahanbit se ale nenechají ani okolní země, jako jsou Kazachstán nebo Kyrgyzstán. I tyto národy v sobě mají velké národní cítění a jejich představitelé si potrpí na okázalost. Když kazašskou Astanu vyzdobíme tak, že bude svítit až na měsíc, v kyrgyzském Biškeku nebo ruských městech budou chtít ještě něco většího. Jsou to paradoxy, protože se jedná o země, kde není standard mít do každé domácnosti zavedenou vodu a tak podobně. Utrácí se tam díky nerostnému bohatství, popisuje Jakub Olbert.

Investice do dekorace má smysl

Za výzdobu a dekorace ve veřejných prostorech i nákupních centrech se ale utrácí všude na světě. A má to svůj smysl. Atraktivní a dnes už neodmyslitelně i interaktivní výzdoba zkrátka přiláká víc lidí a ti pak udělají větší útratu v obchodech. I nad výzdobou je ale potřeba uvažovat a přizpůsobit ji zákazníkům. Špatně zacílená dekorace a akce nikomu zisky nezvýší. Pro příklad nemusíme chodit daleko. Do jednoho českého nákupního centra jednou pozvali youtubery a doufali, že zájem o internetové hvězdy zvedne i tržby. Jenže to byl omyl. Youtubeři jsou pro hodně mladí lidé, kteří ještě nemají dost peněz. Je potřeba přizpůsobit akce a výzdobu nejsolventnější zákaznické skupině, znát její složení a mířit jednou na rodiny s dětmi, podruhé na klientelu vyžívající se v luxusu. Když připravujeme novou instalaci, strávíme hodně času právě nad portfoliem zákazníků. Dlouho debatujeme o tom, co by je mohlo zaujmout, vysvětluje Jakub Olbert.

Zatímco ještě před pěti lety stačilo po obchodních domech rozvěsit girlandy a postavit jeden velký vánoční strom, dnes jsou běžné požadavky na pohybové a zvukové prvky a nejrůznější wow efekty. Jak se ukázalo i v jiných oborech, hodně zabírají příběhy. Ruský obchodní řetězec Mega si například objednal nejen dekorace, ale k tomu i celý pohádkový příběh, kterým propojil všechny jeho pobočky. Protože neexistují žádné konkrétní tabulky a grafy o vlivu dekorace na obchod, nejdůležitější ze všeho je, aby lidi své zážitky z center sdíleli na sociálních sítích. Teď v S.O.S. – Dekorace dokonce pracují na výzdobě, kterou bude přímo nutné propojit s Facebookem nebo Instagramem a výzdobu budou spoluvytvářet sami návštěvníci. Hodně pomáhá i to, když se nějaký vánoční trh objeví v žebříčku prestižních světových novin nebo na Trip Advisoru a podobných cestovatelských portálech.

Díky bohu za návrat filmařů

Pokud firma nezíská velkou zakázku z jiné sféry, tvoří Vánoce většinou 70 % všech jejích ročních zakázek. Ačkoli se kontrakty uzavírají už na jaře a výroba běží i teď přes léto, je předvánoční období velmi hektické. Během měsíce musí firma stihnout nazdobit až 150 center a pak téměř naráz zase všechno sundat a uložit do skladů. Dílny a sklady S.O.S. – Dekorace v pražských Kunraticích mimochodem zabírají plochu 20 000 metrů čtverečních. Po Vánocích se připravují Valentýn a Velikonoce a zbytek roku má firma na spolupráci s tvůrci reklamy nebo filmovými produkcemi. Mimo jiné se podílela na kulisách Letopisů Narnie nebo Kletbě bratří Grimmů. Práce pro film je úžasná. Můžeme dělat na velkých projektech, které nás baví. Kdo jiný než filmaři by si nechali postavit kopii středověkého hradu. Navíc práce nemusí být až tak precizní, protože se po pár dnech stejně všechno bourá. A k tomu jsou filmové zakázky dobře placené. Jsem proto rád, že se produkce znovu začínají vracet do Česka, říká podnikatel. Jediná nevýhoda spočívá v tom, že tvůrce dekorace se jako subdodavatel nedostává do titulků a nemá na sebe jak upozornit.

Větší jméno proto firmě dělají jiné projekty. Jeden z těch nejnáročnějších bylo vytvoření expozice v novém pavilonu slonů a hrochů v pražské zoologické zahradě. Tam byla firma generálním dodavatelem a dostala zcela volnou ruku. Šlo o objemově dosud největší zakázku vůbec, na které se pracovalo 9 měsíců. Zásadní zkušeností po stránce řemesla pak byla vnitřní výzdoba čestlického akvaparku. Byla to pro nás další z výzev, do které jsme šli bez zkušeností. Byli jsme zvyklí dělat věci na pár dnů nebo týdnů. Tady musí všechno vydržet roky a navíc ve vodním prostředí. Hodně nás to posunulo dopředu. Ale učíme se pořád. Když jsme dělali na akvaparku v Popradu, museli jsme se vypořádat se slanou vodou. Naštěstí už dnes máme produktové a designové oddělení, za našich punkerských let bychom něco takového určitě nezvládli, komentuje Jakub Olbert. Přiznává, že v minulosti dělal hodně věcí na hraně a pak kvůli tomu ani nespal. Nikdy ale od žádné zakázky neutekl a toho si na něm zákazníci vážili. Dokonce i v jednom pražském hotelu, kde po dlouhém čekání dodaná fontána nakonec udělala víc škody než užitku. Jeho životním mottem je, že cesta bez překážek nikam nevede.

MM25_Copy

Před pár dny se v S.O.S. – Dekorace pustili do dalšího projektu. Je jím půjčovna dekorací Dekorent, která jako jediná v České republice nabízí firemním i soukromým zákazníkům ucelené portfolio dekorací a dekorativních prvků použitelných pro nejrůznější eventy, party, oslavy, konference nebo trhy. Máme v nabídce nejen běžné dekorativní prvky, ale i takové, které z každé akce udělají nevšední zážitek. Zákazníci si mohou půjčit mluvící 3D sochy, květinové brány, unikání světelná fiber glassová křesla i dětský kolotoč. Aktuálně je v nabídce na 500 prvků a brzy jejich počet zdvojnásobíme, říká majitel společnosti. Pro půjčovnu se rozhodl proto, že mu bylo líto nechat ležet ve skladech hezkou dekoraci, která může nadělat spoustu radosti i parády. Zároveň má půjčovna firmě pomoci zlepšit cash flow mimo sezónu a navíc bude mít vliv i na marketing, který je zatím oním pověstným pátým kolem u vozu. Dosud nebyl potřeba, zakázky se přelévaly z roku na rok. Protože se ale pomalu začíná měnit generace manažerů nákupních center, je potřeba na sebe víc upozorňovat a navazovat nové kontakty.

Krom toho si Jakub Olbert dál půjde za svými sny. Ten o výzdobě Staroměstského náměstí už si před lety splnil, na výzdobu pařížské Champs-Élysées rezignoval, protože nemůže konkurovat Belgičanům, kteří ji na jedné z nejdražších ulic světa dělají zadarmo. Další vysněnou lokalitou je Times Square v New Yorku. Také věří, že jednou dostane příležitost blýsknout se například na Rudém náměstí v Moskvě nebo v obchodním domě Gum. Jednou už od toho nebylo daleko. Velký potenciál vidí také v Arabských Emirátech. Tamní finanční zdroje umožní vytvořit skutečně velkolepá díla, která nebudou kýčem. A o to teď podnikateli, který leckdy připomínal kaskadéra, jde.

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.


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