Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/templates/aspro_next_rospiro/js/ |
Upload File : |
/* You can use this file with your scripts. It will not be overwritten when you upgrade solution. */ var block_show = false; function scrollMore() { var $target = $("h3:contains('Популярные категории')"); if (block_show) { return false; } var wt = $(window).scrollTop(); var wh = $(window).height(); var et = $target.offset().top; var eh = $target.outerHeight(); var dh = $(document).height(); if (wt >= et) { block_show = true; $.ajax({ type: "POST", url: "/ajax/index_blocks_ajax.php?mode=ajax&component_type=comp_catalog_hit", beforeSend: function () { $("#comp_catalog_hit").html( '<p style="text-align:center">Загрузка...</p>' ); }, success: function (data) { $("#comp_catalog_hit").html(data); $.ajax({ type: "POST", url: "/ajax/index_blocks_ajax.php?component_type=comp_bottom_banners", beforeSend: function () { $("#comp_bottom_banners").html( '<p style="text-align:center">Загрузка...</p>' ); }, success: function (data) { $("#comp_bottom_banners").html(data); $.ajax({ type: "POST", url: "/ajax/index_blocks_ajax.php?component_type=comp_catalog_section_tab", beforeSend: function () { $("#comp_catalog_section_tab").html( '<p style="text-align:center">Загрузка...</p>' ); }, success: function (data) { $("#comp_catalog_section_tab").html(data); $.ajax({ type: "POST", url: "/ajax/index_blocks_ajax.php?component_type=comp_bottom_banners2", beforeSend: function () { $("#comp_bottom_banners2").html( '<p style="text-align:center">Загрузка...</p>' ); }, success: function (data) { $("#comp_bottom_banners2").html(data); $.ajax({ type: "POST", url: "/ajax/index_blocks_ajax.php?component_type=comp_catalog_section_tab2", beforeSend: function () { $("#comp_catalog_section_tab2").html( '<p style="text-align:center">Загрузка...</p>' ); }, success: function (data) { $("#comp_catalog_section_tab2").html(data); $.ajax({ type: "POST", url: "/ajax/index_blocks_ajax.php?component_type=comp_adv_middle", beforeSend: function () { $("#comp_adv_middle").html( '<p style="text-align:center">Загрузка...</p>' ); }, success: function (data) { $("#comp_adv_middle").html(data); $.ajax({ type: "POST", url: "/ajax/index_blocks_ajax.php?component_type=comp_blog", beforeSend: function () { $("#comp_blog").html( '<p style="text-align:center">Загрузка...</p>' ); }, success: function (data) { $("#comp_blog").html(data); $.ajax({ type: "POST", url: "/ajax/index_blocks_ajax.php?component_type=comp_brands", beforeSend: function () { $("#comp_brands").html( '<p style="text-align:center">Загрузка...</p>' ); }, success: function (data) { $("#comp_brands").html(data); comp_brands }, error: function (jqXHR, text, error) { $("#comp_brands").html(error); }, }); }, error: function (jqXHR, text, error) { $("#comp_blog").html(error); }, }); }, error: function (jqXHR, text, error) { $("#comp_adv_middle").html(error); }, }); }, error: function (jqXHR, text, error) { $("#comp_catalog_section_tab2").html(error); }, }); }, error: function (jqXHR, text, error) { $("#comp_bottom_banners2").html(error); }, }); }, error: function (jqXHR, text, error) { $("#comp_catalog_section_tab").html(error); }, }); }, error: function (jqXHR, text, error) { $("#comp_bottom_banners").html(error); }, }); }, error: function (jqXHR, text, error) { $("#comp_catalog_hit").html(error); }, }); } } $(window).scroll(function () { let comp_catalog_hit = $("#comp_catalog_hit"); let comp_bottom_banners = $("#comp_bottom_banners"); let comp_catalog_section_tab = $("#comp_catalog_section_tab"); let comp_bottom_banners2 = $("#comp_bottom_banners2"); let comp_catalog_section_tab2 = $("#comp_catalog_section_tab2"); let comp_adv_middle = $("#comp_adv_middle"); if ( comp_catalog_hit.length > 0 && comp_bottom_banners.length > 0 && comp_catalog_section_tab.length > 0 && comp_bottom_banners2.length > 0 && comp_catalog_section_tab2.length > 0 && comp_adv_middle.length > 0 ) { scrollMore(); } }); $(document).ready(function () { let comp_catalog_hit = $("#comp_catalog_hit"); let comp_bottom_banners = $("#comp_bottom_banners"); let comp_catalog_section_tab = $("#comp_catalog_section_tab"); let comp_bottom_banners2 = $("#comp_bottom_banners2"); let comp_catalog_section_tab2 = $("#comp_catalog_section_tab2"); let comp_adv_middle = $("#comp_adv_middle"); if ( comp_catalog_hit.length > 0 && comp_bottom_banners.length > 0 && comp_catalog_section_tab.length > 0 && comp_bottom_banners2.length > 0 && comp_catalog_section_tab2.length > 0 && comp_adv_middle.length > 0 ) { scrollMore(); } }); var template_block_show; $(window).scroll(function () { if (template_block_show) { return; } if ($(document).scrollTop() > 100) { var templateSrc = $("#advantages").attr('template-src'); $.ajax({ type: "POST", url: "/ajax/wbs24_detail_page_ajax.php", dataType: 'html', data: { 'componentName': 'ADVANTAGES_BLOCK', 'templateSrc': templateSrc, }, beforeSend: function () { $("#advantages").html( '<p style="text-align:center">Загрузка...</p>' ); template_block_show = true; }, success: function (data) { $("#advantages").html(data); template_block_show = true; }, error: function (jqXHR, text, error) { $("#associated_products").html(error); template_block_show = true; }, }); } }); (function () { 'use strict'; // Флаг, что Метрика уже загрузилась. let loadedMetrica = false; // Переменная для хранения таймера. let timerId; let timerId2; // Для бота Яндекса грузим Метрику сразу без "отложки", // чтобы в панели Метрики были зелёные кружочки // при проверке корректности установки счётчика. if (navigator.userAgent.indexOf( 'YandexMetrika' ) > -1) { loadMetrica(); } else { // Подключаем Метрику, если юзер начал скроллить. window.addEventListener('scroll', loadMetricaScroll, {passive: true}); // Подключаем Метрику, если юзер коснулся экрана. window.addEventListener('touchstart', loadMetrica); // Подключаем Метрику, если юзер дернул мышкой. document.addEventListener('mouseenter', loadMetrica); // Подключаем Метрику, если юзер кликнул мышкой. document.addEventListener('click', loadMetrica); // Подключаем Метрику при полной загрузке DOM дерева, // с "отложкой" в 1 секунду через setTimeout, // если пользователь ничего вообще не делал (фоллбэк). document.addEventListener('DOMContentLoaded', loadFallback); } function loadFallback() { timerId = setTimeout(loadImages, 2000); } function loadImages( e ) { const elements = document.querySelectorAll("[data-wbs24-defer]"); elements.forEach(function (element) { const deferSrc = element.getAttribute("data-wbs24-defer"); if (element.tagName.toLowerCase() === "a") { // Если элемент <a>, заменяем значение href element.setAttribute("href", deferSrc); } else if (element.tagName.toLowerCase() === "img") { // Если элемент <img>, заменяем значение src element.setAttribute("src", deferSrc); } }); clearTimeout(timerId); } function loadMetricaScroll( e ) { if (window.scrollY > 30) { loadMetrica(); } } function loadMetrica( e ) { // Пишем отладку в консоль браузера. if (e && e.type) { console.log(e.type); } else { console.log('DOMContentLoaded'); } // Если флаг загрузки Метрики отмечен, // то ничего более не делаем. if (loadedMetrica) { return; } // загрузка recaptcha let recaptcha = document.querySelector('#recaptchaApiLoader'); if (recaptcha) { recaptcha.src = recaptcha.dataset.src; } // google tag manager let googletagmanager = document.querySelector('#googletagmanager_gtag'); if (googletagmanager) { googletagmanager.src = googletagmanager.dataset.src; } // загрузка frame для youtube const vkFasad = document.querySelector('.iframe__vkvideo_custom'); if (vkFasad) { const iframeVk = document.createElement("iframe"); iframeVk.src = vkFasad.getAttribute('data-src'); iframeVk.width = "100%"; iframeVk.height = "100%"; iframeVk.style.setProperty("position", "absolute"); iframeVk.style.setProperty("top", "0"); iframeVk.style.setProperty("left", "0"); iframeVk.frameBorder ="0"; iframeVk.allow = "encrypted-media; fullscreen; picture-in-picture; screen-wake-lock;"; iframeVk.setAttribute('allowFullScreen', 'true'); vkFasad.appendChild(iframeVk); } const youtubeFasad = document.querySelector('.iframe__youtube_custom'); if (youtubeFasad) { const iframeYoutube = document.createElement("iframe"); iframeYoutube.src = youtubeFasad.getAttribute('data-src'); iframeYoutube.width = "100%"; iframeYoutube.height = "100%"; iframeYoutube.style.setProperty("position", "absolute"); iframeYoutube.style.setProperty("top", "0"); iframeYoutube.style.setProperty("left", "0"); iframeYoutube.frameBorder ="0"; iframeYoutube.allow = "encrypted-media; fullscreen; picture-in-picture; screen-wake-lock;"; iframeYoutube.setAttribute('allowFullScreen', 'true'); youtubeFasad.appendChild(iframeYoutube); } // загрузка стандартной метрики const alternativeMetrika = document.querySelector('[data-script-name="alternativeMetrika"]'); if (alternativeMetrika) { alternativeMetrika.src = alternativeMetrika.getAttribute('data-src'); } // загрузка b24 Widget of open lines (function(w,d,u){ var s=d.createElement('script');s.async=true;s.src=u+'?'+(Date.now()/60000|0); var h=d.getElementsByTagName('script')[0];h.parentNode.insertBefore(s,h); })(window,document,'https://cdn-ru.bitrix24.ru/b7205243/crm/site_button/loader_2_a0b9cq.js'); // загрузка метрики (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(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} 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"); ym(41678544, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer" }); // Отмечаем флаг, что Метрика загрузилась, // чтобы не загружать её повторно при других // событиях пользователя и старте фоллбэка. loadedMetrica = true; // Очищаем таймер, чтобы избежать лишних утечек памяти. clearTimeout(timerId2); // Отключаем всех наших слушателей от всех событий, // чтобы избежать утечек памяти. window.removeEventListener( 'scroll', loadMetrica ); window.removeEventListener( 'touchstart', loadMetrica ); document.removeEventListener( 'mouseenter', loadMetrica ); document.removeEventListener( 'click', loadMetrica ); document.removeEventListener( 'DOMContentLoaded', loadFallback ); } })(); /* wbs24 - add sale stickers */ function wbs24SaleSticker() { const debug = true; function getItems(css) { const items = document.querySelectorAll(css); if (!items) items = []; return items; } function getDiscount(item) { let discount = 0; const priceElement = item.querySelector('.price'); const priceDiscountElement = item.querySelector('.price.discount'); if (priceElement && priceDiscountElement) { const price = priceElement.dataset.value; const priceDiscount = priceDiscountElement.dataset.value; const deltaPrice = priceDiscount - price; discount = Math.round(deltaPrice / (priceDiscount / 100)); } return discount; } function setSticker(item, stickerClass, discount) { if (!discount) return; const stickersElement = item.querySelector('.stickers'); if (isAllowAddSticker(stickersElement, stickerClass)) { let div = document.createElement('div'); div.className = 'wrap_mark_sale'; div.innerHTML = `<div class="${stickerClass}">-${discount}%</div>`; stickersElement.append(div); } } function isAllowAddSticker(stickersElement, stickerClass) { if (!stickersElement) return false; const stickerElement = stickersElement.querySelector('.' + stickerClass); return stickerElement ? false : true; } function run(css) { let items = getItems(css); items.forEach(item => { let discount = getDiscount(item); setSticker(item, 'mark_sale', discount); }); } function action() { run('.catalog .item, .tabs_content .item'); run('.catalog_detail, .fast_view_frame'); } function observer(css) { let catalogElement = document.querySelector(css); if (catalogElement) { let catalogElementObserver = new MutationObserver(mutationRecords => { if (debug) console.log('catalogElementObserver found mutation'); action(); }); catalogElementObserver.observe(catalogElement, { childList: true, subtree: true, }); } } action(); observer('.block_list'); observer('#popup_iframe_wrapper'); observer('.wide_page'); } document.addEventListener('DOMContentLoaded', wbs24SaleSticker); /* wbs24 - buy services */ function wbs24BuyServices() { const debug = true; const protocol = location.protocol+'//'; const domain = location.host; let basketContainerCss; let basketItemsCss; let basketItemFormPlaceSubCss; let mode = 'basket'; let previousBasketSum; const formClass = 'form-services'; const formSubCss = '.' + formClass; const ajaxUrl = '/local/services/ajax.php'; function init() { // basket mode basketContainerCss = '.basket-items-list'; basketItemsCss = basketContainerCss + ' .basket-items-list-item-container'; basketItemFormPlaceSubCss = '.basket-item-block-info'; // detail mode if (!document.querySelector(basketContainerCss)) { basketContainerCss = '.catalog_detail'; basketItemsCss = basketContainerCss + ' .item_main_info'; basketItemFormPlaceSubCss = '.middle_info'; mode = 'detail'; } } function action() { let items = getItems(basketItemsCss); let sum = getBasketSum(); addFormToItems(items); if (mode == 'basket' && sum != previousBasketSum) { previousBasketSum = sum; delUnbound(); } } function observer(css) { let basketContainer = document.querySelector(css); if (basketContainer) { let basketContainerObserver = new MutationObserver(mutationRecords => { if (debug) console.log('basketContainerObserver found mutation'); action(); }); basketContainerObserver.observe(basketContainer, { childList: true, subtree: true, }); } } function getItems(css) { let items = document.querySelectorAll(css); return items ? items : []; } function addFormToItems(items) { items.forEach(item => { addForm(item); }); } async function addForm(item) { let productId = getItemProductId(item); if (!productId) return; let itemIsSevice = getItemParentProductId(item); if (itemIsSevice) return; const basketItemFormPlace = item.querySelector(basketItemFormPlaceSubCss); if (needAddForm(basketItemFormPlace)) { if (debug) console.log('attend add service form'); let formHtml = await getFormAsHtml(productId); if (formHtml && needAddForm(basketItemFormPlace)) { if (debug) console.log('add service form'); let div = document.createElement('div'); div.innerHTML = formHtml; basketItemFormPlace.append(div); activateForm(basketItemFormPlace) } } } function getItemProductId(item) { // basket mode let productId = item.dataset.productId; // need data-product-id in item // detail mode if (!productId && mode == 'detail') { let itemId = item.id; let array = itemId.split('_'); productId = array[array.length - 1]; } return productId } function getItemParentProductId(item) { const parentProductId = item.dataset.serviceofproductid; return parentProductId !== undefined ? parentProductId : false; } function needAddForm(place) { if (!place) return false; const form = place.querySelector(formSubCss); return !form ? true : false; } async function getFormAsHtml(productId) { let servicesHtml = await getServicesAsHtml(productId); let formHtml = `<div class='${formClass}'>${servicesHtml}</div>`; return formHtml; } async function getServicesAsHtml(productId) { let html = ''; let services = await getServices(productId); services.forEach(function(service) { let formattedPrice = formatPrice(service.price); html += `<div class='service-item'> <div class='service-item__button'> <div class='btn-onoff js-buy-service' data-product-id='${productId}' data-service-id='${service.id}' data-service-price='${service.price}'> </div> </div> <div class='service-item__name'>${service.name}</div> <div class='service-item__price'>${formattedPrice}</div> </div>`; }); return html; } async function getServices(productId) { let services = await request({ action: 'getServices', productId: productId, }); return services; } function activateForm(formPlace) { let buyButtons = formPlace.querySelectorAll('.js-buy-service'); for (let button of buyButtons) { addBuyButtonHandlers(button); activateSelectedServices(button); } } function addBuyButtonHandlers(button) { button.addEventListener('click', switchBuyButton); } async function activateSelectedServices(button) { let productId = button.dataset.productId; let serviceId = button.dataset.serviceId; let exist = await checkInBasket(productId, serviceId); if (exist) { button.classList.add('active'); } } function switchBuyButton(event) { let button = event.target; let productId = button.dataset.productId; let serviceId = button.dataset.serviceId; let servicePrice = button.dataset.servicePrice; if (button.classList.contains('active')) { delFromBasket(productId, serviceId, servicePrice); } else { addToBasket(productId, serviceId, servicePrice); } button.classList.toggle('active'); } function formatPrice(price) { let formattedPrice = price.toLocaleString('ru-RU'); formattedPrice += ' ₽'; return formattedPrice; } // BASKET async function addToBasket(productId, serviceId, price) { let response = await request({ action: 'addToBasket', productId: productId, serviceId: serviceId, }); if (response.result = 'success') { recalcBasket(); recalcMiniBasket(1, price); } } async function delFromBasket(productId, serviceId, price = 0) { let response = await request({ action: 'delFromBasket', productId: productId, serviceId: serviceId, }); if (response.result = 'success') { recalcBasket(); if (price) recalcMiniBasket(-1, -price); } } async function checkInBasket(productId, serviceId) { let exist = false; let response = await request({ action: 'checkInBasket', productId: productId, serviceId: serviceId, }); if (response.result == 'exist') { exist = true; } return exist; } async function delUnbound() { let response = await request({ action: 'delUnbound', }); if (response.result == 'recalc') { recalcBasket(); } } async function recalcBasket() { if (!BX.Sale || !BX.Sale.BasketComponent) return; let param = { sessid: BX.bitrix_sessid(), site_id: BX.message('SITE_ID'), action_var: 'basketAction', select_props: 'NAME,DISCOUNT,PROPS,DELETE,DELAY,TYPE,PRICE,QUANTITY,SUM', offers_props: 'SIZES,COLOR_REF,SERVICEOFPRODUCTID', quantity_float: 'N', count_discount_4_all_quantity: 'Y', price_vat_show_value: 'Y', hide_coupon: 'Y', use_prepayment: 'N', basketAction: 'recalculate', }; let result = await requestToSaleBasket(param); applyBasketResult(result); } function getBasketSum() { if (!BX.Sale || !BX.Sale.BasketComponent) return; let bc = BX.Sale.BasketComponent; return bc.result.allSum; } function applyBasketResult(result) { let bc = BX.Sale.BasketComponent; bc.actionPool.doProcessing(false); if (!BX.type.isPlainObject(result)) return; bc.actionPool.setRefreshStatus(result.BASKET_REFRESHED); if (result.RESTORED_BASKET_ITEMS) { bc.restoreBasketItems(result.RESTORED_BASKET_ITEMS); } if (result.DELETED_BASKET_ITEMS) { bc.deleteBasketItems(result.DELETED_BASKET_ITEMS, bc.params.SHOW_RESTORE === 'Y'); } if (result.MERGED_BASKET_ITEMS) { bc.deleteBasketItems(result.MERGED_BASKET_ITEMS, false, true); } bc.applyBasketResult(result.BASKET_DATA); bc.editBasketItems(bc.getItemsToEdit()); bc.editTotal(); //bc.applyPriceAnimation(); bc.editWarnings(); bc.actionPool.switchTimer(); } // MINI BASKET function recalcMiniBasket(deltaQuantity, deltaSum) { let quantity = getMiniBasketQuantity(); if (quantity !== false) { quantity += Number(deltaQuantity); setMiniBasketQuantity(quantity); } let sum = getMiniBasketSum(); if (sum !== false) { sum += Number(deltaSum); setMiniBasketSum(sum); } } function getMiniBasketQuantity() { let quantity = false; let quantityElement = document.querySelector('.basket.basket-count .js-basket-block > .count'); if (quantityElement) { quantity = Number(quantityElement.innerHTML); } return quantity; } function getMiniBasketSum() { let sum = false; let sumElement = document.querySelector('.basket.basket-count .js-basket-block .prices'); if (sumElement) { let value = sumElement.innerHTML; value = value.replace(' ', '', value); value = value.replace(' ', '', value); value = value.replace('₽', '', value); sum = Number(value); } return sum; } function setMiniBasketQuantity(quantity) { let quantityElements = document.querySelectorAll('.basket.basket-count .js-basket-block > .count'); for (let quantityElement of quantityElements) { quantityElement.innerHTML = quantity; } } function setMiniBasketSum(sum) { let sumElements = document.querySelectorAll('.basket.basket-count .js-basket-block .prices'); for (let sumElement of sumElements) { let formattedSum = formatPrice(sum); sumElement.innerHTML = formattedSum; } } // REQUESTS async function request(param) { let result = []; let response = await fetch(ajaxUrl, { method: 'POST', headers: { 'Content-Type': 'application/json;charset=utf-8' }, body: JSON.stringify(param) }); if (response.ok) { result = await response.json(); } else { if (debug) console.error('request error'); } return result; } async function requestToSaleBasket(param) { let result = false; let url = new URL(protocol+domain+'/bitrix/components/bitrix/sale.basket.basket/ajax.php'); for(let paramElement in param) { url.searchParams.append(paramElement, param[paramElement]); } let response = await fetch("/bitrix/components/bitrix/sale.basket.basket/ajax.php", { headers: { "accept": "*/*", "accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7", "bx-ajax": "true", "content-type": "application/x-www-form-urlencoded", }, "referrer": protocol+domain+"/basket/", "referrerPolicy": "no-referrer-when-downgrade", "body": url.search.replace('?', ''), "method": "POST", "mode": "cors", "credentials": "include", }); if (response.ok) { result = await response.json(); } else { if (debug) console.error('request error'); } return result; } // INIT init(); action(); observer(basketContainerCss); } document.addEventListener('DOMContentLoaded', wbs24BuyServices); class Wbs24Hint { constructor() { this.debug = false; this.currentURL = window.location.href; this.basketURL = '/basket/'; this.basketContainerCss = '.basket-items-list'; this.catalogContainerCss = '.catalog_block'; this.mainPageCss = '.wide_page'; this.catalogURL = '/catalog/'; this.elementIdsToMaxCount = {}; this.catalogClasses = [ 'div', '.plus', '.minus' ]; this.basketClasses = [ '.basket-item-block-amount', '.basket-item-amount-btn-plus', '.basket-item-amount-btn-minus' ]; } start() { if (!this.currentURL.includes(this.basketURL)) { this.createHandlers('input[name="quantity"]', this.catalogClasses); if (this.currentURL.includes(this.catalogURL)) { this.observer(this.catalogContainerCss); } else { this.observer(this.mainPageCss); } } else { this.sendAjaxRequest(); this.observer(this.basketContainerCss); this.createHandlers('.basket-item-amount-filed', this.basketClasses); } } observer(css) { let catalogElement = document.querySelector(css); if (catalogElement) { let catalogElementObserver = new MutationObserver(mutationRecords => { if (this.debug) console.log('catalogElementObserver found mutation'); if (this.currentURL.includes(this.basketURL)) { this.basketAction(); } else { this.catalogAction(); } }); catalogElementObserver.observe(catalogElement, { childList: true, subtree: true, }); } } basketAction() { let basketItems = document.querySelectorAll('.basket-item-info-name-link'); let elementIdsToMaxCount = this.elementIdsToMaxCount; basketItems.forEach((basketItem) => { let wbs24Hint = new Wbs24Hint(); let basketItemContainer = basketItem.closest('.basket-items-list-item-container'); let elementUrl = basketItem.href; let parseUrl = elementUrl.split('/'); let elementId = parseUrl[parseUrl.length - 2]; // Проверить data атрибут let childPlusButton = basketItemContainer.querySelector('.basket-item-amount-btn-plus'); if (!childPlusButton.dataset.max) { childPlusButton.dataset.max = elementIdsToMaxCount[elementId]; } // Проверить содержится ли подсказка в Dom дереве let childWbs24MaxCount = basketItemContainer.querySelector('.wbs24-max-product-count'); if (childWbs24MaxCount == undefined) { let observerLabel = true; let quantityInput = basketItemContainer.querySelector('.basket-item-amount-filed'); wbs24Hint.createHandler(quantityInput, wbs24Hint.basketClasses, observerLabel); } }); } catalogAction() { this.createHandlers('input[name="quantity"]', this.catalogClasses); } createHandlers(quantityInputs, requiredClasses) { let allQuantityInputs = document.querySelectorAll(quantityInputs); allQuantityInputs.forEach((quantityInput) => { if (this.debug) console.log('quantityInput: ' + quantityInput); if (this.debug) console.log(`requiredClasses: ${requiredClasses}`); if (!quantityInput.dataset.wbs24event) { let wbs24Hint = new Wbs24Hint(); wbs24Hint.createHandler(quantityInput, requiredClasses); } }); } createHandler(quantityInput, requiredClasses, observerLabel = false) { let quantityInputParent = quantityInput.closest(requiredClasses[0]); let plusButton = quantityInputParent.querySelector(requiredClasses[1]); let minusButton = quantityInputParent.querySelector(requiredClasses[2]); if (quantityInputParent != undefined && plusButton != undefined && minusButton != undefined ) { quantityInput.dataset.wbs24event = true; quantityInputParent.classList.add('wbs24-position'); // Проверяем есть ли уже в DOM дереве let isWbs24MaxCountInDom = quantityInputParent.querySelector('.wbs24-max-product-count'); if (isWbs24MaxCountInDom == undefined) { let hint = document.createElement('div'); if (this.currentURL.includes(this.basketURL)) { hint.className = "wbs24-max-product-count wbs24-max-product-count-basket"; hint.innerHTML = "<div>Добавлено максимальное количество товара</div>"; } if (!this.currentURL.includes(this.basketURL)) { hint.className = "wbs24-max-product-count"; hint.innerHTML = "<div>Добавлено максимальное<br>количество товара</div>"; } quantityInputParent.append(hint); } let wbs24MaxCount = quantityInputParent.querySelector('.wbs24-max-product-count'); if (observerLabel) { if (Number(quantityInput.value) == Number(plusButton.dataset.max)) { wbs24MaxCount.style.display = "block"; } } // add handler for input value quantityInput.addEventListener('input', () => { if (Number(quantityInput.value) >= Number(plusButton.dataset.max)) { wbs24MaxCount.style.display = "block"; } else { wbs24MaxCount.style.display = "none"; } }); // add handler for click on plus button if (this.currentURL.includes(this.basketURL)) { plusButton.addEventListener('click', () => { if (this.debug) console.log('quantity value: ' + quantityInput.value); if (this.debug) console.log('plusButton value: ' + plusButton.dataset.max); if (Number(quantityInput.value) >= Number(plusButton.dataset.max)) { wbs24MaxCount.style.display = "block"; } else { wbs24MaxCount.style.display = "none"; } }); } else { plusButton.addEventListener('click', () => { if (this.debug) console.log('quantity value: ' + quantityInput.value); if (this.debug) console.log('plusButton value: ' + plusButton.dataset.max); if (Number(quantityInput.value) + 1 >= Number(plusButton.dataset.max)) { wbs24MaxCount.style.display = "block"; } else { wbs24MaxCount.style.display = "none"; } }); } // add handler for click on minus button minusButton.addEventListener('click', () => { wbs24MaxCount.style.display = "none"; }); } } sendAjaxRequest() { let basketItems = document.querySelectorAll('.basket-item-info-name-link'); basketItems.forEach(async (basketItem) => { let basketItemContainer = basketItem.closest('.basket-items-list-item-container'); let elementUrl = basketItem.href; let parseUrl = elementUrl.split('/'); let elementId = parseUrl[parseUrl.length - 2]; let url = '/ajax/wbs24_prompt.php?element_id=' + elementId; let response = await fetch(url); let responseText = await response.text(); let maxQuantity = JSON.parse(responseText); let childPlusButton = basketItemContainer.querySelector('.basket-item-amount-btn-plus'); childPlusButton.dataset.max = maxQuantity; this.elementIdsToMaxCount[elementId] = maxQuantity; }); } } document.addEventListener("DOMContentLoaded", function(event) { let wbs24Hint = new Wbs24Hint(); wbs24Hint.start(); }); class Wbs24GallerySlider { constructor() { this.debug = false; this.catalogContainerCss = '.catalog_block'; this.mainPage = '.wide_page'; this.currentURL = window.location.href; this.catalogURL = '/catalog/'; } start() { this.createHandlers(); if (this.currentURL.includes(this.catalogURL)) { this.observer(this.catalogContainerCss); } else { this.observer(this.mainPage); } } createHandlers() { let allGalleryWrappers = document.querySelectorAll('.section-gallery-wrapper'); allGalleryWrappers.forEach(function(galleryWrapper, index) { if (!galleryWrapper.dataset.wbs24event) { let wbs24GallerySlider = new Wbs24GallerySlider(); wbs24GallerySlider.createHandler(galleryWrapper); } }); } createHandler(galleryWrapper) { if (galleryWrapper != undefined) { galleryWrapper.dataset.wbs24event = true; galleryWrapper.onmouseleave = function(event) { let galleryWrapperItems = galleryWrapper.querySelectorAll('.section-gallery-wrapper__item'); galleryWrapperItems.forEach((galleryWrapperItem) => { if (galleryWrapperItem.classList.contains('_active')) { galleryWrapperItem.classList.remove('_active'); } }); galleryWrapperItems[0].classList.add('_active'); }; } } observer(css) { let catalogElement = document.querySelector(css); if (catalogElement) { let catalogElementObserver = new MutationObserver(mutationRecords => { if (this.debug) console.log('catalogElementObserver found mutation'); this.action(); }); catalogElementObserver.observe(catalogElement, { childList: true, subtree: true, }); } } action() { this.createHandlers(); } } document.addEventListener("DOMContentLoaded", function(event) { let wbs24GallerySlider = new Wbs24GallerySlider(); wbs24GallerySlider.start(); }); class Wbs24StickerColor{ constructor() { this.debug = false; this.catalogContainerCss = '.catalog_page'; this.mainPage = '.wide_page'; this.currentURL = window.location.href; this.catalogURL = '/catalog/'; } start() { this.bypassAllStickers(); if (this.currentURL.includes(this.catalogURL)) { this.observer(this.catalogContainerCss); } else { this.observer(this.mainPage); } } bypassAllStickers() { let stickers = document.querySelectorAll('[class*="sticker_"]'); stickers.forEach(function(sticker) { if (!sticker.dataset.wbs24label) { let wbs24StickerColor = new Wbs24StickerColor(); wbs24StickerColor.changeStickerColor(sticker); } }); } changeStickerColor(sticker) { if (sticker != undefined) { // ставим метку, чтобы больше не проходить по этому стикеру sticker.dataset.wbs24label = true; let className = sticker.className; let arrClassName = className.split('_'); sticker.setAttribute('style', `background-color:#${arrClassName[1]} !important`); } } observer(css) { let catalogElement = document.querySelector(css); if (catalogElement) { let catalogElementObserver = new MutationObserver(mutationRecords => { if (this.debug) console.log('catalogElementObserver found mutation'); this.action(); }); catalogElementObserver.observe(catalogElement, { childList: true, subtree: true, }); } } action() { this.bypassAllStickers(); } } document.addEventListener("DOMContentLoaded", function(event) { let wbs24StickerColor = new Wbs24StickerColor(); wbs24StickerColor.start(); }); class Wbs24Bonus { start() { this.sendAjaxRequest(); } async sendAjaxRequest() { let catalogDetail = document.querySelector('.catalog_detail'); if (catalogDetail) { let url = '/ajax/wbs24_user_type.php'; let response = await fetch(url); let responseText = await response.text(); let isWholesaleBuyer = JSON.parse(responseText); if (!isWholesaleBuyer) { this.addBonusLabelToDetailProduct(); } } else { let currentURL = window.location.href; let basketURL = '/basket/'; if (currentURL.includes(basketURL)) { let url = '/ajax/wbs24_user_type.php'; let response = await fetch(url); let responseText = await response.text(); let isWholesaleBuyer = JSON.parse(responseText); if (!isWholesaleBuyer) { this.addBonusLabelToBasket(0); this.observer('.basket-items-list'); } } } } addBonusLabelToDetailProduct() { let saleBlock = document.querySelector('.prices_block .sale_block'); if (saleBlock) { let div = document.createElement('div'); div.className = 'text'; div.style.background = '#1e90ff'; div.style.color = 'white'; div.innerHTML = 'Бонусы от <span class="values_wrapper"><span class="price_value">104,5</span><span class="price_currency"> ₽</span></span>'; saleBlock.append(div); } else { let priceMatrixWrapper = document.querySelector('.prices_block .price_matrix_wrapper'); if (priceMatrixWrapper) { let div = document.createElement('div'); div.className = 'sale_block'; div.innerHTML = '<div class="text" style="background:#1e90ff;color:white;">Бонусы от <span class="values_wrapper"><span class="price_value">104,5</span><span class="price_currency"> ₽</span></span></div>'; priceMatrixWrapper.append(div); } } } addBonusLabelToBasket(sumObserver) { let bonus = document.querySelector('.wbs24-bonus-final'); if (bonus) { bonus.remove(); } let sum = Number(document.querySelector('.basket-coupon-block-total-price-current').innerHTML.replace(/[^\d.-]/g, '')); if (sumObserver > 0) { sum = sumObserver; } let bonuses = document.querySelectorAll('.wbs24-highload-data .bonus'); if (bonuses) { bonuses.forEach(bonus => { let priceFrom = Number(bonus.querySelector('.priceFrom').innerHTML); let priceTo = Number(bonus.querySelector('.priceTo').innerHTML); let priceBonus = Number(bonus.querySelector('.priceBonus').innerHTML); let saleBlock = document.querySelector('.basket-checkout-block-total-price-inner'); let basketCouponBlock = document.querySelector('.basket-coupon-block-total-price-difference'); if ((sum > priceFrom) && (sum < priceTo)) { let orderBonus = sum * priceBonus / 100; let div = document.createElement('div'); if (basketCouponBlock) { div.className = 'wbs24-bonus-final wbs24-bonus-right basket-coupon-block-total-price-difference'; } else { div.className = 'wbs24-bonus-final basket-coupon-block-total-price-difference'; } div.innerHTML = '<div>Бонус</div> <span style="white-space: nowrap; background:#1e90ff;color:white;">'+ orderBonus.toLocaleString() +' ₽</span>'; saleBlock.append(div); } }); } } observer(css) { let catalogElement = document.querySelector(css); if (catalogElement) { let catalogElementObserver = new MutationObserver(mutationRecords => { if (this.debug) console.log('catalogElementObserver found mutation'); this.action(); }); catalogElementObserver.observe(catalogElement, { childList: true, subtree: true, }); } } action() { let items = document.querySelectorAll('.basket-items-list-item-amount'); let sum = 0; items.forEach(item => { let priceBlock = item.nextElementSibling; let price = Number(priceBlock.querySelector('.basket-item-price-current-text').innerHTML.replace(/[^\d.-]/g, '')); sum = sum + price; }); let sumObserver = sum; console.log('sumObserver: ' + sumObserver); this.addBonusLabelToBasket(sumObserver); } } document.addEventListener("DOMContentLoaded", function(event) { let wbs24Bonus = new Wbs24Bonus(); wbs24Bonus.start(); }); /* wbs24 - stop bot field */ if (typeof window !== 'undefined') { document.addEventListener('DOMContentLoaded', function() { let stopBot = document.querySelector('.stop_bot input'); if(!!stopBot) { stopBot.removeAttribute('required'); } }); } class Wbs24BasketUkassa { constructor() { this.currentURL = window.location.href; this.catalogURL = '/order/'; } start() { if (this.currentURL.includes(this.catalogURL)) { let paymentGatewayBtn = document.querySelector('.btn-success'); if (paymentGatewayBtn) { paymentGatewayBtn.click(); } } } } if (typeof window !== 'undefined') { document.addEventListener("DOMContentLoaded", function(event) { let BasketUkassa = new Wbs24BasketUkassa(); BasketUkassa.start(); }); }