(function () { 'use strict'; // ========================================= // ОСНОВНЫЕ НАСТРОЙКИ // ========================================= const METRIKA_ID = 45608397; const CONSENT_COOKIE = 'kvartiryConsentV1'; const CONSENT_DAYS = 180; const COOKIE_DOMAIN = 'kvartiry-posutochno16.ru'; const POLICY_URL = 'https://kvartiry-posutochno16.ru/policy/'; const COOKIES_URL = 'https://kvartiry-posutochno16.ru/cookies/'; const CONSENT_URL = 'https://kvartiry-posutochno16.ru/consent/'; // Используем ту же страницу запрета рекламы, // что и на сайте «Электрики16». const NO_SPAM_URL = 'https://elektriki16.ru/no-spam/'; const METRIKA_INFO_URL = 'https://yandex.com/support/metrica/ru/code/data-collected.html'; const COOKIE_INFO_URL = 'https://yandex.ru/adv/edu/materials/cookie-chto-ehto-takoe'; const WEBVISOR_INFO_URL = 'https://yandex.ru/support/metrica/ru/webvisor/info'; const currentScript = document.currentScript; let metrikaStarted = false; let settings = null; // ========================================= // ЧТЕНИЕ СОГЛАСИЯ // ========================================= function getConsent() { const prefix = CONSENT_COOKIE + '='; const parts = document.cookie.split(';'); for (let i = 0; i < parts.length; i++) { const part = parts[i].trim(); if (part.indexOf(prefix) !== 0) { continue; } try { const value = JSON.parse( decodeURIComponent( part.substring(prefix.length) ) ); if ( value && typeof value.analytics === 'boolean' ) { return value; } return null; } catch (e) { return null; } } return null; } // ========================================= // СОХРАНЕНИЕ СОГЛАСИЯ // ========================================= function saveConsent(analytics) { const value = { necessary: true, analytics: Boolean(analytics), updated: Date.now() }; const maxAge = CONSENT_DAYS * 86400; const expires = new Date( Date.now() + maxAge * 1000 ).toUTCString(); document.cookie = CONSENT_COOKIE + '=' + encodeURIComponent(JSON.stringify(value)) + '; Expires=' + expires + '; Max-Age=' + maxAge + '; Path=/' + '; Domain=' + COOKIE_DOMAIN + '; SameSite=Lax' + (location.protocol === 'https:' ? '; Secure' : ''); return value; } // ========================================= // ЯНДЕКС.МЕТРИКА // Запуск только после согласия // ========================================= function startMetrika() { if ( metrikaStarted || !settings || settings.analytics !== true ) { return; } const currentConsent = getConsent(); if ( !currentConsent || currentConsent.analytics !== true ) { return; } metrikaStarted = true; // Не загружаем второй экземпляр tag.js, // если очередь ym уже создана. if (typeof window.ym !== 'function') { (function (m, e, t, r, i, k, a) { m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments); }; m[i].l = 1 * new Date(); k = e.createElement(t); a = e.getElementsByTagName(t)[0]; k.async = 1; k.src = r; a.parentNode.insertBefore(k, a); })( window, document, 'script', 'https://mc.yandex.ru/metrika/tag.js', 'ym' ); } window.ym(METRIKA_ID, 'init', { webvisor: true, clickmap: true, accurateTrackBounce: true, trackLinks: true }); } // ========================================= // СОЗДАНИЕ ОБЩЕГО МОДУЛЯ // ========================================= function init() { if (document.getElementById('site-cookie-module')) { return; } if (!document.body) { return; } const root = document.createElement('div'); root.id = 'site-cookie-module'; root.innerHTML = ` `; // ========================================= // ВСТАВКА МОДУЛЯ // ========================================= if ( currentScript && currentScript.parentNode ) { currentScript.parentNode.insertBefore( root, currentScript.nextSibling ); } else { ( document.querySelector('footer') || document.body ).appendChild(root); } // ========================================= // ЭЛЕМЕНТЫ УПРАВЛЕНИЯ // ========================================= const panel = root.querySelector('#cc-panel'); const settingsPanel = root.querySelector('#cc-settings'); const analyticsCheckbox = root.querySelector('#cc-analytics'); // ========================================= // ПОКАЗ И СКРЫТИЕ COOKIE // Баннер рекламы здесь не скрывается // ========================================= function hidePanel() { panel.hidden = true; settingsPanel.hidden = true; } function showSettings() { panel.hidden = false; settingsPanel.hidden = false; const saved = getConsent(); analyticsCheckbox.checked = Boolean( saved ? saved.analytics : settings && settings.analytics ); } // ========================================= // ПРИМЕНЕНИЕ СОГЛАСИЯ // ========================================= function applyConsent(analytics, reloadIfRevoked) { const previouslyEnabled = Boolean( settings && settings.analytics ); settings = saveConsent(analytics); window.dispatchEvent( new CustomEvent('siteCookieConsentChanged', { detail: { necessary: true, analytics: Boolean(analytics) } }) ); hidePanel(); if (analytics) { startMetrika(); } else if ( previouslyEnabled && reloadIfRevoked ) { window.location.reload(); } } // ========================================= // ОБРАБОТЧИКИ КНОПОК // ========================================= root.querySelector('#cc-accept').addEventListener( 'click', function () { applyConsent(true, false); } ); root.querySelector('#cc-reject').addEventListener( 'click', function () { applyConsent(false, true); } ); root.querySelector('#cc-open-settings').addEventListener( 'click', showSettings ); root.querySelector('#cc-settings-link').addEventListener( 'click', showSettings ); root.querySelector('#cc-save').addEventListener( 'click', function () { applyConsent( analyticsCheckbox.checked, true ); } ); root.querySelector('#cc-cancel').addEventListener( 'click', function () { if (getConsent()) { hidePanel(); } else { settingsPanel.hidden = true; } } ); // ========================================= // ВОССТАНОВЛЕНИЕ СОГЛАСИЯ // ========================================= const saved = getConsent(); if (saved) { settings = saved; hidePanel(); if (settings.analytics) { startMetrika(); } } else { settings = { necessary: true, analytics: false }; // При первом посещении показываем окно cookie. // Предупреждение о рекламе остаётся видимым всегда. panel.hidden = false; } } // ========================================= // ЗАПУСК // ========================================= if (document.readyState === 'loading') { document.addEventListener( 'DOMContentLoaded', init, { once: true } ); } else { init(); } })();