1 2const rBasket = { 3 4 nFormat: new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }), 5 // 6 //==================== Cards manipulation ============================ 7 // 8 9 initCards: function (mode = 0) { 10 let cards = document.querySelectorAll(".merch-card"); 11 12 if (cards.length == 0) { 13 cards = document.querySelectorAll(".merch-card-one"); 14 } 15 16 const baseClass = "merch-card"; 17 18 this.getFromCookie(); 19 20 this.showHeaderSum(this.sumGoods()); 21 22 cards.forEach(card => { 23 24 const btnOrder = card.querySelector(`.${baseClass}__btn-order`); 25 const btnPrice = card.querySelector(`.${baseClass}__btn-price`); 26 27 // const btnCart = card.querySelector(`.${baseClass}__btn-order`); 28 29 const currentCount = card.querySelector(`input.button-price__count`); 30 const btnMinus = card.querySelector("button.button-price__minus"); 31 const bntPlus = card.querySelector("button.button-price__plus"); 32 33 const code = card.dataset.code; 34 const price = card.dataset.price; 35 36 const changeButtons = () => { 37 btnOrder.classList.toggle('hide'); 38 btnPrice.classList.toggle('hide'); 39 }; 40 41 const initButtons = () => { 42 btnOrder.classList.remove('hide'); 43 btnPrice.classList.add('hide'); 44 }; 45 46 let item = this.get(code); 47 // console.log('item', item, code, this.goods); 48 if (item) { 49 changeButtons(); 50 currentCount.value = item.qty; 51 } else { 52 currentCount.value = 0; 53 initButtons(); 54 } 55 56 btnOrder.addEventListener("click", () => { 57 currentCount.value = 1; 58 changeButtons(); 59 this.fullAdd(code, currentCount.value, price); 60 if (mode) { 61 this.calcCards(); 62 } 63 }); 64 65 btnMinus.addEventListener("click", () => { 66 if (Number(currentCount.value) <= 1) { 67 currentCount.value = "1"; 68 changeButtons(); 69 this.fullAdd(code, 0, price); 70 if (mode) { 71 card.classList.add('hidden'); 72 card.remove(); 73 this.calcCards(); 74 } 75 return; 76 } 77 currentCount.value = Number(currentCount.value) - 1; 78 this.fullAdd(code, currentCount.value, price); 79 if (mode) { 80 this.calcCards(); 81 } 82 }); 83 84 bntPlus.addEventListener("click", () => { 85 currentCount.value = Number(currentCount.value) + 1; 86 this.fullAdd(code, currentCount.value, price); 87 if (mode) { 88 this.calcCards(); 89 } 90 }); 91 }); 92 }, 93 clearBasket: function () { 94 let cards = document.querySelectorAll(".merch-card"); 95 96 if (cards.length == 0) { 97 cards = document.querySelectorAll(".merch-card-one"); 98 } 99 100 const baseClass = "merch-card"; 101 102 this.clear(); 103 104 this.getFromCookie(); 105 106 this.showHeaderSum(this.sumGoods()); 107 108 cards.forEach(card => { 109 const btnOrder = card.querySelector(`.${baseClass}__btn-order`); 110 const btnPrice = card.querySelector(`.${baseClass}__btn-price`); 111 112 const currentCount = card.querySelector(`input.button-price__count`); 113 114 const code = card.dataset.code; 115 const price = card.dataset.price; 116 117 const initButtons = () => { 118 btnOrder.classList.remove('hide'); 119 btnPrice.classList.add('hide'); 120 }; 121 122 currentCount.value = 0; 123 initButtons(); 124 125 }); 126 }, 127 // ÐÐ»Ñ ÑÑÑаниÑÑ "ÐоÑзина" 128 calcCards: function () { 129 let cards = document.querySelectorAll(".merch-card"); 130 const baseClass = "merch-card"; 131 132 let amount = 0, amountOld = 0, amountDiscount = 0; 133 cards.forEach(card => { 134 let price = card.dataset.price; 135 let priceOld = card.dataset.priceold; 136 let discount = parseInt(priceOld - price); 137 let qty = card.querySelector("input.button-price__count").value; 138 // console.log(price, priceOld, discount, qty); 139 amount += parseInt(price * qty); 140 amountOld += parseInt(priceOld * qty); 141 if (discount > 0) { 142 amountDiscount += parseInt(discount * qty); 143 } 144 let priceSum = card.querySelector(".card-book__price-action"); 145 if (priceSum) { 146 priceSum.innerHTML = this.nFormat.format(parseInt(price * qty)) + ' â½'; 147 } 148 }); 149 150 // console.log(amount, amountOld, amountDiscount); 151 152 let basket = document.querySelector(".basket-section__right-prices"); 153 154 if (basket) { 155 amount = this.nFormat.format(parseInt(amount)); 156 basket.querySelector('span.right-amount').innerHTML = `${amount} â½`; 157 if (amountOld && amountOld > amount) { 158 basket.querySelector('span.old-amount').innerHTML = `${amountOld} â½`; 159 } else { 160 basket.querySelector('span.old-amount').innerHTML = ``; 161 } 162 if (amountDiscount) { 163 basket.querySelector('div.discount-amount').innerHTML = `Скидка ${amountDiscount} â½`; 164 } else { 165 basket.querySelector('div.discount-amount').innerHTML = ``; 166 } 167 } 168 169 // return { 'amount': amount, 'amountOld': amountOld, 'amountDiscount', amountDiscount }; 170 },
171 initCardsPopup: function () { 172 173 return; 174 let cards = document.querySelectorAll("li.basket-nav__item"); 175 176 cards.forEach((card) => { 177 let btnTrach = card.querySelector(`button.basket-nav__btn-del-item`); 178 let code = card.dataset.code; 179 if (btnTrach) { 180 btnTrach.addEventListener("click", (e) => { 181 this.fullAdd(code, 0); 182 card.classList.add('hidden'); 183 card.remove(); 184 this.calcCardsPopup(); 185 }); 186 } 187 }); 188 }, 189 190 loadCardsPopup: function () { 191 192 const popupBasket = document.getElementById('popup-basket'); 193 const container = popupBasket.querySelector("ul.basket-nav__list"); 194 const countBadge = popupBasket.querySelector(".basket-nav__title"); 195 const amountBadge = popupBasket.querySelector(".basket-nav__price"); 196 const aboutText = popupBasket.querySelector('input[name="f_About"]'); 197 let urlContainer = document.querySelector(".merch-section-url-settings"); 198 let dataUrl = urlContainer.dataset.url; 199 200 reloadData(new FormData()); 201 202 203 function reloadData(data) { 204 // data.append('sort', sortMode); 205 // console.log(data); 206 fetch(dataUrl, { 207 method: 'POST', 208 body: data 209 }).then((response) => { 210 // console.log(response); 211 if (!response.ok) { 212 throw new Error(`ÐÑоизоÑла оÑибка. ÐопÑобÑйÑе позже`); 213 } 214 return response.json(); 215 }).then((body) => { 216 // console.log(body.tags); 217 // preloader.classList.add('hidden'); 218 219 /* 220 if (body.json) { 221 rBasket.goods = JSON.parse(body.json); 222 rBasket.saveToCookie(); 223 rBasket.init(); 224 } 225 */ 226 227 if (!body.itemsHTML || body.itemsHTML.length < 1) { 228 container.innerHTML = ` 229 <div class="program-filters__section-title center" style="width:100%; grid-column: span 4;"> 230 ÐоÑзина пÑÑÑа 231 </div> 232 `; 233 // moreButton.classList.add('hidden'); 234 } else { 235 container.innerHTML = body.itemsHTML; 236 //countBadge.innerHTML = body.qty + ' ÑоваÑов'; 237 amountBadge.innerHTML = body.amount + ' â½'; 238 aboutText.value = body.about; 239 rBasket.initCardsPopup(); 240 } 241 body.itemsHTML = ''; 242 }).catch((error) => { 243 // preloader.classList.add('hidden'); 244 console.log(error); 245 container.innerHTML = ` 246 <div class="program-filters__section-title center" style="width:100%; grid-column: span 4;"> 247 ÐоÑзина пÑÑÑа. 248 </div> 249 `; 250 // moreButton.classList.add('hidden'); 251 }); 252 } 253 254 }, 255 calcCardsPopup: function () { 256 const popupBasket = document.getElementById('popup-basket'); 257 let amountBadge = popupBasket.querySelector(".basket-nav__price"); 258 259 let cards = document.querySelectorAll("li.basket-nav__item"); 260 261 let amount = 0; 262 cards.forEach((card) => { 263 let price = card.dataset.price; 264 let qty = card.dataset.qty; 265 amount += parseInt(price * qty); 266 }); 267 // console.log(amountBadge, amount); 268 amountBadge.innerHTML = amount + ' â½'; 269 }, 270 271 // 272 //==================== Basket manipulation ============================ 273 // 274 275 headerBasketContainer: '', headerBasketCount: '', headerBasketSum: '', 276 // headerBasketContainerMob: '', headerBasketCountMob: '', 277 basketGoodsCookieName: 'rgsu_net_goods', 278 goods: [], 279 280 init: function () { 281 this.headerBasketContainer = document.querySelector('button.merch-section__btn-bag'); 282 if (this.headerBasketContainer) { 283 this.headerBasketSum = this.headerBasketContainer.querySelector('span.button__label'); 284 } 285 // this.headerBasketCountMob = document.querySelector('span.header-mob-menu__notice--mob'); 286 this.getFromCookie(); 287 288 let count = this.countGoods(); 289 this.showHeaderCount(count); 290 }, 291 fullAdd: function (code, qty, price) { 292 this.getFromCookie(); 293 this.add(code, qty, price); 294 this.saveToCookie(); 295 296 let count = this.countGoods(); 297 this.showHeaderCount(count); 298 299 this.showHeaderSum(this.sumGoods()); 300 console.log(this.sumGoods()); 301 }, 302 add: function (code, qty, price) { 303 let changed = false; 304 this.goods.forEach((item, index) => { 305 if (item.code == code) { 306 this.goods[index].qty = qty; 307 this.goods[index].price = price; 308 changed = true; 309 } 310 }); 311 if (!changed) { 312 this.goods.push({ 'code': code, 'qty': qty, 'price': price }); 313 } 314 }, 315 remove: function (code, qty = 0) { 316 this.goods.forEach((item, index) => { 317 if (item.code == code) { 318 this.goods[index].qty = 0; 319 } 320 }); 321 }, 322 get: function (code) { 323 let retItem = false; 324 this.goods.forEach((item, index) => { 325 if (item.code == code && item.qty > 0) { 326 retItem = item; 327 } 328 }); 329 return retItem; 330 }, 331 countGoods: function () { 332 let count = 0; 333 this.goods.forEach((item, index) => { 334 if (item.qty > 0) { 335 count += parseInt(item.qty); 336 } 337 }); 338 return count; 339 }, 340 sumGoods: function () { 341 let sum = 0; 342 this.goods.forEach((item, index) => { 343 if (item.qty > 0) { 344 sum += parseInt(item.qty) * parseInt(item.price); 345 } 346 }); 347 return sum; 348 }, 349 clear: function () { 350 this.cookie.clear(this.basketGoodsCookieName); 351 }, 352 getFromCookie: function () { 353 let cookieString = this.cookie.get(this.basketGoodsCookieName); 354 if (cookieString) { 355 this.goods = JSON.parse(cookieString); 356 } else { 357 this.goods = []; 358 } 359 }, 360 saveToCookie: function () { 361 this.cookie.set(this.basketGoodsCookieName, JSON.stringify(this.goods)); 362 }, 363 showHeaderCount: function (count) { 364 this.headerBasketCount.innerHTML = count; 365 if (this.headerBasketContainer) { 366 if (count > 0) { 367 this.headerBasketContainer.setAttribute('data-popup-open', '#popup-basket'); 368 } else { 369 this.headerBasketContainer.setAttribute('data-popup-open', '#popup-basket-empty'); 370 } 371 } 372 if (this.headerBasketCountMob) { 373 this.headerBasketCountMob.innerHTML = count; 374 } 375 }, 376 showHeaderSum: function (sum) { 377 this.headerBasketSum.innerHTML = this.nFormat.format(parseInt(sum)) + ' â½'; 378 if (this.headerBasketContainer) { 379 if (sum > 0) { 380 this.headerBasketContainer.setAttribute('data-popup-open', '#popup-basket'); 381 } else { 382 this.headerBasketContainer.setAttribute('data-popup-open', '#popup-basket-empty'); 383 } 384 } 385 if (this.headerBasketCountMob) { 386 this.headerBasketCountMob.innerHTML = sum; 387 } 388 }, 389 btnOrderCard: () => { 390 const baseClass = 'merch-card'; 391 const merchContent = document.querySelector( 392 '.merch-catalog__items', 393 ); 394 if (!merchContent) return; 395 const items = merchContent.querySelectorAll(`.${baseClass}`);
396 items.forEach((card) => { 397 const btnOrder = card.querySelector(`.${baseClass}__btn-order`); 398 const btnPrice = card.querySelector(`.${baseClass}__btn-price`); 399 400 if (!btnOrder || !btnPrice) return; 401 const changeButtons = () => { 402 btnOrder.classList.toggle('hide'); 403 btnPrice.classList.toggle('hide'); 404 }; 405 406 btnOrder.addEventListener('click', changeButtons); 407 }); 408 }, 409 btnOrderCardCount: () => { 410 document.querySelectorAll("[data-toggle='button-price']").forEach((button) => { 411 const baseClass = 'button-price'; 412 const behavior = button.getAttribute('data-behavior') || 'disable'; 413 414 const currentCount = button.querySelector( 415 `.${baseClass}__count`, 416 ); 417 const btnMinus = button.querySelector( 418 `.${baseClass}__minus`, 419 ); 420 const btnPlus = button.querySelector( 421 `.${baseClass}__plus`, 422 ); 423 if (!currentCount || !btnMinus || !btnPlus) return; 424 425 const updateState = () => { 426 const value = Number(currentCount.value) || 0; 427 if (behavior === 'disable') { 428 if (value <= 1) { 429 btnMinus.setAttribute('disabled', 'true'); 430 } else { 431 btnMinus.removeAttribute('disabled'); 432 } 433 } else if (behavior === 'hide-parent') { 434 btnMinus.removeAttribute('disabled'); 435 } 436 }; 437 438 updateState(); 439 btnMinus.addEventListener('click', () => { 440 let value = Number(currentCount.value) || 0; 441 const prevValue = value; 442 value = Math.max(1, value - 1); 443 currentCount.value = String(value); 444 445 if (behavior === 'hide-parent' && prevValue === 1) { 446 const parentCard = button.closest('.merch-card'); 447 if (parentCard) { 448 const btnOrder = parentCard.querySelector('.merch-card__btn-order'); 449 const btnPrice = parentCard.querySelector('.merch-card__btn-price'); 450 451 if (btnOrder && btnPrice) { 452 btnOrder.classList.remove('hide'); 453 btnPrice.classList.add('hide'); 454 } 455 } 456 } 457 458 updateState(); 459 }); 460 461 btnPlus.addEventListener('click', () => { 462 let value = Number(currentCount.value) || 0; 463 value += 1; 464 currentCount.value = String(value); 465 updateState(); 466 }); 467 }); 468 }, 469 // 470 //==================== Easy cookie manipulation ============================ 471 // 472 cookie: { 473 set: function (name, value, days) { 474 var date; 475 var expires; 476 477 if (days) { 478 date = new Date(); 479 date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 480 expires = "; expires=" + date.toGMTString(); 481 } else { 482 expires = ""; 483 } 484 485 document.cookie = name + "=" + value + expires + "; path=/"; 486 }, 487 488 get: function (name) { 489 var nameEQ = name + "="; 490 var cookiesArray = document.cookie.split(';'); 491 var cookiesArrayLength = cookiesArray.length; 492 var i = 0; 493 var cookie; 494 495 for (i = 0; i < cookiesArrayLength; i += 1) { 496 cookie = cookiesArray[i]; 497 498 while (cookie.charAt(0) === ' ') { 499 cookie = cookie.substring(1, cookie.length); 500 } 501 502 if (cookie.indexOf(nameEQ) === 0) { 503 return cookie.substring(nameEQ.length, cookie.length); 504 } 505 } 506 return null; 507 }, 508 509 clear: function (name) { 510 this.set(name, "", -1); 511 }, 512 } 513}; 514 515document.addEventListener('DOMContentLoaded', () => { 516 517 rBasket.init(); 518 519 const headerBasketButton = document.querySelector("button.merch-section__btn-bag"); 520 521 if (headerBasketButton) { 522 headerBasketButton.addEventListener("click", (e) => { 523 rBasket.loadCardsPopup(); 524 }); 525 } 526 527});
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.