Kdy začíná platit smlouva a jak se počítají lhůty a čas při plnění povinností?

17. 4. 2025
Doba čtení: 6 minut

Sdílet

Muž s vyděšeným pohledem na přesýpací hodiny.
Autor: Depositphotos.com, podle licence: Public Domain CC0
Ilustrační obrázek
Kdy přesně vzniká nebo zaniká určité právo nebo povinnost? A co když je povinnost jednoho vzájemně podmíněná s právem druhého a naopak? Když má být něco vykonáno v určitý den – do kolika hodin?

Pro vznik a zánik práv a povinností během dne a stejně i pro jejich splnění během určitého dne, konkrétních 24 hodin, určuje pravidla občanský zákoník v ustanoveních § 601 a § 602.

  • Podle ust. § 601 odst. 1 nabývá-li se právo nebo vzniká-li povinnost v určitý den, nabude se nebo vznikne počátkem toho dne; zaniká-li právo nebo povinnost v určitý den, zanikne koncem toho dne. To neplatí, vylučuje-li to povaha právního případu.
  • Podle ust. § 601 odst. 2 podmiňuje-li zánik určitého práva vznik jiného práva ve vzájemné návaznosti, nastává oboje v týž okamžik. Není-li ujednáno nebo stanoveno něco jiného, nastane takový právní účinek koncem dne.

Co znamenají slova zákona?

Jestliže tedy vzniká právo (nebo vzniká, nastupuje určitá povinnost) v určitý den, váže se jejich vznik k počátku dne (0:00 hod.) a zánik ke konci dne (24:00 hod.). To neplatí pouze v případě, pokud to vylučuje povaha právního předpisu. Takový specialitami se ale zabývat nebudeme. 

Možná se jako autor článku mýlím, ale domnívám se, že 24:00 hod. jednoho dne je totéž jako 0:00 hod. A tak mám za to, že právo vzniká (nabývá se) nebo povinnost vzniká až v 0:01 (nebo chcete-li 0:00.00.01) začínajícího dne. 

Ačkoliv vesměs se v pojednáních o dané problematice uvádějí uvedené časy 0:00 hod. a 24:00 hod. Vlastně přitom ani žádný čas 0:00 neexistuje, jde o 24:00 předchozího dne. Podobně jako neexistuje žádný rok 0, nýbrž jen rok mínus 1 př. n. l. resp. př. Kr., čili před naším letopočtem či pro věřící v Ježíše Krista před narozením Ježíše Krista, a pak rok (plus) 1 n. l. (našeho letopočtu).

Pokud jsou však 2 práva vzájemně návazná, pak jedno zaniká a druhé vzniká v týž okamžik.  Nestanoví-li zákon jinak nebo nedohodnou-li se strany jinak, je tímto okamžikem konec dne.

Ještě podrobnější vysvětlení

Ust. § 601 odst. 1 občanského zákoníku, určující, k jakému okamžiku nastává následek v podobě vzniku nebo zániku subjektivního práva či povinnosti, lze vztáhnout toliko na situace, kdy dochází izolovaně pouze k jedné z popsaných situací. Tedy buď ke vzniku subjektivního práva či povinnosti, anebo k jejich zániku, vysvětluje Nejvyšší soud ČR v rozsudku spis. zn. 27 Cdo 1120/2023, ze dne 28. 8. 2024. 

Nelze jej naopak aplikovat na případy, kdy na sebe zánik a vznik subjektivního práva bezprostředně navazují.

Je-li zánik jednoho subjektivního práva předpokladem vzniku druhého (tedy nejde-li o pouhou časovou souslednost), je třeba při posuzování rozhodného okamžiku aplikovat pravidlo zakotvené v ust. § 601 odst. 2 občanského zákoníku

Zákon pro tyto případy podpůrně (neujednají-li si strany anebo nestanoví-li zákon něco jiného) upravuje pravidlo, že takový právní následek nastane ne začátkem, ale až koncem určitého dne. 

Ostatně, aplikace ust. § 601 odst. 1 občanského zákoníku na takovou situaci by byla  nesmyslná – došlo by k překryvu obou práv v určitý (poslední) den, navzdory tomu, že zánik prvního práva je předpokladem vzniku druhého a že toto právo nemůže svědčit současně dvěma osobám najednou.

Příklady

A tak třeba nájemní právo vzniká v 0:00 resp. 0:01 prvního dne trvání nájemního poměru založeného nájemní smlouvou. A končí ve 24:00 posledního dne výpovědní lhůty na základě uplatněné výpovědi.

Naproti tomu účinky darovací smlouvy movité věci, například šperku, na jejímž základě pozbývá její vlastnictví jeden subjekt a nabývá jej druhý subjekt, nastanou ve 24:00 dne, kdy došlo k darování, čili uzavření darovací smlouvy. Ta přitom nemusí být písemná – ostatně, copak se uzavírá písemná smlouva třeba ohledně běžných dárků k narozeninám či k Vánocům?

Podobně, jak vyložil Nejvyšší soud ČR, v rozsudku spis. zn. 27 Cdo 1120/2023, ze dne 28. 8. 2024, účinnost smlouvy o postoupení pohledávky (ust. § 1879 a násl. občanského zákoníku) pozbývá postupitel postoupenou pohledávku (přestává být jejím věřitelem) a nabývá ji (jejím věřitelem se stává) postupník, a to ve smyslu ust. § 601 odst. 2 občanského zákoníku

Jinak řečeno, nabytí pohledávky postupníkem je „podmíněno“ pozbytím této pohledávky postupitelem ve smyslu ust. § 601 odst. 2 občanského zákoníku.

Kdy je nutné splnit povinnosti a jak se počítají lhůty?

Pokud je splnění nějaké povinnosti nebo nabytí práva vázáno na lhůtu, pak se postupuje při jejím počítání a určení jejího nejzazšího momentu, především podle ust. § 605 a § 607 občanského zákoníku.

Lhůta určená podle dnů začíná ve smyslu ust. § 605 odst. 1 občanského zákoníku až dnem, který následuje po skutečnosti rozhodné pro její počátek.

  • Příklad: Pokud závazek vznikl např. 3. dne kalendářního měsíce, počíná patnáctidenní lhůta běžet 4. kalendářní den a skončí 18. kalendářní den. – 19. den už je dlužník v prodlení, pokud nesplnil závazek, nebo případně i věřitel, pokud nepřijal dlužníkovo plnění.

Konec lhůty určené podle týdnů, měsíců nebo let pak připadá na den, který se pojmenováním nebo číslem shoduje se dnem, na který připadá skutečnost, od níž se lhůta nebo doba počítá. Není-li takový den v posledním měsíci, připadne konec lhůty nebo doby na poslední den měsíce. Tato pravidla vyplývají z ust. § 605 odst. 2. občanského zákoníku.

  • Příklad: Pokud např. závazek vznikne 29. 2. 2028 s tím, že má být vyrovnán do 5 let, potom konec lhůty připadne na 28. 2. 2033.

Posunutí splnění povinnosti nebo vznik práva na nejbližší pracovní den

Připadne-li poslední den lhůty na sobotu, neděli nebo svátek, je posledním dnem lhůty  pracovní den nejblíže následující, jak vyplývá z ust. § 607 občanského zákoníku.

V kolik hodin denní doby má být plněna povinnost nebo vykonáno právo?

Má-li se právo vykonat nebo povinnost splnit v určitý den nebo do určitého dne, vyžaduje se podle ust. § 602 občanského zákoníku, aby se tak stalo v obvyklou denní dobu. Ledaže něco jiného plyne ze zvyklostí, ze zavedené praxe stran, popřípadě ze zvláštních okolností případu. 

Takže je zapotřebí, aby ke splnění povinnosti nebo výkonu práva, k nimž má dojít v určitý den nebo podle formulace například smlouvy nebo zákona do určitého dne, došlo v obvyklou denní dobu (např. v otevírací nebo pracovní dobu), anebo do 22:00 hod. u fyzické osoby doma, pokud má být plněno takto. Pokud má například nájemce bytu uhradit v hotovosti nájemné u pana majitele činžovního domu nejpozději v určitý den.

Obdobně by naopak nejdřívější výkon práva nebo nejdřívější plnění povinnosti neměly nastat před 6:00 hod. Vycházíme z nočního klidu mezi 22:00 až do 6:00 druhého dne.

Pokud by tedy nebyl uhrazen např. určitý dluh splatný v hotovosti do 22:00 na určeném platebním místě, protože by chtěl dlužník platit např. až ve 23:30, máme za to, že se ocitá v prodlení dlužník (nikoliv věřitel, který není povinen plnění, například peníze, přijmout po desáté hodině večerní). 

A tak by mohly takzvaně naskočit některé sankce za prodlení vůči dlužníkovi, například povinnost uhradit úrok z prodlení nebo smluvní pokutu stanovenou za každý den prodlení. 

skoleni_12_6

Ale vážnější důsledky jako povinnost uhradit vysokou smluvní pokutu, jejíž výše není odvozována od počtu dnů prodlení – byla by tedy stejná v případě prodlení 1 den nebo třeba 1 měsíc – nebo případné zesplatnění dluhu, pokud by je oprávněná strana vymáhala, by zřejmě byly v rozporu s dobrými mravy, respektive by šlo o zneužití práva ze strany oprávněné osoby.

Na co si musíte dát pozor, když platíte ve splátkách? Čím vás může věřitel potrestat? Přečtěte si také:

Na co si musíte dát pozor, když platíte ve splátkách? Čím vás může věřitel potrestat?

 

K tomu by došlo v případě, pokud by prokázal dlužník, že byl skutečně schopen plnit v poslední den lhůty, jen nedokázal dodržet čas běžné denní doby. Pokud bude nějaký takový případ řešící danou problematiku ve sporném případě projednáván a řešen Nejvyšším soudem a vzejdou z něj zajímavé a poučné a všeobecně použitelné závěry, budeme vás informovat.

Autor článku

Nenadávejte právníkům, zákony netvoří zdaleka jen oni. Oni je pak jen zašmodrchávají ve prospěch svých klientů, třeba zrovna vás. Budu se však snažit vám je vysvětlovat.

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