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.