PageSourceSearch

https://rgsu.net/tm/assets/js/rbasket-merch.js?v=2.2.241

js rgsu.net collected 2026-10-02 06:36:09 UTC 18,908 bytes, 527 lines download raw bytes

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.