403Webshell
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 :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/templates/aspro_next_rospiro/js/custom.js
/*
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('&nbsp;', '', 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();
    });
}

Youez - 2016 - github.com/yon3zu
LinuXploit