PageSourceSearch

https://www.e-myholiday.com/js/st5/jquery-ui.multidatespicker.js?1755569649

js e-myholiday.com collected 2026-10-02 05:54:57 UTC 19,034 bytes, 517 lines download raw bytes

vendor: 19,034 bytes, lines 1-517
1/*
2 * MultiDatesPicker v1.6.4
3 * http://multidatespickr.sourceforge.net/
4 *
5 * Copyright 2014, Luca Lauretta
6 * Dual licensed under the MIT or GPL version 2 licenses.
7 */
8(function ($) {
9  $.extend($.ui, {multiDatesPicker: {version: "1.6.4"}});
10
11  $.fn.multiDatesPicker = function (method) {
12    var mdp_arguments = arguments;
13    var ret = this;
14    var today_date = new Date();
15    var day_zero = new Date(0);
16    var mdp_events = {};
17
18    function removeDate(date, type) {
19      if (!type) type = 'picked';
20      date = dateConvert.call(this, date);
21      for (var i = 0; i < this.multiDatesPicker.dates[type].length; i++)
22        if (!methods.compareDates(this.multiDatesPicker.dates[type][i], date))
23          return this.multiDatesPicker.dates[type].splice(i, 1).pop();
24    }
25
26    function removeIndex(index, type) {
27      if (!type) type = 'picked';
28      return this.multiDatesPicker.dates[type].splice(index, 1).pop();
29    }
30
31    function addDate(date, type, no_sort) {
32      if (!type) type = 'picked';
33      date = dateConvert.call(this, date);
34
35      // @todo: use jQuery UI datepicker method instead
36      date.setHours(0);
37      date.setMinutes(0);
38      date.setSeconds(0);
39      date.setMilliseconds(0);
40
41      if (methods.gotDate.call(this, date, type) === false) {
42        this.multiDatesPicker.dates[type].push(date);
43        if (!no_sort) this.multiDatesPicker.dates[type].sort(methods.compareDates);
44      }
45    }
46
47    function sortDates(type) {
48      if (!type) type = 'picked';
49      this.multiDatesPicker.dates[type].sort(methods.compareDates);
50    }
51
52    function dateConvert(date, desired_type, date_format) {
53      if (!desired_type) desired_type = 'object';/*
54			if(!date_format && (typeof date == 'string')) {
55				date_format = $(this).datepicker('option', 'dateFormat');
56				if(!date_format) date_format = $.datepicker._defaults.dateFormat;
57			}
58			*/
59      return methods.dateConvert.call(this, date, desired_type, date_format);
60    }
61
62    var methods = {
63      init: function (options) {
64        var $this = $(this);
65        this.multiDatesPicker.changed = false;
66
67        var mdp_events = {
68          beforeShow: function (input, inst) {
69            this.multiDatesPicker.changed = false;
70            if (this.multiDatesPicker.originalBeforeShow)
71              this.multiDatesPicker.originalBeforeShow.call(this, input, inst);
72          },
73          onSelect: function (dateText, inst) {
74            var $this = $(this);
75            this.multiDatesPicker.changed = true;
76
77            if (dateText) {
78              $this.multiDatesPicker('toggleDate', dateText);
79              this.multiDatesPicker.changed = true;
80              // @todo: this will be optimized when I'll move methods to the singleton.
81            }
82
83            if (this.multiDatesPicker.mode == 'normal' && this.multiDatesPicker.pickableRange) {
84              if (this.multiDatesPicker.dates.picked.length > 0) {
85                var min_date = this.multiDatesPicker.dates.picked[0],
86                  max_date = new Date(min_date.getTime());
87
88                methods.sumDays(max_date, this.multiDatesPicker.pickableRange - 1);
89
90                // counts the number of disabled dates in the range
91                if (this.multiDatesPicker.adjustRangeToDisabled) {
92                  var c_disabled,
93                    disabled = this.multiDatesPicker.dates.disabled.slice(0);
94                  do {
95                    c_disabled = 0;
96                    for (var i = 0; i < disabled.length; i++) {
97                      if (disabled[i].getTime() <= max_date.getTime()) {
98                        if ((min_date.getTime() <= disabled[i].getTime()) && (disabled[i].getTime() <= max_date.getTime())) {
99                          c_disabled++;
100                        }
101                        disabled.splice(i, 1);
102                        i--;
103                      }
104                    }
105                    max_date.setDate(max_date.getDate() + c_disabled);
106                  } while (c_disabled != 0);
107                }
108
109                if (this.multiDatesPicker.maxDate && (max_date > this.multiDatesPicker.maxDate))
110                  max_date = this.multiDatesPicker.maxDate;
111
112                $this
113                  .datepicker("option", "minDate", min_date)
114                  .datepicker("option", "maxDate", max_date);
115              } else {
116                $this
117                  .datepicker("option", "minDate", this.multiDatesPicker.minDate)
118                  .datepicker("option", "maxDate", this.multiDatesPicker.maxDate);
119              }
120            }
121
122            if (this.multiDatesPicker.originalOnSelect && dateText)
123              this.multiDatesPicker.originalOnSelect.call(this, dateText, inst);
124
125          },
126          beforeShowDay: function (date) {
127            var $this = $(this),
128              gotThisDate = $this.multiDatesPicker('gotDate', date) !== false,
129              isDisabledCalendar = $this.datepicker('option', 'disabled'),
130              isDisabledDate = $this.multiDatesPicker('gotDate', date, 'disabled') !== false,
131              areAllSelected = this.multiDatesPicker.maxPicks <= this.multiDatesPicker.dates.picked.length;
132
133            var bsdReturn = [true, '', null];
134            if (this.multiDatesPicker.originalBeforeShowDay)
135              bsdReturn = this.multiDatesPicker.originalBeforeShowDay.call(this, date);
136
137            bsdReturn[1] = gotThisDate ? 'ui-state-highlight ' + bsdReturn[1] : bsdReturn[1];
138            bsdReturn[0] = bsdReturn[0] && !(isDisabledCalendar || isDisabledDate || (areAllSelected && !bsdReturn[1]));
139            return bsdReturn;
140          }
141        };
142
143        // value have to be extracted before datepicker is initiated
144        if ($this.val()) var inputDates = $this.val()
145
146        if (options) {
147          // value have to be extracted before datepicker is initiated
148          //if(options.altField) var inputDates = $(options.altField).val();
149          if (options.separator) this.multiDatesPicker.separator = options.separator;
150          if (!this.multiDatesPicker.separator) this.multiDatesPicker.separator = ' ~ ';
151
152          this.multiDatesPicker.originalBeforeShow = options.beforeShow;
153          this.multiDatesPicker.originalOnSelect = options.onSelect;
154          this.multiDatesPicker.originalBeforeShowDay = options.beforeShowDay;
155          this.multiDatesPicker.originalOnClose = options.onClose;
156
157          // datepicker init
158          $this.datepicker(options);
159
160          this.multiDatesPicker.minDate = $.datepicker._determineDate(this, options.minDate, null);
161          this.multiDatesPicker.maxDate = $.datepicker._determineDate(this, options.maxDate, null);
162          if (options.addDates) methods.addDates.call(this, options.addDates);
163
164          if (options.addDisabledDates)
165            methods.addDates.call(this, options.addDisabledDates, 'disabled');
166
167          methods.setMode.call(this, options);
168        } else {
169          $this.datepicker();
170        }
171        $this.datepicker('option', mdp_events);
172
173        // adds any dates found in the input or alt field
174        if (inputDates) $this.multiDatesPicker('value', inputDates);
175
176        // generates the new string of added dates
177        var inputs_values = $this.multiDatesPicker('value');
178
179        // fills the input field back with all the dates in the calendar
180        $this.val(inputs_values);
181
182        // Fixes the altField filled with defaultDate by default
183        var altFieldOption = $this.datepicker('option', 'altField');
184        if (altFieldOption) $(altFieldOption).val(inputs_values);
185
186        // Updates the calendar view
187        $this.datepicker('refresh');
188      },
189      compareDates: function (date1, date2) {
190        date1 = dateConvert.call(this, date1);
191        date2 = dateConvert.call(this, date2);
192        // return > 0 means date1 is later than date2
193        // return == 0 means date1 is the same day as date2
194        // return < 0 means date1 is earlier than date2
195        var diff = date1.getFullYear() - date2.getFullYear();
196        if (!diff) {
197          diff = date1.getMonth() - date2.getMonth();
198          if (!diff)
199            diff = date1.getDate() - date2.getDate();
200        }
201        return diff;
202      },
203      sumDays: function (date, n_days) {
204        var origDateType = typeof date;
205        obj_date = dateConvert.call(this, date);
206        obj_date.setDate(obj_date.getDate() + n_days);
207        return dateConvert.call(this, obj_date, origDateType);
208      },
209      dateConvert: function (date, desired_format, dateFormat) {
210        var from_format = typeof date;
211        var $this = $(this);
212
213        if (from_format == desired_format) {
214          if (from_format == 'object') {
215            try {
216              date.getTime();
217            } catch (e) {
218              $.error('Received date is in a non supported format!');
219              return false;
220            }
221          }
222          return date;
223        }
224
225        if (typeof date == 'undefined') date = new Date(0);
226
227        if (desired_format != 'string' && desired_format != 'object' && desired_format != 'number')
228          $.error('Date format "' + desired_format + '" not supported!');
229
230        if (!dateFormat) {
231          // thanks to bibendus83 -> http://sourceforge.net/tracker/index.php?func=detail&aid=3213174&group_id=358205&atid=1495382
232          var dp_dateFormat = $this.datepicker('option', 'dateFormat');
233          if (dp_dateFormat) {
234            dateFormat = dp_dateFormat;
235          } else {
236            dateFormat = $.datepicker._defaults.dateFormat;
237          }
238        }
239
240        // converts to object as a neutral format
241        switch (from_format) {
242          case 'object':
243            break;
244          case 'string':
245            date = $.datepicker.parseDate(dateFormat, date);
246            break;
247          case 'number':
248            date = new Date(date);
249            break;
250          default:
251            $.error('Conversion from "' + desired_format + '" format not allowed on jQuery.multiDatesPicker');
252        }
253        // then converts to the desired format
254        switch (desired_format) {
255          case 'object':
256            return date;
257          case 'string':
258            return $.datepicker.formatDate(dateFormat, date);
259          case 'number':
260            return date.getTime();
261          default:
262            $.error('Conversion to "' + desired_format + '" format not allowed on jQuery.multiDatesPicker');
263        }
264        return false;
265      },
266      gotDate: function (date, type) {
267        if (!type) type = 'picked';
268        for (var i = 0; i < this.multiDatesPicker.dates[type].length; i++) {
269          if (methods.compareDates.call(this, this.multiDatesPicker.dates[type][i], date) === 0) {
270            return i;
271          }
272        }
273        return false;
274      },
275      value: function (value) {
276        if (value && typeof value == 'string') {
277          methods.addDates.call(this, value.split(this.multiDatesPicker.separator));
278        } else {
279          var dates = methods.getDates.call(this, 'string');
280          return dates.length
281            ? dates.join(this.multiDatesPicker.separator)
282            : "";
283        }
284      },
285      getDates: function (format, type) {
286        if (!format) format = 'string';
287        if (!type) type = 'picked';
288        switch (format) {
289          case 'object':
290            return this.multiDatesPicker.dates[type];
291          case 'string':
292          case 'number':
293            var o_dates = new Array();
294            for (var i in this.multiDatesPicker.dates[type])
295              o_dates.push(
296                dateConvert.call(
297                  this,
298                  this.multiDatesPicker.dates[type][i],
299                  format
300                )
301              );
302            return o_dates;
303
304          default:
305            $.error('Format "' + format + '" not supported!');
306        }
307      },
308      addDates: function (dates, type) {
309        if (dates.length > 0) {
310          if (!type) type = 'picked';
311          switch (typeof dates) {
312            case 'object':
313            case 'array':
314              if (dates.length) {
315                for (var i = 0; i < dates.length; i++)
316                  addDate.call(this, dates[i], type, true);
317                sortDates.call(this, type);
318                break;
319              } // else does the same as 'string'
320            case 'string':
321            case 'number':
322              addDate.call(this, dates, type);
323              break;
324            default:
325              $.error('Date format "' + typeof dates + '" not allowed on jQuery.multiDatesPicker');
326          }
327          //$(this).datepicker('refresh');
328        } else {
329          $.error('Empty array of dates received.');
330        }
331      },
332      removeDates: function (dates, type) {
333        if (!type) type = 'picked';
334        var removed = [];
335        if (Object.prototype.toString.call(dates) === '[object Array]') {
336          for (var i in dates.sort(function (a, b) {
337            return b - a
338          })) {
339            removed.push(removeDate.call(this, dates[i], type));
340          }
341        } else {
342          removed.push(removeDate.call(this, dates, type));
343        }
344        return removed;
345      },
346      removeIndexes: function (indexes, type) {
347        if (!type) type = 'picked';
348        var removed = [];
349        if (Object.prototype.toString.call(indexes) === '[object Array]') {
350          for (var i in indexes.sort(function (a, b) {
351            return b - a
352          })) {
353            removed.push(removeIndex.call(this, indexes[i], type));
354          }
355        } else {
356          removed.push(removeIndex.call(this, indexes, type));
357        }
358        return removed;
359      },
360      resetDates: function (type) {
361        if (!type) type = 'picked';
362        this.multiDatesPicker.dates[type] = [];
363      },
364      toggleDate: function (date, type) {
365        if (!type) type = 'picked';
366
367        switch (this.multiDatesPicker.mode) {
368          case 'daysRange':
369            this.multiDatesPicker.dates[type] = []; // deletes all picked/disabled dates
370            var end = this.multiDatesPicker.autoselectRange[1];
371            var begin = this.multiDatesPicker.autoselectRange[0];
372            if (end < begin) { // switch
373              end = this.multiDatesPicker.autoselectRange[0];
374              begin = this.multiDatesPicker.autoselectRange[1];
375            }
376            for (var i = begin; i < end; i++)
377              methods.addDates.call(this, methods.sumDays.call(this, date, i), type);
378            break;
379          default:
380            if (methods.gotDate.call(this, date) === false) // adds dates
381              methods.addDates.call(this, date, type);
382            else // removes dates
383              methods.removeDates.call(this, date, type);
384            break;
385        }
386      },
387      setMode: function (options) {
388        var $this = $(this);
389        if (options.mode) this.multiDatesPicker.mode = options.mode;
390
391        switch (this.multiDatesPicker.mode) {
392          case 'normal':
393            for (option in options)
394              switch (option) {
395                case 'maxPicks':
396                case 'minPicks':
397                case 'pickableRange':
398                case 'adjustRangeToDisabled':
399                  this.multiDatesPicker[option] = options[option];
400                  break;
401                //default: $.error('Option ' + option + ' ignored for mode "'.options.mode.'".');
402              }
403            break;
404          case 'daysRange':
405          case 'weeksRange':
406            var mandatory = 1;
407            for (option in options)
408              switch (option) {
409                case 'autoselectRange':
410                  mandatory--;
411                case 'pickableRange':
412                case 'adjustRangeToDisabled':
413                  this.multiDatesPicker[option] = options[option];
414                  break;
415                //default: $.error('Option ' + option + ' does not exist for setMode on jQuery.multiDatesPicker');
416              }
417            if (mandatory > 0) $.error('Some mandatory options not specified!');
418            break;
419        }
420
421        /*
422        if(options.pickableRange) {
423          $this.datepicker("option", "maxDate", options.pickableRange);
424          $this.datepicker("option", "minDate", this.multiDatesPicker.minDate);
425        }
426        */
427
428        if (mdp_events.onSelect)
429          mdp_events.onSelect();
430      },
431      destroy: function () {
432        this.multiDatesPicker = null;
433        $(this).datepicker('destroy');
434      }
435    };
436
437    this.each(function () {
438      var $this = $(this);
439      if (!this.multiDatesPicker) {
440        this.multiDatesPicker = {
441          dates: {
442            picked: [],
443            disabled: []
444          },
445          mode: 'normal',
446          adjustRangeToDisabled: true
447        };
448      }
449
450      if (methods[method]) {
451        var exec_result = methods[method].apply(this, Array.prototype.slice.call(mdp_arguments, 1));
452        switch (method) {
453          case 'removeDates':
454          case 'removeIndexes':
455          case 'resetDates':
456          case 'toggleDate':
457          case 'addDates':
458            var altField = $this.datepicker('option', 'altField');
459            // @todo: should use altFormat for altField
460            var dates_string = methods.value.call(this);
461            if (altField !== undefined && altField != "") {
462              $(altField).val(dates_string);
463            }
464            $this.val(dates_string);
465
466            $.datepicker._refreshDatepicker(this);
467        }
468        switch (method) {
469          case 'removeDates':
470          case 'getDates':
471          case 'gotDate':
472          case 'sumDays':
473          case 'compareDates':
474          case 'dateConvert':
475          case 'value':
476            ret = exec_result;
477        }
478        return exec_result;
479      } else if (typeof method === 'object' || !method) {
480        return methods.init.apply(this, mdp_arguments);
481      } else {
482        $.error('Method ' + method + ' does not exist on jQuery.multiDatesPicker');
483      }
484      return false;
485    });
486
487    return ret;
488  };
489
490  var PROP_NAME = 'multiDatesPicker';
491  var dpuuid = new Date().getTime();
492  var instActive;
493
494  $.multiDatesPicker = {version: false};
495  //$.multiDatesPicker = new MultiDatesPicker(); // singleton instance
496  $.multiDatesPicker.initialized = false;
497  $.multiDatesPicker.uuid = new Date().getTime();
498  $.multiDatesPicker.version = $.ui.multiDatesPicker.version;
499
500  // allows MDP not to hide everytime a date is picked
501  $.multiDatesPicker._hideDatepicker = $.datepicker._hideDatepicker;
502  $.datepicker._hideDatepicker = function () {
503    var target = this._curInst.input[0];
504    var mdp = target.multiDatesPicker;
505    if (!mdp || (this._curInst.inline === false && !mdp.changed)) {
506      return $.multiDatesPicker._hideDatepicker.apply(this, arguments);
507    } else {
508      mdp.changed = false;
509      $.datepicker._refreshDatepicker(target);
510
511    }
512  };
513
514  // Workaround for #4055
515  // Add another global to avoid noConflict issues with inline event handlers
516  window['DP_jQuery_' + dpuuid] = $;
517})(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.