Jak se stát úspěšnější firmou? Buďte kreativní a nebojte se

2. 1. 2018
Doba čtení: 7 minut

Sdílet

Ilustrační obrázek
Autor: Depositphotos – AllaSerebrina
Ilustrační obrázek
Vybudovat kvalitní a dobře fungující firmu, to nechce jen dobrý nápad. Celkový úspěch je souhrou mnoha faktorů. Zaměřte se letos na své nedostatky a obavy.

Jaký bude nový rok? Především takový, jaký si ho uděláte. Pokud ho chcete učinit lepším, než byl ten právě skončený, máme pro vás pár předsevzetí, která se vyplatí dodržovat.

1. Mějte rádi svou práci a kolegy

Základními kameny ve všech podnicích jsou dobré vztahy mezi zaměstnanci a nadřízenými. Přátelské prostředí se vám odvděčí dobrou náladou napříč firmou a větší motivací zaměstnanců. Neopomíjejte proto interní komunikaci, která má silný psychologický vliv na zaměstnance a výrazně ovlivňuje jejich spokojenost. Po delší době, kdy jsme interní komunikaci zanedbávali, se ukázalo, že to nebylo vhodné řešení. Řada nedávno provedených opatření jasně dokázala, že jsou zaměstnanci rádi, když ví, že se o ně firma zajímá a nabízí jim určité benefity. V předvánočním čase mělo například úspěch pořádání několika výletů za kulturou nebo znovuoživení interní skupiny na Facebooku, kde se mohou všichni zaměstnanci vyjádřit k aktuálnímu dění ve firmě, říká Daniel Černý, předseda představenstva společnosti HALLA.

Komunikace ve firmě odráží i to, na jaký styl řízení se v podniku vsází. Autoritativní styl plný pravidel, příkazů a zákazů nedává lidem důvěru, a tudíž ani zodpovědnost. Anarchistický styl naopak žádná pravidla nemá a firma ho zřejmě dlouho nepřežije. Demokratický styl naproti tomu upřednostňuje smysluplná základní pravidla, konsenzus a možnost všech podílet se na nich tak, aby vycházela ze skutečných potřeb firmy. Více si o vztazích ve firmách přečtěte v článku Jak spolehlivě naštvat kolegy a zaměstnance? Vsaďte na komunikaci, co nefunguje.

2. Nezapomínejte na vzdělávání zaměstnanců

Všechna odvětví se dynamicky rozvíjí, což s sebou přináší potřebu doplnění znalostí. Ne každý si na to ale ve svém volnu najde dostatek času. Nabídněte proto zaměstnancům interní kurzy, školení nebo vstupenky na oborové konference. Vynaložené výdaje se vám určitě vrátí. A vedle oborového vzdělávání neopomíjejte ani obecnější kurzy, například cizích jazyků. Zaměstnanci jazykové kurzy vnímají jako jeden z nejlepších pracovních benefitů, protože mají přesah i do osobního rozvoje, říká ředitelka jazykové agentury Skřivánek Bronislava Chudobová.

Se začátkem nového roku přicházejí i změny v oblasti benefitů. Mimo jiné je možné poskytovat nepeněžní a od daně osvobozený příspěvek na knihy. Podrobnosti naleznete v článku Nové benefity pro zaměstnance. Využijí je zaměstnavatelé?

3. Buďte kreativní a nekopírujte

Originál je vždy a pouze jen jeden. Ti, co se už o nějakou kopii pokoušeli, by nejspíše dali za pravdu tvrzení, že vytvořit věrnou kopii je ještě horší, než zapojit vlastní rozum a síly k vytvoření něčeho vlastního. Dělejte věci po svém, nekopírujte konkurenci, ale mějte svoji vlastní filozofii, využijte své vlastní nápady. Dlouhodobě perspektivnější je snažit se na trhu prorazit s něčím odlišným, ne prodávat to, po čem je u většiny konkurence největší poptávka, radí David Mencl, ředitel společnosti Ekonomické stavby.

Před začátkem podnikání doporučuje položit si základní otázku „Proč to dělám?“ Ta se zcela jistě promítne do více rovin. „Proč nabízím tento produkt nebo právě tyto služby?“, „Proč by je měli moji potenciální zákazníci chtít?“. Pokud si umíte na tyto otázky odpovědět, měli byste si stanovit jasný cíl a cestu, jakou chcete tohoto cíle dosáhnout. Je dobré si zároveň uvědomit, že cesta není nikdy jednoduchá, že musíme počítat s riziky a komplikacemi. I při velkém nadšení je potřeba zachovávat chladnou hlavu a být vytrvalý. Davidu Meclovi se vždy vyplatilo staré rčení „Na nikoho se nepovyšuj a před nikým se neponižuj.“

4. Buďte k nalezení

Co se nedá dohledat na Googlu, jako by nebylo. Doba si žádá patřičnou komunikaci na internetu, ať už jde o funkčnost webu, komunikaci na sociálních sítích nebo e-mailing. Na online komunikaci je potřeba nahlížet komplexně. Nejde jenom o to mít vymazlený web nebo super firemní stránku na Facebooku. Umění je propojit aktivity v jednotlivých onlinových kanálech tak, abyste každému potenciálnímu zákazníkovi pomohli objevit právě vaši značku nebo produkt. A to je samozřejmě teprve začátek. Až se na vás povalí požadavky a dotazy, měli byste zákazníkům zajistit dlouhodobou spokojenost, postarat se o maximální míru doporučení a minimalizovat negativní odezvu, která v online prostředí může napáchat nepěkné škody, radí Sandra Gligić, General Manager ve společnosti Taste.

Nejlepší a nejnavštěvovanější webové stránky jsou ty, které jsou jednoduché, přehledné a intuitivně ovladatelné. Běžně ale weby trpí tím, že jsou nepřehledné, přeplácané a návštěvníci neví, kam mají kliknout, aby získali informace, které hledají. Největší nedostatky se tedy týkají samotných základů každého webu, tedy jeho nabídky, vyhledávání, navigace a celkového rozmístění prvků na stránce. Jak tyto problémy snadno odhalit, to radí článek Objevit nedostatky webu dá práci. Zkuste nástroje, které vám s tím pomohou.

5. Investujte, inovujte

Pokud pracujete ve výrobním segmentu, bez technických změn a inovací se pravděpodobně neobejdete. Doba jde neustále dopředu a žádá si nová řešení. Jen díky nim budete mít záruku, že budete schopni reagovat na změny trhu a vaše firma bude efektivnější a konkurenceschopná. Je nutné co nejvíc procesů automatizovat a předat je technologiím, aby se lidé mohli věnovat důležitějším a komplexnějším činnostem. Přechod na tech-driven firmu je prerekvizitou k rozvoji a růstu firmy, protože šikovných lidí je v dnešní době nedostatek, uvádí Radek Ondrášík, marketingový ředitel e-shopu Notino.cz. Kdy firma na technologickou zeď narazí, závisí na množství transakcí v časovém cyklu a na odvětví. V případě internetových obchodů to často bývá při obratu mezi 250 a 300 miliony korun ročně. O tématu pojednává článek Nerostete a přitom na to máte? Možná jste podcenili riziko technologické zdi.

Nové technologie s sebou přináší netušené možnosti. Je ale potřeba přizpůsobit se nejenom z hlediska funkčnosti, ale také vzhledu, který hraje stále větší roli. Když stavíte dům ve spolupráci s architektem, tak ho postavíte s lepším výsledkem a vyšší hodnotou. Proto nám ve firmě přišlo dobré začít spolupracovat s designéry a mít výrobek, který na trhu prodáme za víc peněz, doplňuje Dan Pilát, majitel společnosti Intrea Piko, který postupem času zjistil, že je to ale hlavně otázka konkurenceschopnosti, nejen lepšího výdělku.

Ptejte se odborníka v poradně Mzdové účetnictví
PhDr. Dagmar Kučerová
mzdový poradce

6. Udělejte si pořádek 

Podnikatelé se mnohdy bojí obrátit na odborníky nebo zkušenější konkurenci proto, že se obávají vyzrazení svého know-how. V případě plošných změn, se kterými se ale nejsou schopni popasovat sami, většinou nic takového nehrozí. Není tedy dobré to odkládat. Příkladem může být GDPR. I přesto, že se na něj 3 ze 4 firem už začaly připravovat, tak hned v první fázi příprav narazily na zdržení při seznamování se s právním rámcem. Jen 54 % společností se proto domnívá, že bude v době, kdy vejde GDPR v účinnost, v poslední fázi příprav, uvádí Ondřej Šnejdar z auditorské a poradenské společnosti BDO. Do konce roku 2018 budou mít podle této společnosti správně upravené databáze přibližně tři čtvrtiny firem.

Další příklad dává Jan Bureš, partner advokátní kanceláře LP Legal: Od nabytí účinnosti nového občanského zákoníku uplynuly už bezmála čtyři roky, a přesto nemá velká část podnikatelů aktualizovány své vzorové smluvní dokumenty či obchodní podmínky. Nadále tak uzavírají smlouvy, které neodpovídají platné a účinné právní úpravě.

7. Nebojte se expanze

Nové příležitosti k růstu neposkytuje jen networking a rozšiřování zákaznické základny, nové zákazníky můžete najít např. na nových trzích. Česká republika je poměrně malá na to, aby se v ní prodalo veškeré vaše zboží. Nenechte se odradit počátečními náklady a byrokracií a expandujte do světa. Jiné trhy přijdou mimo jiné vhod jako pojistka pro udržení poptávky v době krize. Výběr toho správného trhu každopádně nepodceňujte. 

Školení pro účetní - podzimní novinky

Nejjednodušší je nejdříve vyzkoušet trhy sousedních zemí, kde už mají nějaké povědomí o Česku a jejich kvalitních pracovnících a výrobcích. Nesnažte se ale přenášet stejné principy fungování z Česka do zahraničí. Stylem jsou nám nejblíž Slováci, ale i ti se v některých ohledech liší. Chybou je snažit se aplikovat v zahraničí model domácích lídrů e-commerce. Je velmi pravděpodobné, že v zahraničí určují trendy zcela jiní matadoři, upozorňuje Jakub Šulák, CEO společnosti Shockworks. Více se dozvíte v článku Nevylámejte si zuby na expanzi do zahraničí. Zkuste nejprve Slovensko a Maďarsko.

8. Když si nevíte rady, obraťte se na profesionály

Především menší firmy se snadno dostanou do bodu, kdy si nejsou jisté, jakým směrem se dál vydat. V případě, že si potřebujete ujasnit svou vizi a učinit strategická rozhodnutí, je vhodné tyto kroky konzultovat, a to zvlášť v momentě, kdy nemáte moc zkušeností s řízením a rozvojem organizací. Poraďte se s odborníkem na danou oblast, koučem nebo alespoň s úspěšným a zkušenějším podnikatelem, který vás může upozornit na nejčastější omyly a chyby, nabádá Alice Kubíčková, ředitelka Komory právní odpovědnosti.

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