Zlatý důl pod Ještědem

2. 3. 2009

Sdílet

Vysoký televizní vysílač Ješted
Autor: Depositphotos.com
Ještěd
Severočeské město Liberec se už nějaký čas může považovat mezi našimi městy za mediální hvězdu. Vše vyvrcholilo zahájením prestižních soutěží Mistrovství světa v klasickém lyžování. Pokud by to bylo kvůli sportovnímu svátku lyžařů a skvělé atmosféře a zázemí, bylo by vše logické.

Jenomže nebývalý zájem vyvolalo už zpočátku rozhodnutí uspořádat šampionát v klasickém lyžování málem v nížině, později prapodivně proplácené faktury a zpráva NKÚ, v neposlední řadě pak dramaticky navyšované už tak velmi vysoké výdaje ze státního rozpočtu, potažmo z peněz kraje a města na přidruženou zábavu. Není divu, že leckdo měl na sousloví „liberecké mistrovství“ alergii, jiný oči přivíral a světovou sportovní akci si užíval. Po osobní ochutnávce přímo v dění lyžařského světového svátku se ve mně oba dojmy mísily.

 Proč právě Vesec?

Každý, kdo si po schválení dějiště letošního MS na mapě našel Vesec, se jistě podivil, proč zrovna tady, v nadmořské výšce 450 metrů, se má na konci února 2009 uskutečnit MS v klasickém lyžování. Údiv přešel často v poklepání si na čelo vloni v únoru, kdy se tady jako generálka MS konaly závody Světového poháru v klasickém lyžování. Po sněhu nebylo ani památky, tak se jej organizátoři rozhodli dovézt, tedy spíše „ukrást zpod běžek“ amatérským sportovcům, jež se vydali na Jizerskou magistrálu. Vysloužili si za to kritiku jak laické veřejnosti, tak profesionálních sportovců a pochopitelně se to nelíbilo ani ochranářům přírody. Následovaly pokuty.

Velká nervozita z nedostatku sněhu v nížině vedla organizátory letošního šampionátu k permanentnímu několikaměsíčnímu zasněžování areálu; světě div se, používala se k tomu i pitná voda! Lidé v českých hospodách i mimo ně se sázeli, zda sníh roztaje, nebo vydrží. Neroztál, dokonce přibyl. Jen několik dní před slavnostním zahájením mistrovství začalo nepřetržitě sněžit. Dokonce to způsobilo pětidenní sněhovou kalamitu a sníh byl rázem na obtíž: překážel jak na tratích, které vyžadují speciální úpravu, tak ve městě a okolí.

Jednalo se o štěstí, možná o smlouvu s ďáblem, nicméně teď nikdo nemůže říci, že je Vesec pro prestižní soutěž s ohledem na sněhové možnosti nevhodný.

A nebe sníh chrlí a chrlí

Aby už konečně přestalo sněžit, si nakonec přáli jak organizátoři MS, tak závodníci i návštěvníci, kteří se nechtěli sněhovými závějemi v centru Liberce brodit. Město sníh pečlivě odklízelo, ale jen někde. Jeden místní mi k tomu řekl: „Jo, snaží se sníh odklízet. Tady jo, ale jakmile zahnete do postranní uličky, kam funkcionáři netrefí, budete ve sněhu až po kolena.“ Vzápětí mě pozval k nim na sídliště, kde bylo sněhu tolik, že by bohatě vystačil na další šampionát.

To, že se při podobných akcích dbá o údržbu zejména ploch v blízkosti dění, není výjimkou a stát vždy na úpravu okolí nemalou částkou přispívá. Vyprávět by o tom mohla pražská Libeň, která v roce 2004 hostila mistrovství světa v ledním hokeji. Předcházelo mu zatravňování tramvajového  kolejiště, upravování chodníků atd.

Diskotéka není levná záležitost

Po dobu dvanácti dnů se v Liberci a okolí očekával nevídaný nápor jak tuzemských, tak zahraničních turistů. Těšili se na něj obchodníci, kočovní stánkaři a nejvíce samozřejmě organizátoři mistrovství.

 Těžko soudit, z jakého důvodu bylo návštěvníků mnohem méně, než se očekávalo. Zlé jazyky tvrdí, že vstupenky byly předražené, a s tím nelze než souhlasit, což kdekoho odradilo. Tribuny zely prázdnotou, což se snažili organizátoři změnit tím, že začali v půli šampionátu vstupné zlevňovat nebo vymýšlet různé akce, jako například „Kup jednu a druhou máš za korunu“. To se samozřejmě nelíbilo těm, kteří za svou podívanou již draze zaplatili v předprodeji. Navíc ani taková opatření davy návštěvníků do Liberce nepřivedla.

Světové akce tohoto formátu vždy slibují vedle soutěžního napětí i zábavu. Právě o tu se měl postarat doprovodný program. Pro děti bylo otevřené kino Lípa, kde se promítaly různé pohádky. Poptávka dětských diváků, jak se později ukázalo, nebyla příliš veliká. Pro starší byly připravené různé koncerty, přijela například Dara Rollins, Maxim Turbulenc nebo Michal David. Možná organizátoři netušili, že místní školáci dostali dva týdny prázdnin a raději z města, které se mělo stát neprůjezdnou zónou, odjeli i s rodiči někam jinam. Nad běžeckou tratí duněly decibely – zvukovou kulisou podívané ve Vesci byla disco hudba. Nesmím zapomenout ani na každodenní ohňostroj, který doprovázel předávání medailí.

Celkové náklady na tyto legrácky se vyšplhaly k několika desítkám milionů korun. Vzhledem k tomu, že návštěvníků nebylo tolik, jak se předpokládalo, stojí za úvahu zjistit, kde se stala chyba a zda byla investice v takovém rozsahu zapotřebí. Doprovodný program na sportovní akce jistě patří, ale rozhodně není tím největším lákadlem.

Máš byt v Liberci? Pak jsi vítěz!

Ubytování v Liberci jsme sháněli v předstihu, nicméně  místní hoteliéři nám vždy řekli, že rezervaci slíbit nemohou, protože ještě nevědí, jak to v únoru bude. To co nevěděli, byla hladina cen, jakou nasadí. Chtěli vyčkat a udeřit, což se jim ve finále nevyplatilo. Čekali autobusy plné turistů, hlavně ze zahraničí, jenž budou závratné částky ochotni platit. Hotely však zely prázdnotou.

Ten, kdo chtěl mít jistotu, si v předtermínu totiž zajistil ubytování jinde.

Jednou z možností byl pronájem soukromého bytu. A vůbec nebylo málo těch, kteří byli ochotni za rychlý černý přivýdělek vystěhovat sebe i celou rodinu a po dobu šampionátu okupovat například přátele, rodiče či prarodiče, odjet na chatu nebo někam do levnějšího hotelu. Laťka cen v privátu byla opravdu vysoko (někdy i sedmdesát euro za osobu na noc). Nechat tedy ve svém domově vegetovat cizí lidi za necelé dva týdny zisk kolem osmdesáti korun„čistá ruka“, za to opravdu stálo.

Někteří návštěvníci se ubytovali za hranicí města, a byli tací, kteří dokonce zvolili i vzdálenější „zlatou“ Prahu – noc je prý vyšla na šest set korun, což byla oproti Liberci až směšná částka. Navíc se bez problémů dalo každý den dojíždět autobusem určeným pro přepravu na mistrovství. Aby o drahocenné diváky organizátoři nepřišli, nabídli navíc těm, co se ubytovali mimo město, zdarma rozvoz autobusy.

Nejlépe nad libereckými ubytovateli vyzráli norští fanoušci, kteří zvolili něco zcela nestandardního – založili stanové městečko, kde v klidu, když zrovna mohutně nepodporovali své závodníky, vegetovali. Když měli hlad, prostě si na plynovém vařiči udělali rybu z vlastních zdrojů.

Jídlo a pití

Některé liberecké restaurace vítaly své hosty cedulí, že po dobu konání mistrovství světa je otevírací doba prodloužená dle potřeb zákazníka. To bylo nadmíru sympatické. Kdo by ale čekal velkolepý mejdan, byl zklamaný. Snad byla na vině zima, snad únava, možná i zmíněné dojíždění – noční město zas tak divoké nebylo.

Liberecké restaurace nabízely velmi chutná jídla – jak typicky česká, tak i netradiční mušle a jiné speciality. Ceny, dle jídelních lístků, byly nabízeným službám úměrné. Jenže chyba lávky, při placení jsem se sumy na účtence až zalekla.Tentokrát žádná cedule, žádné varování předem. Číšnice mi jen možná trochu rozpačitě, ale naprosto suše oznámila, že po dobu mistrovství vše zdražili. Nebylo žádnou výjimkou dostat sběračku polévky za devadesát pět korun.

Ptala jsem se zahraničních kolegů novinářů, protřelých harcovníků velkých sportovních klání, co tomu všemu říkají. Nevěřícně kroutili hlavou, nikde se nesetkali s tím, aby jim v hospodě dělali speciální „sportovní“ cenu. Rovněž si posteskli nad zvláštními praktikami v tiskovém středisku. Je nevídané, aby zde novinář platil za pronájem internetového kabelu. Mistrovství světa v Liberci za něj inkasovalo 3000 korun. Přitom novinář informující o místním dění a výsledcích jednoznačně prokazuje organizátorům službu. 

Doprava ve městě

Remcání řidičů se místy ozývalo kvůli uzavírkám, ty však byly nutné. Město se tuto nepříjemnost snažilo občanům a dalším návštěvníkům vynahradit tím, že byla městská doprava během šampionátu pro všechny zadarmo, takže se mi suma, kterou jsem zaplatila navíc v restauracích, alespoň takto částečně vrátila při cestování po městě.

Někteří místní si však nad tímto vstřícným gestem města povzdechli, prý se o tom měli dozvědět dříve, než si zakoupili měsíční kupón. A komu se to vůbec nelíbilo, byli taxikáři. Jeden mi naštvaně řekl, že díky této úlevě přichází o kšefty. Vadily mu i zkrácené intervaly mezi spoji městské hromadné dopravy.

Mistrovství světa v klasickém lyžování včera skončilo. Medaile byly rozdány, tak se dá říci, že se i přes nejrůznější komplikace vlastně vydařilo. V srdcích daňových poplatníků však zanechá hluboký šrám, protože z jejich kapes vytáhlo nemálo peněz, které skončily kdovíkde a kdoví u koho, což nebývá v České republice zvykem rozklíčovat a po zásluze potrestat.

Autor článku

Své profesní působení v médiích zahájila v týdeníku Reflex. Pracovala v kreativním týmu TV NOVA a vedla sekci Sport a relax serveru Vitalia.cz vydavatelství Internet Info. Podílela se také na jeho dalším projektu, serveru 120na80.cz.

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