PageSourceSearch

https://hotel-attache.ru/wp-content/plugins/attache-booking/fronte…/assets/att.booking.front.js?ver=1757359985

js hotel-attache.ru collected 2026-10-07 17:36:25 UTC 33,539 bytes, 797 lines download raw bytes

1jQuery(document).ready(function ($) {
2    let booking_attache = $("#booking_attache");
3
4    let booking_start = $("input[name='booking_start']");
5    let booking_finish = $("input[name='booking_finish']");
6
7    let booking_guests_rooms = $(".booking_guests_rooms");
8    let booking_guests_guests_adults = $(".booking_guests_guests_adults");
9    let booking_guests_guests_childs = $(".booking_guests_guests_childs");
10
11    let booking_select = $(".booking_select");
12    let booking_guests_chevron = $(".booking_guests_chevron");
13    let booking_guests_popup = $(".booking_guests_popup");
14
15    let booking_room = $(".booking_room");
16    let booking_add_room = $("#booking_add_room");
17    let booking_remove_room = $(".booking_remove_room");
18
19    let booking_adults = $(".booking_adults");
20    let booking_remove_adult = $(".booking_remove_adult");
21    let booking_add_adult = $(".booking_add_adult");
22
23    let booking_guests_popup_static = $(".booking_guests_popup_static");
24    let booking_guests_popup_child = $(".booking_guests_popup_child");
25    let booking_childs = $(".booking_childs");
26    let booking_remove_child = $(".booking_remove_child");
27    let booking_add_child = $(".booking_add_child");
28
29    let booking_child_age = $("input[name='booking_child_age']");
30
31    let booking_search = $("#booking_search");
32
33    let booking_roomer = $(".booking_roomer");
34
35    function resetResults() {
36        booking_roomer.html("");
37    }
38
39    // Счётчики
40    window.rooms = 1;
41    let all_adults = 1;
42    let all_childs = 0;
43
44
45    // Клоны
46    let childs_template = booking_guests_popup_child.clone();
47    booking_guests_popup_child.remove();
48
49    let booking_room_template = booking_room.clone();
50    booking_room.addClass("booking_room_1");
51    booking_room.attr("data-room-i", rooms);
52    booking_room.find("input[name='booking_adults']").attr("name", "room_" + rooms + "_booking_adults");
53    booking_room.find("input[name='booking_childs']").attr("name", "room_" + rooms + "_booking_childs");
54
55
56    //Проставляем текущую дату в поля
57    Date.prototype.toDateInputValue = (function () {
58        var local = new Date(this);
59        local.setMinutes(this.getMinutes() - this.getTimezoneOffset());
60        return local.toJSON().slice(0, 10);
61    });
62    // booking_start.val(new Date().toDateInputValue());
63    // booking_finish.val(new Date(new Date().setDate(new Date().getDate()+1)).toDateInputValue());
64
65
66    //Range Date Locale
67    window.locale_date = {
68        "format": "DD.MM.YYYY",
69        "separator": " - ",
70        "applyLabel": "Выбрать",
71        "cancelLabel": "Закрыть",
72        "fromLabel": "Заезд",
73        "toLabel": "Выезд",
74        "customRangeLabel": "Custom",
75        "weekLabel": "Н",
76        "daysOfWeek": [
77            "<span style='color:red'>Вс</span>",
78            "Пн",
79            "Вт",
80            "Ср",
81            "Чт",
82            "Пт",
83            "<span style='color:red'>Сб</span>"
84        ],
85        "monthNames": [
86            "Январь",
87            "Февраль",
88            "Март",
89            "Апрель",
90            "Май",
91            "Июнь",
92            "Июль",
93            "Август",
94            "Сентябрь",
95            "Октябрь",
96            "Ноябрь",
97            "Декабрь"
98        ],
99        "firstDay": 1
100    };
101
102    let currentDate = moment().format("DD.MM.YYYY");
103    let nextDate = moment().add(1, 'days').format("DD.MM.YYYY");
104
105    booking_start.val(currentDate);
106    booking_finish.val(nextDate);
107
108    $("#booking_start, #booking_finish").daterangepicker({
109        locale: locale_date,
110        startDate: currentDate,
111        endDate: nextDate,
112        minDate: currentDate,
113        alwaysShowCalendars: true,
114        autoApply: true,
115        autoUpdateInput: false,
116
117    }, function (start, end, label) {
118        // console.log("New date range selected: ' + start.format('YYYY-MM-DD') + ' to ' + end.format('YYYY-MM-DD') + ' (predefined range: ' + label + ')");
119        // Lets update the fields manually this event fires on selection of range
120        var selectedStartDate = start.format("DD.MM.YYYY"); // selected start
121        var selectedEndDate = end.format("DD.MM.YYYY"); // selected end
122
123        $checkinInput = $('#booking_start');
124        $checkoutInput = $('#booking_finish');
125
126
127        // Updating Fields with selected dates
128        $checkinInput.val(selectedStartDate);
129        $checkoutInput.val(selectedEndDate);
130
131        // Setting the Selection of dates on calender on CHECKOUT FIELD (To get this it must be binded by Ids not Calss)
132        var checkOutPicker = $checkoutInput.data('daterangepicker');
133        checkOutPicker.setStartDate(selectedStartDate);
134        checkOutPicker.setEndDate(selectedEndDate);
135
136        // Setting the Selection of dates on calender on CHECKIN FIELD (To get this it must be binded by Ids not Calss)
137        var checkInPicker = $checkinInput.data('daterangepicker');
138        checkInPicker.setStartDate(selectedStartDate);
139        checkInPicker.setEndDate(selectedEndDate);
140
141    });
142
143    $("#booking_start, #booking_finish").on('apply.daterangepicker', function(ev, picker) {
144        console.log(picker.startDate.format('DD.MM.YYYY'), picker.endDate.format('DD.MM.YYYY'));
145        if (picker.startDate.format('DD.MM.YYYY') === picker.endDate.format('DD.MM.YYYY')) {
146            let new_date = moment(picker.startDate).add(1, 'days').format("DD.MM.YYYY");
147            picker.setEndDate(new_date);
148            $("#booking_finish").val(new_date);
149        }
150    });
151
152    // Раскрытие выпадающего списка
153    booking_select.on("click", function () {
154        if (!booking_guests_popup.hasClass("active")) {
155            booking_guests_chevron.addClass("active");
156            booking_guests_popup.addClass("active");
157        } else {
158            booking_guests_chevron.removeClass("active");
159            booking_guests_popup.removeClass("active");
160        }
161    });
162
163    $("#booking_close_popup").on("click", function () {
164        booking_select.click();
165        booking_search.click();
166    });
167
168    //Добавление комнаты
169    booking_add_room.on("click", function () {
170        if (rooms < 5) {
171            let new_room = booking_room_template.clone();
172            new_room.addClass("booking_room_" + (++rooms));
173            new_room.attr("data-room-i", rooms);
174            $(this).before(new_room);
175            new_room.find("legend").html("Номер " + rooms);
176            new_room.find("input[name='booking_adults']").attr("name", "room_" + rooms + "_booking_adults");
177            new_room.find("input[name='booking_childs']").attr("name", "room_" + rooms + "_booking_childs");
178        } else {
179            booking_add_room.html("Не более 5 номеров");
180            booking_add_room.addClass("button_alert");
181            setTimeout(function () {
182                booking_add_room.removeClass("button_alert");
183                booking_add_room.html("Добавить номер");
184            }, 3000);
185        }
186        resetResults();
187    });
188
189    // Удаление комнаты
190    $(document).on("click", ".booking_remove_room", function () {
191        $(this).parents(".booking_room").remove();
192        rooms--;
193        resetResults();
194    });
195
196    // Добавление гостя
197    $(document).on('click', ".booking_add_adult", function () {
198        let input = $(this).parents(".booking_guests_adults").find("input");
199        let room_i = $(this).parents(".booking_room").attr("data-room-i");
200        if ((window.booking_query.rooms[room_i].booking_adults + window.booking_query.rooms[room_i].booking_childs) >= 5) {
201            showLegendAlert($(this));
202        } else if (window.booking_query.rooms[room_i].booking_adults >= 3) {
203            showLegendAlert($(this), "Не более 3 взрослых гостей");
204        } else {
205            input.val(Number(input.val()) + 1);
206        }
207        resetResults();
208    })
209
210    // Удаление гостя
211    $(document).on('click', ".booking_remove_adult", function () {
212        let input = $(this).parents(".booking_guests_adults").find("input");
213        if (Number(input.val()) > 1) {
214            input.val(Number(input.val()) - 1);
215        }
216        resetResults();
217    })
218
219    // Добавление ребенка
220    $(document).on('click', ".booking_add_child", function () {
221        let input = $(this).parents(".booking_guests_childs").find(".booking_childs");
222        let room_i = $(this).parents(".booking_room").attr("data-room-i");
223        if ((window.booking_query.rooms[room_i].booking_adults + window.booking_query.rooms[room_i].booking_childs) < 5) {
224            input.val(Number(input.val()) + 1);
225            let new_child = childs_template.clone();
226            new_child.find("input[type='radio']").attr("name", "room_" + room_i + "_booking_child_age_" + input.val());
227            $(this).parents(".booking_room").find(".booking_guests_popup_child_wrapper").append(new_child);
228        } else {
229            showLegendAlert($(this));
230        }
231        resetResults();
232
233    })
234
235    // Удаление ребенка
236    $(document).on('click', ".booking_remove_child", function () {
237        let input = $(this).parents(".booking_guests_childs").find(".booking_childs");
238        if (Number(input.val()) > 0) {
239            input.val(Number(input.val()) - 1);
240        }
241        $(this).parents(".booking_guests_popup_static").find(".booking_guests_popup_child:last-child").remove();
242        resetResults();
243    })
244
245    // Удаление конкретного ребенка
246    $(document).on('click', ".booking_remove_child_button", function () {
247        let input = $(this).parents(".booking_guests_popup_static").find(".booking_childs");
248        if (Number(input.val()) > 0) {
249            input.val(Number(input.val()) - 1);
250        }
251        $(this).parents(".booking_guests_popup_child").remove();
252        resetResults();
253    })
254
255    //TODO: добавить ограничение на добавление третьего взрослого ребенка
256    //TODO: в номере с 3 взрослыми может быть только 1 подросток (добавить ограничение на добавление второго взрослого ребенка)
257    //TODO: не более 3 подростков в номере с 1 взрослым
258
259    // Алерт о максимальном количестве человек
260    function showLegendAlert(item, message = "Не более 5 человек") {
261        let legend = item.parents(".booking_room").find("legend");
262
263        legend.html(message);
264        legend.addClass("alert");
265
266        window.legendAlert = undefined;
267        window.legendAlert = function () {
268            legend.html("Номер " + item.parents(".booking_room").attr("data-room-i"));
269            legend.removeClass("alert");
270        }
271        setTimeout(window.legendAlert, 2000);
272    }
273
274    // Сбор данных с формы
275    function getQuery() {
276        all_adults = 0;
277        all_childs = 0;
278
279        let booking_array = booking_attache.serializeArray();
280
281        window.booking_query = {
282            start: booking_start.val(),
283            finish: booking_finish.val(),
284            rooms: []
285        }
286
287        for (let i = 1; i <= rooms; i++) {
288            let adults = Number(booking_attache.find(`input[name='room_${i}_booking_adults']`).val());
289            let childs = Number(booking_attache.find(`input[name='room_${i}_booking_childs']`).val());
290
291            all_adults += adults;
292            all_childs += childs;
293
294            let room = {
295                booking_adults: adults,
296                booking_childs: childs,
297                childs: []
298            }
299
300            if (childs > 0) {
301                $(`fieldset.booking_room[data-room-i=${i}] select[name=booking_child_age]`).each(function (i, elem) {
302                    if ($(elem).val() < 0) {
303                        room.childs.push(0);
304                    } else {
305                        room.childs.push(Number($(elem).val()));
306                    }
307                });
308            }
309
310            window.booking_query.rooms[i] = room;
311        }
312
313        booking_guests_rooms.find("span").html(rooms);
314        booking_guests_guests_adults.find("span").html(all_adults);
315        booking_guests_guests_childs.find("span").html(all_childs);
316
317        if (all_childs > 0) {
318            booking_guests_guests_childs.addClass("active");
319        } else {
320            booking_guests_guests_childs.removeClass("active");
321        }
322
323        var urlParams = new URLSearchParams(window.location.search);
324        var roomId = urlParams.get('room');
325        if (roomId) {
326            window.booking_query.desiredRoom = roomId;
327        }
328
329
330        return window.booking_query;
331    }
332
333    // При обновлении форм собираем результаты, для расчёта количества гостей и отображения в выпадашке
334    booking_attache.on("click", function () {
335        setTimeout(getQuery, 100);
336    });
337
338
339    // Поиск номеров
340    booking_search.on("click", function () {
341        // Проверить возраст детей
342        let child_age_selects = true;
343        $("select[name=booking_child_age]").each(function() {
344           if ($(this).val() === null || $(this).val() === -1 || $(this).val() === "-1") {
345               child_age_selects = false;
346               $(this).addClass("alert");
347           }
348        });
349        if (!child_age_selects) {
350            if (!booking_guests_popup.hasClass("active")) booking_select.click();
351
352            window.ageAlert = undefined;
353            window.ageAlert = function () {
354                $(".booking_child_age").removeClass("alert");
355            }
356            setTimeout(window.ageAlert, 5000);
357
358            return 0;
359        }
360
361        // Закрыть всплывашку при клике на Поиск
362        if (booking_guests_popup.hasClass("active")) {
363            booking_guests_chevron.removeClass("active");
364            booking_guests_popup.removeClass("active");
365        }
366
367        //Далее, если мы на главной, то сохраняем данные и переадресовываемся на страницу Бронирования
368        if (window.location.pathname !== "/bronirovanie/") {
369            localStorage.setItem('bookingData', JSON.stringify(getQuery()));
370            window.location.pathname = '/bronirovanie/';
371        } else {
372            booking_roomer.html("");
373            booking_roomer.addClass("wait");
374            $(this).attr("disabled", true);
375
376            ajaxs('\\Attache\\SearchQuery::ajaxs_makeQuery', {json: getQuery()})
377                .done(function (response) {
378                    //console.log(response);
379                    booking_roomer.removeClass("wait");
380                    $("#booking_search").attr("disabled", false);
381                })
382        }
383
384    });
385
386    // Восстановление данных с локального хранилища, если пришли с другой страницы
387    let bookingData = JSON.parse(localStorage.getItem('bookingData'));
388
389    if (bookingData) {
390        window.booking_query = bookingData;
391
392        booking_start.val(bookingData.start);
393        booking_finish.val(bookingData.finish);
394
395        // Создаём комнаты
396        $.each(bookingData.rooms, function(i, elem) {
397            if (i === 0) return 0;
398            if (i !== 1) booking_add_room.click();
399
400            // Добавим взрослых
401            $(`input[name=room_${i}_booking_adults]`).val(elem.booking_adults);
402
403            // Добавим детей
404            if (elem.childs !== undefined) {
405                window.booking_query.rooms[i].booking_childs = 0;
406                $.each(elem.childs, function(j, child) {
407                    $(`.booking_room[data-room-i=${i}] .booking_add_child`).click();
408                    $(`.booking_room[data-room-i=${i}] .booking_guests_popup_child:last-child select`).val(child);
409                })
410            }
411
412        });
413
414        getQuery();
415
416        localStorage.removeItem('bookingData');
417
418        setTimeout($("#booking_search").click(), 200);
419    }
420
421    // Функция сохранения данных о днях с бэка
422    window.days = 0;
423    window.setDays = function (days) {
424        window.days = days;
425    }
426
427    // Выбор с Завтраком и Без
428    booking_roomer.on("change", "select[name=booking_room_breakfast]", function () {
429        let current_i = $(this).parents(".booking_select_rooms").attr("data-room-i");
430        let room_summary = $(`.booking_room_select_summary_${current_i}`);
431        let current = $(this).parents(".booking_room_select");
432        let breakfast_price = current.attr("data-breakfast-price");
433        let current_price_sum = current.find(".booking_room_prices .price.price_sum .value");
434
435        //посчитать цену завтрака
436        let childs_5_10 = window.booking_query.rooms[current_i].childs.filter(number => (number >= 5 && number <= 10)).length;
437        let childs_11_99 = window.booking_query.rooms[current_i].childs.filter(number => (number >= 11 && number <= 99)).length;
438        let breakfast_sum = window.booking_query.rooms[current_i].booking_adults * breakfast_price + childs_5_10 * 600 + childs_11_99 * breakfast_price;
439
440        if ($(this).val() == 1) {
441            if (current.attr("data-breakfast") == 0 || current.attr("data-breakfast") === undefined) {
442                //Добавить текст под цену в сутки
443                current.find(".booking_room_prices").append(`<div class="price breakfast_price">
444                    <span>+ <span class="value" data-value="${breakfast_sum}">${breakfast_sum}</span><span>₽/сутки</span></span>
445                </div>`)
446
447                //Пересчитать общую цену
448                let final_sum = Number(current_price_sum.attr("data-value")) + breakfast_sum * current.attr("data-days")
449                current_price_sum.attr("data-value", final_sum);
450                current.attr("data-breakfast", 1);
451                updateSummary();
452            }
453        } else if($(this).val() == 100) {
454            current.find(".rest_closed_alert").css("height", "auto");
455        } else {
456            current.find(".rest_closed_alert").css("height", "0px");
457            if (current.attr("data-breakfast") == 1) {
458                let final_sum = Number(current_price_sum.attr("data-value")) - breakfast_sum * current.attr("data-days")
459                current_price_sum.attr("data-value", final_sum);
460                current.attr("data-breakfast", 0);
461                current.find(".breakfast_price").remove();
462
463                updateSummary();
464            }
465        }
466        onRenderFuncs();
467    });
468
469    // Ставим check при выборе комнаты
470    booking_roomer.on("click", ".booking_room_button label", function () {
471        if ($(".booking_room_button").attr("disabled") === "disabled") return 0;
472        let input = $(this).find("input");
473        input.prop('checked', !input.is(":checked"));
474
475        let current = $(this).parents(".booking_room_select");
476        let current_id = current.attr("data-room-id");
477        let current_i = $(this).parents(".booking_select_rooms").attr("data-room-i");
478        let room_summary = $(`.booking_room_select_summary_${current_i}`);
479        let current_config = current.attr("data-room-config");
480
481        // Все элементы .booking_room_select
482        let all_items = $(this).parents(".booking_select_rooms").find(".booking_room_select");
483
484        // Получаем следующий элемент за current
485        let next_items = all_items.slice(all_items.index(current) + 1);
486        let next_room_id = null;
487
488        next_items = next_items.filter(function() {
489            let item_room_id = $(this).data("room-id");
490            if (!next_room_id && item_room_id !== $(current).data("room-id")) {
491                next_room_id = item_room_id;
492            }
493            return item_room_id === next_room_id;
494        });
495
496        // Получаем все элементы, кроме current и next_items
497        let other_items = all_items
498            .not(current)
499            .not(next_items);
500
501        console.log("Следующий элемент:", next_items);
502        console.log("Остальные элементы:", other_items );
503
504        if (input.is(":checked")) {
505            current.addClass("selected");
506            all_items.not(current).removeClass("selected");
507            all_items.not(current).find("input[name='booking_room_type']").prop('checked', false);
508            if (!current.hasClass("upsale") && current.data("room-id") !== next_items.data("room-id")) {
509                next_items.addClass("upsale");
510                next_items.slideDown("fast");
511            } else {
512                next_items.slideUp("fast");
513            }
514
515            updateSummary();
516            onRenderFuncs();
517
518            other_items.slideUp("fast");
519        } else {
520            current.removeClass("selected");
521            all_items.find("input[name='booking_room_type']").prop('checked', false);
522            all_items.removeClass("upsale");
523            updateSummary();
524            onRenderFuncs();
525            all_items.slideDown("fast");
526        }
527
528    });
529
530    //Обновляет суммы и показывает итог, если выбраны все номера
531    window.updateSummary = () => {
532        console.log("UPDATE");
533        //Обходим все номера
534        $(".booking_select_rooms").each(function () {
535            let room_selected = false;
536            let rooms_count = $(".booking_select_rooms").length;
537            let current_i = $(this).attr("data-room-i");
538            //Обходим все варианты
539            $(this).find(".booking_room_select").each(function () {
540                let room_summary = $(`.booking_room_select_summary_${current_i}`);
541                if ($(this).hasClass("selected")) {
542                    room_selected = true;
543
544                    //Считаем цены
545                    let room_price_day = Number($(this).find(".price:not(.price_sum, .breakfast_price) span.value").attr("data-value"));
546                    let room_price_sum = Number($(this).find(".price.price_sum span.value").attr("data-value"));
547
548                    //Устанавливаем цены под номерами
549                    room_summary.find(".booking_room_summary_row.room .value").attr("data-value", room_price_day);
550                    room_summary.find(".booking_room_summary_row.booking_room_summary_row_sum .value").attr("data-value", room_price_sum);
551
552                    //Дублируем конфигурацию
553                    if (room_summary.find(".room_info").find(".booking_room_configuration_type").length < 1) {
554                        room_summary.find(".room_info").prepend($(this).find(".booking_room_configuration_type").clone());
555                    }
556
557                    let breakfast_div = room_summary.find(".room_info_breakfast");
558                    if ($(this).attr("data-breakfast") === "1") {
559                        room_summary.find(".booking_room_summary_row.breakfast .value").attr("data-value", $(this).attr("data-breakfast-price"));
560                        room_summary.find(".booking_room_summary_row.breakfast").css("display", "flex");
561                        breakfast_div.show();
562                    } else {
563                        room_summary.find(".booking_room_summary_row.breakfast").css("display", "none");
564                        breakfast_div.hide();
565                    }
566
567                    if (rooms_count === 1) {
568                        $(".booking_room_select_summary_1").find(".room_price").hide();
569                    } else {
570                        $(".booking_room_select_summary_1").find(".room_price").show();
571                    }
572                }
573                if (room_selected) {
574                    room_summary.css("display", "grid");
575                } else {
576                    room_summary.css("display", "none");
577                }
578            });
579        });
580
581        if ($(".booking_room_select.selected").length === $(".booking_select_rooms").length) {
582
583            $(".booking_order .booking_order_summary .booking_room_summary_row").remove();
584
585            let sum_row = 0;
586
587            //Выводим цену в общий итог и плюсуем к итогу
588            $(".booking_room_select.selected").each(function() {
589                let current_i = $(this).parents(".booking_select_rooms").attr("data-room-i");
590                let order_sum = Number($(this).find(".price span.value").attr("data-value"));
591
592                $(".booking_order .booking_order_summary").append(`
593                    <div class="booking_room_summary_row price">
594                    <span>Номер ${current_i}</span><span class="value" data-value="${order_sum}">${order_sum}</span>
595                    </div>`);
596
597                sum_row += order_sum;
598
599            });
600
601            $(".booking_order .booking_order_summary").append(`
602                    <div class="booking_room_summary_row booking_room_summary_row_sum price">
603                    <span>Итого</span><span class="value" data-value="${sum_row}">${sum_row}</span>
604                    </div>`);
605
606
607            $(".booking_order_title").show();
608            $(".booking_order").css("display", "grid");
609            $("input[name=booking_order_phone]").cleave({ phone: true, phoneRegionCode: 'RU', autoUnmask: true});
610
611            // Проверка на заполненность полей
612            // отключаем кнопку при инициализации страницы
613            $(".booking_order_submit").prop("disabled", true);
614
615            // функция для проверки валидности email
616            function validateEmail(email) {
617                let re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
618                return re.test(String(email).toLowerCase());
619            }
620
621            // проверяем поля на заполненность при вводе данных
622            $(".booking_order input[required], .booking_order textarea[required]").on("input, change", function() {
623                let emptyFields = $(".booking_order input[required], .booking_order textarea[required]").filter(function() {
624                    // проверяем пустое ли поле и валиден ли email
625                    console.log($(this).val());
626                    return $.trim($(this).val()) === "" ||
627                        ($(this).attr("type") === "checkbox" && !$(this).is(":checked")) ||
628                        ($(this).attr("type") === "email" && !validateEmail($(this).val()));
629                });
630
631                // если все обязательные поля заполнены и email валиден, то разрешаем кнопку, иначе отключаем
632                if(emptyFields.length === 0) {
633                    $(".booking_order_submit").prop("disabled", false);
634                } else {
635                    $(".booking_order_submit").prop("disabled", true);
636                }
637            });
638        } else {
639            $(".booking_order_title").hide();
640            $(".booking_order").hide();
641        }
642    }
643
644    window.onRenderFuncs = () => {
645        // Формат цен
646        $(".booking_roomer .price > span.value").each(function () {
647            $(this).html(Number($(this).attr("data-value")).toLocaleStr
647ing('ru'));
648        });
649
650        $("input[name=booking_order_pay],[name=booking_order_online]").on("change", function () {
651            if ($(this).attr("name") === "booking_order_pay") {
652                $("input[name=booking_order_online]").click();
653            } else {
654                $("input[name=booking_order_pay]").click();
655            }
656        });
657    }
658
659
660
661    let booking_order_form = $(".booking_order_form");
662    //Переменные для заказа
663    window.order_query = [];
664    window.order_query.rooms = [];
665    window.order_query.form = [];
666
667    // Сбор данных для бронирования
668    function getOrderQuery() {
669
670        order_query.form = {
671            "name": $("input[name=name]").val(),
672            "phone": $("input[name=phone]").val(),
673            "email": $("input[name=email]").val(),
674            "comment": $("textarea[name=comment]").val(),
675            "online": $("input[name=booking_order_online]").val(),
676            "price": $(".booking_order_summary").find(".booking_room_summary_row_sum span.value").attr("data-value"),
677        }
678
679        $.each(booking_query.rooms, function(i, elem) {
680            if (i === 0) return;
681            let room_selected = $(`.booking_select_rooms[data-room-i=${i}]`).find(`.booking_room_select.selected`);
682            let local_room = {
683                "date_start": booking_query.start,
684                "date_finish": booking_query.finish,
685                "room_type": room_selected.attr("data-room-id"),
686                "adult_guests": booking_query.rooms[i].booking_adults,
687                "child_guests": booking_query.rooms[i].booking_childs,
688                "childs": booking_query.rooms[i].childs,
689                "breakfast": room_selected.attr("data-breakfast"),
690                "configuration": room_selected.attr("data-room-config-bed"),
691                "price_day": room_selected.find(".price:not(.price_sum, .breakfast_price) span.value").attr("data-value"),
692                "price_sum": room_selected.find(".price.price_sum span.value").attr("data-value"),
693            };
694
695            order_query.rooms.push(local_room);
696        });
697
698        return order_query;
699    }
700
701    // Отправка бронирования
702    booking_roomer.on("click", ".booking_order_submit", function () {
703        getOrderQuery();
704
705        $(this).attr("disabled", true);
706        $(".booking_room_button").attr("disabled", true);
707        $("input[name=booking_room_type]").attr("disabled", true);
708
709        booking_roomer.append(`<div class='booking_success wait'></div>`);
710
711        ajaxs('\\Attache\\OrderReservation::ajaxs_addOrderReservation', {"form": order_query.form, "rooms": order_query.rooms})
712            .done(function (response) {
713                booking_roomer.find(".booking_success").removeClass("wait");
714                booking_roomer.find(".booking_success").html("<div>Номер успешно забронирован!</div><div>Подтверждение бронирования будет отправлено на указанный Вами электронный адрес.</div>");
715                let target = $(".booking_success").offset().top;
716
717                ym(7615612,'reachGoal','bronirovanie');
718
719                $('html, body').animate({
720                    scrollTop: target
721                }, 1000);
722                //$("#booking_search").attr("disabled", false);
723            })
724
725    });
726
727
728    // Маска для телефона
729
730
731});
732
733// Cleave
734(function($, window, undefined){ 'use strict'
735
736    $.fn.cleave = function(opts) {
737
738        var defaults = {autoUnmask: false},
739            options = $.extend(defaults, opts || {});
740
741        return this.each(function(){
742
743            var $this = $(this), cleave = new Cleave($this.first(), options);
744
745            $this.data('cleave-auto-unmask', options['autoUnmask']);;
746            $this.data('cleave',cleave)
747        });
748    }
749
750    var origGetHook, origSetHook;
751
752    if ($.valHooks.input) {
753
754        origGetHook = $.valHooks.input.get;
755        origSetHook = $.valHooks.input.set;
756
757    } else {
758
759        $.valHooks.input = {};
760    }
761
762    $.valHooks.input.get = function (el) {
763
764        var $el = $(el), cleave = $el.data('cleave');
765
766        if( cleave ) {
767
768            return $el.data('cleave-auto-unmask') ? cleave.getRawValue() : el.value;
769
770        } else if( origGetHook ) {
771
772            return origGetHook(el);
773
774        } else {
775
776            return undefined;
777        }
778    }
779
780    $.valHooks.input.set = function (el,val) {
781
782        var $el = $(el), cleave = $el.data('cleave');
783
784        if( cleave ) {
785
786            cleave.setRawValue(val);
787            return $el;
788
789        } else if( origSetHook ) {
790
791            return origSetHook(el);
792
793        } else {
794            return undefined;
795        }
796    }
797})(jQuery, window);

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.