PageSourceSearch

https://rainforestecolodge.com.fj/wp-content/plugins/wp-hotel-book…/js/hotel-booking-v2.js?ver=6ac98e5c1bc0f

js rainforestecolodge.com.fj collected 2026-10-10 01:01:45 UTC 26,083 bytes, 741 lines download raw bytes

1/** search api */
2const urlCurrent = document.location.href;
3const urlPageSearch = hotel_settings?.url_page_search;
4let filterRooms = JSON.parse(window.localStorage.getItem('wphb_filter_rooms')) || {};
5let firstLoad = true;
6const hotelBookingSearchNode = document.querySelector('.hotel-booking-search');
7
8const wphbAddQueryArgs = (endpoint, args) => {
9    const url = new URL(endpoint);
10
11    Object.keys(args).forEach((arg) => {
12        url.searchParams.set(arg, args[arg]);
13    });
14
15    return url;
16};
17
18const removeFilterArgs = (url, args) => {
19    const filters = ['min_price', 'max_price', 'rating', 'room_type'];
20
21    [...filters].map(filter => {
22        if (!args.hasOwnProperty(filter)) {
23            url.searchParams.delete(filter);
24        }
25    });
26
27    return url;
28}
29
30const searchRoomsPages = () => {
31
32    const forms = document.querySelector('.wp-hotel-booking-search-rooms .hotel-booking-search form#hb-form-search-page');
33
34    if (forms === null) {
35        return;
36    }
37
38    requestSearchRoom(forms, filterRooms);
39}
40
41const requestSearchRoom = (forms, args, btn = false) => {
42    const skeleton = document.querySelector('.wp-hotel-booking-search-rooms .hotel-booking-search ul.wphb-skeleton-animation');
43    const wrapperResult = document.querySelector('.wp-hotel-booking-search-rooms .hotel-booking-search .detail__booking-rooms');
44    const showNumber = document.querySelector('.wp-hotel-booking-search-rooms .sort-by-wrapper .show-number');
45    const wpRestUrl = hotel_settings.wphb_rest_url;
46
47    if (!wpRestUrl) {
48        return;
49    }
50
51    if (Object.keys(args).length === 0) {
52        const monthName = new Intl.DateTimeFormat("en-US", {month: "long"}).format;
53        const today = new Date();
54        const stringToday = (monthName(today) + ' ' + ('0' + today.getDate()).slice(-2) + ', ' + today.getFullYear());
55        const tomorrow = new Date(new Date().getTime() + 24 * 60 * 60 * 1000);
56        const stringTomorrow = (monthName(tomorrow) + ' ' + ('0' + tomorrow.getDate()).slice(-2) + ', ' + tomorrow.getFullYear());
57
58        args.check_in_date = stringToday;
59        args.check_out_date = stringTomorrow;
60        args.adults = null;
61        args.max_child = null;
62        args.paged = 1;
63
64        //Filter - Price, rating, type
65        const searchFilter = document.querySelector('#hotel-booking-search-filter');
66
67        if (searchFilter) {
68            const priceField = searchFilter.querySelector('.hb-price-field');
69            const ratingField = searchFilter.querySelector('.hb-rating-field');
70            const typeField = searchFilter.querySelector('.hb-type-field');
71
72            if (priceField) {
73                args.min_price = '';
74                args.max_price = '';
75            }
76
77            if (ratingField) {
78                args.rating = '';
79            }
80
81            if (typeField) {
82                args.room_type = '';
83            }
84        }
85    }
86
87    const urlWphbSearch = wphbAddQueryArgs(wpRestUrl + 'wphb/v1/rooms/search-rooms', {...args});
88
89    wp.apiFetch({
90        path: 'wphb/v1/rooms/search-rooms' + urlWphbSearch.search,
91        method: 'GET',
92    }).then((response) => {
93
94        if (btn) {
95            btn.classList.remove('wphb_loading');
96        }
97
98        const {status, data, message} = response;
99
100        if (firstLoad) {
101            formSearchRooms(forms, skeleton, wrapperResult);
102        }
103
104        const paginationEle = document.querySelector('.rooms-pagination');
105        if (paginationEle) {
106            paginationEle.remove();
107        }
108
109        if (status === 'error') {
110            throw new Error(message || 'Error');
111        }
112        wrapperResult.style.display = 'block';
113        wrapperResult.innerHTML = data.content;
114        if (showNumber) {
115            showNumber.innerHTML = data.show_number;
116        }
117        const pagination = data.pagination;
118
119        if (typeof pagination !== 'undefined') {
120            const paginationHTML = new DOMParser().parseFromString(pagination, 'text/html');
121            const paginationNewNode = paginationHTML.querySelector('.rooms-pagination');
122
123            if (paginationNewNode) {
124                wrapperResult.after(paginationNewNode);
125                wphbPaginationRoom(forms, skeleton, wrapperResult);
126            }
127        }
128
129    }).catch((error) => {
130        wrapperResult.innerHTML = '';
131        const errorNode = document.querySelector('.wphb-message.error');
132
133        if (errorNode) {
134            errorNode.innerHTML = error.message || 'Error: Query wphb/v1/rooms/search-room';
135        } else {
136            wrapperResult.insertAdjacentHTML('beforeend', `<p class="wphb-message error" style="display:block">${error.message || 'Error: Query wphb/v1/rooms/search-room'}</p>`);
137        }
138
139        if (showNumber) {
140            showNumber.innerHTML = '';
141        }
142    }).finally(() => {
143        skeleton.style.display = 'none';
144        // Save filter courses to Storage
145        window.localStorage.setItem('wphb_filter_rooms', JSON.stringify(args));
146
147        let urlPush = wphbAddQueryArgs(document.location, args);
148        urlPush = removeFilterArgs(urlPush, args);
149
150        //check is room extra not push url
151        const url_string = urlPush.href;
152        const url = new URL(url_string);
153        const isRoomExtra = url.searchParams.get("is_page_room_extra");
154
155        if (isRoomExtra != 'select-room-extra' && !firstLoad) {
156            window.history.pushState('', '', urlPush);
157            //update value checkin checkout to form search room when reload page
158            const checkInDate = document.querySelector('.wp-hotel-booking-search-rooms .hotel-booking-search form#hb-form-search-page input[name="check_in_date"]');
159            const checkOutDate = document.querySelector('.wp-hotel-booking-search-rooms .hotel-booking-search form#hb-form-search-page input[name="check_out_date"]');
160            checkInDate.value = args.check_in_date;
161            checkOutDate.value = args.check_out_date;
162        }
163
164        //form booking
165        bookingRoomsPages(forms);
166
167        firstLoad = false;
168        const contentPageSearch = document.querySelector('.wp-hotel-booking-search-rooms .hotel-booking-search');
169        if (contentPageSearch != null) {
170            contentPageSearch.scrollIntoView({behavior: "smooth"});
171        }
172        //auto set quantity extra option when change select quantity before book room in page search
173        toggleExtravalue();
174    });
175}
176
177const formSearchRooms = (forms, skeleton, wrapperResult) => {
178
179    if (forms === null) return;
180
181    forms.addEventListener('submit', (event) => {
182        event.preventDefault();
183        const checkinDate = forms.querySelector('input[name="check_in_date"]').value;
184        const checkoutDate = forms.querySelector('input[name="check_out_date"]').value;
185        const countAdults = forms.querySelector('select[name="adults_capacity"]') ? forms.querySelector('select[name="adults_capacity"]').value : 0;
186        const maxChild = forms.querySelector('select[name="max_child"]') ? forms.querySelector('select[name="max_child"]').value : 0;
187        const paged = forms.querySelector('input[name="paged"]') ? forms.querySelector('input[name="paged"]').value : 1;
188        const btn = forms.querySelector('button.wphb-button');
189        btn && btn.classList.add('wphb_loading');
190
191        if (checkinDate === '' || checkoutDate === '') {
192            alert(' Please select check in and check out date and search again! ');
193            btn && btn.classList.remove('wphb_loading');
194            return;
195        }
196
197        wrapperResult.innerHTML = '';
198        skeleton.style.display = 'block';
199
200        filterRooms = {
201            ...filterRooms,
202            check_in_date: checkinDate,
203            check_out_date: checkoutDate,
204            adults: countAdults,
205            max_child: maxChild,
206            paged: paged
207        };
208
209        window.localStorage.setItem('wphb_filter_rooms', JSON.stringify(filterRooms));
210
211        requestSearchRoom(forms, filterRooms, btn);
212    });
213}
214const wphbPaginationRoom = (forms, skeleton, wrapperResult) => {
215    const paginationEle = document.querySelectorAll('.wp-hotel-booking-search-rooms .rooms-pagination .page-numbers');
216
217    paginationEle.length > 0 && paginationEle.forEach((ele) => ele.addEventListener('click', (event) => {
218        event.preventDefault();
219        event.stopPropagation();
220
221        wrapperResult.style.display = 'none';
222        skeleton.style.display = 'block';
223
224        let filterRooms = JSON.parse(window.localStorage.getItem('wphb_filter_rooms')) || {};
225
226        const urlString = event.currentTarget.getAttribute('href');
227
228        if (urlString) {
229            const current = [...paginationEle].filter((el) => el.classList.contains('current'));
230            const paged = parseInt(event.currentTarget.textContent) || (ele.classList.contains('next') && parseInt(current[0].textContent) + 1) || (ele.classList.contains('prev') && parseInt(current[0].textContent) - 1);
231            filterRooms.paged = paged;
232
233            requestSearchRoom(forms, {...filterRooms});
234        }
235    }));
236};
237/** end search api */
238
239
240/** Booking room search page */
241
242const bookingRoomsPages = (formsCheck) => {
243
244    const formBooking = document.querySelectorAll('.wp-hotel-booking-search-rooms form.hb-page-search-room-results');
245
246    if (formBooking.length == 0) return;
247
248    const checkinDate = formsCheck.querySelector('input[name="check_in_date"]')?.value;
249    const checkoutDate = formsCheck.querySelector('input[name="check_out_date"]')?.value;
250
251    const submit = async (form, btn = false, numRoom, roomID) => {
252        const extraData = [];
253        const hotelOption = form.querySelectorAll('input.hb_optional_quantity_selected');
254
255        hotelOption && hotelOption.forEach((ele) => {
256            if (ele.checked) {
257                // const eleName = ele.getAttribute('name');
258                // const extraID = eleName?.match(/(?<=\[).+?(?=\])/)?.[0] || null;
259                const extraID = ele.dataset.id;
260                const qty = parseInt(ele.parentElement?.nextElementSibling?.querySelector('input[class="hb_optional_quantity"]')?.value) || 1;
261                if (extraID) {
262                    extraData.push({extraID, qty});
263                }
264            }
265        });
266
267        try {
268            const response = await wp.apiFetch({
269                path: 'wphb/v1/rooms/book-rooms',
270                method: 'POST',
271                data: {roomID, checkinDate, checkoutDate, numRoom, extraData},
272            });
273
274            const {status, data} = response;
275            const redirect = data?.results?.redirect || '';
276            const message = data?.results?.message || '';
277
278            if (btn) {
279                btn.classList.remove('wphb_loading');
280            }
281
282            if ('success' === status && redirect) {
283                // if ( message != '' ) {
284                //     alert( message );
285                // }
286                window.location.href = redirect;
287            }
288
289        } catch (error) {
290            alert(error.message && error.message);
291        }
292    };
293
294    formBooking.forEach(function (form) {
295        form.addEventListener('submit', function (e) {
296            e.preventDefault();
297            const numRoom = form.querySelector('select[name="hb-num-of-rooms"]')?.value;
298            const roomID = form.querySelector('input[name="room-id"]')?.value;
299            const quantityBook = form.querySelector('select[name="hb-num-of-rooms"]')?.value;
300
301            if (quantityBook == 0) {
302                alert('Please select quantity room!');
303                return;
304            }
305            if (checkinDate === '' || checkoutDate === '') {
306                alert(' Please select check in and check out date and search again! ');
307                return;
308            }
309            const btn = form.querySelector('button.hb_add_to_cart');
310            btn && btn.classList.add('wphb_loading');
311            submit(form, btn, numRoom, roomID);
312        })
313    })
314}
315
316const addExtraToCart = () => {
317    const formExtra = document.querySelector('form.hb-select-extra-results');
318
319    if (formExtra === null) return;
320
321    const submit = async () => {
322
323        const extraData = [];
324        const cartID = formExtra.querySelector('input[name="cart_id"]').value;
325        const hotelOption = formExtra.querySelectorAll('input.hb_optional_quantity_selected');
326
327        hotelOption && hotelOption.forEach((ele) => {
328            if (ele.checked) {
329                // const eleName = ele.getAttribute('name');
330                // const extraID = eleName?.match(/(?<=\[).+?(?=\])/)?.[0] || null;
331                const extraID = ele?.dataset.id || null;
332                const qty = parseInt(ele.parentElement?.nextElementSibling?.querySelector('input[class="hb_optional_quantity"]')?.value) || 1;
333
334                if (extraID) {
335                    extraData.push({extraID, qty});
336                }
337            }
338            ;
339
340        });
341
342        try {
343            const response = await wp.apiFetch({
344                path: 'wphb/v1/rooms/add-extra-cart',
345                method: 'POST',
346                data: {cartID, extraData},
347            });
348
349            const {status, redirect} = response;
350            console.log(response);
351            if ('success' === status && redirect) {
352                window.location.href = redirect;
353            }
354
355        } catch (error) {
356            alert(error.message && error.message);
357        }
358    }
359
360    formExtra.addEventListener('submit', function (e) {
361        e.preventDefault();
362        const btn = formExtra.querySelector('button[type="submit"]');
363        btn && btn.classList.add('wphb_loading');
364        submit();
365    });
366
367}
368/** End Booking search page */
369
370
371/** search form */
372
373const checkAvaliableRooms = () => {
374
375    //remove sidebar search in page search room_select
376    if (hotel_settings?.is_page_search) {
377        const sideBar = document.querySelector('.thim-widget-search-room');
378        if (sideBar != null) {
379            const FormSidebar = sideBar.querySelector('form#hb-form-search-page');
380            if (FormSidebar != null) {
381                FormSidebar.removeAttribute('id');
382            }
383            const searchResult = sideBar.querySelector('#hotel-booking-results');
384            if (searchResult != null) {
385                searchResult.remove();
386            }
387        }
388    }
389
390    const forms = document.querySelectorAll('form[class^="hb-search-form"]:not(#hb-form-search-page)');
391
392    forms.length >
392 0 && forms.forEach((form) => {
393        form.addEventListener('submit', function (e) {
394            e.preventDefault();
395            const checkinDate = form.querySelector('input[name="check_in_date"]').value;
396            const checkoutDate = form.querySelector('input[name="check_out_date"]').value;
397            const countAdults = form.querySelector('select[name="adults_capacity"]') ? form.querySelector('select[name="adults_capacity"]').value : 0;
398            const maxChild = form.querySelector('select[name="max_child"]') ? form.querySelector('select[name="max_child"]').value : 0;
399            const paged = form.querySelector('input[name="paged"]') ? form.querySelector('input[name="paged"]').value : 1;
400
401            if (checkinDate === '' || checkoutDate === '') {
402                alert(' Please select check in and check out date and search again! ');
403                return;
404            }
405
406            const data = {
407                check_in_date: checkinDate,
408                check_out_date: checkoutDate,
409                adults: countAdults,
410                max_child: maxChild,
411                paged: paged,
412            }
413            window.localStorage.setItem('wphb_filter_rooms', JSON.stringify(data));
414            const urlPush = wphbAddQueryArgs(document.location, data);
415            const urlString = urlPush.search;
416            window.location.href = urlPageSearch + urlString;
417        })
418
419    });
420}
421/** End search form */
422
423const processCheckout = () => {
424    const form = document.getElementById('hb-cart-form');
425    if (form === null) return;
426    const btn = form.querySelector('a.hb_checkout');
427    if (btn === null) return;
428    btn.addEventListener('click', function (e) {
429        e.preventDefault();
430        if (hotel_settings?.checkout_page_url) {
431            window.location.href = hotel_settings.checkout_page_url;
432        } else {
433            alert('Please set checkout page url in settings');
434        }
435    });
436}
437
438//auto set quantity extra option when change select quantity before book room in page search
439const toggleExtravalue = () => {
440    const select = document.querySelector('.hb-page-search-room-results select.number_room_select');
441    if (select == null) return;
442
443    select.addEventListener('change', function (e) {
444        e.preventDefault();
445        const optionExtras = document.querySelectorAll('.hb-page-search-room-results .hb_optional_quantity');
446        if (optionExtras == null) return;
447        optionExtras.forEach(function (extra) {
448            extra.value = select.value;
449        });
450    })
451}
452
453const renderPrice = (price) => {
454    const currencySymbol = hotel_settings.currency_symbol || '';
455    const currencyPosition = hotel_settings.currency_position || 'left';
456
457    price = renderPriceNumber(price);
458
459    switch (currencyPosition) {
460        case 'left':
461            price = currencySymbol + price;
462            break;
463        case 'right':
464            price = price + currencySymbol;
465            break;
466        case 'left_with_space':
467            price = currencySymbol + ' ' + price;
468            break;
469        case 'right_with_space':
470            price = price + ' ' + currencySymbol;
471            break;
472        default:
473            break;
474    }
475
476    return price;
477};
478
479const renderPriceNumber = (price) => {
480    const numberDecimals = hotel_settings.number_decimal || 0;
481    const thousandsSeparator = hotel_settings.thousands_separator || '';
482
483    price = (price / 1).toFixed(numberDecimals);
484    price = price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, thousandsSeparator);
485
486    return price;
487};
488
489const priceSlider = () => {
490    const priceFields = document.querySelectorAll('.hb-price-field');
491    if (!priceFields) {
492        return;
493    }
494
495    for (let i = 0; i < priceFields.length; i++) {
496        const priceField = priceFields[i];
497        const minPrice = priceField.getAttribute('data-min');
498        const maxPrice = priceField.getAttribute('data-max');
499        let step = priceField.getAttribute('data-step');
500
501        if (minPrice === '' || maxPrice === '' || step === '') {
502            continue;
503        }
504
505        const minPriceNode = priceField.querySelector('.hb-min-price');
506        const maxPriceNode = priceField.querySelector('.hb-max-price');
507
508
509        const priceSliderNode = priceField.querySelector('.hb-price-range');
510
511        const start = filterRooms.min_price || minPrice;
512        const end = filterRooms.max_price || maxPrice;
513        step = parseInt(step);
514
515        noUiSlider.create(priceSliderNode, {
516            start: [parseInt(start), parseInt(end)],
517            connect: true,
518            step,
519            tooltips: false,
520            range: {
521                min: parseInt(minPrice), max: parseInt(maxPrice),
522            },
523            // direction: 'lt',
524        });
525
526        priceSliderNode.noUiSlider.on('update', function (values, handle, unencoded) {
527            minPriceNode.value = parseInt(values[0]);
528            maxPriceNode.value = parseInt(values[1]);
529            priceField.querySelector('.min').innerHTML = renderPrice(values[0]);
530            priceField.querySelector('.max').innerHTML = renderPrice(values[1]);
531        });
532
533        const applyBtn = priceField.querySelector('button.apply');
534
535        //apply btn click event
536        applyBtn.addEventListener('click', function (event) {
537            event.preventDefault();
538
539            const minPrice = minPriceNode.value;
540            const maxPrice = maxPriceNode.value;
541
542            filterRooms = {
543                ...filterRooms,
544                min_price: parseInt(minPrice),
545                max_price: parseInt(maxPrice)
546            };
547
548            window.localStorage.setItem('wphb_filter_rooms', JSON.stringify(filterRooms));
549
550            searchRoomsPages();
551        });
552    }
553}
554
555const rating = () => {
556    const ratingFields = document.querySelectorAll('.hb-rating-field');
557    if (!ratingFields) {
558        return;
559    }
560
561    for (let i = 0; i < ratingFields.length; i++) {
562        const ratingField = ratingFields[i];
563
564        const allInputs = ratingField.querySelectorAll('input[type="checkbox"]');
565        const rating = filterRooms.rating || [];
566        [...rating].map(value => {
567            ratingField.querySelector(`input[name ="rating"][value ="${value}"]`).checked = true;
568        });
569
570        for (let i = 0; i < allInputs.length; i++) {
571            const input = allInputs[i];
572
573            input.addEventListener('change', function (event) {
574                const allCheckedInput = ratingField.querySelectorAll('input[type="checkbox"]:checked');
575
576                let value = [];
577                [...allCheckedInput].map(checkedInput => {
578                    value.push(checkedInput.value);
579                });
580
581                filterRooms = {
582                    ...filterRooms,
583                    rating: value
584                };
585
586                window.localStorage.setItem('wphb_filter_rooms', JSON.stringify(filterRooms));
587
588                searchRoomsPages();
589            });
590        }
591    }
592}
593
594const roomType = () => {
595    const roomTypeFields = document.querySelectorAll('.hb-type-field');
596    if (!roomTypeFields) {
597        return;
598    }
599
600    for (let i = 0; i < roomTypeFields.length; i++) {
601        const roomTypeField = roomTypeFields[i];
602
603        const allInputs = roomTypeField.querySelectorAll('input[type="checkbox"]');
604
605        const roomTypesValue = filterRooms.room_type || [];
606        [...roomTypesValue].map(value => {
607            roomTypeField.querySelector(`input[name ="room_type"][value ="${value}"]`).checked = true;
608        });
609
610        for (let i = 0; i < allInputs.length; i++) {
611            const input = allInputs[i];
612
613            input.addEventListener('change', function (event) {
614                const allCheckedInput = roomTypeField.querySelectorAll('input[type="checkbox"]:checked');
615
616                let value = [];
617                [...allCheckedInput].map(checkedInput => {
618                    value.push(checkedInput.value);
619                });
620
621                filterRooms = {
622                    ...filterRooms,
623                    room_type: value
624                };
625
626                window.localStorage.setItem('wphb_filter_rooms', JSON.stringify(filterRooms));
627
628                searchRoomsPages();
629            });
630        }
631    }
632}
633
634const clearFilter = () => {
635    const filterForms = document.querySelectorAll('.search-filter-form');
636    if (!filterForms) {
637        return;
638    }
639
640    for (let i = 0; i < filterForms.length; i++) {
641        const filterForm = filterForms[i];
642        const clearFilter = filterForm.querySelector('.clear-filter button');
643
644        clearFilter.addEventListener('click', function (event) {
645            const priceField = document.querySelector('.hb-price-field');
646            if (priceField) {
647                const minPrice = priceField.getAttribute('data-min');
648                const maxPrice = priceField.getAttribute('data-max');
649                const priceSliderNode = priceField.querySelector('.hb-price-range');
650                const start = minPrice;
651                const end = maxPrice;
652
653                priceSliderNode.noUiSlider.updateOptions({
654                    start: [parseInt(start), parseInt(end)]
655                });
656            }
657
658            const ratingFields = filterForm.querySelectorAll('.hb-rating-field input');
659
660            [...ratingFields].map(ratingField => {
661                ratingField.checked = false;
662            });
663
664            const roomTypeFields = filterForm.querySelectorAll('.hb-type-field input');
665
666            [...roomTypeFields].map(roomTypeField => {
667                roomTypeField.checked = false;
668            });
669
670            if (filterRooms.hasOwnProperty('min_price')) {
671                delete filterRooms['min_price'];
672            }
673
674            if (filterRooms.hasOwnProperty('max_price')) {
675                delete filterRooms['max_price'];
676            }
677
678            if (filterRooms.hasOwnProperty('rating')) {
679                delete filterRooms['rating'];
680            }
681
682            if (filterRooms.hasOwnProperty('room_type')) {
683                delete filterRooms['room_type'];
684            }
685
686            window.localStorage.setItem('wphb_filter_rooms', JSON.stringify(filterRooms));
687
688            searchRoomsPages();
689        });
690    }
691}
692
693const sortBy = () => {
694    const sortByWrapper = document.querySelector('.sort-by-wrapper');
695    if (!sortByWrapper) {
696        return;
697    }
698
699    const sortBy = filterRooms.sort_by || '';
700    const listOptions = sortByWrapper.querySelectorAll('ul li');
701    const toggle = sortByWrapper.querySelector('.toggle');
702
703    [...listOptions].map(element => {
704        if (element.getAttribute('data-value') === sortBy) {
705            toggle.innerHTML = element.innerHTML;
706            element.classList.add('active');
707        } else {
708            element.classList.remove('active');
709        }
710
711        element.addEventListener('click', function (event) {
712            const value = element.getAttribute('data-value');
713
714            filterRooms = {
715                ...filterRooms,
716                'sort_by': value
717            };
718
719            window.localStorage.setItem('wphb_filter_rooms', JSON.stringify(filterRooms));
720
721            searchRoomsPages();
722        });
723    });
724}
725
726document.addEventListener('DOMContentLoaded', () => {
727    searchRoomsPages();//use in page search room
728    addExtraToCart();
729    checkAvaliableRooms(); // use multi form search will redirect to page search room with data valid :
730    processCheckout();
731
732    if (hotelBookingSearchNode && hotel_settings && hotel_settings.is_page_search) {
733        priceSlider();
734        rating();
735        roomType();
736        clearFilter();
737        sortBy();
738    }
739});
740
741

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.