PageSourceSearch

https://www.hotelslitteraires.fr/res/js/template/form/booking/ui.js?q=1790256808596

js hotelslitteraires.fr collected 2026-09-24 18:48:11 UTC 5,870 bytes, 164 lines download raw bytes

1var initFormBooking = async () => {
2  const form = document.querySelector('form');
3  const heightNavigation = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--height-navigation')) || 100;
4
5  let openPickers = 0;
6
7  function attachCloseOnScroll(fp, threshold = 0) {
8    const startY = window.pageYOffset || document.documentElement.scrollTop || 0;
9    const handler = () => {
10      const y = window.pageYOffset || document.documentElement.scrollTop || 0;
11      if (Math.abs(y - startY) >= threshold) fp.close();
12    };
13    fp._detachCloseOnScroll = () => {
14      window.removeEventListener('scroll', handler);
15      window.removeEventListener('wheel', handler);
16      window.removeEventListener('touchmove', handler);
17      fp._detachCloseOnScroll = null;
18    };
19    window.addEventListener('scroll', handler, { passive: true });
20    window.addEventListener('wheel', handler, { passive: true });
21    window.addEventListener('touchmove', handler, { passive: true });
22  }
23
24  function markRange(arrivalPicker, departurePicker) {
25    document.querySelectorAll('.flatpickr-day.selected-mid')
26      .forEach(el => el.classList.remove('selected-mid'));
27    const start = arrivalPicker?.selectedDates?.[0];
28    const end = departurePicker?.selectedDates?.[0];
29    if (!start || !end) return;
30    document.querySelectorAll('.flatpickr-day').forEach(el => {
31      if (el.classList.contains('prevMonthDay') || el.classList.contains('nextMonthDay')) return;
32      const d = el.dateObj;
33      if (d > start && d < end) el.classList.add('selected-mid');
34    });
35  }
36
37  const hasDateInputs = document.querySelector('.get-date');
38  const lang = document.documentElement.lang || 'fr';
39
40  if (hasDateInputs) {
41    if (typeof flatpickr == 'undefined') {
42      try {
43        await lazy.loadScript("/res/js/flatpickr/flatpickr.min.css", 0);
44        await lazy.loadScript("/res/js/flatpickr/flatpickr.js", 0);
45        if (lang !== 'en') {
46          await lazy.loadScript(`https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/${lang}.js`, 0);
47        }
48      } catch (e) { console.error('Erreur chargement flatpickr : ', e); }
49    }
50
51    const arrivalInput = document.getElementById('date-arrivee');
52    const departureInput = document.getElementById('date-depart');
53
54    let arrivalPicker, departurePicker;
55
56    // Arrivée
57    arrivalPicker = flatpickr(arrivalInput, {
58      dateFormat: lang === 'en' ? 'm/d/Y' : 'd/m/Y',
59      minDate: 'today',
60      locale: lang,
61      allowInput: true,
62      disableMobile: true,
63      onChange(selectedDates) {
64        if (selectedDates.length) {
65          const nextDay = new Date(selectedDates[0]);
66          nextDay.setDate(nextDay.getDate() + 1);
67          departurePicker.set('minDate', nextDay);
68          departurePicker.setDate(nextDay, true);
69          departureInput.removeAttribute('disabled');
70          departurePicker.open();
71        }
72        markRange(arrivalPicker, departurePicker);
73      },
74      onOpen() {
75        openPickers++;
76        attachCloseOnScroll(this);
77        setTimeout(() => markRange(arrivalPicker, departurePicker), 0);
78      },
79      onClose() {
80        this._detachCloseOnScroll?.();
81        openPickers = Math.max(0, openPickers - 1);
82      },
83    });
84
85    departurePicker = flatpickr(departureInput, {
86      dateFormat: lang === 'en' ? 'm/d/Y' : 'd/m/Y',
87      locale: lang,
88      allowInput: true,
89      disableMobile: true,
90      clickOpens: false,
91      onChange() { markRange(arrivalPicker, departurePicker); },
92      onOpen() {
93        openPickers++;
94        attachCloseOnScroll(this);
95        setTimeout(() => markRange(arrivalPicker, departurePicker), 0);
96      },
97      onClose() {
98        this._detachCloseOnScroll?.();
99        openPickers = Math.max(0, openPickers - 1);
100      },
101    });
102
103    departureInput.setAttribute('disabled', true);
104
105    document.querySelectorAll('.get-date').forEach(input => {
106      input.addEventListener('focus', function () {
107        if (!input.disabled && input._flatpickr) input._flatpickr.open();
108      });
109    });
110
111    document.querySelectorAll('.get-date').forEach(input => {
112      input.addEventListener('input', function () {
113        let value = input.value.replace(/\D/g, '').slice(0, 8);
114        let formatted = '';
115        if (value.length >= 5) formatted = `${value.slice(0, 2)}/${value.slice(2, 4)}/${value.slice(4, 8)}`;
116        else if (value.length >= 3) formatted = `${value.slice(0, 2)}/${value.slice(2, 4)}`;
117        else if (value.length >= 1) formatted = value.slice(0, 2);
118        input.value = formatted;
119      });
120    });
121  }
122
123  const adultsInput = document.getElementById('adults');
124  const wrapper = adultsInput.closest('[data-singular]');
125  const peopleLabel = document.getElementById('people-label');
126
127  const singular = wrapper.dataset.singular;
128  const plural = wrapper.dataset.plural;
129
130  function updatePeopleLabel() {
131    const count = parseInt(adultsInput.value || 1, 10);
132    if (count > 1) {
133      peopleLabel.classList.add('left-7.5')
134    } else {
135      peopleLabel.classList.remove('left-7.5')
136    }
137
138    peopleLabel.textContent = count > 1 ? plural : singular;
139  }
140
141  updatePeopleLabel();
142  adultsInput.addEventListener('input', updatePeopleLabel);
143  adultsInput.addEventListener('change', updatePeopleLabel);
144
145
146  const bookingForm = document.getElementById('booking-form');
147  const rateSelect = document.getElementById('rate-choice');
148  const hotelIdInput = document.getElementById('selectedHotelId');
149
150  if (bookingForm && rateSelect && hotelIdInput) {
151    rateSelect.addEventListener('change', function () {
152      const option = this.selectedOptions[0];
153      if (!option) return;
154
155      const hotelId = option.dataset.hotel || '';
156      const baseUrl = option.value;
157
158      const action = baseUrl.replace('HOTEL_ID', hotelId);
159
160      bookingForm.action = action;
161      hotelIdInput.value = hotelId;
162    });
163  }
164};

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.