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