PageSourceSearch

https://www.gdefoto.com/assets/cookie-consent.js?v=1788470490

js gdefoto.com collected 2026-10-03 20:00:12 UTC 11,245 bytes, 221 lines download raw bytes

1/**
2 * Cookie-баннер: одна строка внизу экрана.
3 * RU (без языкового префикса в URL): accept-only, ссылки на политику и правила загрузки.
4 * Локали (/en|/es|/de|/it|/fr|/pt|/ja|/ko|/pl|/nl/): GDPR-режим, Accept + Reject; на reject
5 *   ставим opt-out для аналитики (best-effort).
6 * Show once -> выбор сохраняется в localStorage + cookie на 1 год.
7 * Пока баннер виден, задаёт --fm-marquee-h = своей высоте: chat.js поднимает кнопку чата на эту величину.
8 *
9 * Для теста: открыть URL с ?cookietest=1 (баннер появится несмотря на выбор).
10 * Кастомизация: window.GdfCookieConsent (опционально, переопределяет строки).
11 * 2026-09-03: карточка в 4-5 строк (до 21% экрана телефона) ужата до полосы в 1-2 строки.
12 */
13(function () {
14  if (window.__gdfCookieConsentLoaded) return;
15  window.__gdfCookieConsentLoaded = true;
16
17  var KEY = 'gdf_cookie_consent_v1';
18  var forceShow = /(?:[?&])cookietest=1\b/.test(location.search);
19
20  // --- locale detection by first URL segment ---
21  var seg = (location.pathname.split('/')[1] || '').toLowerCase();
22  var LOC = (['en', 'es', 'de', 'it', 'fr', 'pt', 'ja', 'ko', 'pl', 'nl'].indexOf(seg) !== -1) ? seg : 'ru';
23  // Тул-страницы несут локаль в ?lang= (путь всегда /tools/..., без языкового сегмента).
24  if (LOC === 'ru' && /^\/tools\//.test(location.pathname)) {
25    var _ql = ((location.search.match(/[?&]lang=([a-z]{2})\b/i) || [])[1] || '').toLowerCase();
26    if (['en', 'es', 'de', 'it', 'fr', 'pt', 'ja', 'ko', 'pl', 'nl'].indexOf(_ql) !== -1) LOC = _ql;
27  }
28  var isGdpr = (LOC !== 'ru');
29
30  // GA4 / Yandex ids for opt-out on reject (site1)
31  var GA4 = 'G-H8EVRNCXPK';
32  var YA = '95584902';
33
34  if (!forceShow) {
35    var ls = null;
36    try { ls = localStorage.getItem(KEY); } catch (e) { /* localStorage blocked */ }
37    if (ls === 'accepted' || ls === 'rejected') { if (ls === 'rejected') applyOptOut(); return; }
38    if (document.cookie.indexOf(KEY + '=accepted') !== -1) {
39      try { localStorage.setItem(KEY, 'accepted'); } catch (e) {}
40      return;
41    }
42    if (document.cookie.indexOf(KEY + '=rejected') !== -1) {
43      try { localStorage.setItem(KEY, 'rejected'); } catch (e) {}
44      applyOptOut(); return;
45    }
46  }
47
48  // Рендер: «text linkText · rulesLinkText». rulesText пустой; если задать строку (через GdfCookieConsent),
49  // вернётся прежний формат «text link. rulesText rulesLink.».
50  var DICT = {
51    ru: {
52      text: 'Используем cookie.', linkText: 'Подробнее', linkHref: '/privacy/', accept: 'Окей', reject: null,
53      rulesText: '', rulesLinkText: 'Правила загрузки', rulesLinkHref: '/pravila-zagruzki/',
54      aria: 'Уведомление об использовании cookie'
55    },
56    en: {
57      text: 'We use cookies for analytics and preferences.', linkText: 'Privacy Policy', linkHref: '/en/privacy/', accept: 'Accept', reject: 'Reject',
58      rulesText: '', rulesLinkText: 'Content Policy', rulesLinkHref: '/content-policy/',
59      aria: 'Cookie notice'
60    },
61    es: {
62      text: 'Usamos cookies para analítica y preferencias.', linkText: 'Política de Privacidad', linkHref: '/es/privacy/', accept: 'Aceptar', reject: 'Rechazar',
63      rulesText: '', rulesLinkText: 'Normas de contenido', rulesLinkHref: '/content-policy/',
64      aria: 'Aviso de cookies'
65    },
66    de: {
67      text: 'Wir nutzen Cookies für Analyse und Einstellungen.', linkText: 'Datenschutz', linkHref: '/de/privacy/', accept: 'Akzeptieren', reject: 'Ablehnen',
68      rulesText: '', rulesLinkText: 'Inhaltsrichtlinie', rulesLinkHref: '/content-policy/',
69      aria: 'Cookie-Hinweis'
70    },
71    it: {
72      text: 'Usiamo i cookie per analisi e preferenze.', linkText: 'Privacy', linkHref: '/it/privacy/', accept: 'Accetta', reject: 'Rifiuta',
73      rulesText: '', rulesLinkText: 'Norme sui contenuti', rulesLinkHref: '/content-policy/',
74      aria: 'Avviso sui cookie'
75    },
76    fr: {
77      text: 'Nous utilisons des cookies (analyse, préférences).', linkText: 'Confidentialité', linkHref: '/fr/privacy/', accept: 'Accepter', reject: 'Refuser',
78      rulesText: '', rulesLinkText: 'Règles de contenu', rulesLinkHref: '/content-policy/',
79      aria: 'Avis sur les cookies'
80    },
81    pt: {
82      text: 'Usamos cookies para análise e preferências.', linkText: 'Privacidade', linkHref: '/en/privacy/', accept: 'Aceitar', reject: 'Recusar',
83      rulesText: '', rulesLinkText: 'Regras de conteúdo', rulesLinkHref: '/content-policy/',
84      aria: 'Aviso de cookies'
85    },
86    ja: {
87      text: 'Cookieを使用しています(分析・設定の記憶)。', linkText: 'プライバシーポリシー', linkHref: '/en/privacy/', accept: '許可する', reject: '拒否する',
88      rulesText: '', rulesLinkText: 'コンテンツポリシー', rulesLinkHref: '/content-policy/',
89      aria: 'Cookieに関するお知らせ'
90    },
91    ko: {
92      text: '쿠키를 사용합니다(분석·설정 기억).', linkText: '개인정보 처리방침', linkHref: '/en/privacy/', accept: '허용', reject: '거부',
93      rulesText: '', rulesLinkText: '콘텐츠 정책', rulesLinkHref: '/content-policy/',
94      aria: '쿠키 안내'
95    },
96    pl: {
97      text: 'Używamy cookie do analityki i zapamiętywania ustawień.', linkText: 'Polityka prywatności', linkHref: '/en/privacy/', accept: 'Akceptuję', reject: 'Odrzuć',
98      rulesText: '', rulesLinkText: 'Zasady treści', rulesLinkHref: '/content-policy/',
99      aria: 'Informacja o plikach cookie'
100    },
101    nl: {
102      text: 'We gebruiken cookies voor analyse en voorkeuren.', linkText: 'Privacybeleid', linkHref: '/en/privacy/', accept: 'Accepteren', reject: 'Weigeren',
103      rulesText: '', rulesLinkText: 'Inhoudsbeleid', rulesLinkHref: '/content-policy/',
104      aria: 'Cookiemelding'
105    }
106  };
107
108  var cfg = Object.assign({}, DICT[LOC], window.GdfCookieConsent || {});
109
110  if (document.readyState === 'loading') {
111    document.addEventListener('DOMContentLoaded', mount, { once: true });
112  } else {
113    mount();
114  }
115
116  function mount() {
117    if (document.querySelector('.gdf-cookie')) return;
118    if (!document.body) return;
119
120    var style = document.createElement('style');
121    style.textContent =
122      '.gdf-cookie{position:fixed;left:0;right:0;bottom:0;margin:0;background:#1a2333;color:#fff;padding:7px 14px;padding-bottom:calc(7px + env(safe-area-inset-bottom,0px));box-shadow:0 -3px 14px rgba(0,0,0,.2);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:13px;line-height:1.35;display:flex;align-items:center;justify-content:center;gap:12px;z-index:2147483646;animation:gdfCookieIn .3s ease-out}' +
123      '.gdf-cookie p{margin:0;flex:0 1 auto;min-width:0;color:#fff}' +
124      '.gdf-cookie a{color:#7fc4ff;text-decoration:underline;white-space:nowrap}' +
125      '.gdf-cookie-btns{display:flex;gap:6px;flex:0 0 auto}' +
126      '.gdf-cookie button{background:#0a4dad;color:#fff;border:0;border-radius:6px;padding:6px 14px;font-size:13px;line-height:1.2;font-weight:600;cursor:pointer;white-space:nowrap;transition:background .15s;font-family:inherit}' +
127      '.gdf-cookie button:hover{background:#073d8a}' +
128      '.gdf-cookie button:active{transform:scale(.98)}' +
129      '.gdf-cookie button.gdf-cookie-reject{background:transparent;border:1px solid #5b6b86;color:#cdd7e6}' +
130      '.gdf-cookie button.gdf-cookie-reject:hover{background:rgba(255,255,255,.06)}' +
131      '@keyframes gdfCookieIn{from{transform:translateY(100%)}to{transform:translateY(0)}}' +
132      '@media(max-width:520px){.gdf-cookie{font-size:12px;padding:6px 10px;padding-bottom:calc(6px + env(safe-area-inset-bottom,0px));gap:8px;justify-content:space-between}.gdf-cookie button{padding:6px 12px;font-size:12px}}';
133    (document.head || document.documentElement).appendChild(style);
134
135    var bar = document.createElement('div');
136    bar.className = 'gdf-cookie';
137    bar.setAttribute('role', 'dialog');
138    bar.setAttribute('aria-label', cfg.aria);
139    var p = document.createElement('p');
140    p.appendChild(document.createTextNode(cfg.text + ' '));
141    var a = document.createElement('a');
142    a.href = cfg.linkHref;
143    a.textContent = cfg.linkText;
144    p.appendChild(a);
145    if (cfg.rulesLinkHref) {
146      var a2 = document.createElement('a'); a2.href = cfg.rulesLinkHref; a2.textContent = cfg.rulesLinkText;
147      if (cfg.rulesText) {
148        p.appendChild(document.createTextNode('. ' + cfg.rulesText + ' '));
149        p.appendChild(a2);
150        p.appendChild(document.createTextNode('.'));
151      } else {
152        p.appendChild(document.createTextNode(' · '));
153        p.appendChild(a2);
154      }
155    } else {
156      p.appendChild(document.createTextNode('.'));
157    }
158    bar.appendChild(p);
159
160    var btns = document.createElement('div');
161    btns.className = 'gdf-cookie-btns';
162    if (cfg.reject) {
163      var rbtn = document.createElement('button');
164      rbtn.type = 'button';
165      rbtn.className = 'gdf-cookie-reject';
166      rbtn.textContent = cfg.reject;
167      rbtn.addEventListener('click', reject);
168      btns.appendChild(rbtn);
169    }
170    var btn = document.createElement('button');
171    btn.type = 'button';
172    btn.textContent = cfg.accept;
173    btn.addEventListener('click', accept);
174    btns.appendChild(btn);
175    bar.appendChild(btns);
176
177    document.body.appendChild(bar);
178    lift();
179    window.addEventListener('resize', lift);
180  }
181
182  // Поднять кнопку чата (chat.js: bottom = 24px + var(--fm-marquee-h)) над полосой.
183  function lift() {
184    var bar = document.querySelector('.gdf-cookie');
185    try {
186      if (bar) document.documentElement.style.setProperty('--fm-marquee-h', bar.offsetHeight + 'px');
187      else document.documentElement.style.removeProperty('--fm-marquee-h');
188    } catch (e) {}
189  }
190
191  function save(val) {
192    try { localStorage.setItem(KEY, val); } catch (e) {}
193    var oneYear = 60 * 60 * 24 * 365;
194    document.cookie = KEY + '=' + val + '; max-age=' + oneYear + '; path=/; SameSite=Lax';
195  }
196
197  function dismiss() {
198    var bar = document.querySelector('.gdf-cookie');
199    window.removeEventListener('resize', lift);
200    try { document.documentElement.style.removeProperty('--fm-marquee-h'); } catch (e) {}
201    if (bar) {
202      bar.style.transition = 'opacity .25s, transform .25s';
203      bar.style.opacity = '0';
204      bar.style.transform = 'translateY(100%)';
205      setTimeout(function () { bar.remove(); }, 280);
206    }
207  }
208
209  function accept() { save('accepted'); dismiss(); }
210
211  function reject() { save('rejected'); applyOptOut(); dismiss(); }
212
213  // best-effort opt-out of non-essential analytics after a reject (GDPR)
214  function applyOptOut() {
215    try {
216      window['ga-disable-' + GA4] = true;
217      document.cookie = 'ga-disable-' + GA4 + '=true; max-age=31536000; path=/; SameSite=Lax';
218      window['disableYaCounter' + YA] = true;
219    } catch (e) {}
220  }
221})();

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.