Zákon o vodovodech a kanalizacích pro veřejnou potřebu a o změně některých zákonů (zákon o vodovodech a kanalizacích) - Měření dodávané vody

Předpis č. 274/2001 Sb.

Znění od 1. 1. 2025

274/2001 Sb. Zákon o vodovodech a kanalizacích pro veřejnou potřebu a o změně některých zákonů (zákon o vodovodech a kanalizacích)

Měření dodávané vody

§ 16

(1) Množství dodané vody měří provozovatel vodoměrem, který je stanoveným měřidlem podle zvláštních právních předpisů21). Jiný způsob určení množství dodané vody může stanovit v odůvodněných případech pouze vlastník vodovodu, popřípadě provozovatel vodovodu, pokud je k tomu vlastníkem zmocněn, a to se souhlasem odběratele. Vodoměrem registrované množství dodané vody nebo jiným způsobem určené množství dodané vody je podkladem pro vyúčtování dodávky (fakturaci) vody.

(2) Vlastníkem vodoměru je vlastník vodovodu, s výjimkou případů, kdy přede dnem nabytí účinnosti tohoto zákona se prokazatelně stal vlastníkem vodoměru provozovatel vodovodu.

(3) Osazení, údržbu a výměnu vodoměru provádí provozovatel. Jeho povinností je oznámit odběrateli výměnu vodoměru alespoň 15 dní předem, současně s vymezením času v rozsahu maximálně 3 hodin, a to i v případě, že vodoměr je pro provozovatele přístupný bez účasti odběratele, pokud se s vlastníkem nedohodne jinak. Přítomnému odběrateli se současně s výměnou předává potvrzení obsahující zaznamenaný stav měření odebraného vodoměru a u nově osazeného vodoměru jeho číslo, zaznamenaný stav a termín, do kterého musí být vyměněn.

(4) Odběratel má právo zajistit si na vlastní náklady metrologickou zkoušku vodoměru na místě instalace, a to nezávislým měřidlem, připojeným na odbočení s uzávěrem za osazeným vodoměrem na potrubí vnitřního vodovodu před jeho prvním rozdělením. Tuto zkoušku provede za přítomnosti provozovatele vodovodu na základě smlouvy s odběratelem Český metrologický institut, pokud to vnitřní vodovod umožňuje. Zjistí-li se odchylka větší, než připouští zvláštní právní předpis21), vodoměr se považuje za nefunkční a při stanovení množství dodané vody pro vypořádání případné reklamace se postupuje podle § 17 odst. 4 písm. a).

(5) Není-li množství odebrané vody z hydrantů a veřejných výtokových stojanů měřeno vodoměrem, stanoví toto množství vlastník vodovodu na podkladě výpočtu vycházejícího z účelu použití odebrané vody a místních podmínek.

(6) Způsob určení množství odebírané vody, není-li osazen vodoměr, stanoví prováděcí právní předpis.

§ 17

(1) Povinností odběratele je dodržet podmínky umístění vodoměru stanovené vlastníkem, popřípadě provozovatelem vodovodu. Pokud vnitřní vodovod nevyhovuje požadavkům pro montáž vodoměru, je odběratel povinen na písemné vyzvání provozovatele provést v přiměřené lhůtě potřebné úpravy na připojované stavbě nebo pozemku.

(2) Odběratel je povinen umožnit provozovateli přístup k vodoměru, chránit vodoměr před poškozením a bez zbytečného odkladu oznámit provozovateli závady v měření. Jakýkoliv zásah do vodoměru bez souhlasu provozovatele je nepřípustný a provozovatel má právo jednotlivé části vodoměru zajistit proti neoprávněné manipulaci.

(3) Vodoměr podléhá úřednímu ověření podle zvláštních právních předpisů.21) Má-li odběratel pochybnosti o správnosti měření nebo zjistí-li závadu na vodoměru, má právo požádat o jeho přezkoušení. Toto právo lze uplatnit nejpozději při výměně vodoměru. Provozovatel je povinen na základě písemné žádosti odběratele do 30 dnů ode dne doručení žádosti zajistit přezkoušení vodoměru u subjektu oprávněného provádět státní metrologickou kontrolu měřidel, přičemž odběratel je povinen poskytnout provozovateli k odečtu i výměně vodoměru nezbytnou součinnost. Výsledek přezkoušení oznámí provozovatel neprodleně písemně odběrateli.

(4) Zjistí-li se při přezkoušení vodoměru vyžádaném odběratelem, že

a) údaje vodoměru nesplňují některý z požadavků stanovených zvláštním právním předpisem21), vodoměr se považuje za nefunkční; stanovení množství dodané vody se v tom případě provádí podle skutečného odběru ve stejném období roku předcházejícímu tomu období, které je předmětem reklamace nebo žádosti o přezkoušení vodoměru. V případě, že takové údaje nejsou k dispozici, nebo jsou zjevně zpochybnitelné, stanoví se množství dodané vody podle následného odběru ve stejném období roku nebo podle směrných čísel spotřeby vody a podle odstavce 6, pokud se provozovatel s odběratelem nedohodne jinak,

b) údaje vodoměru splňují požadavky stanovené zvláštním právním předpisem,21) hradí náklady spojené s výměnou a přezkoušením vodoměru odběratel,

c) pozbylo platnosti ověření vodoměru podle zvláštního právního předpisu21), považuje se vodoměr za nefunkční; stanovení množství dodané vody se v případě nesouhlasu odběratele provede postupem uvedeným v písmenu a),

d) vodoměr je nefunkční, hradí náklady spojené s jeho výměnou a přezkoušením provozovatel.

(5) Zjistí-li provozovatel nebo odběratel při kontrole nebo výměně vodoměru, že vodoměr údaje o množství dodávané vody nezaznamenává, vypočte se množství dodané vody za příslušné období nebo jeho část podle dodávek ve stejném období minulého roku, nebo jde-li o nový odběr nebo změnu, v odběrových poměrech podle množství dodávané vody v následujícím srovnatelném období, případně jiným způsobem dohodnutým s odběratelem.

(6) Při reklamaci podle § 16 odst. 4 a vypořádání vyplývajícím ze zjištění podle odstavců 4 a 5 se za období k vypořádání považuje období od posledního skutečně provedeného odečtu vodoměru předcházejícího skutečnému odečtu vodoměru na základě kterého došlo k výměně vodoměru do dne výměny vodoměru, související s reklamací nebo žádostí o jeho přezkoušení.

(7) Byla-li nefunkčnost nebo poškození vodoměru způsobena nedostatečnou ochranou vodoměru odběratelem nebo přímým zásahem odběratele vedoucím k poškození vodoměru, hradí újmu a náklady spojené s výměnou vodoměru odběratel.

(8) Odběratel si může na svůj náklad osadit na vnitřním vodovodu vlastní podružný vodoměr (například pro byt, ubytovnu, prodejnu, výrobnu, pronajaté prostory). Odpočet z podružného vodoměru nemá vliv na určení množství provozovatelem dodané vody.

(9) Obecné technické podmínky měření množství dodané vody, způsob výpočtu dodané vody, není-li osazen vodoměr, a způsob vypořádání rozdílů podle výsledků přezkoušení vodoměrů stanoví prováděcí právní předpis.

§ 18

Odvádění odpadních vod

(1) Odvedení odpadních vod z pozemku nebo stavby je splněno okamžikem vtoku odpadních vod z kanalizační přípojky do kanalizace.

(2) Kanalizací mohou být odváděny odpadní vody jen v limitech znečištění a v množství stanoveném v kanalizačním řádu a ve smlouvě o odvádění odpadních vod. Odběratel je povinen v místě a rozsahu stanoveném kanalizačním řádem kontrolovat míru znečištění vypouštěných odpadních vod do kanalizace.

(3) V případě, že je kanalizace ukončena čistírnou odpadních vod, není dovoleno vypouštět do této kanalizace odpadní vody přes septiky a čistírny odpadních vod, pokud se nejedná o čistírny odpadních vod k odstranění znečištění, které převyšuje limity znečištění uvedené kanalizačním řádem.

§ 19

Měření odváděných odpadních vod

(1) Množství odpadních vod vypouštěných do kanalizace měří odběratel svým měřicím zařízením, jestliže to stanoví kanalizační řád. Umístění a typ měřicího zařízení se určí ve smlouvě uzavřené mezi odběratelem a vlastníkem vodovodu nebo kanalizace, popřípadě provozovatelem; nedojde-li k uzavření smlouvy, určí umístění a typ měřicího zařízení vodoprávní úřad. Měřicí zařízení podléhá úřednímu ověření podle zvláštních právních předpisů21) a toto ověřování zajišťuje na své náklady odběratel. Provozovatel je oprávněn průběžně kontrolovat funkčnost a správnost měřicího zařízení a odběratel je povinen umožnit provozovateli přístup k tomuto měřicímu zařízení.

(2) Odběratel, který vypouští do kanalizace odpadní vody s obsahem zvlášť nebezpečných látek,22) je povinen v souladu s povolením vodoprávního úřadu měřit míru znečištění a objem odpadních vod a množství zvlášť nebezpečných látek vypouštěných do kanalizace, vést o nich evidenci a výsledky měření předávat vodoprávnímu úřadu, který povolení vydal.

(3) Má-li provozovatel pochybnosti o správnosti měření nebo zjistí-li závadu na měřicím zařízení, má právo požadovat přezkoušení měřicího zařízení. Odběratel je povinen na základě písemné žádosti provozovatele do 30 dnů od doručení žádosti zajistit přezkoušení měřicího zařízení u autorizované zkušebny. Výsledek přezkoušení oznámí písemně odběratel neprodleně provozovateli.

(4) Zjistí-li se při přezkoušení měřicího zařízení vyžádaném provozovatelem, že

a) údaje měřicího zařízení se odchylují od skutečnosti více, než připouští technický předpis tohoto měřicího zařízení, měřicí zařízení se považuje za nefunkční; v tomto případě hradí náklady spojené s výměnou a přezkoušením měřicího zařízení odběratel,

b) údaje měřicího zařízení se neodchylují od skutečnosti více, než připouští příslušný technický předpis, hradí náklady spojené s výměnou a přezkoušením měřicího zařízení provozovatel,

c) měřicí zařízení je vadné, hradí náklady spojené s jeho výměnou a přezkoušením odběratel, který je též povinen neprodleně zajistit jeho výměnu za správné a funkční měřicí zařízení.

(5) Pokud není množství vypouštěných odpadních vod měřeno, předpokládá se, že odběratel, který odebírá vodu z vodovodu, vypouští do kanalizace takové množství vody, které odpovídá zjištění na vodoměru nebo směrným číslům roční potřeby vody, pokud nejsou instalovány vodoměry. V případě, kdy je měřen odběr z vodovodu, ale je také možnost odběru z jiných zdrojů, použijí se ke zjištění spotřeby vody směrná čísla roční potřeby nebo se k naměřenému odběru z vodovodu připočte množství vody získané z jiných, provozovatelem vodovodu měřených zdrojů.

(6) Není-li množství srážkových vod odváděných do jednotné kanalizace přímo přípojkou nebo přes uliční vpust měřeno, vypočte se toto množství způsobem, který stanoví prováděcí právní předpis. Výpočet množství srážkových vod odváděných do jednotné kanalizace musí být uveden ve smlouvě o odvádění odpadních vod.

(7) Jestliže odběratel vodu dodanou vodovodem zčásti spotřebuje bez vypuštění do kanalizace a toto množství je prokazatelně větší než 30 m3 za rok, zjistí se množství vypouštěné odpadní vody do kanalizace buď měřením, nebo odborným výpočtem podle technických propočtů předložených odběratelem a ověřených provozovatelem, pokud se předem provozovatel s odběratelem nedohodli jinak.

(8) Vypořádání rozdílů z nefunkčního měření podle výsledku přezkoušení měřicího zařízení se provádí od odečtu, který předcházel tomu odečtu, který byl důvodem žádosti o přezkoušení měřicího zařízení.

(9) Vypouští-li odběratel do kanalizace vodu z jiných zdrojů než z vodovodu a není-li možno zjistit množství vypouštěné odpadní vody měřením nebo jiným způsobem stanoveným prováděcím právním předpisem, zjistí se množství vypouštěných odpadních vod odborným výpočtem ověřeným provozovatelem.

(10) Obecné technické podmínky měření množství vypouštěných odpadních vod, způsob výpočtu množství vypouštěných odpadních vod a způsob výpočtu množství srážkových vod odváděných do jednotné kanalizace, není-li měření zavedeno, směrná čísla spotřeby vody a způsob vypořádání rozdílů stanoví prováděcí právní předpis.

§ 20

Vodné a stočné

(1) Vodné a stočné má jednosložkovou nebo dvousložkovou formu.

(2) Jednosložková forma je součinem ceny podle cenových předpisů17a) a množství odebrané vody podle § 16 nebo vypouštěných odpadních vod a srážkových vod podle § 19.

(3) Dvousložková forma obsahuje složku, která je součinem ceny podle cenových předpisů17a) a množství odebrané vody podle § 16 nebo vypouštěných odpadních vod a srážkových vod podle § 19 a pevnou složku stanovenou v závislosti na kapacitě vodoměru, profilu přípojky nebo ročního množství odebrané vody. Podíl jednotlivých složek stanoví cenový předpis.17a) Způsob výpočtu pevné složky stanoví prováděcí právní předpis.

(4) Vodné a stočné se hradí v jednosložkové formě, pokud obec nestanoví obecně závaznou vyhláškou vydanou v samostatné působnosti úhradu vodného a stočného ve dvousložkové formě, včetně druhu stanovení pevné složky. O úhradě vodného a stočného ve dvousložkové formě včetně druhu stanovení pevné složky může také rozhodnout nejvyšší orgán právnické osoby, která je vlastníkem vodovodů a kanalizací a ve které výkon hlasovacích práv nejméně ve dvoutřetinové většině drží obce.

(5) Je-li voda dodávána vlastníkem vodovodu, popřípadě jeho provozovatelem jiné osobě, než je odběratel, rozhoduje o formě vodného vlastník tohoto vodovodu.

(6) Povinnost platit za odvádění srážkových vod do kanalizace pro veřejnou potřebu se nevztahuje na plochy dálnic, silnic, místních komunikací a účelových komunikací15) veřejně přístupných, plochy drah celostátních a regionálních včetně pevných zařízení potřebných pro přímé zajištění bezpečnosti a plynulosti drážní dopravy s výjimkou staveb, pozemků nebo jejich částí využívaných pro služby, které nesouvisí s činností provozovatele dráhy nebo drážního dopravce, zoologické zahrady, veřejná a neveřejná pohřebiště a plochy nemovitostí určených k trvalému bydlení a na domácnosti.

(7) Povinnost platit vodné a stočné se nevztahuje na jednotky požární ochrany při záchranných a likvidačních pracích31).

(8) Vlastník vodovodu nebo kanalizace, popřípadě jejich provozovatel, pokud tak vyplývá ze smlouvy uzavřené podle § 8 odst. 2, je povinen předložit odběrateli na jeho žádost úplný výpočet ceny pro vodné a stočné podle struktury uvedené v odstavci 9.

(9) Členění nákladových položek, jejich obsah, objemové a množstevní položky a jejich podíl při výpočtu ceny podle cenových předpisů pro vodné a stočné stanoví prováděcí právní předpis.

Skrýt změny zákona Legenda text přidán text vypuštěn
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); } } }