Močové kameny mohou pacientovi způsobit silné bolesti. Někdy se ale naopak nemusí nijak projevit

30. 5. 2024 7:30
přidejte názor
Autor: Depositphotos.com/Tharakorn

Uvádí se, že zhruba 5 až 10 % celkové lidské populace se v průběhu života potýká s výskytem močových kamenů. Většinou se jedná o pacienty v produktivním věku, avšak dané potíže mohou postihnout i malé děti nebo seniory. Existuje přitom několik typů močových kamenů, které se liší nejen příčinou vzniku, ale také svým složením a umístěním v močových cestách.

Co jsou močové kameny?

Co se dozvíte v článku
  1. Co jsou močové kameny?
  2. Druhy močových kamenů
  3. Příčiny močových kamenů
  4. Jaké mají močové kameny příznaky?
  5. Diagnostika
  6. Močové kameny: léčba 
  7. Prevence močových kamenů

Močové kameny (tzv. konkrementy) představují obecný lékařský termín označující tvrdé usazeniny vznikající z minerálů nebo solí kyselin v moči. Za normálních okolností se jedná o malé objekty procházející bez větších potíží močovými cestami. Když se však zvětší, mohou se zaseknout a způsobit ucpání močového měchýře, močové trubice nebo se usadit kdekoli v močových cestách

Někdy tyto kameny nevyvolávají žádné příznaky, avšak ve chvíli, kdy zablokují močové cesty, může pacient cítit silnou bolest v žebrech, kyčlích, zádech nebo břiše. V případě, že nemohou být samy vyloučeny přirozenou cestou, se odstraňují takzvanou litotrypsií (použití rázových vln) nebo endoskopickou technikou (použití specializovaných nástrojů k prohlížení a operaci vnitřních orgánů). [1, 2, 34]

Druhy močových kamenů

Zmíněné minerální usazeniny se tvoří obvykle v ledvinách a postupem času se mohou přesunout do močovodu nebo močového měchýře. V závislosti na tom, kde se objekt nachází, je označován buď jako kámen močového měchýře, nebo jako ledvinový či uretrální konkrement. Proces tvorby těchto usazenin se pak odborně nazývá urolitiáza, ledvinová litiáza nebo nefrolitiáza.

Asi 85 % močových kamenů je tvořeno vápníkem (kalciumfosfátové konkrementy) a zbytek je složen z různých látek, včetně šťavelanů (oxalátové konkrementy), kyseliny močové, cystinu nebo struvitu. Struvitové kameny, které jsou směsí hořčíku, amoniaku, uhličitanu vápenatého a fosfátů, jsou označovány jako infekční kameny, protože se vytváří pouze v infikované moči. Z cystinu se pak tvoří cystinové kameny, které vznikají v důsledku dědičné metabolické poruchy.

Ledvinové kameny

Konkrementy nacházející se v ledvinách se nazývají ledvinové kameny. Vznikají z krystalů vyskytujících se v moči, které na sebe přitahují další prvky, spojují se a následně vytváří pevnou látku, jež se buď vyloučí z těla, nebo se přesune do jiné části močových cest či případně zůstává právě v ledvině.

Za vznik ledvinových kamenů je zodpovědná celá řada příčin. Mezi ty nejvýznamnější patří nevyvážená strava, dehydratace, nadměrná koncentrace látek tvořících kameny v moči, časté infekce močových cest nebo metabolické poruchy. Některé osoby mají však také genetické predispozice pro rozvoj těchto potíží a mnohdy za nimi stojí i jiné zdravotní problémy,

Uretrální kameny

Dalším typem močového konkrementu je takzvaný uretrální kámen. Jedná se o shluk minerálů a dalších látek, který vytváří pevnou hmotu, jež uvízla v jednom z močovodů, tedy trubici, kterou putuje moč z ledvin do měchýře. Tato trubice je dlouhá přibližně 10 až 12 cm a uretrální kameny se v ní nacházejí buď na konci proximálním, který navazuje na ledvinovou pánvičku, nebo distálním, jenž ústí do močového měchýře.

Drobné kamínky obvykle projdou močovodem bez větších potíží, avšak pokud jsou větších rozměrů, mohou se v trubici zaseknout a blokovat odtok moči do měchýře. Toto zablokování pak vyvolává silné bolesti, které přichází a odeznívají přerušovaně. Většinou jsou tyto bolesti lokalizované v zádech a šíří se do podbřišku.

Kameny močového měchýře

Kameny se do močového měchýře mohou dostat z ledvin, nebo se vytváří přímo v něm při jeho nedostatečném vyprázdnění po použití toalety. Koncentrovaná moč zde může začít krystalizovat, následkem čehož se zde začnou shlukovat přítomné minerály. Kromě toho se močové kameny vytváří také z jakýchkoliv cizích materiálů, které se v měchýři nacházejí. Mezi nejčastější příčiny, které tyto potíže vyvolávají, tak patří:

  • zvětšená prostata,
  • poškození nervů,
  • zánět močového měchýře,
  • zavedení některých lékařských nástrojů (například drén v močovém měchýři),
  • ledvinové kameny. [5, 6, 7, 8, 9, 10, 11]

Příčiny močových kamenů

Jak už bylo naznačeno, kameny se v močových cestách tvoří nejčastěji v důsledku přesycení moči kamenotvornými látkami. Na vině ale může být i změna pH moči nebo obstrukční uropatie. Kromě toho k jejich vzniku někdy dochází také z důvodu, že se v moči nenacházejí takzvané inhibitory krystalizace a agregace. Jedním z takových inhibitorů je například citrát, který se váže s vápníkem.

Výskyt močových kamenů je navíc častější u lidí s určitými zdravotními potížemi, jako je například hyperparatyreóza či renální tubulární acidóza. Stejně tak se ale s danými potížemi mohou potýkat i pacienti, jejichž strava obsahuje velmi vysoký obsah živočišných bílkovin či vitamínu C, nebo osoby, které nepřijímají dostatek tekutin. Vedle toho zvyšují pravděpodobnost výskytu močových kamenů i některé urologické nemoci a další zdravotní stavy, kam patří například:

  • dřeňová houbovitá ledvina,
  • cysta nebo divertikl kalichu,
  • vezikouretrální reflux,
  • podkovovitá ledvina,
  • ureterokéla (otok močovodu),
  • nefrokalcinóza (nadměrná hladina vápníku v ledvinách),
  • hyperparathyreoidismus,
  • onemocnění gastrointestinálního traktu (například Crohnova choroba),
  • sarkoidóza.
Akutní selhání ledvin může pacienta nepříjemně zaskočit. Co ho způsobuje?
Přečtěte si také:

Akutní selhání ledvin může pacienta nepříjemně zaskočit. Co ho způsobuje?

Pokud se v pacientově rodinné anamnéze močové kameny už někdy vyskytly, může být dotyčný k jejich vzniku náchylnější než jiné osoby. Zároveň se dané obtíže objevují častěji také u lidí, kteří podstoupili operaci za účelem snížení hmotnosti, a vzácněji mohou tvorbu močových kamenů způsobit i některé léky. [12, 13, 14, 15]

Jaké mají močové kameny příznaky?

Kameny v močových cestách nemusí vyvolávat vůbec žádné příznaky, ale stejně tak mohou způsobovat i nesnesitelné bolesti a řadu dalších symptomů, jako je třeba přítomnost krve v moči. Intenzita těchto projevů bývá individuální a je ovlivněna různými faktory, kam patří například lokalizace konkrementu nebo jeho velikost.

Typické jsou pro močové kameny projevy související s častou nutkavou potřebou močení, které je zároveň mnohdy velmi bolestivé. Někdy se může dostavit také nevolnost, zvracení, zvýšená teplota nebo takzvaná anurie, což je stav, při kterém dochází k zástavě tvorby moči. Poslední zmíněný příznak je však častější u pacientů, kteří mají jen jednu ledvinu.

Pokud kameny v ledvinách neblokují odtok moči, mohou způsobovat pacientovi nepohodlí a bolest v oblasti beder. V případě, že jiné příznaky dotyčná osoba nezaznamená, může tento symptom jednoduše zaměnit za jiné zdravotní potíže, zejména pak za bolest zad od páteře. Co se týká asymptomatických konkrementů, tak ty zpravidla odhalí až nějaké zobrazovací vyšetření prováděné v rámci stanovení diagnózy jiného zdravotního problému.

Dojde-li však při průchodu kamenu k blokádě odtoku moči z ledviny (takzvaná ledvinová kolika), zažívá pacient obvykle velice bolestivý stav. Bolest přitom začíná v bederní oblasti a dále vystřeluje do břicha a třísel (u mužů někdy i do varlat). Tento příznak často doprovází také nevolnost a zvracení a pro pacienta je poměrně těžké najít polohu, ve které by se mu ulevilo. [16, 17, 18, 19]

Diagnostika

Jestliže se u vás objevil některý z výše uvedených příznaků, zejména pak krev v moči a silné bolesti v oblasti beder a břicha, je potřeba, aby vás prohlédl lékař a zjistil přesnou příčinu vašich potíží. V některých případech jsou symptomy natolik jasné, že lékař pozná ještě před samotným podstoupením různých vyšetření, co vás tíží. Zejména se tak děje v případě, kdy zjistí, že jste již někdy močové kameny měli.

V prvé řadě je proto potřeba tak jako u každého vyšetření zjistit informace o pacientově anamnéze a o příznacích, které jej trápí. Jelikož se močové kameny někdy projevují stejně jako jiné zdravotní potíže, je potřeba provést určitá vyšetření, aby lékaři mohli zjistit, zda se místo močových kamenů nejedná o některý z následujících zdravotních stavů:

Za jeden z nejefektivnějších diagnostických přístupů se v současné době považuje CT vyšetření, které dokáže odhalit i jiné zdravotní potíže, které mohou způsobovat podobné příznaky jako močové kameny. Jeho alternativou je pak třeba ultrasonografie, rentgen břicha nebo takzvaná vylučovací urografie, což je rentgen močových cest, ledvin a měchýře pomocí kontrastní látky. Kromě zobrazovacích metod se pak zpravidla provádí také vyšetření moči. [20, 21, 22, 23]

Močové kameny: léčba 

Malé kameny, které nezpůsobují žádné příznaky ani neblokují močové cesty nebo nevyvolávají infekci, obvykle není nutné léčit, jelikož je tělo většinou samo vyloučí při močení. Jinak je tomu ovšem v případě kamenů, které přesahují velikost zhruba 5 mm, a těch, co jsou blíže ledvinám. Ty totiž zpravidla močovými cestami samy bez potíží neprojdou.

Pokud jde o to, jak odstranit močový kámen, tak lékaři často využívají takzvanou litorypsii, což je metoda, při níž se konkrementy v ledvinové pánvičce nebo horní části močovodu rozbijí rázovou vlnou. Tento zákrok se provádí u kamenů dosahujících maximální velikosti 1 cm. Takto rozbité kameny jsou pak jednoduše samy vyplaveny močí z těla ven.

Jak jste se léčili s močovými kameny?

Je-li potřeba vyloučit uretrální kameny ze spodní části močovodu, zavádí se přes močový měchýř do trubice ureteroskop, což je druh endoskopu, kterým se konkrementy odstraní. K eliminaci větších kamenů se pak používá takzvaná perkutánní nefrolitotomie. Jedná se o zákrok, při kterém se přes malý řez na zádech zavede do ledviny teleskopická trubice (nefroskop), prostřednictvím které je možné do postiženého místa zavést sondu, jež kámen rozbije na menší kousky. [24, 25, 26, 27, 28]

Prevence močových kamenů

V případě, že se ve vašem močovém ústrojí kámen už někdy vytvořil, existuje určitá pravděpodobnost, že k tomuto jevu dojde časem znova. Aby bylo možné takové situaci předejít, je potřeba zjistit příčinu, proč k jejich vzniku dochází. Za tímto účelem lze podstoupit metabolické vyšetření a provést laboratorní rozbor předchozího močového kamene.

Pokud byl kámen vyloučen přirozenou cestou sám, je vhodné jej zachytit a odnést lékaři, který jej následně odešle k analýze. Co se týká metabolického vyšetření, tak to zahrnuje odběr krve a analýzu vzorku moči. Podle toho, co odhalí uvedené rozbory, pak lékař stanoví příčinu potíží a doporučí vám, jaká preventivní opatření je potřeba dodržovat.

Je-li příčinou vzniku kamenů nízký objem moči, je potřeba začít přijímat více tekutin, a to ideálně ve formě čisté vody. V případě nadměrného množství vápníku v moči pak pacient může užívat thiazidová diuretika, jejichž účelem je snížení vylučování vápníku do moče. Dále by měla dotyčná osoba snížit příjem sodíku a stejně jako v předchozím případě také navýšit příjem tekutin.

Další příčinou může být nízký obsah citrátů v moči. V případě, že má pacient nízkou hladinu draslíku v krvi, předepíše mu lékař k užívání citrát draselný. Je-li hladina draslíku naopak moc vysoká, předepisuje se jako doplněk stravy citrát sodný nebo hydrogenuhličitan sodný. Zvýšit citráty v moči je pak dle některých zdrojů navíc také možné konzumací citrusových plodů.

U případů, kde je za vznik kamenů zodpovědné vysoké množství šťavelanů v moči, je potřeba dodržovat speciální dietu, aby došlo k omezení příjmu této látky. Zároveň je nutné přijímat denně doporučené množství vápníku a dodržovat dostatečný pitný režim. Při zvýšeném obsahu kyseliny močové je pak nezbytné zase omezit živočišné bílkoviny ve stravě, a to samé platí také v momentě, kdy za vznikem konkrementů stojí příliš vysoké pH moči. [29, 30, 21, 32]

Zdroje: fnbrno.cz, cus.cz, ciselniky.dasta.mzcr.cz, kntb.cz, med.unc.edu, kidney.org, vinmec.com, my.clevelandclinic.org, baysideurology.com.au, pennmedicine.org, mayoclinic.org, msdmanuals.com, wikiskripta.eu, tanurology.com.sg, uroklinikum.cz, patients.uroweb.org, urol.fnplzen.cz

  • Žádné názory
  • Našli jste v článku chybu?
'; 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'; } }
'; 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 »