PageSourceSearch

https://www.mrdoors.ru/local/templates/mrdoors2025/assets/custome.js?v5

js mrdoors.ru collected 2026-09-26 04:26:21 UTC 2,839 bytes, 116 lines download raw bytes

1(function () {
2	function resolveScrollTarget(id) {
3		if (!id) {
4			return null;
5		}
6
7		return document.getElementById(id) || document.querySelector('.' + id);
8	}
9
10	function smoothScrollTo(id) {
11		var target = resolveScrollTarget(id);
12		if (!target) {
13			return;
14		}
15
16		target.scrollIntoView({
17			behavior: window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth',
18			block: 'start'
19		});
20	}
21
22	document.addEventListener('click', function (event) {
23		var trigger = event.target.closest('[data-scroll-to]');
24		if (!trigger) {
25			return;
26		}
27
28		event.preventDefault();
29		smoothScrollTo(trigger.getAttribute('data-scroll-to'));
30	});
31
32	var UTM_STORAGE_KEY = 'mrd_utm';
33
34	// Метки берём из адреса текущей страницы, а если их там нет — из сохранённых
35	// ранее, чтобы они не терялись при переходах внутри сайта
36	function collectVisitorUtm() {
37		var stored = {};
38		try {
39			stored = JSON.parse(window.sessionStorage.getItem(UTM_STORAGE_KEY)) || {};
40		} catch (error) {
41			stored = {};
42		}
43
44		var current = {};
45		new URLSearchParams(window.location.search).forEach(function (value, key) {
46			var name = key.toLowerCase();
47			if (name.indexOf('utm_') === 0 && value) {
48				current[name] = value;
49			}
50		});
51
52		if (!Object.keys(current).length) {
53			return stored;
54		}
55
56		try {
57			window.sessionStorage.setItem(UTM_STORAGE_KEY, JSON.stringify(current));
58		} catch (error) {
59			// приватный режим браузера — метки живут только в рамках текущей страницы
60		}
61
62		return current;
63	}
64
65	var visitorUtm = collectVisitorUtm();
66
67	function withVisitorUtm(url) {
68		var target;
69		try {
70			target = new URL(url, window.location.href);
71		} catch (error) {
72			return url;
73		}
74
75		Object.keys(visitorUtm).forEach(function (name) {
76			if (!target.searchParams.has(name)) {
77				target.searchParams.set(name, visitorUtm[name]);
78			}
79		});
80
81		return target.toString();
82	}
83
84	// Карточка каталога целиком обёрнута в <a>, поэтому переход делаем вручную
85	function goToAiDesign(event) {
86		var trigger = event.target.closest('[data-ai-design-url]');
87		if (!trigger) {
88			return;
89		}
90
91		var url = trigger.getAttribute('data-ai-design-url');
92		if (!url) {
93			return;
94		}
95
96		event.preventDefault();
97		event.stopPropagation();
98
99		url = withVisitorUtm(url);
100
101		if (trigger.getAttribute('data-ai-design-target') === '_blank') {
102			window.open(url, '_blank', 'noopener,noreferrer');
103			return;
104		}
105
106		window.location.href = url;
107	}
108
109	document.addEventListener('click', goToAiDesign);
110
111	document.addEventListener('keydown', function (event) {
112		if (event.key === 'Enter' || event.key === ' ') {
113			goToAiDesign(event);
114		}
115	});
116})();

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.