Artróza ramene pacientům brání ve výkonu běžných činností. Jak ji léčit?

25. 2. 2022 7:30
5 nových názorů
Autor: Depositphotos

Zaznamenali jste v poslední době nepříjemnou bolest ramene, která se objevuje hlavně při zátěži? Nebo snad bolest pociťujete i v klidu a všimli jste si, že začíná omezovat rozsah vašich pohybů? Na vině by mohla být artróza ramenního kloubu, která se často rozvíjí s přibývajícím věkem. Může být ale i důsledkem starých zranění, zánětlivých procesů či dlouhodobého přetěžování.

Co je artróza?

Co se dozvíte v článku
  1. Co je artróza?
  2. Stupně artrózy
  3. Anatomie ramene
  4. Artróza ramene
  5. Příčiny artrózy ramene
  6. Rizikové faktory pro artrózu ramene
  7. Mechanismus artrózy ramene
  8. Jaké má artróza ramene příznaky?
  9. Diagnostika
  10. Léčba artrózy ramene

Pod tímto názvem se ukrývá degenerativní onemocnění, které má na svědomí poruchu obnovy kloubní chrupavky a změny kostí i přilehlých tkání. U pacientů dochází k tvorbě nových kostních výrůstků na okrajích kloubů, které se označují jako osteofyty. Zdegenerovaná chrupavka pak ztrácí svou pružnost, rychleji se opotřebovává a nemocným způsobuje bolest či ztrátu hybnosti.

Osteoartróza, jak se těmto obtížím také říká, představuje nejčastější onemocnění kloubů, které postihuje především starší část populace. Údajně se s ní potýká až 70 % pacientů starších 65 let, přičemž u lidí ve věku od 45 do 65 let se četnost pohybuje kolem 40 %. Stále častěji však artróza trápí i mladé pacienty, a to především aktivní sportovce.

Typickým znakem artrózy je její progresivní charakter, což znamená, že jakmile se u pacienta rozvine, velice rychle dochází k poklesu funkčních schopností. Výrazně se snižuje pohyblivost postiženého kloubu a s výskytem řady nepříjemných obtíží souvisí také zhoršení kvality života. Nejčastěji přitom pacienty trápí:

  • artróza ramene (omartróza),
  • artróza kyčle (koxartróza),
  • artróza kolene (spondylartróza).

Kromě výše zmíněných obtíží se mohou objevit i další zdravotní problémy, jako je například artróza páteře, artróza prstů ruky (malých kloubních spojů) nebo třeba artróza kotníků. Obecně totiž může toto onemocnění postihnout prakticky jakýkoliv kloub lidského těla, ale nejvíce bývají zasaženy právě ty, které jsou nosné (koleno, kyčel). [12]

Stupně artrózy

Ačkoliv k opotřebení kloubů samozřejmě dochází také v důsledku běžného pohybu a vyvíjené zátěže, lidské tělo si s tím obvykle dokáže poradit prostřednictvím neustálého obnovování chrupavek. Za rozvojem artrózy stojí mechanické opotřebení spojené se sníženou schopností obnovy těchto tkání, které je tak velké, že způsobí zásadní změny struktury a vlastností kloubů i jejich přilehlých částí.

Pacient se pak ocitá v začarovaném kruhu, jelikož zároveň s chrupavkami bývají zasaženy také okolní tkáně, které artróza výrazně oslabuje, čímž se obtíže ještě zhoršují. Následně dochází ke zmenšení prostoru mezi jednotlivými kostmi, zhoršení pohyblivosti a vzniku kloubních deformit i dalších obtíží. V závislosti na tom, jak moc je artróza u pacienta pokročilá, lékaři rozlišují několik stádií tohoto onemocnění:

  • artróza I. stupně – chrupavka se postupně ztenčuje a dochází k zúžení kloubní štěrbiny,
  • artróza II. stupně – kloubní štěrbina se nadále zužuje, objevují se drobné nerovnosti kloubních ploch a viditelná bývá také změna struktury,
  • artróza III. stupně – kromě další progrese zužování kloubní štěrbiny dochází k tvorbě osteofytů a pseudocyst, ale i dalších problémů, jako je osteoporóza a osteoskleróza,
  • artróza IV. stupně – kloubní štěrbina zcela mizí, na koncích kloubů je jasně patrná deformace a výrazné jsou i osteonekrotické změny nebo patologické postavení kloubu (těžká artróza). [3, 4]

Anatomie ramene

Ramenní kloub (articulatio humeri), který se označuje také jako kloub skapulohumerální či humeroskapulární, představuje spojení pažní kosti skrze její hlavici s lopatkou a klíční kostí. Jde o nejpohyblivější kloub celého lidského těla, jenž umožňuje člověku hýbat horní končetinou všemi možnými směry. To je dáno anatomickou stavbou ramene i funkcí okolních svalů a tkání.

Jamka ramenního kloubu je poměrně mělká, menší než hlavice pažní kosti a doplněná o vazivový kloubní lem. Hlavice kosti pažní se pak o jamku opírá pouze čtvrtinou nebo třetinou své plochy, přičemž zbytek je zapřený o kloubní pouzdro, které je volné, dlouhé a zřasené. Zesilují ho šlachy svalů, které se nachází v okolí kloubu, a kloubní vazy. Pro náležitou funkci ramenního kloubu je pak velice důležitá jeho správná poloha a svalová rovnováha.

Artróza ramene

Jako artróza ramenního kloubu (omartróza) se označuje postupné opotřebení kloubní chrupavky v oblasti ramene, které pacientům způsobuje nepříjemnou bolest a zároveň i celkovou ztuhlost. Povrch kloubu postupně degeneruje a subchondrální kost se remodeluje, čímž ztrácí svou kulovitost a kongruitu. Zároveň zesílí také kloubní pouzdro, což vede k další ztrátě hybnosti.

Artróza ramene není tak častá jako třeba artróza kolenního kloubu nebo kyčlí, jelikož nejde o nosný kloub, takže na něj není vyvíjen tak velký tlak. Dokonce i středně závažná osteoartróza ramenního kloubu však pacientům může způsobit chronickou tupou bolest nebo občasné vzplanutí intenzivní bolesti, která dokáže člověka probudit ze spánku a znemožňuje mu výkon běžných činností. [5, 6]

Příčiny artrózy ramene

Obecně rozlišujeme dva druhy osteoartrózy ramene, a to konkrétně typ primární a typ sekundární. Zatímco původce primární artrózy ramenního kloubu není známý (ačkoliv někteří lékaři předpokládají, že na vině bývá metabolická porucha tvorby chrupavčité tkáně), sekundární artróza ramene je důsledkem jiného onemocnění, infekce, zranění nebo deformace.

Ke vzniku artrózy ramenního kloubu výrazně přispívá jakékoliv mechanické poškození v dané oblasti, tedy například dřívější dislokace kloubu, odchylka z osy nebo jeho celková nestabilita. Dlouhodobě nesprávné uložení hlavice pažní kosti v jamce totiž nadměrně zatěžuje chrupavčitou tkáň, která následně začne degenerovat. Mezi konkrétní příčiny artrózy se přitom řadí například:

  • vrozené vývojové vady či atypický tvar kloubních ploch,
  • dlouhodobé namáhání ramenního kloubu,
  • jednostranné či asymetrické přetěžování ramene,
  • zánětlivé procesy v kloubu a okolních strukturách,
  • instabilita (nestálost a nevyrovnanost ramenního kloubu),
  • onemocnění či úraz ramene (ruptura svalů rotátorové manžety),
  • špatně zahojená kost po zlomenině,
  • dřívější operace ramenního kloubu,
  • dlouhodobě neléčený impingement syndrom,
  • genetické predispozice (nižší kvalita chrupavky). [7, 8, 9]

Rizikové faktory pro artrózu ramene

Ačkoliv se artróza ramenního kloubu může u člověka rozvinout zcela nečekaně, podle lékařů zde zhruba v 90 % případů hraje roli spojení hned několika různých rizikových faktorů. K těm se řadí především:

  • pohlaví – ženy bývají postiženy více než muži,
  • vyšší věk – artróza ramene nejčastěji trápí pacienty po padesátce,
  • dědičnost – rodinný výskyt onemocnění,
  • vrozené vady – například špatné postavení kostí,
  • nízká pohybová aktivita a špatné složení jídelníčku,
  • obezita – často spojená se systémovým zánětem,
  • životní styl – některá povolání nebo sportovní aktivity,
  • svalové dysbalance – například zkrácení prsních svalů,
  • kloubní infekce, úrazy, poranění či onemocnění. [10]

Mechanismus artrózy ramene

V prvních stádiích artrózy dochází k destrukci povrchové části chrupavky, a to hlavně v místě kloubní jamky, která je tvořena lopatkou, ale později také na kloubní hlavici pažní kosti, kde se navíc často tvoří osteofyty. Ztráta chrupavky, která bývá výrazně opotřebovaná, pak ovlivní biomechaniku ramene, přičemž dochází ke tření o kost a brzy se dostaví také nepříjemná bolest.

Kloubní pouzdro se pak často smršťuje, u svalů rotátorové manžety se někdy objevuje kontraktura a podobně reagují i vzdálenější části lidského těla, jako jsou například žebra nebo krční, hrudní a bederní páteř. Tato místa se pak v některých případech mohou reflexně zablokovat, čímž vznikají svalové dysbalance v oblasti pacientova krku, trupu i celé horní končetiny.

Pokud artrózu ramenního kloubu doprovází také zánět, chrupavka bývá postižena v celém svém rozsahu. Vlivem zánětu přitom dochází ke zmnožení synoviální tekutiny, okolí kloubu se zahřívá a objevuje se nepříjemná bolest. Okolní měkké tkáně (šlachy, vazy a burzy) na to reagují tak, že se reflexivně stahují (hypertonus), podléhají nadměrnému tření a mohou se také zanítit. [11, 12]

Trápí vás artróza ramene?

Jaké má artróza ramene příznaky?

Do lékařské ordinace pacienty obvykle přivádí nesnesitelná bolest ramene, která se zpočátku objevuje pouze při nějaké výraznější zátěži, ale později ji může nemocný pociťovat prakticky při jakémkoliv pohybu. V konečném stádiu pak bolest začíná pacienta obtěžovat i v klidovém stavu a dokonce ho může budit ze spánku. Někdy pak vyzařuje také do paže, lokte nebo zápěstí.

S bolestivými projevy souvisí i celková ztuhlost a snížená hybnost ramenního kloubu, která může výrazně omezit pacientův pohybový rozsah. Často se navíc pojí se zkracováním některých svalů (svalové dysbalance). Problémy lidé nejprve pociťují při zevní rotaci, ale později mohou zaznamenat také neschopnost zvednout paži nad hlavu a potíže jim činí také vnitřní rotace.

Vlivem zhoršující se bolesti pacienti využívají postiženou paži čím dál méně, což vede k oslabení některých svalů a dalším pohybovým omezením. To nemocného limituje nejen při práci a sportovních aktivitách, ale často i při běžných každodenních činnostech, jako je čištění zubů, česání, mytí hlavy, sprchování nebo třeba oblékání.

Postupná degenerace kloubní chrupavky a tvorba osteofytů může následně způsobit změnu postavení kloubu, což současně omezuje pohyb ramene a často i celé horní končetiny. Kromě toho mohou pacienti zaznamenat krepitus. Jde o zvuk, který vzniká třením ploch o sebe a v tomto případě se při pohybu kloubu projevuje jako cvakání, lupání, křupání nebo praskání.

Jelikož postižení ramenního kloubu omezuje tělo v pohybu, zároveň se snižuje prokrvení daného místa i okolních tkání. Právě z toho důvodu se může objevit otok, zarudnutí nebo horkost v oblasti postiženého kloubu. Aby toho nebylo málo, někdy se může rameno zablokovat a objevují se i blokády kloubů páteře, klíčních kostí, žeber, loktů či lopatek, což souvisí také se silnými bolestmi hlavy. [13, 14, 15]

Diagnostika

Artróza v rameni přivádí pacienty do lékařské ordinace obvykle ve chvíli, kdy pacient začne pociťovat silnou bolest při pohybu horní končetiny nebo si všimne, že není schopný provádět některé činnosti, které se mu dříve zdály naprosto běžné. K odhalení tohoto problému se kromě pacientovy anamnézy používá také fyzikální a kineziologické vyšetření.

Lékaře bude zajímat hlavně pohybový rozsah ramenního kloubu (aktivní i pasivní), zkrácení nebo oslabení svalů v dané oblasti a případná citlivost na dotek. Kromě toho se zaměří na jakékoliv známky úrazu, poškození kloubu či předchozích operací, ale bude si všímat i známek zranění svalů, šlach a vazů, které postižený kloub obklopují.

Důležitá je i skutečnost, zda se problémy týkají také dalších kloubů, což by mohlo indikovat, že na vině je revmatoidní artritida. Dále pak bude lékař zkoumat i bolest ramene v různých pozicích (při zvyšování tlaku a zátěže), přítomnost otoků či zarudnutí a samozřejmě i krepitus (skřípání uvnitř kloubu), který se objevuje, když pacient pohybuje ramenem či paží.

Mezi další prováděná vyšetření se pak řadí také rentgen, který lékařům odhalí, zda došlo k úbytku chrupavčité tkáně postiženého kloubu a zúžení kloubní štěrbiny. Také může poukázat na přítomnost osteofytů. Kromě toho může lékař požadovat i další testy, kam se řadí například:

  • krevní obraz (k vyloučení jiných obtíží),
  • odběr synoviální tekutiny,
  • magnetická rezonance,
  • CT vyšetření,
  • ultrazvuk. [16, 17, 18]

Léčba artrózy ramene

Jelikož se artróza ramenního kloubu řadí mezi degenerativní onemocnění, je nutné začít ji léčit co nejdříve, jakmile lékař odhalí přesnou diagnózu. Pacienti by také měli vzít v úvahu, že vzniklé změny budou s největší pravděpodobností trvalé, ale nejsou neměnné. Množství kloubní chrupavky se může i nadále snižovat, a proto je nutné co nejrychleji začít problém řešit.

Důležitou součástí léčby je odhalení příčiny obtíží. Pokud se to lékařům podaří, je možné zaměřit se na její odstranění, čímž by se měl také následně zlepšit pacientův stav. Jde přitom hlavně o úpravu chybných pohybových stereotypů, ale pomoci může také snížení hmotnosti. Pokud je příčina onemocnění neznámá, je nutné soustředit se hlavně na ovlivnění jednotlivých příznaků. Léčba pak může být konzervativní, farmakologická či operativní. [19]

Konzervativní léčba

Stejně jako u jiných artritických stavů bývá i v případě artrózy ramenního kloubu léčba nejprve konzervativní. Pokud na ni pacientův organismus dobře reaguje, artrotický proces se může výrazně zpomalit, bolest ustupuje a operaci je možné odložit nebo dokonce zcela vynechat. Pro každého je ovšem vhodný jiný způsob léčby, a proto je nutné vyzkoušet různé terapeutické metody.

V první řadě se doporučuje především změna pohybových stereotypů. To spočívá v omezení činností, které situaci zhoršují a vyvolávají nepříjemnou bolest, což zahrnuje třeba některé sportovní aktivity, zvedání těžkých břemen nebo jinou fyzickou námahu (často v zaměstnání). Kromě toho lékaři doporučují pravidelné cvičení a fyzioterapii, s čímž ovšem souvisí i nutnost dostatečného odpočinku.

Pokud jde o fyzioterapii, jejím cílem je zmírnit bolestivost, zvýšit hybnost ramene a umožnit člověku, aby se opět mohl věnovat běžným činnostem. Protahování a posilování svalů v oblasti ramenního kloubu pak může také zabránit ztuhlosti a funguje i jako prevence proti rozvoji dalších degenerativních změn. Vždy je však nutné situaci konzultovat s fyzioterapeutem, provádět pohyby pod jeho dohledem, sestavit s ním individuální cvičební plán a dodržovat jeho doporučení.

Fyzioterapie v tomto případě zahrnuje hlavně provádění technik měkkých tkání, které pomáhají snížit napětí ve svalech. Manuálně je možné uvolnit reflexní křeče prsního svalstva, širokého zádového svalu, svalstva krční páteře nebo třeba svalů lopatky. Zatímco svaly v hypertonu se pak fyzioterapeut snaží hlavně uvolnit, oslabené svalstvo by měl s pacientem naopak posilovat.

V rámci fyzioterapie se provádí také šetrná ruční trakce a důležitou součástí je i mobilizace ramenního kloubu a okolních struktur (včetně obnovení pohyblivosti krční a hrudní páteře) nebo terapie zaměřená na obnovení funkční koordinace mezi postiženými svaly a svalovými skupinami. K posílení svalů se pak dají využít i různé rehabilitační pomůcky, jako je Thera-Band, balanční podložka Bosu, Propriomed nebo Flowin. [20, 21]

Další možnosti neoperativní léčby

Jako doplněk konzervativní léčby je možné v akutní fázi aplikovat Priessnitzův obklad, který pomáhá mírnit zánětlivé procesy. Někteří lékaři pak doporučují dvakrát až třikrát denně na rameno přikládat studené zábaly (na dobu 20–30 minut), což by mělo snížit bolest, zatímco jiní dávají přednost aplikaci tepla. Kromě toho pak mohou nemocným pomoci také další léčebné metody, jako jsou:

Farmakologická léčba

Terapie osteoartrózy ramenního kloubu se často neobejde bez využití medikamentů. Pro snížení bolestivosti se podávají nesteroidní protizánětlivé léky (známé také jako nesteroidní antirevmatika, nesteroidní antiflogistika či NSAID), jako je například ibuprofen, diklofenac nebo aspirin. Kromě toho mohou pomoci také analgetika, kam patří hlavně paracetamol, a někdy se doporučují i léky známé jako SYSADOA, což jsou symptomatické pomalu působící léky při osteoartróze. [24, 25]

Chirurgická léčba

Jestliže konzervativní ani farmakologická terapie nepřinese pacientovi úlevu a jeho obtíže se nezmírní, je nutné přistoupit k operačnímu řešení. Vhodný zákrok přitom lékař vybírá na základě několika faktorů, kam patří například věk pacienta, pohybové zatížení postiženého kloubu, přidružená onemocnění a samozřejmě i další rizikové činitele, které mají na onemocnění svůj vliv.

Jednou z operativních metod, která se při artróze ramene často používá, je artroskopie. Kloub se v tomto případě naplní sterilním roztokem, dovnitř se zavede endoskop a lékař může kloubní dutinu prohlédnout i ošetřit. Jde o miniinvazivní metodu, při které je možné provést artroskopický debridement (vyčištění) vnitřku kloubu, což sníží tření v rameni a pacientovi uleví od bolesti.

Další možností je pak artrodéza, což je zákrok, který je vhodný hlavně pro pacienty mladší 50 let s těžkou artrózou ramenního kloubu nebo pro pacienty, kteří nemohou podstoupit totální endoprotézu. Jde nicméně o řešení nevratné, které vede k trvalému znehybnění daného kloubu. Lékaři při této operaci vytvoří srůst hlavice a jamky ramenního kloubu, čímž se místo stabilizuje a zastaví se progrese onemocnění.

Pokud je situace vážná, často se provádí totální endoprotéza kloubu (TEP), což je zákrok označovaný také jako artroplastika. Při této operaci lékaři nahradí hlavici pažní kosti i jamku ramenního kloubu chirurgickým materiálem, což pacientům uleví od bolesti. Jde o řešení, které sice má dlouhodobý efekt, ale zároveň vyžaduje také dlouhé zotavování a pravidelné rehabilitace.

Kromě toho pak existují i další možnosti léčby, jako je hemiartroplastika, kdy lékaři za umělou komponentu nahradí pouze hlavici pažní kosti, nebo reverzní totální endoprotéza ramene, jež se využívá hlavně u pacientů s poškozenou rotátorovou manžetou. V tomto případě si materiál, který slouží jako náhrada hlavice pažní kosti a náhrada jamky, vymění místo. [26, 27, 28]

Zdroje: hopkinsmedicine.org, orthoinfo.aaos.org, ncbi.nlm.nih.gov, webmd.com, arthritis.org, arthritis-health.com, fyzioklinika.cz, labtestsonline.cz

Najbrt (neregistrovaný)
Od svých 57 let pravdelně cvičím ve fitku s výjimkou dvou posledních let, kdy jsem přestal kvůli hrozící nákaze COVID-19. Letos jsem jej v březnu ale prodělal (omikron), takže v červnu jsem se k posilování opět vrátil. Nikdy jsem necvičil pouze silově, ale v rovnováze mezi aerobní a silovou složkou. Od těch 57 let (17 let, je mi 74) dodržuji zdravou výživu bez uzenin, vepřového masa, tučných mléčných výrobků, s velkým množstvím zeleniny a zcela bez zbytečného piva ! Poté, co jsem přestal cvičit v posilovně jsem zakoupil domů Veslovací trenažér zn. XEBEX a téměř denně na něm vesloval cca 35 minut. Po návratu do fitka jsem se snažil rychle obnovit svalový úbytek zejména cvičením na kladkách, zřejmě s nepřiměřenou zátěží a zvedáním rukou až nad ramena. V srpnu jsem ráno zjistil, že při některých pohybech zabolí levé rameno. Ortoped indikoval po rentgenovém vyšetření artrozu ramenního kloubu II-III a po kortikoidu na uklidnění jsem dostal placenou hyaluronou injekci. Po týdnu opět začínám cvičit na veslařském trenažeru s malou intenzitou, hybnost ramene není nijak omezena, ale občasné zabolení existuje i nadále ! Uvítal bych zkušenosti někoho podobně postiženého, abych se připravil na zřemě neradostnou budoucnost. Uvítal bych, kdyby se ozval někdo s podobnými problémy a
MUDr. Thai Bao Han (neregistrovaný)
Dobrý den, artróza bohužel nejde vyléčit a další namáhání ramene může bolesti zhoršovat. Já osobně doporučuji už pouze přirozený pohyb s malou váhou, ale lépe určitě poradí rehabilitační lékař či fyzioterapeut.
Marie (neregistrovaný)
Jsem cvičitelka, z důvodů, že máme v rodinné anamnéze artrózu kloubů, beru od 32 let kolagenové preparáty. Jím v omezené míře brambory, které mohou urychlit artrózu. V mládí jsem brala Colafit, který postačí na doplnění stravy, není nutné každý den. Později Proenzi, když bylo s kyselinou hyaluronovou, od 50 let beru doplňky stravy na klouby od Barnyse INOVO 6, INOVO 5 , které se mi zdají nejlepší. Díky tomu, že jsem nikdy neměla nadváhu, brala jsem od 32 let doplňky s kolagenem, pozdějí přípravky s MSM, chondroitin, glukosamin, kyselina hyaluronová, kolagen 1 a 2.Přestože celý život sportuji nemám ani ve svých 62 let artrózu 1. stupně.
karel vlček (neregistrovaný)
DÍKY ZA INFO. Cvičím a někdy, při klicích, pociťuji bolest v pravém rameni. Rozhodl jsem se to nešponovat. Koneckonců nejsem nejmladší.
  • 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 »