PageSourceSearch

https://lenwood.ru/local/templates/main/components/bitrix/sale.bas…/.default/script.js?177537690514860

js lenwood.ru collected 2026-10-07 17:20:55 UTC 14,860 bytes, 358 lines download raw bytes

1// check if quantity is valid
2// and update values of both controls (text input field for PC and mobile quantity select) simultaneously
3function updateQuantity(controlId, basketId, ratio, bUseFloatQuantity) {
4    var oldVal = BX(controlId).defaultValue,
5        newVal = parseFloat(BX(controlId).value) || 0,
6        bIsCorrectQuantityForRatio = false,
7        autoCalculate = ((BX("auto_calculation") && BX("auto_calculation").value == "Y") || !BX("auto_calculation"));
8
9    if (ratio === 0 || ratio == 1) {
10        bIsCorrectQuantityForRatio = true;
11    }
12    else {
13
14        var newValInt = newVal * 10000,
15            ratioInt = ratio * 10000,
16            reminder = newValInt % ratioInt,
17            newValRound = parseInt(newVal);
18
19        if (reminder === 0) {
20            bIsCorrectQuantityForRatio = true;
21        }
22    }
23
24    var bIsQuantityFloat = false;
25
26    if (parseInt(newVal) != parseFloat(newVal)) {
27        bIsQuantityFloat = true;
28    }
29
30    newVal = (bUseFloatQuantity === false && bIsQuantityFloat === false) ? parseInt(newVal) : parseFloat(newVal).toFixed(4);
31    newVal = correctQuantity(newVal);
32
33    if (bIsCorrectQuantityForRatio) {
34        BX(controlId).defaultValue = newVal;
35
36        BX("QUANTITY_INPUT_" + basketId).value = newVal;
37
38        // set hidden real quantity value (will be used in actual calculation)
39        BX("QUANTITY_" + basketId).value = newVal;
40
41        if (autoCalculate) {
42            // basketPoolQuantity.changeQuantity(basketId);
43        }
44    }
45    else {
46        newVal = getCorrectRatioQuantity(newVal, ratio, bUseFloatQuantity);
47        newVal = correctQuantity(newVal);
48
49        if (newVal != oldVal) {
50            BX("QUANTITY_INPUT_" + basketId).value = newVal;
51            BX("QUANTITY_" + basketId).value = newVal;
52
53            if (autoCalculate) {
54                //basketPoolQuantity.changeQuantity(basketId);
55            }
56        } else {
57            BX(controlId).value = oldVal;
58        }
59    }
60    recalcBasketAjax({});
61}
62
63// used when quantity is changed by clicking on arrows
64function setQuantity(basketId, ratio, sign, bUseFloatQuantity) {
65    var curVal = parseFloat(BX("QUANTITY_INPUT_" + basketId).value),
66        newVal;
67
68    newVal = (sign == 'up') ? curVal + ratio : curVal - ratio;
69
70    if (newVal < 0)
71        newVal = 0;
72
73    if (bUseFloatQuantity) {
74        newVal = parseFloat(newVal).toFixed(4);
75    }
76    newVal = correctQuantity(newVal);
77
78    if (ratio > 0 && newVal < ratio) {
79        newVal = ratio;
80    }
81
82    if (!bUseFloatQuantity && newVal != newVal.toFixed(4)) {
83        newVal = parseFloat(newVal).toFixed(4);
84    }
85
86    newVal = getCorrectRatioQuantity(newVal, ratio, bUseFloatQuantity);
87    newVal = correctQuantity(newVal);
88
89    BX("QUANTITY_INPUT_" + basketId).value = newVal;
90    BX("QUANTITY_INPUT_" + basketId).defaultValue = newVal;
91
92    updateQuantity('QUANTITY_INPUT_' + basketId, basketId, ratio, bUseFloatQuantity);
93}
94
95function getCorrectRatioQuantity(quantity, ratio, bUseFloatQuantity) {
96    var newValInt = quantity * 10000,
97        ratioInt = ratio * 10000,
98        reminder = (quantity / ratio - ((quantity / ratio).toFixed(0))).toFixed(6),
99        result = quantity,
100        bIsQuantityFloat = false,
101        i;
102    ratio = parseFloat(ratio);
103
104    if (reminder == 0) {
105        return result;
106    }
107
108    if (ratio !== 0 && ratio != 1) {
109        for (i = ratio, max = parseFloat(quantity) + parseFloat(ratio); i <= max; i = parseFloat(parseFloat(i) + parseFloat(ratio)).toFixed(4)) {
110            result = i;
111        }
112
113    } else if (ratio === 1) {
114        result = quantity | 0;
115    }
116
117    if (parseInt(result, 10) != parseFloat(result)) {
118        bIsQuantityFloat = true;
119    }
120
121    result = (bUseFloatQuantity === false && bIsQuantityFloat === false) ? parseInt(result, 10) : parseFloat(result).toFixed(4);
122    result = correctQuantity(result);
123    return result;
124}
125
126function correctQuantity(quantity) {
127    return parseFloat((quantity * 1).toString());
128}
129
130/**
131 *
132 * @param {} params
133 */
134function recalcBasketAjax(params) {
135
136    BX.showWait();
137
138    var property_values = {},
139        action_var = BX('action_var').value,
140        items = BX('basket_items').querySelectorAll('.cart__item'),
141        delayedItems = BX('delayed_items'),
142        postData,
143        i;
144
145    postData = {
146        'via_ajax': 'Y',
147        'sessid': BX.bitrix_sessid(),
148        'site_id': BX.message('SITE_ID'),
149        'props': property_values,
150        'action_var': action_var,
151        'select_props': BX('column_headers').value,
152        'offers_props': BX('offers_props').value,
153        'quantity_float': BX('quantity_float').value,
154        'price_vat_show_value': BX('price_vat_show_value').value,
155        'hide_coupon': BX('hide_coupon').value,
156        'use_prepayment': BX('use_prepayment').value,
157        'signedParamsString': BX('signedParamsString').value
158
159    };
160    postData[action_var] = 'recalculate';
161
162    if (!!items && items.length > 0) {
163        for (i = 0; items.length > i; i++) {
164            postData['QUANTITY_' + items[i].id] = BX('QUANTITY_' + items[i].id).value;
165        }
166    }
167
168    BX.ajax({
169        url: '/bitrix/components/bitrix/sale.basket.basket/ajax.php',
170        method: 'POST',
171        data: postData,
172        dataType: 'json',
173        onsuccess: function (result) {
174            if (!!result.BASKET_DATA.GRID.ROWS) {
175                var totalQuantity = 0;
176                var totalWeight = 0;
177                $.each(result.BASKET_DATA.GRID.ROWS, function (i, element) {
178                    BX('sum_FORMATED_' + element.ID).innerHTML = element.SUM;
179                    BX('QUANTITY_INPUT_' + element.ID).value = element.QUANTITY;
180                    BX('QUANTITY_' + element.ID).value = element.QUANTITY;
181
182                    totalQuantity++;
183
184                    var alter = '';
185
186                    if (element.MEASURE_CODE == '796') { //шт
187                        if (element.PROPERTY_TOLSHCHINA_VALUE != '' && element.PROPERTY_SHIRINA_VALUE != '' && element.PROPERTY_DLINA_VALUE != '') {
188                            if (typeof element.PROPERTY_TOLSHCHINA_VALUE != "undefined" && typeof element.PROPERTY_SHIRINA_VALUE != "undefined" && typeof element.PROPERTY_DLINA_VALUE != "undefined") {
189                                alter = ((element.PROPERTY_TOLSHCHINA_VALUE.replace(",", ".") * element.PROPERTY_SHIRINA_VALUE.replace(",", ".") * element.PROPERTY_DLINA_VALUE.replace(",", ".")) / 1000000000) * element.QUANTITY
190                                alter = parseFloat(alter.toFixed(3)) + ' м&sup3';
191                            }
192                        }
193                        console.log('вес штуки: ', element.PROPERTY_VES_SHTUKI_VALUE);
194                        // вес штуки указан не для всех товаров, решили игнорировать те, в которых не указан, ГУК декабрь 22
195                        if (element.PROPERTY_VES_SHTUKI_VALUE !== '') {
196                            totalWeight += parseFloat(element.PROPERTY_VES_SHTUKI_VALUE.replace(",", ".")) * element.QUANTITY;
197                        }
198                    }
199                    if (element.MEASURE_CODE == '6') {
200                        if (element.PROPERTY_TOLSHCHINA_VALUE != '' && element.PROPERTY_SHIRINA_VALUE != '' && element.PROPERTY_DLINA_VALUE != '') {
201                            if (typeof element.PROPERTY_TOLSHCHINA_VALUE != "undefined" && typeof element.PROPERTY_SHIRINA_VALUE != "undefined" && typeof element.PROPERTY_DLINA_VALUE != "undefined") {
202                                alter = (1000000000 / (element.PROPERTY_TOLSHCHINA_VALUE.replace(",", ".") * element.PROPERTY_SHIRINA_VALUE.replace(",", ".") * element.PROPERTY_DLINA_VALUE.replace(",", "."))) * element["QUANTITY"];
203                                alter = Math.floor(alter) + ' шт';
204                            }
205                        }
206                    }
207                    if (element.MEASURE_CODE == '778') { //упак // раньше умножалось на округленный объем одной штуки, поменял на расчет по сторонам и умножение на количество в упаковке, гук, август 2022
208                        if (element.PROPERTY_TOLSHCHINA_VALUE != '' && element.PROPERTY_SHIRINA_VALUE != '' && element.PROPERTY_DLINA_VALUE != '' && element.PROPERTY_KOLICHESTVO_V_UPAKOVKE_VALUE != '') {
209                            if (typeof element.PROPERTY_TOLSHCHINA_VALUE != "undefined" && typeof element.PROPERTY_SHIRINA_VALUE != "undefined" && typeof element.PROPERTY_DLINA_VALUE != "undefined" && typeof element.PROPERTY_KOLICHESTVO_V_UPAKOVKE_VALUE != "undefined") {
210                                alter = ((element.PROPERTY_TOLSHCHINA_VALUE.replace(",", ".") * element.PROPERTY_SHIRINA_VALUE.replace(",", ".") * element.PROPERTY_DLINA_VALUE.replace(",", ".")) / 1000000000) * element.PROPERTY_KOLICHESTVO_V_UPAKOVKE_VALUE.replace(",", ".") * element.QUANTITY;
211                                alter = parseFloat(alter.toFixed(3)) + ' м&sup3';
212                            }
213                        }
214                        console.log('вес упаковки: ', element.PROPERTY_VES_SHTUKI_VALUE);
215                        // вес упаковки указан не для всех товаров, решили игнорировать те, в которых не указан, ГУК декабрь 22
216                        if (element.PROPERTY_VES_UPAKOVKI_VALUE !== '') {
217                            totalWeight += parseFloat(element.PROPERTY_VES_UPAKOVKI_VALUE.replace(",", ".")) * element.QUANTITY;
218                        }
219                    }
220
221                    if (BX('alter_measure_' + element.ID)) {
222                        BX('alter_measure_' + element.ID).innerHTML = alter;
223                    }
224
225                });
226
227                BX('cartCntIcon').setAttribute('data-count', totalQuantity);
228                BX('cartCntString').innerHTML = declOfNum(totalQuantity, ['товар', 'товара', 'товаров']);
229                BX('cartCntSum').innerHTML = 'на сумму ' + result.BASKET_DATA.allSum_FORMATED;
230
231            }
232
233            BX('allSum_FORMATED_bottom').innerHTML = result.BASKET_DATA.allSum_FORMATED;
234            console.log(totalWeight);
235            // временный фикс
236            if (totalWeight == 0) {
237                BX('qv-total-weight').innerHTML = "неизвестен (обратитесь в отдел продаж)";
238            } else {
239                BX('qv-total-weight').innerHTML = totalWeight.toFixed(2);
240            }
241
242
243            BX.closeWait();
244        }
245    });
246}
247
248/**
249 * Добавление сопутствующих товаров
250 * @param {} params
251 */
252function addToBasketAjax(product_id) {
253
254    var bxajaxid = BX('bxajaxid');
255
256    BX.ajax({
257        method: "POST",
258        url: "/ajax/add_to_basket.php",
259        data: {
260            'ID': product_id,
261            'Q': '1'
262        },
263        dataType: "json",
264        onsuccess: function (data) {
265
266            BX.ajax.insertToNode('/personal/cart/?bxajaxid=' + bxajaxid.value, 'comp_' + bxajaxid.value);
267
268            BX('cartCntIcon').setAttribute('data-count', data.BASKET_COUNT);
269            BX('cartCntString').innerHTML = data.BASKET_COUNT_FORMAT;
270            BX('cartCntSum').innerHTML = 'на сумму ' + data.BASKET_PRICE;
271
272            yaCounter14007397.reachGoal('upsell');
273            ga('send', 'event', 'direct', 'addtobasket');
274
275        }
276    });
277
278
279}
280
281function declOfNum(number, titles) {
282    cases = [2, 0, 1, 1, 1, 2];
283    return number + ' ' + titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]];
284}
285
286
287/*Проверка совпадения количества штук в упаковке с количеством штук в корзине*/
288document.addEventListener('DOMContentLoaded', function () {
289    // Функция для проверки значения инпута
290    let validateInput = (input) => {
291        let packageQty = parseInt(input.dataset.packageQuantity, 10);
292        let btnOrder = document.querySelector('.btn.btn--red');
293        let btnBuy = document.querySelector('.btn.btn--gray');
294
295        // Ищем родителя .cart__item
296        let cartItem = input.closest('.cart__item');
297        let badge = cartItem?.querySelector('.badge-danger-package');
298
299        if (!packageQty || packageQty <= 0) {
300            input.classList.remove('danger-border-package');
301            if (badge) badge.style.display = 'none';
302            return;
303        }
304
305        let inputValue = parseInt(input.value, 10) || 0;
306
307        if (inputValue !== packageQty && inputValue % packageQty !== 0) {
308            input.classList.add('danger-border-package');
309            btnOrder.classList.add('danger-btn-package');
310            btnBuy.classList.add('danger-btn-package');
311            if (badge) badge.style.display = 'block';
312        } else {
313            input.classList.remove('danger-border-package');
314            btnOrder.classList.remove('danger-btn-package');
315            btnBuy.classList.remove('danger-btn-package');
316            if (badge) badge.style.display = 'none';
317
318        }
319    };
320
321    //проверим все инпуты
322    let checkAllInputs = () => {
323        let inputs = document.querySelectorAll('input[data-package-quantity]');
324        inputs.forEach(input => validateInput(input));
325    };
326
327    //  при загрузке страницы
328    checkAllInputs();
329
330    //обработка количеста
331    document.addEventListener('click', function (event) {
332        let plusButton = event.target.closest('.input-spinner-arrow--plus');
333        let minusButton = event.target.closest('.input-spinner-arrow--minus');
334
335        if (plusButton || minusButton) {
336            let spinner = event.target.closest('.input-spinner');
337            if (spinner) {
338                let input = spinner.querySelector('.input-spinner-value');
339                if (input) {
340                    setTimeout(() => validateInput(input), 0);
341                }
342            }
343        }
344    });
345
346    document.addEventListener('click', function (event) {
347        let deleteButton = event.target.closest('.cart__item-remove.js-cart-remove');
348        if (deleteButton) {
349            event.preventDefault();
350            setTimeout(checkAllInputs, 300);
351        }
352    });
353
354    // Отслеживаем успешное завершение AJAX-запроса Bitrix (перерисовка корзины) - без этого работать не будет, т.к. битрикс переписывает корзину
355    BX.addCustomEvent('onAjaxSuccess', function () {
356        setTimeout(checkAllInputs, 100); // Проверяем все элементы после перерисовки
357    });
358});

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.