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.