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.