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)) + ' м³'; 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)) + ' м³'; 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.