PageSourceSearch

https://rgk-shop.ru/local/modules/logema.stickers/scripts/script.js?175213029910320

js rgk-shop.ru collected 2026-10-08 16:31:54 UTC 10,320 bytes, 340 lines download raw bytes

1function stickerClickBehavior(target, isEvent = false) {
2	let needTargetParent = target.parentElement;
3	if (needTargetParent && needTargetParent.className.indexOf('stickers') !== -1) {
4		if (isEvent && target.dataset.link) {
5			window.open(target.dataset.link, '_blank').opener = null
6		}
7		let tooltip = target.querySelector('._sticker_tooltiptext')
8		if (tooltip) {
9			if (tooltip.timerHandleId !== false) {
10				clearTimeout(tooltip.timerHandleId)
11				tooltip.timerHandleId = false
12			}
13			tooltip.style.display = 'block'
14			tooltip.tabIndex = -1
15			tooltip.focus()
16		}
17	}
18}
19
20function stickerTooltipBlurBehavior(target) {
21	const timeToCloseTooltip = 150
22	let tooltip = target
23	tooltip.timerHandleId = setTimeout((tooltip) => {
24		tooltip.style.display = 'none'
25		tooltip.timerHandleId = false
26	}, timeToCloseTooltip, tooltip)
27}
28
29function setStickerClickBehavior(stickersContainer) {
30	stickersContainer.addEventListener('click', (event) => {
31		stickerClickBehavior(event.target, true)
32	}, {capture: true})
33	stickersContainer.addEventListener('mouseover', (event) => {
34		let target = event.target
35		let needTargetParent = target.closest('.stickers');
36		let mainExpr = needTargetParent && needTargetParent.className.indexOf('stickers') !== -1
37
38		if (mainExpr) {
39			let tooltip = target.closest('._sticker_tooltiptext')
40			let additionalExpr = tooltip && tooltip.className.indexOf('_sticker_tooltiptext') !== -1
41			if (additionalExpr) {
42				stickerClickBehavior(tooltip.parentElement)
43			} else {
44				stickerClickBehavior(target)
45			}
46		}
47	})
48}
49
50function setStickerTooltipBlurBehavior(stickersContainer) {
51	stickersContainer.addEventListener('mouseout', (event) => {
52		let target = event.target
53		if (target.parentElement.className.indexOf('stickers') !== -1) {
54			target = target.querySelector('._sticker_tooltiptext')
55		} else if (target.closest('._sticker_tooltiptext')) {
56			target = target.closest('._sticker_tooltiptext')
57		}
58		if (target && target.className.indexOf('stickers') === -1) {
59			stickerTooltipBlurBehavior(target)
60		}
61	}, {capture: true})
62}
63
64function setStickerTooltipBehavior() {
65	let catalogItems = document.querySelectorAll('.stickers');
66	catalogItems.forEach((element) => {
67		if (!element.dataset.is_set_behavior) {
68			element.dataset.is_set_behavior = 'set'
69			setStickerClickBehavior(element)
70			setStickerTooltipBlurBehavior(element)
71		}
72	})
73}
74
75function getStickerElement(stickerParams) {
76	let sticker = document.createElement('div')
77	sticker.className = 'sticker_' + stickerParams['ID']
78	sticker.style.background = stickerParams['BACKGROUND_COLOR']
79	sticker.innerText = stickerParams['TEXT']
80	return sticker
81}
82
83function getStickerHtml(stickerParams) {
84	let tooltipHtml = '';
85	if (stickerParams['TOOLTIP']) {
86		tooltipHtml = '<div class="_sticker_tooltiptext" style=" ' +
87			'display: none">' + stickerParams['TOOLTIP'] + '</div>'
88	}
89	let dataStickerLink = ''
90	if (stickerParams['LINK']) {
91		dataStickerLink = 'data-link=' + stickerParams['LINK']
92	}
93	let styleHtml = ''
94	if (stickerParams['BACKGROUND_COLOR'] && stickerParams['COLOR']) {
95        styleHtml = `style="background: ${stickerParams['BACKGROUND_COLOR']}; color: ${stickerParams['COLOR']};"`;
96    } else if(stickerParams['BACKGROUND_COLOR']) {
97        styleHtml = `style="background: ${stickerParams['BACKGROUND_COLOR']};"`
98    }else if(stickerParams['COLOR']) {
99        styleHtml = `style="color: ${stickerParams['COLOR']};"`
100    }
101	return `<div class="sticker_${stickerParams['ID']}" ${styleHtml} ${dataStickerLink}> 
102${stickerParams['TEXT']} ${tooltipHtml} </div>`;
103}
104
105function createStickersContainer(parentElement) {
106	let stickersContainer = document.createElement('div')
107	stickersContainer.className = 'stickers'
108	parentElement.prepend(stickersContainer)
109	return stickersContainer
110}
111
112function getOffsetRect(elem) {
113	// (1)
114	const box = elem.getBoundingClientRect();
115
116	// (2)
117	const body = document.body;
118	const docElem = document.documentElement;
119
120	// (3)
121	const scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
122	const scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
123
124	// (4)
125	const clientTop = docElem.clientTop || body.clientTop || 0;
126	const clientLeft = docElem.clientLeft || body.clientLeft || 0;
127
128	// (5)
129	const top = box.top + scrollTop - clientTop;
130	const left = box.left + scrollLeft - clientLeft;
131
132	return {top: Math.round(top), left: Math.round(left)}
133}
134
135function setStickersContainerPosition(stickersContainer, elementForPosition) {
136	stickersContainer.style.position = 'absolute';
137	stickersContainer.style.display = 'block';
138	const position = getOffsetRect(elementForPosition)
139	stickersContainer.style.top = position.top + 'px'
140	stickersContainer.style.left = position.left + 'px'
141}
142
143function handleResponse(response) {
144	response = JSON.parse(response)
145	//console.log(response);
146	let stickersDiv = document.querySelectorAll('.__dsc');
147	let stickersDivOld = document.querySelectorAll('.stickers');
148	stickersDivOld.forEach((element) => {
149		if (element.parentElement.dataset.is_handled !== 'handled_response') {
150			element.remove()
151		}
152	})
153
154
155	stickersDiv.forEach((element) => {
156		element = element.parentElement
157		let item_id = decodeURI(getElementCode(element))
158
159		// if (element.dataset.express) {
160		// 	if (response[item_id]) {
161		// 		let containsDelivery = false;
162		// 		for (let sticker of Object.entries(response[item_id])) {
163		// 			if (sticker[1]['NAME'] && sticker[1]['NAME'] == "Экспресс доставка МСК"){
164		// 				containsDelivery = true;
165		// 			}
166		// 		}
167
168		// 		if ( !containsDelivery){
169		// 			response[item_id].unshift({
170		// 				"ID": "95619",
171		// 				"NAME": "Экспресс доставка МСК",
172		// 				"SORT": "500",
173		// 				"ACTIVE": "Y",
174		// 				"ACTIVE_FROM_X": null,
175		// 				"ACTIVE_FROM": null,
176		// 				"ACTIVE_TO": null,
177		// 				"TEXT": "Экспресс доставка",
178		// 				"BACKGROUND_COLOR": "#484848",
179		// 				"SALE": "",
180		// 				"ALL_PRODUCTS": "",
181		// 				"PRODUCTS": [
182							
183		// 					"94978"
184		// 				],
185		// 				"PRODUCTS_EXCEPTIONS": false,
186		// 				"SECTIONS": false,
187		// 				"WAREHOUSE": [
188		// 					"11",
189		// 					"1",
190		// 					"4",
191		// 					"3"
192		// 				],
193		// 				"TOOLTIP": "Доставка товара в день покупки!",
194		// 				"SHOW_ON_INDEX_PAGE": false,
195		// 				"LINK": "/info/delivery/",
196		// 				"REGIONS": [
197		// 					"80708"
198		// 				]
199		// 			});
200		// 		}
201		// 	}
202		// }
203
204		if (element.dataset.is_handled === 'handled_request') {
205			let stickersContainer = createStickersContainer(element)
206			//setStickersContainerPosition(stickersContainer, element)
207			if (response[item_id]) {
208				for (let sticker of Object.entries(response[item_id])) {
209					stickersContainer.innerHTML += getStickerHtml(sticker[1])
210				}
211				element.dataset.is_handled = 'handled_response';
212			}
213		}
214	})
215	setStickerTooltipBehavior()
216}
217
218function send(data) {
219	let xhr = new XMLHttpRequest();
220	xhr.open('POST', '/local/modules/logema.stickers/ajax/getsticker.php');
221	let t = new FormData
222	t.append('elementsId', JSON.stringify(data))
223	xhr.send(t);
224	xhr.onload = function () {
225		if (xhr.status !== 200) {
226			console.log(`Ошибка ${xhr.status}: ${xhr.statusText}`);
227		} else {
228			handleResponse(xhr.response)
229		}
230	};
231	xhr.onerror = function () {
232		console.log("Запрос не удался");
233	};
234}
235
236function getElementCode(element) {
237	let parent = element.parentElement
238	let linkElement = null
239	let linkElements = element.querySelectorAll('a').forEach((v) => {
240		if (v.href.search(/.*\/product\/.*/) !== -1) {
241			linkElement = v;
242		}
243	})
244	let link;
245	if (!linkElement) {
246		link = window.location.href
247	} else if (linkElement.href.search(/.*\/product\/.*/) === -1) {
248		link = window.location.href
249	} else {
250		link = linkElement.href
251	}
252	let code = link.split('/')
253	return code[4];
254}
255
256function replaceOldStickers(event) {
257	let responseUrl = event.target.responseURL
258	if (responseUrl.search('local/components/interlabs/catalog.actions/ajax-cache.php') !== -1) {
259		document.querySelectorAll('.product-item__sticker-list').forEach((element) => {
260			element.style.display = 'none';
261			let markToStickers = document.createElement('div')
262			markToStickers.className = '__dsc'
263			element.parentElement.prepend(markToStickers)
264		})
265	}
266}
266
267
268(function () {
269	const origOpen = XMLHttpRequest.prototype.open;
270	XMLHttpRequest.prototype.open = function () {
271		this.addEventListener('load', function (event) {
272			setTimeout(() => {
273				let responseUrl = event.target.responseURL
274				if (responseUrl.search('local/components/interlabs/catalog.actions/ajax-cache.php') !== -1) {
275					event.target.response = ''
276					//console.log(event.target.response.length)
277				}
278				replaceOldStickers(event)
279				addStickersToNewProduct()
280				addStickersToFastView()
281			}, 150)
282		});
283		origOpen.apply(this, arguments);
284	};
285})();
286
287function addStickersToNewProduct() {
288	let stickersDiv = document.querySelectorAll('.__dsc');
289	let elementsId = [];
290	stickersDiv.forEach((element) => {
291		element = element.parentElement
292		if (!element.dataset.is_handled) {
293			//element.innerHTML = '';
294
295			elementsId.push(getElementCode(element));
296			element.dataset.is_handled = 'handled_request';
297		}
298	})
299
300	if (elementsId.length > 0) {
301		send(elementsId)
302		return true
303	} else {
304		return false
305	}
306}
307
308function waitLoadFastViewFrame(handleToTimeoutToFastViewFrame) {
309	if (addStickersToNewProduct()) {
310		clearInterval(handleToTimeoutToFastViewFrame)
311	}
312}
313
314function addStickersToFastView() {
315	let catalogItems = document.querySelectorAll('.catalog_block');
316	catalogItems.forEach((element) => {
317		if (!element.dataset.handled) {
318			element.dataset.handled = 'handled'
319			element.addEventListener('click', (event) => {
320				let target = event.target
321				let needTargetParent = target.closest('.fast_view_block');
322				const timeoutToFastViewFrame = 400
323				const maxTimeoutToFastViewFrame = 10000
324				if (needTargetParent) {
325					const handleToTimeoutToFastViewFrame = setInterval(() => {
326						waitLoadFastViewFrame(handleToTimeoutToFastViewFrame)
327					}, timeoutToFastViewFrame)
328					setTimeout(() => {
329						clearInterval(handleToTimeoutToFastViewFrame)
330					}, maxTimeoutToFastViewFrame)
331				}
332			}, {capture: true})
333		}
334	})
335}
336
337document.addEventListener('DOMContentLoaded', (event) => {
338	addStickersToNewProduct()
339	addStickersToFastView()
340})

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.