Kde loni otevřeli praktici a zubaři nové ordinace? Stále jich víc končí, než začíná

7. 2. 2024

Sdílet

V tuzemsku loni otevřely nové ordinace desítky zubařů či praktických lékařů, a to i pro děti. Pojišťovna a kraje je lákaly do lokalit, kde chybí nejvíce. I tak ale situace není růžová, protože víc lékařů odchází, než přibývá.

Litoměřicko, Karvinsko, Liberecko. To jsou příklady tří okresů, kde se loni podařilo otevřít nejvíc nových ordinací praktických lékařů nebo stomatologů. V každém jmenovaném tři. Například na Karvinsku vznikly konkrétně v Bohumíně, Dolní Lutyni a Dětmarovicích.

Co se dozvíte v článku
  1. Pomoc z krajů i obcí
  2. Kde otevíraly nové ambulance
  3. Nové ordinace při nemocnicích
  4. Příklady z Jihomoravského kraje
  5. Lékaři chybějí ve 243 obcích
  6. Více ordinací zavírá

Příklady vychází ze seznamu Všeobecné zdravotní pojišťovny (VZP), která je největší na trhu. Na konci ledna zveřejnila předběžný soupis okresů s nově otevřenými ordinacemi. Jsou na něm ty, jež v roce 2023 čerpaly finanční podporu z programu VZP Plus, tedy až 800 tisíc korun na otevření praxe v oblastech, kde dětským i dospělým pacientům chybí základní zdravotní péče.

Celkem se v celé ČR díky pobídce pojišťovny otevřelo 47 nových ordinací ve 28 okresech a 13 krajích. Ambulance praktických lékařů pro děti a dorost vznikly loni nově také při 11 nemocnicích.

Nové ordinace otevřeli lékaři, kteří se vracejí po rodičovské nebo odcházejí z nemocničních ambulancí. O tom, že by se ale výrazně zvýšil celkový počet praktických lékařů třeba příchodem nového, silného ročníku, se mluvit nedá, říká pro Vitalia.cz ředitel VZP Zdeněk Kabátek.

Pomoc z krajů i obcí

Otevíraly se i další ordinace, které v seznamu VZP uvedené nejsou. Třeba v Jihomoravském kraji mají nově dětského praktika v Nemocnici Vyškov a v Brně čtyři nová pracoviště zubařů (viz box níže).

Kromě VZP vznik nových ordinací podporují samotná města, obce či kraje. Nejde jen o jednorázový příspěvek na vybavení ordinace nebo navýšení úhrad za vykázanou zdravotní péči, ale třeba i několikaleté dotování platu zdravotní sestry. Míra pomoci, stejně jako její formy, se liší.

Kde otevíraly nové ambulance

Jde o pracoviště nově zřízená v roce 2023.

Praktický lékař pro děti a dorost

Loni se otevřelo 11 nových ordinací, které využily VZP Plus, v okresech: Praha, Mělník, Nymburk, Praha-východ, Liberec, Semily, Třebíč (2), Břeclav, Hodonín, Olomouc.

Všeobecný praktický lékař

Loni se otevřelo 17 nových ordinací v okresech: Příbram, Domažlice, Cheb (2), Karlovy Vary (2), Děčín, Louny, Most (2), Liberec (2), Havlíčkův Brod, Třebíč, Břeclav, Kroměříž (2).

Praktický zubní lékař

Loni se otevíralo 19 nových ordinací v okresech: Příbram, Děčín, Litoměřice (3), Louny, Liberec (2), Rychnov nad Kněžnou, Trutnov, Pardubice, Ústí nad Orlicí, Vyškov, Bruntál (2), Karviná (3), Nový Jičín.

Zdroj: VZP

Násobená pomoc zafungovala třeba v Třebíči, kde se loni o městskou dotaci úspěšně přihlásili dva zájemci a získali i podporu VZP. Novou ordinaci pro dospělé ve městě od 1. července otevřela společnost MP Medicare. Od 1. srpna mají také novou ordinaci pro děti a dorost společnosti MiniMedica.

Dotace pro pediatry a praktické lékaře spustila Třebíč loni, peníze jdou z městského rozpočtu. K programu město přistoupilo zejména z toho důvodu, že někteří lékaři, hlavně pediatři, odešli do důchodu, vysvětluje místostarosta Třebíče Miloš Hrůza. Městský úřad je každý rok ochotný lékařům rozdělit celkem dva miliony korun. Má ale podmínky: ordinace musí být otevřena pět dní v týdnu a vždy minimálně čtyři hodiny denně. Podporu je město schopné nově otevřené ordinaci vyplácet pět nebo deset let.

Nové ordinace při nemocnicích

Seznam nemocnic, ve kterých vznikly nové ordinace praktických lékařů pro děti a dorost v roce 2023.

  • Všeobecná fakultní nemocnice v Praze
  • Oblastní nemocnice Příbram (2 ordinace)
  • Nemocnice Tábor
  • Stodská nemocnice
  • Nemocnice Kadaň
  • Oblastní nemocnice Náchod
  • Nemocnice Pelhřimov
  • Nemocnice Havlíčkův Brod
  • Nemocnice Kyjov
  • Fakultní nemocnice Ostrava

Zdroj: VZP

Nejde ovšem jen o peníze, ale i o poskytnutí zázemí pro nové ordinace a pomoc s administrativou. Jihomoravský kraj zřídil nové ambulance ve vlastních nemocnicích. Nové lékaře krajský úřad aktivně vyhledává a pomáhá jim s nezbytným vydáním souhlasu s poskytováním zdravotních služeb či s akreditací, aby si lékaři ve svých ordinacích mohli vychovat zástupce. Podle mluvčí úřadu Aleny Knotkové je důležitá také spolupráce se zdravotními pojišťovnami, městy, obcemi i školami a také, aby pomoc všech stran byla koordinovaná.

Ne vždy také pomoc míří přímo do ordinací. Třeba v Libereckém kraji podpora lékařům směřuje přes obce. Kraj vyhlašuje podruhé dotační program pro obce na podporu primární péče, protože vnímá stále nedostatek praktických lékařů pro dospělé i pro děti a také zubních lékařů, kteří uzavírají smlouvy se zdravotní pojišťovnou, popisuje radní pro zdravotnictví Vladimír Richter.

Příklady z Jihomoravského kraje

Praktické lékařství pro děti a dorost – loni krajský úřad zřídil dvě ordinace přímo ve svých nemocnicích (Kyjov, Vyškov) a nově otevřely také tři ambulance těchto lékařek:

  • Martina Machajdíková, Novosedly (okres Břeclav)
  • Soňa Jelínková, Lužice (okres Hodonín)
  • Vlasta Bučková, Znojmo (okres Znojmo)

Všeobecné praktické lékařství – pro dospělé se loni otevřely tři ambulance praktických lékařů:

  • Klinika Podané ruce, Mikulov (okres Břeclav)
  • Efertus healtcare, Brno
  • Hana Jahorná, Blučina (okres Brno-venkov)

Zubní lékařství – loni otevřelo 13 nových stomatologických ordinací těchto lékařů a firem:

  • Jitka Peřina, Brno
  • Zuby pro život, Brno
  • Lupodent, Vyškov
  • Marwan Sajed, Brno
  • Třetí zuby Pohořelice, Pohořelice
  • Simona Dufková, Blansko
  • Jitka Filipová, Brno
  • ReDens, Hodonín
  • Lenka Kočárková, Břeclav
  • EklaDent, Vyškov
  • Karolína Hanáková, Dolní Bojanovice
  • Veronika Zálešáková, Hustopeče
  • Veronika Vitouchová, Blansko

Zdroj: Krajský úřad Jihomoravského kraje

Lékaři chybějí ve 243 obcích

Navzdory desítkám otevřených ordinací však v některých částech republiky zubní či praktičtí všeobecní lékaři stále chybějí.

Třeba na Karvinsku sice loni otevřely tři nové ordinace, v samotné Karviné ale ani jedna. 

Statutární město Karviná se snaží přilákat nové zubaře, ale zatím se to příliš nedaří, říká mluvčí města Lukáš Hudeček. „Důvodem nedostatku zubařů v Karviné je hlavně jejich odchod do důchodu. Ti, kteří skončili, se většinou starali o cca 2200 až 2500 pacientů. Nově přicházející zubaři však přijímají zhruba 750 pacientů a dělají řadu úkonů za přímou úhradu,“ dodal mluvčí.

V primární péči je ve všech okresech Jihomoravského kraje situace neutěšená. V současné době lékaři primární péče chybí nejvíce v okresech Blansko, Hodonín a Znojmo, podotýká také mluvčí krajského úřadu Alena Knotková.

Nedostatek lékařů se přitom týká i velkých měst. Některé obvody bez pokrytí všeobecným praktickým lékařem máme i v Praze a zatím se nám to i přes naše snahy nedaří změnit, podotýká místopředsedkyně správní rady VZP, poslankyně Věra Adámková.

Podle online seznamů lokalit, kde lékaři dostanou přednostně smlouvy, zveřejňovaných VZP je v ČR aktuálně 96 oblastí, v nichž chybí dětští praktici. V 90 místech hledají zubaře a v 57 obcích by rádi viděli otevřenou ordinaci praktického lékaře pro dospělé.

Galerie: Kde chybí lékaři a jakým tempem mizí ordinace

Více ordinací zavírá

Neutěšenou situaci v dostupnosti dětských praktických lékařů na konci loňského roku prezentoval na sjezdu lékařské komory ředitel Ústavu zdravotnických informací a statistiky (ÚZIS) Ladislav Dušek. Vyčíslil, že bez základní lékařské péče je zhruba 180 tisíc dětí. Navíc v následujících pěti až sedmi letech do důchodu může odejít 700 až 900 lékařů. 

Ladislav Dušek také ukázal data, která ukazují, že v letech 2018 až 2022 síť dětských praktiků přišla o celkem 336 ordinací. Ukázalo se také, že i přes otevírání nových praxí je stále více těch, které končí. A to platí také pro praktické lékaře pro dospělé.

Ředitel VZP připustil, že trend, kdy více ordinací zavírá, než otevírá, se zatím nepodařilo zastavit. 

To je potřeba si přiznat. Chceme proto zintenzivnit snahu oslovovat lékaře, aby zřizovali nové ordinace nebo se přihlásili do programu VZP Plus a získali bonifikace za navýšení kapacity počtu registrovaných klientů, říká Zdeněk Kabátek.

Pro rok 2024 si VZP žádnou metu v počtu nově otevřených ordinací nestanovila. Lékařů je výrazný nedostatek, a pokud by se nám podařilo zopakovat příběh loňského roku, byl by to úspěch, dodává ředitel pojišťovny.

Dětských psychologů a psychiatrů se nedostává. Kde jinde hledat pomoc? Přečtěte si také:

Dětských psychologů a psychiatrů se nedostává. Kde jinde hledat pomoc?

V ČR přitom zdaleka nechybějí jen lékaři primární péče. Zcela kritická je situace v dětské a dorostové psychiatrii, kde podle šéfa ÚZIS bylo k 10. červenci 2023 lékařů s touto specializací dohromady jen 198, z toho 83 ve věku 60 let a více let. 

Dalším příkladem jsou diabetologové. Těch v ČR pracuje 914 a jejich průměrný věk je 53 let. Z toho 499 lékařů působí v ambulancích, těch ale ubývá. Mezi 2018 až 2022 systém přišel celkem o 50 pracovišť. Diabetes přitom patří mezi onemocnění, u kterého přibývá pacientů. 

Autor článku

Redaktorka Vitalia.cz. Vystudovala žurnalistiku a češtinu na Univerzitě Palackého v Olomouci, pracovala v Deníku, na webu TV Nova a iDNES.cz. Píše o zdravotnictví. Je držitelkou novinářských cen Psychiatrické společností ČLS JEP za rok 2021 a 2022. 

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