1/* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2 COOKIE-CONSENT â модÑÐ»Ñ ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ / ÑоглаÑÐ¸Ñ Ð½Ð° cookie 3 ТеаÑÑ Ð½Ð° Таганке 4 5 window.CookieConsent â пÑблиÑнÑй API Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑÐ¸Ñ 6 ÑкÑипÑов без пÑавок ÑдÑа модÑлÑ. 7 8 ЧТРÐÐÐÐÐТ ÐÐÐУÐЬ: 9 â ÑиÑÐ°ÐµÑ cookie вÑбоÑа и оÑдаÑÑ ÐµÐ³Ð¾ ÑоÑÑоÑние наÑÑжÑ; 10 â пиÑÐµÑ cookie пÑи нажаÑии кнопок; 11 â пÑи оÑказе гаÑÐ¸Ñ Consent Mode, ÑиÑÑÐ¸Ñ Ñвои cookie аналиÑики 12 и пеÑезагÑÑÐ¶Ð°ÐµÑ ÑÑÑаниÑÑ; 13 â пеÑеоÑкÑÑÐ²Ð°ÐµÑ Ð¿Ð»Ð°ÑÐºÑ Ð¿Ð¾ кнопке в подвале. 14 15 ЧÐÐÐ ÐÐÐУÐЬ ÐÐ ÐÐÐÐÐТ: 16 â не ÑеÑаеÑ, показÑваÑÑ Ð»Ð¸ плаÑÐºÑ Ð¿Ñи пеÑвой загÑÑзке: 17 ÑÑо Ð´ÐµÐ»Ð°ÐµÑ ÑеÑвеÑ, добавлÑÑ ÐºÐ»Ð°ÑÑ .is-visible пÑи оÑÑÑÑÑÑвии 18 cookie (ваÑÐ¸Ð°Ð½Ñ A â полноÑÑÑаниÑного кÑÑа неÑ); 19 â не генеÑиÑÑÐµÑ ÑазмеÑкÑ: вÑÑ Ð²ÑÑÑÑка пÑÐ¸Ñ Ð¾Ð´Ð¸Ñ Ð¸Ð· Ñаблона CMS; 20 â не пиÑÐµÑ inline-ÑÑили: ÑолÑко клаÑÑÑ is-* и аÑÑибÑÑÑ. 21 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 22 23(function () { 24 'use strict'; 25 26 var COOKIE_NAME = 'theatre_cookie_consent'; 27 var COOKIE_VERSION = 1; 28 var MAX_AGE = 31536000; /* 12 меÑÑÑев в ÑекÑÐ½Ð´Ð°Ñ */ 29 30 /* Cookie аналиÑики, доÑÑÑпнÑе ÑайÑÑ Ð½Ð° ÑвоÑм домене. 31 Cookie ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð² (.mc.yandex.ru и подобнÑе) ÑдалиÑÑ 32 ÑÑедÑÑвами ÑайÑа невозможно â ÑÑо огÑаниÑение опиÑано в полиÑике. */ 33 var ANALYTICS_COOKIE_NAMES = ['_ga', '_gid', '_gat', '_ym_uid', '_ym_d', '_ym_isad', '_ym_visorc']; 34 var ANALYTICS_COOKIE_PREFIXES = ['_ga_', '_gat_', '_ym_']; 35 36 var root = null; 37 var mode = 'consent'; 38 var state = null; 39 var listeners = []; 40 var lastTrigger = null; 41 42 43 /* ââââââââââââââââââââââââââââââââââââââââââââââââ 44 Ð ÐÐÐТРС COOKIE 45 ââââââââââââââââââââââââââââââââââââââââââââââââ */ 46 47 /* Ðомен веÑÑ Ð½ÐµÐ³Ð¾ ÑÑовнÑ, ÑÑÐ¾Ð±Ñ Ð²ÑÐ±Ð¾Ñ Ð´ÐµÐ¹ÑÑвовал и на 48 tagankateatr.ru, и на m.tagankateatr.ru. 49 Ðожно пеÑеопÑеделиÑÑ Ð°ÑÑибÑÑом data-consent-domain. */ 50 function cookieDomain() { 51 if (root && root.dataset.consentDomain) return root.dataset.consentDomain; 52 var parts = location.hostname.split('.'); 53 if (parts.length < 2) return ''; /* localhost â host-only */ 54 return '.' + parts.slice(-2).join('.'); 55 } 56 57 function readRaw(name) { 58 var match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)')); 59 return match ? decodeURIComponent(match[1]) : null; 60 } 61 62 function writeState(next) { 63 var domain = cookieDomain(); 64 var value = encodeURIComponent(JSON.stringify(next)); 65 document.cookie = COOKIE_NAME + '=' + value + 66 ';path=/' + 67 (domain ? ';domain=' + domain : '') + 68 ';max-age=' + MAX_AGE + 69 ';SameSite=Lax' + 70 (location.protocol === 'https:' ? ';Secure' : ''); 71 state = next; 72 } 73 74 function readState() { 75 var raw = readRaw(COOKIE_NAME); 76 if (!raw) return null; 77 try { 78 var parsed = JSON.parse(raw); 79 if (!parsed || parsed.v !== COOKIE_VERSION) return null; 80 return parsed; 81 } catch (e) { 82 return null; 83 } 84 } 85 86 function dropCookie(name) { 87 var domain = cookieDomain(); 88 var paths = ['/', location.pathname]; 89 var hosts = ['', location.hostname, domain]; 90 for (var p = 0; p < paths.length; p++) { 91 for (var h = 0; h < hosts.length; h++) { 92 document.cookie = name + '=;path=' + paths[p] + 93 (hosts[h] ? ';domain=' + hosts[h] : '') + 94 ';max-age=0'; 95 } 96 } 97 } 98 99 function clearAnalyticsCookies() { 100 var all = document.cookie.split(';'); 101 for (var i = 0; i < all.length; i++) { 102 var name = all[i].split('=')[0].trim(); 103 if (!name) continue; 104 105 var match = ANALYTICS_COOKIE_NAMES.indexOf(name) !== -1; 106 if (!match) { 107 for (var p = 0; p < ANALYTICS_COOKIE_PREFIXES.length; p++) { 108 if (name.indexOf(ANALYTICS_COOKIE_PREFIXES[p]) === 0) { match = true; break; } 109 } 110 } 111 if (match) dropCookie(name); 112 } 113 } 114 115 116 /* ââââââââââââââââââââââââââââââââââââââââââââââââ 117 СÐСТÐЯÐÐÐ Ð ÐÐÐÐÐСÐÐ 118 ââââââââââââââââââââââââââââââââââââââââââââââââ */ 119 120 function categories() { 121 return { 122 necessary: true, 123 analytics: state ? state.analytics === true : false 124 }; 125 } 126 127 function notify() { 128 var value = categories(); 129 for (var i = 0; i < listeners.length; i++) {
130 try { listeners[i](value); } catch (e) { /* подпиÑÑик не должен ломаÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ */ } 131 } 132 } 133 134 /* Google Consent Mode v2. ÐеÑÐ¾Ð»Ñ (granted) вÑÑÑавлÑеÑÑÑ Ð² Ñаблоне 135 до иниÑиализаÑии GTM â здеÑÑ ÑолÑко ÑеакÑÐ¸Ñ Ð½Ð° вÑбоÑ. */ 136 function pushConsentMode(granted) { 137 if (typeof window.gtag === 'function') { 138 window.gtag('consent', 'update', { 139 analytics_storage: granted ? 'granted' : 'denied', 140 ad_storage: 'denied', 141 ad_user_data: 'denied', 142 ad_personalization: 'denied' 143 }); 144 } 145 window.dataLayer = window.dataLayer || []; 146 window.dataLayer.push({ 147 event: 'cookie_consent_update', 148 consent: { analytics: granted } 149 }); 150 } 151 152 153 /* ââââââââââââââââââââââââââââââââââââââââââââââââ 154 ÐÐÐÐРРСÐРЫТÐÐ ÐÐÐШÐÐ 155 ââââââââââââââââââââââââââââââââââââââââââââââââ */ 156 157 function show(trigger) { 158 if (!root) return; 159 lastTrigger = trigger || null; 160 root.classList.add('is-visible'); 161 root.removeAttribute('aria-hidden'); 162 } 163 164 function hide() { 165 if (!root) return; 166 167 /* СнÑÑÑ ÑокÑÑ Ñ Ð¿Ð¾Ñомка до aria-hidden â пÑавило пÑоекÑа, 168 инаÑе бÑаÑÐ·ÐµÑ ÑÑгаеÑÑÑ Ð½Ð° focused descendant. */ 169 if (root.contains(document.activeElement)) document.activeElement.blur(); 170 171 root.classList.remove('is-visible'); 172 root.setAttribute('aria-hidden', 'true'); 173 174 if (lastTrigger && document.contains(lastTrigger)) lastTrigger.focus(); 175 lastTrigger = null; 176 } 177 178 179 /* ââââââââââââââââââââââââââââââââââââââââââââââââ 180 ÐÐÐ ÐÐÐТЧÐÐÐ ÐÐÐÐÐÐ 181 ââââââââââââââââââââââââââââââââââââââââââââââââ */ 182 183 function record(analytics) { 184 writeState({ 185 v: COOKIE_VERSION, 186 mode: mode, 187 analytics: mode === 'notice' ? null : analytics, 188 ts: new Date().toISOString() 189 }); 190 } 191 192 function onAccept() { 193 record(true); 194 pushConsentMode(true); 195 hide(); 196 notify(); 197 } 198 199 function onDecline() { 200 record(false); 201 pushConsentMode(false); 202 clearAnalyticsCookies(); 203 hide(); 204 notify(); 205 /* ÐеÑезагÑÑзка вÑгÑÑÐ¶Ð°ÐµÑ Ñже ÑабоÑаÑÑие ÑÑÑÑÑики. 206 Ðа ÑледÑÑÑем ÑендеÑе ÑеÑÐ²ÐµÑ Ð¸Ñ Ð½Ðµ подÑÑавиÑ. */ 207 location.reload(); 208 } 209 210 /* ÐÑеÑÑик (ÑолÑко Ñежим notice): ниÑего не ÑÐ¾Ñ ÑанÑеÑ, 211 плаÑка веÑнÑÑÑÑ Ð¿Ñи ÑледÑÑÑем визиÑе. */ 212 function onClose() { 213 hide(); 214 } 215 216 function onKeydown(e) { 217 if (e.key !== 'Escape') return; 218 if (!root || !root.classList.contains('is-visible')) return; 219 /* Рполном Ñежиме Esc не закÑÑÐ²Ð°ÐµÑ â ÑÑо бÑл Ð±Ñ Ð¾Ð±Ñ Ð¾Ð´ вÑбоÑа. */ 220 if (mode === 'notice') onClose(); 221 } 222 223 224 /* ââââââââââââââââââââââââââââââââââââââââââââââââ 225 ÐÐÐЦÐÐÐÐÐÐЦÐЯ 226 ââââââââââââââââââââââââââââââââââââââââââââââââ */ 227 228 function init() { 229 root = document.querySelector('.cookie-consent'); 230 if (!root) return; 231 232 mode = root.dataset.consentMode === 'notice' ? 'notice' : 'consent'; 233 state = readState(); 234 235 /* СÑÑÐ°Ñ Ð¾Ð²ÐºÐ° на ÑлÑÑай ÑÐ¼ÐµÐ½Ñ Ñежима notice â consent: 236 вÑбоÑ, ÑделаннÑй в Ñежиме ÑведомлениÑ, не заÑÑиÑÑваеÑÑÑ 237 как ÑоглаÑие. ÐÑновнÑÑ Ð¿ÑовеÑÐºÑ Ð´ÐµÐ»Ð°ÐµÑ ÑеÑвеÑ, ÑÑа â 238 на ÑлÑÑай ÑаÑÑÐ¸Ð½Ñ ÑонизаÑии Ñаблонов Ð¼ÐµÐ¶Ð´Ñ Ñ Ð¾ÑÑами. */ 239 if (state && mode === 'consent' && state.mode === 'notice') { 240 show(); 241 } 242 243 var accept = root.querySelector('.cookie-consent__btn--accept'); 244 var decline = root.querySelector('.cookie-consent__btn--decline'); 245 var close = root.querySelector('.cookie-consent__close'); 246 247 if (accept) accept.addEventListener('click', onAccept); 248 if (decline) decline.addEventListener('click', onDecline); 249 if (close) close.addEventListener('click', onClose); 250 251 document.addEventListener('keydown', onKeydown); 252 253 /* Ðнопка «ÐаÑÑÑойки cookie» в подвале â Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ одна 254 (в ÑÑÑеÑе копиÑÐ°Ð¹Ñ Ð¿ÑодÑблиÑован Ð´Ð»Ñ Ð´ÐµÑкÑопа и мобилки). */
255 var openers = document.querySelectorAll('[data-cookie-settings]'); 256 for (var i = 0; i < openers.length; i++) { 257 openers[i].addEventListener('click', function (e) { show(e.currentTarget); }); 258 } 259 260 window.CookieConsent.destroy = function () { 261 if (accept) accept.removeEventListener('click', onAccept); 262 if (decline) decline.removeEventListener('click', onDecline); 263 if (close) close.removeEventListener('click', onClose); 264 document.removeEventListener('keydown', onKeydown); 265 listeners = []; 266 }; 267 } 268 269 270 /* ââââââââââââââââââââââââââââââââââââââââââââââââ 271 ÐУÐÐÐЧÐЫРAPI 272 ââââââââââââââââââââââââââââââââââââââââââââââââ */ 273 274 window.CookieConsent = { 275 /* ТекÑÑее ÑоÑÑоÑние каÑегоÑий: { necessary, analytics } */ 276 get: function () { return categories(); }, 277 278 /* РазÑеÑена ли каÑегоÑиÑ: CookieConsent.has('analytics') */ 279 has: function (category) { return categories()[category] === true; }, 280 281 /* ÐодпиÑка на изменение вÑбоÑа. ÐозвÑаÑÐ°ÐµÑ ÑÑнкÑÐ¸Ñ Ð¾ÑпиÑки. */ 282 onChange: function (fn) { 283 if (typeof fn !== 'function') return function () {}; 284 listeners.push(fn); 285 return function () { 286 var i = listeners.indexOf(fn); 287 if (i !== -1) listeners.splice(i, 1); 288 }; 289 }, 290 291 /* ÐÑкÑÑÑÑ Ð¿Ð»Ð°ÑÐºÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ (кнопка в подвале) */ 292 open: function () { show(); }, 293 294 /* Сделан ли вÑÐ±Ð¾Ñ Ð²Ð¾Ð¾Ð±Ñе */ 295 isAnswered: function () { return state !== null; }, 296 297 destroy: function () {} 298 }; 299 300 if (document.readyState === 'loading') { 301 document.addEventListener('DOMContentLoaded', init); 302 } else { 303 init(); 304 } 305})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.