1918 lines · 52.0 KB · JavaScript
RawDownload
/*! * Datepicker for Bootstrap v1.5.1 (https://github.com/eternicode/bootstrap-datepicker) * * Copyright 2012 Stefan Petre * Improvements by Andrew Rowls * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) */(function(factory){    if (typeof define === "function" && define.amd) {        define(["jquery"], factory);    } else if (typeof exports === 'object') {        factory(require('jquery'));    } else {        factory(jQuery);    }}(function($, undefined){ 	function UTCDate(){		return new Date(Date.UTC.apply(Date, arguments));	}	function UTCToday(){		var today = new Date();		return UTCDate(today.getFullYear(), today.getMonth(), today.getDate());	}	function isUTCEquals(date1, date2) {		return (			date1.getUTCFullYear() === date2.getUTCFullYear() &&			date1.getUTCMonth() === date2.getUTCMonth() &&			date1.getUTCDate() === date2.getUTCDate()		);	}	function alias(method){		return function(){			return this[method].apply(this, arguments);		};	}	function isValidDate(d) {		return d && !isNaN(d.getTime());	} 	var DateArray = (function(){		var extras = {			get: function(i){				return this.slice(i)[0];			},			contains: function(d){				// Array.indexOf is not cross-browser;				// $.inArray doesn't work with Dates				var val = d && d.valueOf();				for (var i=0, l=this.length; i < l; i++)					if (this[i].valueOf() === val)						return i;				return -1;			},			remove: function(i){				this.splice(i,1);			},			replace: function(new_array){				if (!new_array)					return;				if (!$.isArray(new_array))					new_array = [new_array];				this.clear();				this.push.apply(this, new_array);			},			clear: function(){				this.length = 0;			},			copy: function(){				var a = new DateArray();				a.replace(this);				return a;			}		}; 		return function(){			var a = [];			a.push.apply(a, arguments);			$.extend(a, extras);			return a;		};	})();  	// Picker object 	var Datepicker = function(element, options){		$(element).data('datepicker', this);		this._process_options(options); 		this.dates = new DateArray();		this.viewDate = this.o.defaultViewDate;		this.focusDate = null; 		this.element = $(element);		this.isInline = false;		this.isInput = this.element.is('input');		this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .btn') : false;		this.hasInput = this.component && this.element.find('input').length;		if (this.component && this.component.length === 0)			this.component = false; 		this.picker = $(DPGlobal.template);		this._buildEvents();		this._attachEvents(); 		if (this.isInline){			this.picker.addClass('datepicker-inline').appendTo(this.element);		}		else {			this.picker.addClass('datepicker-dropdown dropdown-menu');		} 		if (this.o.rtl){			this.picker.addClass('datepicker-rtl');		} 		this.viewMode = this.o.startView; 		if (this.o.calendarWeeks)			this.picker.find('thead .datepicker-title, tfoot .today, tfoot .clear')						.attr('colspan', function(i, val){							return parseInt(val) + 1;						}); 		this._allow_update = false; 		this.setStartDate(this._o.startDate);		this.setEndDate(this._o.endDate);		this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled);		this.setDaysOfWeekHighlighted(this.o.daysOfWeekHighlighted);		this.setDatesDisabled(this.o.datesDisabled); 		this.fillDow();		this.fillMonths(); 		this._allow_update = true; 		this.update();		this.showMode(); 		if (this.isInline){			this.show();		}	}; 	Datepicker.prototype = {		constructor: Datepicker, 		_process_options: function(opts){			// Store raw options for reference			this._o = $.extend({}, this._o, opts);			// Processed options			var o = this.o = $.extend({}, this._o); 			// Check if "de-DE" style date is available, if not language should			// fallback to 2 letter code eg "de"			var lang = o.language;			if (!dates[lang]){				lang = lang.split('-')[0];				if (!dates[lang])					lang = defaults.language;			}			o.language = lang; 			switch (o.startView){				case 2:				case 'decade':					o.startView = 2;					break;				case 1:				case 'year':					o.startView = 1;					break;				default:					o.startView = 0;			} 			switch (o.minViewMode){				case 1:				case 'months':					o.minViewMode = 1;					break;				case 2:				case 'years':					o.minViewMode = 2;					break;				default:					o.minViewMode = 0;			} 			switch (o.maxViewMode) {				case 0:				case 'days':					o.maxViewMode = 0;					break;				case 1:				case 'months':					o.maxViewMode = 1;					break;				default:					o.maxViewMode = 2;			} 			o.startView = Math.min(o.startView, o.maxViewMode);			o.startView = Math.max(o.startView, o.minViewMode); 			// true, false, or Number > 0			if (o.multidate !== true){				o.multidate = Number(o.multidate) || false;				if (o.multidate !== false)					o.multidate = Math.max(0, o.multidate);			}			o.multidateSeparator = String(o.multidateSeparator); 			o.weekStart %= 7;			o.weekEnd = (o.weekStart + 6) % 7; 			var format = DPGlobal.parseFormat(o.format);			if (o.startDate !== -Infinity){				if (!!o.startDate){					if (o.startDate instanceof Date)						o.startDate = this._local_to_utc(this._zero_time(o.startDate));					else						o.startDate = DPGlobal.parseDate(o.startDate, format, o.language);				}				else {					o.startDate = -Infinity;				}			}			if (o.endDate !== Infinity){				if (!!o.endDate){					if (o.endDate instanceof Date)						o.endDate = this._local_to_utc(this._zero_time(o.endDate));					else						o.endDate = DPGlobal.parseDate(o.endDate, format, o.language);				}				else {					o.endDate = Infinity;				}			} 			o.daysOfWeekDisabled = o.daysOfWeekDisabled||[];			if (!$.isArray(o.daysOfWeekDisabled))				o.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\s]*/);			o.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){				return parseInt(d, 10);			}); 			o.daysOfWeekHighlighted = o.daysOfWeekHighlighted||[];			if (!$.isArray(o.daysOfWeekHighlighted))				o.daysOfWeekHighlighted = o.daysOfWeekHighlighted.split(/[,\s]*/);			o.daysOfWeekHighlighted = $.map(o.daysOfWeekHighlighted, function(d){				return parseInt(d, 10);			}); 			o.datesDisabled = o.datesDisabled||[];			if (!$.isArray(o.datesDisabled)) {				var datesDisabled = [];				datesDisabled.push(DPGlobal.parseDate(o.datesDisabled, format, o.language));				o.datesDisabled = datesDisabled;			}			o.datesDisabled = $.map(o.datesDisabled,function(d){				return DPGlobal.parseDate(d, format, o.language);			}); 			var plc = String(o.orientation).toLowerCase().split(/\s+/g),				_plc = o.orientation.toLowerCase();			plc = $.grep(plc, function(word){				return /^auto|left|right|top|bottom$/.test(word);			});			o.orientation = {x: 'auto', y: 'auto'};			if (!_plc || _plc === 'auto')				; // no action			else if (plc.length === 1){				switch (plc[0]){					case 'top':					case 'bottom':						o.orientation.y = plc[0];						break;					case 'left':					case 'right':						o.orientation.x = plc[0];						break;				}			}			else {				_plc = $.grep(plc, function(word){					return /^left|right$/.test(word);				});				o.orientation.x = _plc[0] || 'auto'; 				_plc = $.grep(plc, function(word){					return /^top|bottom$/.test(word);				});				o.orientation.y = _plc[0] || 'auto';			}			if (o.defaultViewDate) {				var year = o.defaultViewDate.year || new Date().getFullYear();				var month = o.defaultViewDate.month || 0;				var day = o.defaultViewDate.day || 1;				o.defaultViewDate = UTCDate(year, month, day);			} else {				o.defaultViewDate = UTCToday();			}		},		_events: [],		_secondaryEvents: [],		_applyEvents: function(evs){			for (var i=0, el, ch, ev; i < evs.length; i++){				el = evs[i][0];				if (evs[i].length === 2){					ch = undefined;					ev = evs[i][1];				}				else if (evs[i].length === 3){					ch = evs[i][1];					ev = evs[i][2];				}				el.on(ev, ch);			}		},		_unapplyEvents: function(evs){			for (var i=0, el, ev, ch; i < evs.length; i++){				el = evs[i][0];				if (evs[i].length === 2){					ch = undefined;					ev = evs[i][1];				}				else if (evs[i].length === 3){					ch = evs[i][1];					ev = evs[i][2];				}				el.off(ev, ch);			}		},		_buildEvents: function(){            var events = {                keyup: $.proxy(function(e){                    if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1)                        this.update();                }, this),                keydown: $.proxy(this.keydown, this),                paste: $.proxy(this.paste, this)            };             if (this.o.showOnFocus === true) {                events.focus = $.proxy(this.show, this);            }             if (this.isInput) { // single input                this._events = [                    [this.element, events]                ];            }            else if (this.component && this.hasInput) { // component: input + button                this._events = [                    // For components that are not readonly, allow keyboard nav                    [this.element.find('input'), events],                    [this.component, {                        click: $.proxy(this.show, this)                    }]                ];            }			else if (this.element.is('div')){  // inline datepicker				this.isInline = true;			}			else {				this._events = [					[this.element, {						click: $.proxy(this.show, this)					}]				];			}			this._events.push(				// Component: listen for blur on element descendants				[this.element, '*', {					blur: $.proxy(function(e){						this._focused_from = e.target;					}, this)				}],				// Input: listen for blur on element				[this.element, {					blur: $.proxy(function(e){						this._focused_from = e.target;					}, this)				}]			); 			if (this.o.immediateUpdates) {				// Trigger input updates immediately on changed year/month				this._events.push([this.element, {					'changeYear changeMonth': $.proxy(function(e){						this.update(e.date);					}, this)				}]);			} 			this._secondaryEvents = [				[this.picker, {					click: $.proxy(this.click, this)				}],				[$(window), {					resize: $.proxy(this.place, this)				}],				[$(document), {					mousedown: $.proxy(function(e){						// Clicked outside the datepicker, hide it						if (!(							this.element.is(e.target) ||							this.element.find(e.target).length ||							this.picker.is(e.target) ||							this.picker.find(e.target).length ||							this.picker.hasClass('datepicker-inline')						)){							this.hide();						}					}, this)				}]			];		},		_attachEvents: function(){			this._detachEvents();			this._applyEvents(this._events);		},		_detachEvents: function(){			this._unapplyEvents(this._events);		},		_attachSecondaryEvents: function(){			this._detachSecondaryEvents();			this._applyEvents(this._secondaryEvents);		},		_detachSecondaryEvents: function(){			this._unapplyEvents(this._secondaryEvents);		},		_trigger: function(event, altdate){			var date = altdate || this.dates.get(-1),				local_date = this._utc_to_local(date); 			this.element.trigger({				type: event,				date: local_date,				dates: $.map(this.dates, this._utc_to_local),				format: $.proxy(function(ix, format){					if (arguments.length === 0){						ix = this.dates.length - 1;						format = this.o.format;					}					else if (typeof ix === 'string'){						format = ix;						ix = this.dates.length - 1;					}					format = format || this.o.format;					var date = this.dates.get(ix);					return DPGlobal.formatDate(date, format, this.o.language);				}, this)			});		}, 		show: function(){      var element = this.component ? this.element.find('input') : this.element;			if (element.attr('readonly') && this.o.enableOnReadonly === false)				return;			if (!this.isInline)				this.picker.appendTo(this.o.container);			this.place();			this.picker.show();			this._attachSecondaryEvents();			this._trigger('show');			if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) {				$(this.element).blur();			}			return this;		}, 		hide: function(){			if (this.isInline)				return this;			if (!this.picker.is(':visible'))				return this;			this.focusDate = null;			this.picker.hide().detach();			this._detachSecondaryEvents();			this.viewMode = this.o.startView;			this.showMode(); 			if (				this.o.forceParse &&				(					this.isInput && this.element.val() ||					this.hasInput && this.element.find('input').val()				)			)				this.setValue();			this._trigger('hide');			return this;		}, 		remove: function(){			this.hide();			this._detachEvents();

Lines 1–500 of 1918.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t