Česko má šanci stát se startupovým státem. Mladé firmy našly nového spojence a chtějí přesvědčit příští vládu

18. 3. 2025
Doba čtení: 12 minut

Sdílet

Martin Jiránek,  Česká startupová asociace, a Radek Špicar, viceprezident Svazu průmyslu ČR
Autor: Česká startupová asociace a Svaz průmyslu ČR
Martin Jiránek, Česká startupová asociace, a Radek Špicar, viceprezident Svazu průmyslu ČR
Česká startupová asociace se nově stává členem Svazu průmyslu ČR. Má tak získat větší zastání svých zájmů u vlády. Spolu budou tlačit na prosazení vhodnějšího zákona o zaměstnaneckých akciích, jedním z cílů je také dostat nápady začínajících firem do těch velkých a zavedených.

Hlasitější přímluva a z toho plynoucí silné slovo, které startupy v Česku dosud neměly – to má přinést nová spolupráce České startupové asociace a Svazu průmyslu. Podle představ obou organizací by měly být zájmy zdejších technologických firem prosazovány důrazněji. Zaměstnavatelský svaz byl přitom dosud vnímán především jako orgán zastupující firmy, které jsou v českém průmyslu ukotvené klasičtějším způsobem. A startupům se prozatím jejich představy o podobě byznysového prostředí v Česku dařilo do reality přetavit jen částečně.

Nově má být jim i začínajícím podnikatelům zdejší prostředí přívětivější. Nakolik ale může být Česko zemí startupů? O nastavení spolupráce, o prioritách i o pozici tradičních firem a technologií jsme mluvili s Radkem Špicarem, viceprezidentem Svazu průmyslu ČR, a Martinem Jiránkem, který stojí v čele České startupové asociace.

„Jsme více než 100 let stará organizace, která se během své historie snažila o to, aby zastupovala ekonomiku jako celek. A ta ekonomika se samozřejmě v průběhu času vyvíjí. Mění se podíl firem menších, větších, regionálních a pražských, vždy jsme ale chtěli, abychom znali potřeby ekonomiky jako celku a byli ještě více schopni jednotlivé její části hájit. Je třeba vědět, jaké má potřeby ta z našeho pohledu velmi perspektivní část ekonomiky, jako jsou technologické firmy či softwarové startupy, abychom je mohli úspěšně zastupovat a hájit jejich zájmy,“ říká k začlenění Špicar.

Použitelné zaměstnanecké akcie opět v nedohlednu. Inovativní firmy z Česka odejdou, říkají startupy Přečtěte si také:

Použitelné zaměstnanecké akcie opět v nedohlednu. Inovativní firmy z Česka odejdou, říkají startupy

Proč teď? Jak se situace v ekonomice změnila, že nyní tuto oblast řešíte?

RŠ: Je to pro nás součást dlouhodobého, letitého procesu. Minulý týden jsme měli představenstvo, kde se řešil rozpočet Svazu průmyslu, což je skoro 100 milionů korun. Generální ředitel Dan Urban zde představil zajímavou informaci – že největší část členských příspěvků přichází od high-tech firem: digitálních, softwarových, IT, technologických, působících v oblasti výzkumu a vývoje anebo čipů. Zájem o startupy doplňuje naši starost o klasické, nadále klíčové pilíře českého průmyslu typu strojírenství, energetika, chemický průmysl či hutnictví.

Vzájemná spolupráce nám umožní dodat jednotnou pozici za celý sektor. Jako připomínkové místo na úrovni ministerstva máme právo při tvorbě legislativy, pokud se jakýkoliv zákon dotýká hospodářské politiky, připomínkovat jej stejně jako ostatní resorty a vláda se s námi o tom musí bavit. Klíčová ale bude i evropská úroveň, kde jsme velmi silní, protože jsme jeden z nejdůležitějších členů Business Europe, což je největší evropský zaměstnavatelský svaz, který zastupuje zhruba 20 milionů evropských firem vůči Evropské radě, komisi a parlamentu.

Jak se pojí to, že jsme tak průmyslová a výrobní země, s tím, že hovoříte o významné části příspěvků od technologických firem?

RŠ: To se vůbec nevylučuje, naopak, jsme jedna z nejdiverzifikovanějších ekonomik na světě. Lidé mají často pocit, že jsme nějaká monokulturní ekonomika závislá pouze na automobilním průmyslu. To ale není pravda. Ano, Škodovka stále představuje 4 procenta HDP v této zemi a 8 procent exportu, což je obrovské číslo, takže se o ní logicky mluví. Navíc je pomyslně sexy – každý přichází s jejími výrobky do styku, má k ní nějaký emocionální vztah. Ale třeba elektrotechnický průmysl se podílem na HDP velmi blíží tomu automobilovému. 

Je ale nutné propojení velkých průmyslových firem s malými technologickými startupy. Potřebují to obě strany a slibujeme si to od spolupráce s Českou startupovou asociací. Když tyto dva světy propojíte, ze střetu dvou civilizací většinou vznikne něco opravdu zajímavého a originálního. Podobně se snažíme intenzivně propojovat podniky a univerzity.

MJ: Chystáme po vzoru například švédského nebo irského modelu aktivní propojování velkých firem s českými startupy, právě z mnoha řečených důvodů. Ve chvíli, kdy startup dostane prvního velkého zákazníka, pomůže mu to jak finančně, tak dobrou referencí pro další potenciální zákazníky i investory. A to je něco, co třeba Švédové dělají velmi dobře už roky.

Jak ale třeba toto zařídit a zajistit?

MJ: Na tomto směru už pracujeme. Klíčová věc je zařídit kontakt, propojit dva rozdílné světy. Třeba právě ve Švédsku mají týmy lidí, kteří pomáhají startupům vysvětlit, jak funguje svět korporátu, a spolupráci zajišťují. A stejně tak obráceně. Protože častou překážkou je to, že startup hovoří s někým z firmy, ale chybí finanční ředitel, obchodní ředitel či samotný CEO, aby tu diskuzi slyšeli, a pak to ztroskotá.

RŠ: Jsme na to procesně připraveni. Máme několik desítek zaměstnanců ve výkonném aparátu. SP ČR je obrovský, zastupuje ty největší svazy a několik tisíc individuálních firem. Takže nového člena umíme začlenit do struktury a propojit s ostatními.

Co by tedy podle plánů ze spolupráce mělo vzejít?

MJ: Ke krátkodobým cílům patří společně připravit doporučení a návrhy, opatření pro politické strany směrem k volbám. Společně řešíme i velmi aktuální téma ESOPů. Osobně si od příštího volebního období slibuji, že bychom mohli udělat výrazné změny směrem k vylepšení startupového ekosystému. Už teď na tom pracujeme napříč všemi stranami. Vidíme, jak některé okolní státy už úpravou startupového a investorského prostředí v minulých letech prošly a utíkají nám, protože my svůj ekosystém zatím moc neupravujeme. Potřebujeme s příští vládou udělat větší skok, ne řešit jedno nebo dvě témata. To je z mého pohledu dlouhodobý cíl spolupráce.

Toto volební období už jste zavrhli?

MJ: Z pohledu legislativního procesu se toho už moc stihnout nedá. Některá témata ještě řešíme, ale primárně se soustředíme na to, abychom se stranami komunikovali, co se bude dít po volbách. Příští vláda by měla mít ideálně vše připravené tak, aby mohla reálné kroky začít řešit hned v prvním roce.

RŠ: Je to tak. Budeme jednat s touto vládou o záležitostech, které jsou pro nás důležité, aktuální, které se ještě dají stihnout. ESOPy tady už dávno měly být. Každý ztracený měsíc je nešťastný. A toto buď ještě dokážeme dotáhnout, což by bylo skvělé, nebo začneme okamžitě s příští vládou. Chtěli bychom, aby pozitivní změny spojené s ESOPy začaly platit už od začátku příštího roku.

Liší se startupy od tradičních firem, které si obvykle představíme, že Svaz průmyslu a dopravy zastupuje?

RŠ: Stejně jako je velmi diverzifikovaná česká ekonomika, tak je i naše členská základna. Zastupujeme tisíce firem, které mají dohromady asi 1,3 milionu zaměstnanců, a jde o kombinaci různě velkých společností, i těch malých technologických. Výborně je to vidět například na složení zahraničních misí. Před osmi lety jsem jezdil primárně s velkými firmami, hodně nadnárodními, které působily v České republice. Pak jsme začali stále víc jezdit s českým kapitálem a teď už jezdíme i s opravdu velmi malými. Naše mise do Spojených států s technologickými firmami jsou většinou ty vůbec největší, které pořádáme. Je o ně největší zájem.

Ondřej Tomek: Technologické firmy nemají důvod v Česku zůstat. Vím o třiceti, které právě odcházejí Přečtěte si také:

Ondřej Tomek: Technologické firmy nemají důvod v Česku zůstat. Vím o třiceti, které právě odcházejí

Podobností je možná víc, než by si člověk myslel. I já jsem si myslel, že oblast ESOPů bude spíš relevantní pro startupy, malé či středně velké firmy. Ukázalo se, že to tak není, že spoustu našich velkých členů ESOPy využívá, a to včetně nadnárodních gigantů, a jsou pro ně hodně důležité. Poslední novela zavedená s cílem zatraktivnit využívání zaměstnaneckých akcií jim to využívání ale naopak zhoršila. Společných potřeb je hodně, ale je třeba, abychom hovořili jedním jazykem a chodili za vládou společně.

Co jsou ty další společné potřeby, které chcete řešit?

RŠ: Určitě trh práce. Startupy potřebují vysoce kvalifikovanou pracovní sílu v různých oblastech, lidi s globální zkušeností z velkých firem, kterých se tu často nedostává. Je potřeba jim usnadnit přístup na český trh práce, tedy zrychlit a zpřístupnit imigrační legislativu. Nebo zlepšit školství tak, aby kvalitní absolventi českých škol byli lépe připraveni na práci ve startupech nebo v technologických firmách. 

Naprosto klíčová věc je oblast kapitálového trhu. Na té musíme začít spolupracovat okamžitě. Evropa jako celek nikdy nedožene Spojené státy a může si o tom nechat jen zdát, pokud nebude mít jednotný silný kapitálový trh, kam si firmy budou moct chodit pro peníze. Protože pokud budou chodit i nadále do bank, jak je v kontinentální Evropě zvykem, budou se tam nadále potýkat s velkou rezervovaností vůči půjčování peněz na jejich odvážné projekty. Bez odvážnějšího kapitálového trhu se nehneme.

MJ: Česko ten kapitál opravdu potřebuje. Není to jen o potřebě investiční incentivy pro business angely, což už řešíme. Nebo že by penzijní fondy měly mít možnost investovat do rizikového kapitálu. Musíme řešit celkově evropský kapitálový trh a potřebujeme, aby Česká republika byla tím, kdo změny bude tlačit, ne tím, kdo je bude brzdit. Čím víc lidí bude chtít podnikat, tím lépe. Musíme přidat také v oblasti transferu technologií, kde určitě máme mezery vzhledem k tomu, jak málo spin-offů na českých univerzitách vzniká v porovnání se státy, se kterými bychom se porovnávat chtěli.

Zmínili jste řadu směrů. Pokud byste měli vybrat jeden zásadní, který by české startupové prostředí katapultoval nahoru, co by to bylo?

RŠ: Potřebujeme atraktivnější ESOPy a posílit kapitálový trh.

MJ: Ještě mi dává smysl zjednodušit život začínajícím startupům, tam se inspirujeme španělským a portugalským zákonem. A rozhodně bychom se měli bavit i o vládní úrovni, kde potřebujeme, aby existoval jasný tým, který bude pro tuto diskusi partnerem. Ten aktuálně na úrovni vlády nemáme.

Velká část z toho jsou myšlenky, které jsou už nějakou dobu ve vzduchu. Změnily se podle vás podmínky, když si teď slibujete změny?

MJ: Pokud ze sektoru startupů vzejde nějaký návrh, expertíza svazu a pomyslné razítko, které nám na něj dá, může zvýšit šanci, že jej vláda podpoří. Díky podpoře jednoho z nejdůležitějších subjektů z pohledu hospodářství půjde nahoru i důvěryhodnost.

RŠ: Souhlasím, dva hlavní přínosy jsou odbornost a legitimita. Máme špičkové právníky, daňaře, legislativce znalé podnikového i úřednického světa. Když na to dají palec, politici a státní správa s tím pracují tak, že je to opravdu v pořádku. Za desítky let vzájemné interakce vědí, že nemůžeme tlačit něco, co by nefungovalo a za čím bychom nestáli, co by byl třeba jen partikulární zájem malé části české ekonomiky. A legitimita. Pokud se za něco postaví svaz, je to zájem 30 procent českého HDP. Jsme členem tripartity, což je naprosto exkluzivní postavení. A díky vlastní kanceláři v Business Europe v Bruselu jsme schopni být na začátku evropských legislativních procesů. Měnit legislativu, až když přijde do České republiky, je pozdě.

Funguje toto silné jméno svazu i na Ministerstvo financí? Ptám se kvůli ESOPům.

RŠ: Jsou ministerstva, kde funguje více, a jsou ta, kde funguje méně. Ministerstvo financí skutečně patří k resortům, kde komunikace existuje, v mnoha ohledech je úspěšná, ale zrovna toto téma je složité a jednání nejsou jednoduchá, to musím přiznat.

Jedna z věcí, na kterou si startupy stěžují a kterou jsme dosud nezmiňovali, je byrokracie. Plánujete i v tomto ohledu nějaké kroky?

RŠ: Opět se projevuje národní a evropská úroveň. V minulých letech z evropské úrovně přicházela obrovská byrokratická regulatorní zátěž. Dlouhodobě jsme upozorňovali na to, že nás to znevýhodňuje například vůči našim americkým konkurentům. Mám pocit, že po tom, co to dobře popsali Mario DraghiEnrico Letta, s tím nová Evropská komise začíná pracovat. Připravili jsme s Business Europe několik desítek naprosto konkrétních legislativních návrhů a mnoho z nich bylo použito pro poslední omnibus Evropské komise. Návrhy v něm obsažené ušetří evropským firmám několik miliard eur a výrazně sníží byrokratickou náročnost podnikání v Evropě.

Rok po startupové zimě mladé technologické firmy ožívají. Loni ohlásily investice za víc než 14,6 miliardy Přečtěte si také:

Rok po startupové zimě mladé technologické firmy ožívají. Loni ohlásily investice za víc než 14,6 miliardy

MJ: Velká část regulatorní zátěže je už jen v samotném nastavení Evropy. Pokud chce startup expandovat po trzích kontinentu, každý stát má pravidla nastavená jinak. Tomu by mohl pomoct takzvaný 28. režim (jeden předpis pro daně, bankrot, pracovní právo a další podmínky ve všech 27 zemích EU, pozn. redakce), který by umožnil jakoby přemostit a sjednotit regulace jednotlivých států.

Máte v plánu navrhnout i daňové úlevy specificky pro startupy nebo inovativní firmy?

MJ: Za startupovou asociaci to chceme řešit v rámci startupového zákona. Je to jedno z klíčových témat, které aktuálně rozpracováváme a v nejbližších týdnech a měsících budeme podrobnější návrhy diskutovat s politiky a samozřejmě i se Svazem průmyslu. Zatím se koukáme na inspiraci do Španělska, Portugalska či Rumunska. Jednotlivé úlevy se v každé zemi liší, a konkrétní opatření je třeba řešit v rámci potřeb českých startupů a celkově českého prostředí. Řešíme pomoc v pracovněprávních vztazích, jak se rychle dostat ke kapitálu, možnosti snížení nákladů na byrokratickou zátěž, jak jednodušeji by se mohly spin-offy dostat k celosvětovým patentům… Cílem je říct si „ano, chceme tyto firmy podpořit, takže když se jim povede vyrůst, posílí českou ekonomiku a díky nim zbohatneme jako společnost celkově“.

Dnes podstatná část startupů z Česka odchází nebo zakládá v zahraničí entitu, či rovnou svou matku. Proč se tak podle vás děje?

RŠ: Jeden z důvodů je velmi pozitivní, a to, že ti lidé zakládají firmy s globální ambicí. To je velmi potřeba, my nejsme startup nation a naše mentalita není americká či izraelská, a pokud mladší generace tuto ambici mít bude, je to skvělé a snahu o rychlou internacionalizaci firem vítám. 

Pak jsou samozřejmě důvody, které nejsou tak pozitivní. Jako je třeba právě snaha dostat se do režimu, kde ESOPy fungují jednodušeji, kde je vymahatelnost práva jistější, daňové prostředí přívětivější a podobně. V těchto ohledech bychom měli udělat vše pro to, abychom to prostředí nabízeli srovnatelné. 

Je jasné, že když chci na americký trh, musím tam být přítomný, ale nemusím tam vždy přestěhovat také svoji centrálu. Potřebujeme, abychom nebyli jen zemí dcer zahraničních matek a ještě víc subdodavatelsky orientovaná, ale být zemí, kde budou vznikat centrály a odkud bude globální byznys řízený. To si ale musíme odpracovat.

MJ: Bylo by opravdu skvělé, kdyby si politická i úřednická sféra uvědomila, že dobrá regulace a dobré systémové nastavení může být pro stát konkurenční výhoda. Některé státy už si to vyhodnotily a pracují na tom, my zatím bohužel ne.

Má vůbec Česko šanci stát se startupovým státem, ať už vezmeme region středoevropský, anebo dokonce pokud pomýšlíme na celou Evropu?

MJ: Za mě rozhodně ano. Je to opravdu o přenastavení systému a podpoře určitého mindsetu. Není cílem, aby chtělo podnikat 100 procent populace, ale když bude mít zájem třeba o 20, 30, 40 procent lidí víc, možnosti se výrazně zvětší. Potenciál opravdu je. Máme například skvělé vysoké školy, a i když asi nikdy nebudeme Izrael, prostě proto, že podmínky fungování a historie jsou jiné, můžeme být lepší než spousta zemí okolo nás.

MM Influenceři

Simona Kijonková: Za poslední půlrok jsem se dívala na investice v horizontu 1,4 miliardy Přečtěte si také:

Simona Kijonková: Za poslední půlrok jsem se dívala na investice v horizontu 1,4 miliardy

RŠ: To těžší je hotovo – to, co nelze vybudovat přes noc. Máme velmi dobré technické univerzity, které produkují špičkové talenty. Funguje atraktivita země jako taková. Praha, Brno i Ostrava jsou místa, kam lidé chtějí přijet, protože se tam dobře žije. Bezpečnost je dobrá, kvalita života také, takže dostat sem špičkové talenty, nebo přimět ty české, které odešly, aby se vrátily, není tak složité. 

Je ale potřeba udělat věci, které se v porovnání s tím dají zařídit docela rychle. Změnit pár zákonů, existující procesy, jako například ty imigrační výrazně zrychlit, a uvést v život pár nových podpůrných schémat, jež ekonomika potřebuje. Není to žádná raketová věda. A není nutné s tím otálet.

  • Chcete mít Lupu bez bannerů?
  • Chcete dostávat speciální týdenní newsletter o zákulisí českého internetu?
  • Chcete mít k dispozici strojové přepisy podcastů?
  • Chcete získat slevu 1 000 Kč na jednu z našich konferencí?

Staňte se naším podporovatelem

Seriál: Rozhovory
Neutrální ikona do widgetu na odběr článků ze seriálů

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.


Autor článku

Novinářka, která dává dohromady čísla a příběhy. Do článků se jí dlouhodobě vetřely především technologie a startupy. Pracovala pro Českou televizi, tisk i web.

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