PageSourceSearch

https://www.jhrl.com/sites/all/modules/rescms/rc_core/js/jquery.rcItemAvailForm.js?tlse4v

js jhrl.com collected 2026-10-06 13:18:24 UTC 24,977 bytes, 618 lines download raw bytes

1(function ($) {
2  var one_day = 1000 * 60 * 60 * 24;
3  var availData = null;
4  var rateData = null;
5  var methods = {
6    currencyFormatterInstance: null,
7    getFormatter: function (currency) {
8      if (!this.currencyFormatterInstance) {
9        this.currencyFormatterInstance = new Intl.NumberFormat('en-US', {
10          style: 'currency',
11          currency: currency,
12          maximumFractionDigits: 0,
13          minimumFractionDigits: 0
14        });
15      }
16      return this.currencyFormatterInstance;
17    },
18    addDayPrices: function (dp, options) {
19      setTimeout(function () {
20        var formatter = methods.getFormatter(options.price[0].c ? options.price[0].c : 'USD');
21        $('.ui-datepicker td > *').each(function (idx) {
22          var date = new Date((dp.selectedMonth + 1) + "/" + (idx + 1) + "/" + dp.selectedYear);
23          if (methods.hasPrice(options, date)) {
24            var price = methods.getPrice(options, date, 8);
25            $(this).attr('data-content', formatter.format(price.p));
26          }
27          else {
28            $(this).addClass('no-price');
29            $(this).attr('data-content', "-");
30          }
31        });
32      }, 0);
33    },
34    addDays: function (dt, days) {
35      var dobj = new Date(dt);
36      dobj.setDate(dobj.getDate() + parseInt(days));
37      return dobj.getTime();
38    },
39    checkTurn: function (options, date) {
40      var tds = methods.getTurnDays.apply(this, [options, date]);
41      if (tds) {
42        var day = date.getDay();
43        if (day == 0) day = 7;
44        if (!tds[day]) return false;
45      }
46      return true;
47    },
48    checkTurnover: function (options, date, type) {
49      if (options.turn) {
50        for (var to in options.turn) {
51          if (date >= options.turn[to].bdt && date <= options.turn[to].edt && ((type == 'checkout' && (options.turn[to].t == 'X' || options.turn[to].t == 'I')) || (type == 'checkin' && (options.turn[to].t == 'X' || options.turn[to].t == 'O')))) {
52            return false;
53          }
54        }
55      }
56      return true;
57    },
58    checkDeparture: function (options, date) {
59      if (!methods.checkTurnover.apply(this, [options, date, 'checkout'])) {
60        return false
61      }
62      if (options.tdd) {
63        return methods.checkTurn.apply(this, [options, date])
64      }
65      return true
66    },
67    getTurnDays: function (options, date) {
68      var turn = {};
69      var found = false;
70      var tm = date.getTime();
71      if (options.restr) {
72        for (var r in options.restr) {
73          if (typeof options.restr[r].t != 'undefined' && options.restr[r].t !== null && options.restr[r].bdt <= tm && options.restr[r].edt >= tm) {
74            if (options.restr[r].t == 0) {
75              turn = {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7};
76            } else {
77              if (Array.isArray(options.restr[r].t)) {
78                for (var tdind in options.restr[r].t) {
79                  turn[options.restr[r].t[tdind]] = options.restr[r].t[tdind]
80                }
81              } else {
82                turn[options.restr[r].t] = options.restr[r].t
83              }
84            }
85            found = true;
86            break;
87          }
88        }
89      }
90      if (options.td && !found) {
91        turn[options.td] = options.td;
92        found = true;
93      }
94      if (options.tds && !found) {
95        turn = options.tds;
96        found = true;
97      }
98      if (!found) {
99        turn = false;
100      }
101      return turn;
102    },
103    getMinStay: function (options, checkin) {
104      var min = options.mns;
105      var tm = checkin;
106      if (options.restr) {
107        for (var r in options.restr) {
108          if (options.restr[r].bdt <= tm && options.restr[r].edt >= tm) {
109            if (options.restr[r].mn > 0) {
110              min = options.restr[r].mn;
111            }
112            found = true;
113            break;
114          }
115        }
116      }
117      return min;
118    },
119    getStayIncrement: function (options, checkin) {
120      var inc = 1;
121      var tm = checkin;
122      var found = false;
123      if (options.restr) {
124        for (var r in options.restr) {
125          if (options.restr[r].bdt <= tm && options.restr[r].edt >= tm && options.restr[r].i !== null && options.restr[r].i > 0) {
126            inc = options.restr[r].i;
127            found = true;
128            break;
129          }
130        }
131      }
132      if (!found && options.incr) {
133        inc = options.incr;
134      }
135      return inc;
136    },
137    init: function (options) {
138      var self = this;
139      if (options.avail) {
140        for (key in options.avail) {
141          if (options.avail[key].b !== undefined && options.avail[key].e !== undefined) {
142            options.avail[key].bdt = methods.parseDate.apply(this, [options.avail[key].b]);
143            options.avail[key].edt = methods.parseDate.apply(this, [options.avail[key].e]);
144          }
145        }
146      }
147      if (options.restr) {
148        for (key in options.restr) {
149          if (options.restr[key].b !== undefined && options.restr[key].e !== undefined) {
150            options.restr[key].bdt = methods.parseDate.apply(this, [options.restr[key].b]);
151            options.restr[key].edt = methods.parseDate.apply(this, [options.restr[key].e]);
152          }
153        }
154      }
155      if (options.price) {
156        for (key in options.price) {
157          if (options.price[key].b !== undefined && options.price[key].e !== undefined) {
158            options.price[key].bdt = methods.parseDate.apply(this, [options.price[key].b]);
159            options.price[key].edt = methods.parseDate.apply(this, [options.price[key].e]);
160          }
161        }
162      }
163      if (options.turn) {
164        for (key in options.turn) {
165          if (options.turn[key].b !== undefined && options.turn[key].e !== undefined) {
166            options.turn[key].bdt = methods.parseDate.apply(this, [options.turn[key].b]);
167            options.turn[key].edt = methods.parseDate.apply(this, [options.turn[key].e]);
168          }
169        }
170      }
171      if (options.emb) {
172        $(this).data('isEmbedded', true);
173      } else if (options.mt && Modernizr && Modernizr.touch) {
174        $(this).data('isEmbedded', true);
175      } else if (options.embbp) {
176        var vp = $(window).width();
177        if (vp < options.embbp) {
178          $(this).data('isEmbedded', true);
179          options.emb = true;
180        }
181      }
182      $('.affects-quote', '#' + options.id).change(function () {
183        if (options.ajx && options.ajx.tgt) {
184          $(options.ajx.tgt).html('');
185        }
186      });
187      var now = Date.now();
188      var maxBegin = methods.addDays.apply(this, [now, options.mxe - Math.max(options.incr || 0, options.mns || 0)]);
189      if ($(this).data('isEmbedded')) {
190        $('input.end, input.begin', '#' + options.id).each(function () {
191          $(this).parents('.form-item').hide();
192        });
193        $('.rc-avail-embed', this).datepicker({
194          dateFormat: options.df,
195          numberOfMonths: options.me ? options.me : options.mv,
196          stepMonths: options.me ? options.me : options.mv,
197          firstDay: options.tdc ? options.tdc : 0,
198          minDate: options.mnb,
199          maxDate: options.mxe,
200          changeMonth: true,
201          changeYear: true,
202          onSelect: function (dateText, inst) {
203            if ($('input.begin', '#' + options.id).val() && $('input.end', '#' + options.id).val()) {
204              $('input.end', '#' + options.id).val('');
205              $('input.begin', '#' + options.id).val(dateText);
206            } else if ($('input.begin', '#' + options.id).val()) {
207              $('input.end', '#' + options.id).val(dateText);
208              if (options.sub && options.id) $('#' + options.id).submit();
209            } else {
210              $('input.begin', '#' + options.id).val(dateText);
211            }
212            methods.updateEmbedMessage.apply(this, [options]);
213            if (options.ajx && options.ajx.tgt) {
214              $(options.ajx.tgt).html('');
215            }
216            if (options.spr && options.price) {
217              methods.addDayPrices(inst, options);
218            }
219          },
220          onChangeMonthYear: function(month, year, inst) {
221            if (options.spr && options.price) {
222              methods.addDayPrices(inst, options);
223            }
224          },
225          beforeShowDay: function (date) {
226            if (!$('input.begin', '#' + options.id).val() || ($('input.begin', '#' + options.id).val() && $('input.end', '#' + options.id).val())) {
227              if (maxBegin && date > maxBegin) {
228                return [false, ''];
229              }
230              if (options.restr_price && !methods.hasPrice.apply(this, [options, date.getTime()])) {
231                return [false, ''];
232              }
233              var avail = methods.getAvail.apply(this, [options, date.getTime(), "checkin", true]);
234              var turnCheck = methods.checkTurn.apply(this, [options, date]) && methods.checkTurnover.apply(this, [options, date, 'checkin']);
235              if (!turnCheck) {
236                avail[0] = false;
237              }
238              var mins = methods.getMinStay.apply(this, [options, date]);
239              // 99 night minimum = closed to arrival
240              if (mins == 99) avail[0] = false;
241              return avail;
242            } else {
243              if (options.restr_price && !methods.hasPrice.apply(this, [options, date.getTime()])) {
244                return [false, ''];
245              }
246              var begDt = $(this).datepicker("getDate").getTime();
247              var min = methods.addDays.apply(this, [begDt, methods.getMinStay.apply(this, [options, begDt])]);
248              var max = methods.getMaxStay.apply(this, [options, begDt]);
249              var maxDate = Math.min(methods.addDays.apply(this, [begDt, max]), methods.addDays.apply(this, [Date.now(), options.mxe]));
250              var incr = methods.getStayIncrement.apply(this, [options, begDt]);
251
252              var avail = methods.getAvail.apply(this, [options, date.getTime(), "checkout", true]);
253              if (incr) {
254                diff = Math.round((date.getTime() - begDt) / one_day);
255                if (diff % incr != 0) {
256                  avail[0] = false;
257                }
258              }
259              var depCheck = methods.checkDeparture.apply(this, [options, date]);
260              if (!depCheck) avail[0] = false;
261              if (date.getTime() < min || date.getTime() > maxDate) avail[0] = false;
262              return avail;
263            }
264          }
265        });
266        if ($('input.begin', '#' + options.id).val()) {
267          $('.rc-avail-embed', this).datepicker('setDate', $('input.begin', '#' + options.id).val());
268        }
269        methods.updateEmbedMessage.apply(this, [options]);
270      } else {
271        $('#' + options.beg, this).datepicker({
272          dateFormat: options.df,
273          numberOfMonths: options.mv,
274          stepMonths: options.mv,
275          showOn: 'both',
276          firstDay: options.tdc ? options.tdc : 0,
277          changeMonth: true,
278          changeYear: true,
279          onSelect: function (dateText, inst) {
280            $(this).change();
281          },
282          beforeShow: function (input, inst) {
283            if (options.spr && options.price) {
284              methods.addDayPrices(inst, options);
285            }
286            return {minDate: options.mnb, maxDate: options.mxe};
287          },
288          onChangeMonthYear: function(month, year, inst) {
289            if (options.spr && options.price) {
290              methods.addDayPrices(inst, options);
291            }
292          },
293          beforeShowDay: function (date) {
294            if (maxBegin && date > maxBegin) {
295              return [false, ''];
296            }
297            if (options.restr_price && !methods.hasPrice.apply(this, [options, date.getTime()])) {
298              return [false, ''];
299            }
300            var avail = methods.getAvail.apply(this, [options, date.getTime(), "checkin", true]);
301            var turnCheck = methods.checkTurn.apply(this, [options, date]) && methods.checkTurnover.apply(this, [options, date, 'checkin']);
302            if (!turnCheck) avail[0] = false;
303            var mins = methods.getMinStay.apply(this, [options, date]);
304            // 99 night minimum = closed to arrival
305            if (mins == 99) avail[0] = false;
306            return avail;
307          },
308          onClose: function () {
309            var bdt, edt
310            if (options.end != '') {
311              bdt = $(this).datepicker('getDate')
312              edt = $('#' + options.end, self).datepicker('getDate')
313              if (bdt !== null && (edt == null || edt <= bdt)) {
314                setTimeout(function () {
315                  $('#' + options.end, self).datepicker('show')
316                }, 200);
317              }
318            }
319          },
320        });
321        if (options.end != '') {
322          $('#' + options.end, this).datepicker({
323            dateFormat: options.df,
324            numberOfMonths: 1,
325            stepMonths: 1,
326            showOn: 'both',
327            firstDay: options.tdc ? options.tdc : 0,
328            onSelect: function (dateText, inst) {
329              $(this).change();
330            },
331            beforeShow: function (input, inst) {
332              if (options.spr && options.price) {
333                methods.addDayPrices(inst, options);
334              }
335              if ($('#' + options.beg).val()) {
336                var min = options.mns;
337                var max = options.mxs;
338                return {
339                  minDate: new Date(methods.addDays.apply(this, [$('#' + options.beg).datepicker("getDate").getTime(), min])),
340                  maxDate: new Date(Math.min(methods.addDays.apply(this, [$('#' + options.beg).datepicker("getDate").getTime(), max]), methods.addDays.apply(this, [Date.now(), options.mxe]))),
341                  disabled: false
342                };
343              } else {
344                return {disabled: true};
345              }
346            },
347            onChangeMonthYear: function(month, year, inst) {
348              if (options.spr && options.price) {
349                methods.addDayPrices(inst, options);
350              }
351            },
352            beforeShowDay: function (date) {
353              if (!$('#' + options.beg).val()) {
354                return [false, ''];
355              } else if (options.restr_price && !methods.hasPrice.apply(this, [options, date.getTime()])) {
356                return [false, ''];
357              } else {
358                var begDt = $('#' + options.beg).datepicker("getDate").getTime();
359                var min = methods.addDays.apply(this, [begDt, methods.getMinStay.apply(this, [options, begDt])]);
360                var max = methods.getMaxStay.apply(this, [options, begDt]);
361                var maxDate = Math.min(methods.addDays.apply(this, [begDt, max]), methods.addDays.apply(this, [Date.now(), options.mxe]));
362                var incr = methods.getStayIncrement.apply(this, [options, begDt]);
363
364                var avail = methods.getAvail.apply(this, [options, date.getTime(), "checkout", true]);
365                if (incr) {
366                  diff = Math.round((date.getTime() - begDt) / one_day);
367                  if (diff % incr != 0) {
368                    avail[0] = false;
369                  }
370                }
371                var depCheck = methods.checkDeparture.apply(this, [options, date]);
372                if (!depCheck) avail[0] = false;
373                if (date.getTime() < min || date.getTime() > maxDate) avail[0] = false;
374                return avail;
375              }
376            }
377          });
378        }
379      }
380      $('#' + options.id).closest('form').submit(function () {
381        if (($('input.begin', '#' + options.id).val() && ($('input.end', '#' + options.id) && !$('input.end', '#' + options.id).val())) || ($('input.end', '#' + options.id).val() && !$('input.begin', '#' + options.id).val())) {
382          alert(options.txt.sbe);
383          return false;
384        }
385      });
386      if (options.ajx && options.ajx.url) {
387        $('#' + options.id).closest('form').submit(function () {
388          if (!$('input.begin', '#' + options.id).val() || (options.end && !$('input.end', '#' + options.id).val())) {
389            alert(options.txt.sd);
390          } else if (!methods.checkChildAges.apply(this, [options])) {
391            alert(options.txt.chia);
392          } else {
393            $('div' + options.ajx.tgt).html(options.txt.lm).addClass('loading');
394            $.get(options.ajx.url, $(this).formSerialize(), function (data, status) {
395              if (status == 'success') {
396                if (data.message) alert(data.message);
397                if (data.reveals) {
398                  var reveals = $('<div />').append(data.reveals)
399                  $('body').append(reveals)
400                  Drupal.attachBehaviors(reveals)
401                }
402                if (data.content) {
403                  $('div' + options.ajx.tgt).html(data.content);
404                  Drupal.attachBehaviors('div' + options.ajx.tgt);
405                } else {
406                  $('div' + options.ajx.tgt).html('');
407                }
408              } else {
409                alert(options.txt.ae);
410                $('div' + options.ajx.tgt).html('');
411              }
412              $('div' + options.ajx.tgt).removeClass('loading');
413            });
414          }
415          return false;
416        });
417      } else {
418        $('#' + options.id).closest('form').submit(function () {
419          if ($('input.begin', '#' + options.id).val() && !methods.checkChildAges.apply(this, [options])) {
420            alert(options.txt.chia);
421            return false;
422          }
423          return true;
424        });
425      }
426      if (options.chia) {
427        methods.updateChildAges.apply(this, [options]);
428        $('.child', '#' + options.id).change(function () {
429          methods.updateChildAges.apply(this, [options]);
430        });
431      }
432      $(this).data('rcItemAvailFormOptions', options);
433    },
434    embedReset: function (options) {
435      $('input.begin', '#' + options.id).val('');
436      $('input.end', '#' + options.id).val('');
437      if (options.emb) {
438        $('.rc-avail-embed', '#' + options.id).datepicker('refresh');
439      }
440      methods.updateEmbedMessage.apply(this, [options]);
441    },
442    parseDate: function (datestr) {
443      var dt = new Date(0, 0, 0, 0, 0, 0, 0);
444      var parts = datestr.split("-");
445      if (parts.length == 3) {
446        dt.setFullYear(parts[0], parts[1] - 1, parts[2]);
447      } else {
448        parts = datestr.split("/");
449        if (parts.length == 3) {
450          dt.setFullYear(parts[2], parts[0] - 1, parts[1]);
451        }
452      }
453      return dt.getTime();
454    },
455    getAvail: function (options, dt, type, recurse) {
456      var avail = [false, 'av-X'];
457      var pavail;
458      var caldt = dt;
459      if (type == 'checkout') dt = methods.addDays.apply(this, [dt, -1]);
460      if (options.avail) {
461        for (var av in options.avail) {
462          if (dt >= options.avail[av].bdt && dt <= options.avail[av].edt && options.avail[av].a > 0) {
463            avail = [true, 'av-O'];
464            if (options.avail[av].x != '') avail[1] = avail[1] + ' x-' + options.avail[av].x;
465            if (options.avail[av].s != '') avail[1] = avail[1] + ' s-' + options.avail[av].s;
466            break;
467          }
468        }
469        if (options.lodg && recurse) {
470          if (type == 'checkout' && avail[0]) {
471            navail = methods.getAvail.apply(this, [options, methods.addDays.apply(this, [dt, 1]), 'checkin', false]);
472            if (!navail[0]) avail[1] = avail[1] + " av-OUT";
473          } else if (type == 'checkin') {
474            pavail = methods.getAvail.apply(this, [options, methods.addD
474ays.apply(this, [dt, -1]), type, false]);
475            if (avail[0]) {
476              if (!pavail[0]) avail[1] = avail[1] + " av-IN";
477            } else if (!avail[0]) {
478              if (pavail[0]) avail[1] = avail[1] + " av-OUT";
479            }
480          }
481        }
482      } else {
483        avail = [true, 'av-O'];
484      }
485
486      if ($('input.begin', '#' + options.id).val()) {
487        var begdt = methods.parseDate.apply(this, [$('input.begin', '#' + options.id).val()]);
488        if (caldt == begdt) {
489          avail[1] = avail[1] + " av-BEG";
490        }
491        if (caldt == begdt && type == 'checkin') {
492          avail[1] = avail[1] + " av-S";
493        } else if (options.end != '' && $('input.end', '#' + options.id).val()) {
494          var enddt = methods.parseDate.apply(this, [$('input.end', '#' + options.id).val()]);
495          if (caldt > begdt && caldt <= enddt) avail[1] = avail[1] + " av-S";
496          if (caldt == enddt) avail[1] = avail[1] + " av-END";
497        }
498      }
499
500      return avail;
501    },
502    getMaxStay: function (options, checkin) {
503      var max = options.mxs;
504      var found = false;
505      var avail;
506      var maxAvail = max;
507      if (options.avail) {
508        for (var i = 1; i <= max; i++) {
509          avail = methods.getAvail.apply(this, [options, methods.addDays.apply(this, [checkin, i]), 'checkout', false]);
510          if (!avail[0]) {
511            maxAvail = i - 1;
512            break;
513          }
514        }
515      }
516      if (options.restr) {
517        for (var r in options.restr) {
518          if (options.restr[r].bdt <= checkin && options.restr[r].edt >= checkin) {
519            if (options.restr[r].mx > 0) {
520              max = options.restr[r].mx;
521            }
522            found = true;
523            break;
524          }
525        }
526      }
527      return Math.min(max, maxAvail);
528    },
529    getPrice: function (options, dt, type) {
530      var price = null;
531      if (options.price) {
532        for (var p in options.price) {
533          if (dt >= options.price[p].bdt && dt <= options.price[p].edt && (!type || type == options.price[p].t)) {
534            price = options.price[p];
535          }
536        }
537      }
538      return price;
539    },
540    hasPrice: function (options, dt) {
541      if (options.price) {
542        price = methods.getPrice.apply(this, [options, dt]);
543        if (price) return true;
544      }
545      return false;
546    },
547    updateEmbedMessage: function (options) {
548      if ($('input.begin', '#' + options.id).val() && $('input.end', '#' + options.id).val()) {
549        $('.rc-avail-embed-msg', '#' + options.id).empty().append($('input.begin', '#' + options.id).val() + ' - ' + $('input.end', '#' + options.id).val());
550        $('.rc-avail-embed-msg', '#' + options.id).append().append($('<a href="#" class="start-over">' + options.txt.sto + '</a>').click(function () {
551          methods.embedReset.apply(this, [options]);
552          return false;
553        }));
554      } else if ($('input.begin', '#' + options.id).val()) {
555        $('.rc-avail-embed-msg', '#' + options.id).empty().append(options.txt.cdd);
556        ms = methods.getMinStay.apply(this, [options, $('.rc-avail-embed', '#' + options.id).datepicker('getDate')]);
557        if (ms > 1) $('.rc-avail-embed-msg', '#' + options.id).append('<span class=\"mns\">' + ms + ' ' + options.txt.mns + '</span>');
558        $('.rc-avail-embed-msg', '#' + options.id).append().append($('<a href="#" class="start-over">' + options.txt.sto + '</a>').click(function () {
559          methods.embedReset.apply(this, [options]);
560          return false;
561        }).attr('href', '#').attr('onclick', 'return false;'));
562        $('#' + options.ad).empty();
563      } else {
564        $('.rc-avail-embed-msg', '#' + options.id).empty().append(options.txt.cad);
565        $('#' + options.ad).empty();
566      }
567    },
568    updateChildAges: function (options) {
569      if (options.chia) {
570        var cct = $('.child', '#' + options.id).val();
571        if (cct > 0) {
572          $('.rcav-child-ages .child-age', '#' + options.id).each(function () {
573            $(this).parent().hide();
574          });
575          for (var i = 0; i < cct; i++) {
576            $('.rcav-child-ages .ca-' + i, '#' + options.id).parent().show();
577          }
578          $('.rcav-child-ages', '#' + options.id).show(300);
579        } else {
580          $('.rcav-child-ages', '#' + options.id).hide(300);
581        }
582      }
583    },
584    checkChildAges: function (options) {
585      if (options.chia) {
586        var cct = $('.child', '#' + options.id).val();
587        if (cct > 0) {
588          for (var i = 0; i < cct; i++) {
589            if ($('.rcav-child-ages .ca-' + i, '#' + options.id).val() == '') return false;
590          }
591        }
592      }
593      return true;
594    }
595  };
596  $.fn.rcItemAvailForm = function (method) {
597    if (methods[method]) {
598      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
599    } else if (typeof method === 'object' || !method) {
600      return methods.init.apply(this, arguments);
601    } else {
602      $.error('Method ' + method + ' does not exist on jQuery.filterAvail');
603    }
604    return this;
605  };
606
607  Drupal.behaviors.rcItemAvailForm = {
608    attach: function (context, settings) {
609      $(Drupal.settings.rcItemAvailForm).each(function (ind, data) {
610        if (data.id !== null) {
611          $('#' + data.id, context).once('rcItemAvailForm', function () {
612            $(this).rcItemAvailForm(data);
613          });
614        }
615      });
616    }
617  };
618})(jQuery);

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.