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.