smalot-datetimepicker-rails 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.gitmodules +3 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +59 -0
  7. data/Rakefile +2 -0
  8. data/lib/smalot-datetimepicker-rails/version.rb +5 -0
  9. data/lib/smalot-datetimepicker-rails.rb +9 -0
  10. data/smalot-datetimepicker-rails.gemspec +23 -0
  11. data/vendor/assets/javascripts/bootstrap-datetimepicker.js +1728 -0
  12. data/vendor/assets/javascripts/bootstrap-datetimepicker.min.js +1 -0
  13. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.ar.js +17 -0
  14. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.bg.js +16 -0
  15. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.ca.js +16 -0
  16. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.cs.js +19 -0
  17. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.da.js +16 -0
  18. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.de.js +18 -0
  19. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.ee.js +18 -0
  20. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.el.js +15 -0
  21. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.es.js +16 -0
  22. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.fi.js +16 -0
  23. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.fr.js +18 -0
  24. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.he.js +17 -0
  25. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.hr.js +15 -0
  26. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.hu.js +17 -0
  27. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.id.js +15 -0
  28. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.is.js +16 -0
  29. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.it.js +18 -0
  30. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.ja.js +16 -0
  31. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.ko.js +17 -0
  32. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.lt.js +18 -0
  33. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.lv.js +18 -0
  34. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.ms.js +16 -0
  35. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.nb.js +16 -0
  36. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.nl.js +16 -0
  37. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.no.js +16 -0
  38. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.pl.js +17 -0
  39. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.pt-BR.js +17 -0
  40. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.pt.js +17 -0
  41. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.ro.js +17 -0
  42. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.rs-latin.js +16 -0
  43. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.rs.js +16 -0
  44. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.ru.js +16 -0
  45. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.sk.js +17 -0
  46. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.sl.js +16 -0
  47. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.sv.js +16 -0
  48. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.sw.js +17 -0
  49. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.th.js +16 -0
  50. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.tr.js +17 -0
  51. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.ua.js +15 -0
  52. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.uk.js +16 -0
  53. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.zh-CN.js +16 -0
  54. data/vendor/assets/javascripts/locales/bootstrap-datetimepicker.zh-TW.js +16 -0
  55. data/vendor/assets/stylesheets/bootstrap-datetimepicker.css +414 -0
  56. data/vendor/assets/stylesheets/bootstrap-datetimepicker.min.css +9 -0
  57. metadata +129 -0
@@ -0,0 +1,1728 @@
1
+ /* =========================================================
2
+ * bootstrap-datetimepicker.js
3
+ * =========================================================
4
+ * Copyright 2012 Stefan Petre
5
+ * Improvements by Andrew Rowls
6
+ * Improvements by Sébastien Malot
7
+ * Improvements by Yun Lai
8
+ * Project URL : http://www.malot.fr/bootstrap-datetimepicker
9
+ *
10
+ * Licensed under the Apache License, Version 2.0 (the "License");
11
+ * you may not use this file except in compliance with the License.
12
+ * You may obtain a copy of the License at
13
+ *
14
+ * http://www.apache.org/licenses/LICENSE-2.0
15
+ *
16
+ * Unless required by applicable law or agreed to in writing, software
17
+ * distributed under the License is distributed on an "AS IS" BASIS,
18
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
+ * See the License for the specific language governing permissions and
20
+ * limitations under the License.
21
+ * ========================================================= */
22
+
23
+ /*
24
+ * Improvement by CuGBabyBeaR @ 2013-09-12
25
+ *
26
+ * Make it work in bootstrap v3
27
+ */
28
+
29
+ !function ($) {
30
+
31
+ function UTCDate() {
32
+ return new Date(Date.UTC.apply(Date, arguments));
33
+ }
34
+
35
+ function UTCToday() {
36
+ var today = new Date();
37
+ return UTCDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate(), today.getUTCHours(), today.getUTCMinutes(), today.getUTCSeconds(), 0);
38
+ }
39
+
40
+ // Picker object
41
+
42
+ var Datetimepicker = function (element, options) {
43
+ var that = this;
44
+
45
+ this.element = $(element);
46
+
47
+ // add container for single page application
48
+ // when page switch the datetimepicker div will be removed also.
49
+ this.container = options.container || 'body';
50
+
51
+ this.language = options.language || this.element.data('date-language') || "en";
52
+ this.language = this.language in dates ? this.language : "en";
53
+ this.isRTL = dates[this.language].rtl || false;
54
+ this.formatType = options.formatType || this.element.data('format-type') || 'standard';
55
+ this.format = DPGlobal.parseFormat(options.format || this.element.data('date-format') || dates[this.language].format || DPGlobal.getDefaultFormat(this.formatType, 'input'), this.formatType);
56
+ this.isInline = false;
57
+ this.isVisible = false;
58
+ this.isInput = this.element.is('input');
59
+
60
+
61
+ this.bootcssVer = this.isInput ? (this.element.is('.form-control') ? 3 : 2) : ( this.bootcssVer = this.element.is('.input-group') ? 3 : 2 );
62
+
63
+ this.component = this.element.is('.date') ? ( this.bootcssVer == 3 ? this.element.find('.input-group-addon .glyphicon-th, .input-group-addon .glyphicon-time, .input-group-addon .glyphicon-calendar').parent() : this.element.find('.add-on .icon-th, .add-on .icon-time, .add-on .icon-calendar').parent()) : false;
64
+ this.componentReset = this.element.is('.date') ? ( this.bootcssVer == 3 ? this.element.find('.input-group-addon .glyphicon-remove').parent() : this.element.find('.add-on .icon-remove').parent()) : false;
65
+ this.hasInput = this.component && this.element.find('input').length;
66
+ if (this.component && this.component.length === 0) {
67
+ this.component = false;
68
+ }
69
+ this.linkField = options.linkField || this.element.data('link-field') || false;
70
+ this.linkFormat = DPGlobal.parseFormat(options.linkFormat || this.element.data('link-format') || DPGlobal.getDefaultFormat(this.formatType, 'link'), this.formatType);
71
+ this.minuteStep = options.minuteStep || this.element.data('minute-step') || 5;
72
+ this.pickerPosition = options.pickerPosition || this.element.data('picker-position') || 'bottom-right';
73
+ this.showMeridian = options.showMeridian || this.element.data('show-meridian') || false;
74
+ this.initialDate = options.initialDate || new Date();
75
+
76
+ this._attachEvents();
77
+
78
+ this.formatViewType = "datetime";
79
+ if ('formatViewType' in options) {
80
+ this.formatViewType = options.formatViewType;
81
+ } else if ('formatViewType' in this.element.data()) {
82
+ this.formatViewType = this.element.data('formatViewType');
83
+ }
84
+
85
+ this.minView = 0;
86
+ if ('minView' in options) {
87
+ this.minView = options.minView;
88
+ } else if ('minView' in this.element.data()) {
89
+ this.minView = this.element.data('min-view');
90
+ }
91
+ this.minView = DPGlobal.convertViewMode(this.minView);
92
+
93
+ this.maxView = DPGlobal.modes.length - 1;
94
+ if ('maxView' in options) {
95
+ this.maxView = options.maxView;
96
+ } else if ('maxView' in this.element.data()) {
97
+ this.maxView = this.element.data('max-view');
98
+ }
99
+ this.maxView = DPGlobal.convertViewMode(this.maxView);
100
+
101
+ this.wheelViewModeNavigation = false;
102
+ if ('wheelViewModeNavigation' in options) {
103
+ this.wheelViewModeNavigation = options.wheelViewModeNavigation;
104
+ } else if ('wheelViewModeNavigation' in this.element.data()) {
105
+ this.wheelViewModeNavigation = this.element.data('view-mode-wheel-navigation');
106
+ }
107
+
108
+ this.wheelViewModeNavigationInverseDirection = false;
109
+
110
+ if ('wheelViewModeNavigationInverseDirection' in options) {
111
+ this.wheelViewModeNavigationInverseDirection = options.wheelViewModeNavigationInverseDirection;
112
+ } else if ('wheelViewModeNavigationInverseDirection' in this.element.data()) {
113
+ this.wheelViewModeNavigationInverseDirection = this.element.data('view-mode-wheel-navigation-inverse-dir');
114
+ }
115
+
116
+ this.wheelViewModeNavigationDelay = 100;
117
+ if ('wheelViewModeNavigationDelay' in options) {
118
+ this.wheelViewModeNavigationDelay = options.wheelViewModeNavigationDelay;
119
+ } else if ('wheelViewModeNavigationDelay' in this.element.data()) {
120
+ this.wheelViewModeNavigationDelay = this.element.data('view-mode-wheel-navigation-delay');
121
+ }
122
+
123
+ this.startViewMode = 2;
124
+ if ('startView' in options) {
125
+ this.startViewMode = options.startView;
126
+ } else if ('startView' in this.element.data()) {
127
+ this.startViewMode = this.element.data('start-view');
128
+ }
129
+ this.startViewMode = DPGlobal.convertViewMode(this.startViewMode);
130
+ this.viewMode = this.startViewMode;
131
+
132
+ this.viewSelect = this.minView;
133
+ if ('viewSelect' in options) {
134
+ this.viewSelect = options.viewSelect;
135
+ } else if ('viewSelect' in this.element.data()) {
136
+ this.viewSelect = this.element.data('view-select');
137
+ }
138
+ this.viewSelect = DPGlobal.convertViewMode(this.viewSelect);
139
+
140
+ this.forceParse = true;
141
+ if ('forceParse' in options) {
142
+ this.forceParse = options.forceParse;
143
+ } else if ('dateForceParse' in this.element.data()) {
144
+ this.forceParse = this.element.data('date-force-parse');
145
+ }
146
+
147
+ this.picker = $((this.bootcssVer == 3) ? DPGlobal.templateV3 : DPGlobal.template)
148
+ .appendTo(this.isInline ? this.element : this.container) // 'body')
149
+ .on({
150
+ click: $.proxy(this.click, this),
151
+ mousedown: $.proxy(this.mousedown, this)
152
+ });
153
+
154
+ if (this.wheelViewModeNavigation) {
155
+ if ($.fn.mousewheel) {
156
+ this.picker.on({mousewheel: $.proxy(this.mousewheel, this)});
157
+ } else {
158
+ console.log("Mouse Wheel event is not supported. Please include the jQuery Mouse Wheel plugin before enabling this option");
159
+ }
160
+ }
161
+
162
+ if (this.isInline) {
163
+ this.picker.addClass('datetimepicker-inline');
164
+ } else {
165
+ this.picker.addClass('datetimepicker-dropdown-' + this.pickerPosition + ' dropdown-menu');
166
+ }
167
+ if (this.isRTL) {
168
+ this.picker.addClass('datetimepicker-rtl');
169
+ if (this.bootcssVer == 3) {
170
+ this.picker.find('.prev span, .next span')
171
+ .toggleClass('glyphicon-arrow-left glyphicon-arrow-right');
172
+ } else {
173
+ this.picker.find('.prev i, .next i')
174
+ .toggleClass('icon-arrow-left icon-arrow-right');
175
+ }
176
+ ;
177
+
178
+ }
179
+ $(document).on('mousedown', function (e) {
180
+ // Clicked outside the datetimepicker, hide it
181
+ if ($(e.target).closest('.datetimepicker').length === 0) {
182
+ that.hide();
183
+ }
184
+ });
185
+
186
+ this.autoclose = false;
187
+ if ('autoclose' in options) {
188
+ this.autoclose = options.autoclose;
189
+ } else if ('dateAutoclose' in this.element.data()) {
190
+ this.autoclose = this.element.data('date-autoclose');
191
+ }
192
+
193
+ this.keyboardNavigation = true;
194
+ if ('keyboardNavigation' in options) {
195
+ this.keyboardNavigation = options.keyboardNavigation;
196
+ } else if ('dateKeyboardNavigation' in this.element.data()) {
197
+ this.keyboardNavigation = this.element.data('date-keyboard-navigation');
198
+ }
199
+
200
+ this.todayBtn = (options.todayBtn || this.element.data('date-today-btn') || false);
201
+ this.todayHighlight = (options.todayHighlight || this.element.data('date-today-highlight') || false);
202
+
203
+ this.weekStart = ((options.weekStart || this.element.data('date-weekstart') || dates[this.language].weekStart || 0) % 7);
204
+ this.weekEnd = ((this.weekStart + 6) % 7);
205
+ this.startDate = -Infinity;
206
+ this.endDate = Infinity;
207
+ this.daysOfWeekDisabled = [];
208
+ this.setStartDate(options.startDate || this.element.data('date-startdate'));
209
+ this.setEndDate(options.endDate || this.element.data('date-enddate'));
210
+ this.setDaysOfWeekDisabled(options.daysOfWeekDisabled || this.element.data('date-days-of-week-disabled'));
211
+ this.fillDow();
212
+ this.fillMonths();
213
+ this.update();
214
+ this.showMode();
215
+
216
+ if (this.isInline) {
217
+ this.show();
218
+ }
219
+ };
220
+
221
+ Datetimepicker.prototype = {
222
+ constructor: Datetimepicker,
223
+
224
+ _events: [],
225
+ _attachEvents: function () {
226
+ this._detachEvents();
227
+ if (this.isInput) { // single input
228
+ this._events = [
229
+ [this.element, {
230
+ focus: $.proxy(this.show, this),
231
+ keyup: $.proxy(this.update, this),
232
+ keydown: $.proxy(this.keydown, this)
233
+ }]
234
+ ];
235
+ }
236
+ else if (this.component && this.hasInput) { // component: input + button
237
+ this._events = [
238
+ // For components that are not readonly, allow keyboard nav
239
+ [this.element.find('input'), {
240
+ focus: $.proxy(this.show, this),
241
+ keyup: $.proxy(this.update, this),
242
+ keydown: $.proxy(this.keydown, this)
243
+ }],
244
+ [this.component, {
245
+ click: $.proxy(this.show, this)
246
+ }]
247
+ ];
248
+ if (this.componentReset) {
249
+ this._events.push([
250
+ this.componentReset,
251
+ {click: $.proxy(this.reset, this)}
252
+ ]);
253
+ }
254
+ }
255
+ else if (this.element.is('div')) { // inline datetimepicker
256
+ this.isInline = true;
257
+ }
258
+ else {
259
+ this._events = [
260
+ [this.element, {
261
+ click: $.proxy(this.show, this)
262
+ }]
263
+ ];
264
+ }
265
+ for (var i = 0, el, ev; i < this._events.length; i++) {
266
+ el = this._events[i][0];
267
+ ev = this._events[i][1];
268
+ el.on(ev);
269
+ }
270
+ },
271
+
272
+ _detachEvents: function () {
273
+ for (var i = 0, el, ev; i < this._events.length; i++) {
274
+ el = this._events[i][0];
275
+ ev = this._events[i][1];
276
+ el.off(ev);
277
+ }
278
+ this._events = [];
279
+ },
280
+
281
+ show: function (e) {
282
+ this.picker.show();
283
+ this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
284
+ if (this.forceParse) {
285
+ this.update();
286
+ }
287
+ this.place();
288
+ $(window).on('resize', $.proxy(this.place, this));
289
+ if (e) {
290
+ e.stopPropagation();
291
+ e.preventDefault();
292
+ }
293
+ this.isVisible = true;
294
+ this.element.trigger({
295
+ type: 'show',
296
+ date: this.date
297
+ });
298
+ },
299
+
300
+ hide: function (e) {
301
+ if (!this.isVisible) return;
302
+ if (this.isInline) return;
303
+ this.picker.hide();
304
+ $(window).off('resize', this.place);
305
+ this.viewMode = this.startViewMode;
306
+ this.showMode();
307
+ if (!this.isInput) {
308
+ $(document).off('mousedown', this.hide);
309
+ }
310
+
311
+ if (
312
+ this.forceParse &&
313
+ (
314
+ this.isInput && this.element.val() ||
315
+ this.hasInput && this.element.find('input').val()
316
+ )
317
+ )
318
+ this.setValue();
319
+ this.isVisible = false;
320
+ this.element.trigger({
321
+ type: 'hide',
322
+ date: this.date
323
+ });
324
+ },
325
+
326
+ remove: function () {
327
+ this._detachEvents();
328
+ this.picker.remove();
329
+ delete this.picker;
330
+ delete this.element.data().datetimepicker;
331
+ },
332
+
333
+ getDate: function () {
334
+ var d = this.getUTCDate();
335
+ return new Date(d.getTime() + (d.getTimezoneOffset() * 60000));
336
+ },
337
+
338
+ getUTCDate: function () {
339
+ return this.date;
340
+ },
341
+
342
+ setDate: function (d) {
343
+ this.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset() * 60000)));
344
+ },
345
+
346
+ setUTCDate: function (d) {
347
+ if (d >= this.startDate && d <= this.endDate) {
348
+ this.date = d;
349
+ this.setValue();
350
+ this.viewDate = this.date;
351
+ this.fill();
352
+ } else {
353
+ this.element.trigger({
354
+ type: 'outOfRange',
355
+ date: d,
356
+ startDate: this.startDate,
357
+ endDate: this.endDate
358
+ });
359
+ }
360
+ },
361
+
362
+ setFormat: function (format) {
363
+ this.format = DPGlobal.parseFormat(format, this.formatType);
364
+ var element;
365
+ if (this.isInput) {
366
+ element = this.element;
367
+ } else if (this.component) {
368
+ element = this.element.find('input');
369
+ }
370
+ if (element && element.val()) {
371
+ this.setValue();
372
+ }
373
+ },
374
+
375
+ setValue: function () {
376
+ var formatted = this.getFormattedDate();
377
+ if (!this.isInput) {
378
+ if (this.component) {
379
+ this.element.find('input').val(formatted);
380
+ }
381
+ this.element.data('date', formatted);
382
+ } else {
383
+ this.element.val(formatted);
384
+ }
385
+ if (this.linkField) {
386
+ $('#' + this.linkField).val(this.getFormattedDate(this.linkFormat));
387
+ }
388
+ },
389
+
390
+ getFormattedDate: function (format) {
391
+ if (format == undefined) format = this.format;
392
+ return DPGlobal.formatDate(this.date, format, this.language, this.formatType);
393
+ },
394
+
395
+ setStartDate: function (startDate) {
396
+ this.startDate = startDate || -Infinity;
397
+ if (this.startDate !== -Infinity) {
398
+ this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language, this.formatType);
399
+ }
400
+ this.update();
401
+ this.updateNavArrows();
402
+ },
403
+
404
+ setEndDate: function (endDate) {
405
+ this.endDate = endDate || Infinity;
406
+ if (this.endDate !== Infinity) {
407
+ this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language, this.formatType);
408
+ }
409
+ this.update();
410
+ this.updateNavArrows();
411
+ },
412
+
413
+ setDaysOfWeekDisabled: function (daysOfWeekDisabled) {
414
+ this.daysOfWeekDisabled = daysOfWeekDisabled || [];
415
+ if (!$.isArray(this.daysOfWeekDisabled)) {
416
+ this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/);
417
+ }
418
+ this.daysOfWeekDisabled = $.map(this.daysOfWeekDisabled, function (d) {
419
+ return parseInt(d, 10);
420
+ });
421
+ this.update();
422
+ this.updateNavArrows();
423
+ },
424
+
425
+ place: function () {
426
+ if (this.isInline) return;
427
+
428
+ var index_highest = 0;
429
+ $('div').each(function () {
430
+ var index_current = parseInt($(this).css("zIndex"), 10);
431
+ if (index_current > index_highest) {
432
+ index_highest = index_current;
433
+ }
434
+ });
435
+ var zIndex = index_highest + 10;
436
+
437
+ var offset, top, left, containerOffset;
438
+ if (this.container instanceof $) {
439
+ containerOffset = this.container.offset();
440
+ } else {
441
+ containerOffset = $(this.container).offset();
442
+ }
443
+
444
+ if (this.component) {
445
+ offset = this.component.offset();
446
+ left = offset.left;
447
+ if (this.pickerPosition == 'bottom-left' || this.pickerPosition == 'top-left') {
448
+ left += this.component.outerWidth() - this.picker.outerWidth();
449
+ }
450
+ } else {
451
+ offset = this.element.offset();
452
+ left = offset.left;
453
+ }
454
+
455
+ if(left+220 > document.body.clientWidth){
456
+ left = document.body.clientWidth-220;
457
+ }
458
+
459
+ if (this.pickerPosition == 'top-left' || this.pickerPosition == 'top-right') {
460
+ top = offset.top - this.picker.outerHeight();
461
+ } else {
462
+ top = offset.top + this.height;
463
+ }
464
+
465
+ top = top - containerOffset.top;
466
+ left = left - containerOffset.left;
467
+
468
+ this.picker.css({
469
+ top: top,
470
+ left: left,
471
+ zIndex: zIndex
472
+ });
473
+ },
474
+
475
+ update: function () {
476
+ var date, fromArgs = false;
477
+ if (arguments && arguments.length && (typeof arguments[0] === 'string' || arguments[0] instanceof Date)) {
478
+ date = arguments[0];
479
+ fromArgs = true;
480
+ } else {
481
+ date = (this.isInput ? this.element.val() : this.element.find('input').val()) || this.element.data('date') || this.initialDate;
482
+ if (typeof date == 'string' || date instanceof String) {
483
+ date = date.replace(/^\s+|\s+$/g,'');
484
+ }
485
+ }
486
+
487
+ if (!date) {
488
+ date = new Date();
489
+ fromArgs = false;
490
+ }
491
+
492
+ this.date = DPGlobal.parseDate(date, this.format, this.language, this.formatType);
493
+
494
+ if (fromArgs) this.setValue();
495
+
496
+ if (this.date < this.startDate) {
497
+ this.viewDate = new Date(this.startDate);
498
+ } else if (this.date > this.endDate) {
499
+ this.viewDate = new Date(this.endDate);
500
+ } else {
501
+ this.viewDate = new Date(this.date);
502
+ }
503
+ this.fill();
504
+ },
505
+
506
+ fillDow: function () {
507
+ var dowCnt = this.weekStart,
508
+ html = '<tr>';
509
+ while (dowCnt < this.weekStart + 7) {
510
+ html += '<th class="dow">' + dates[this.language].daysMin[(dowCnt++) % 7] + '</th>';
511
+ }
512
+ html += '</tr>';
513
+ this.picker.find('.datetimepicker-days thead').append(html);
514
+ },
515
+
516
+ fillMonths: function () {
517
+ var html = '',
518
+ i = 0;
519
+ while (i < 12) {
520
+ html += '<span class="month">' + dates[this.language].monthsShort[i++] + '</span>';
521
+ }
522
+ this.picker.find('.datetimepicker-months td').html(html);
523
+ },
524
+
525
+ fill: function () {
526
+ if (this.date == null || this.viewDate == null) {
527
+ return;
528
+ }
529
+ var d = new Date(this.viewDate),
530
+ year = d.getUTCFullYear(),
531
+ month = d.getUTCMonth(),
532
+ dayMonth = d.getUTCDate(),
533
+ hours = d.getUTCHours(),
534
+ minutes = d.getUTCMinutes(),
535
+ startYear = this.startDate !== -Infinity ? this.startDate.getUTCFullYear() : -Infinity,
536
+ startMonth = this.startDate !== -Infinity ? this.startDate.getUTCMonth() : -Infinity,
537
+ endYear = this.endDate !== Infinity ? this.endDate.getUTCFullYear() : Infinity,
538
+ endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity,
539
+ currentDate = (new UTCDate(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.date.getUTCDate())).valueOf(),
540
+ today = new Date();
541
+ this.picker.find('.datetimepicker-days thead th:eq(1)')
542
+ .text(dates[this.language].months[month] + ' ' + year);
543
+ if (this.formatViewType == "time") {
544
+ var hourConverted = hours % 12 ? hours % 12 : 12;
545
+ var hoursDisplay = (hourConverted < 10 ? '0' : '') + hourConverted;
546
+ var minutesDisplay = (minutes < 10 ? '0' : '') + minutes;
547
+ var meridianDisplay = dates[this.language].meridiem[hours < 12 ? 0 : 1];
548
+ this.picker.find('.datetimepicker-hours thead th:eq(1)')
549
+ .text(hoursDisplay + ':' + minutesDisplay + ' ' + (meridianDisplay ? meridianDisplay.toUpperCase() : ''));
550
+ this.picker.find('.datetimepicker-minutes thead th:eq(1)')
551
+ .text(hoursDisplay + ':' + minutesDisplay + ' ' + (meridianDisplay ? meridianDisplay.toUpperCase() : ''));
552
+ } else {
553
+ this.picker.find('.datetimepicker-hours thead th:eq(1)')
554
+ .text(dayMonth + ' ' + dates[this.language].months[month] + ' ' + year);
555
+ this.picker.find('.datetimepicker-minutes thead th:eq(1)')
556
+ .text(dayMonth + ' ' + dates[this.language].months[month] + ' ' + year);
557
+ }
558
+ this.picker.find('tfoot th.today')
559
+ .text(dates[this.language].today)
560
+ .toggle(this.todayBtn !== false);
561
+ this.updateNavArrows();
562
+ this.fillMonths();
563
+ /*var prevMonth = UTCDate(year, month, 0,0,0,0,0);
564
+ prevMonth.setUTCDate(prevMonth.getDate() - (prevMonth.getUTCDay() - this.weekStart + 7)%7);*/
565
+ var prevMonth = UTCDate(year, month - 1, 28, 0, 0, 0, 0),
566
+ day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
567
+ prevMonth.setUTCDate(day);
568
+ prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7) % 7);
569
+ var nextMonth = new Date(prevMonth);
570
+ nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
571
+ nextMonth = nextMonth.valueOf();
572
+ var html = [];
573
+ var clsName;
574
+ while (prevMonth.valueOf() < nextMonth) {
575
+ if (prevMonth.getUTCDay() == this.weekStart) {
576
+ html.push('<tr>');
577
+ }
578
+ clsName = '';
579
+ if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() < month)) {
580
+ clsName += ' old';
581
+ } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() > month)) {
582
+ clsName += ' new';
583
+ }
584
+ // Compare internal UTC date with local today, not UTC today
585
+ if (this.todayHighlight &&
586
+ prevMonth.getUTCFullYear() == today.getFullYear() &&
587
+ prevMonth.getUTCMonth() == today.getMonth() &&
588
+ prevMonth.getUTCDate() == today.getDate()) {
589
+ clsName += ' today';
590
+ }
591
+ if (prevMonth.valueOf() == currentDate) {
592
+ clsName += ' active';
593
+ }
594
+ if ((prevMonth.valueOf() + 86400000) <= this.startDate || prevMonth.valueOf() > this.endDate ||
595
+ $.inArray(prevMonth.getUTCDay(), this.daysOfWeekDisabled) !== -1) {
596
+ clsName += ' disabled';
597
+ }
598
+ html.push('<td class="day' + clsName + '">' + prevMonth.getUTCDate() + '</td>');
599
+ if (prevMonth.getUTCDay() == this.weekEnd) {
600
+ html.push('</tr>');
601
+ }
602
+ prevMonth.setUTCDate(prevMonth.getUTCDate() + 1);
603
+ }
604
+ this.picker.find('.datetimepicker-days tbody').empty().append(html.join(''));
605
+
606
+ html = [];
607
+ var txt = '', meridian = '', meridianOld = '';
608
+ for (var i = 0; i < 24; i++) {
609
+ var actual = UTCDate(year, month, dayMonth, i);
610
+ clsName = '';
611
+ // We want the previous hour for the startDate
612
+ if ((actual.valueOf() + 3600000) <= this.startDate || actual.valueOf() > this.endDate) {
613
+ clsName += ' disabled';
614
+ } else if (hours == i) {
615
+ clsName += ' active';
616
+ }
617
+ if (this.showMeridian && dates[this.language].meridiem.length == 2) {
618
+ meridian = (i < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]);
619
+ if (meridian != meridianOld) {
620
+ if (meridianOld != '') {
621
+ html.push('</fieldset>');
622
+ }
623
+ html.push('<fieldset class="hour"><legend>' + meridian.toUpperCase() + '</legend>');
624
+ }
625
+ meridianOld = meridian;
626
+ txt = (i % 12 ? i % 12 : 12);
627
+ html.push('<span class="hour' + clsName + ' hour_' + (i < 12 ? 'am' : 'pm') + '">' + txt + '</span>');
628
+ if (i == 23) {
629
+ html.push('</fieldset>');
630
+ }
631
+ } else {
632
+ txt = i + ':00';
633
+ html.push('<span class="hour' + clsName + '">' + txt + '</span>');
634
+ }
635
+ }
636
+ this.picker.find('.datetimepicker-hours td').html(html.join(''));
637
+
638
+ html = [];
639
+ txt = '', meridian = '', meridianOld = '';
640
+ for (var i = 0; i < 60; i += this.minuteStep) {
641
+ var actual = UTCDate(year, month, dayMonth, hours, i, 0);
642
+ clsName = '';
643
+ if (actual.valueOf() < this.startDate || actual.valueOf() > this.endDate) {
644
+ clsName += ' disabled';
645
+ } else if (Math.floor(minutes / this.minuteStep) == Math.floor(i / this.minuteStep)) {
646
+ clsName += ' active';
647
+ }
648
+ if (this.showMeridian && dates[this.language].meridiem.length == 2) {
649
+ meridian = (hours < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]);
650
+ if (meridian != meridianOld) {
651
+ if (meridianOld != '') {
652
+ html.push('</fieldset>');
653
+ }
654
+ html.push('<fieldset class="minute"><legend>' + meridian.toUpperCase() + '</legend>');
655
+ }
656
+ meridianOld = meridian;
657
+ txt = (hours % 12 ? hours % 12 : 12);
658
+ //html.push('<span class="minute'+clsName+' minute_'+(hours<12?'am':'pm')+'">'+txt+'</span>');
659
+ html.push('<span class="minute' + clsName + '">' + txt + ':' + (i < 10 ? '0' + i : i) + '</span>');
660
+ if (i == 59) {
661
+ html.push('</fieldset>');
662
+ }
663
+ } else {
664
+ txt = i + ':00';
665
+ //html.push('<span class="hour'+clsName+'">'+txt+'</span>');
666
+ html.push('<span class="minute' + clsName + '">' + hours + ':' + (i < 10 ? '0' + i : i) + '</span>');
667
+ }
668
+ }
669
+ this.picker.find('.datetimepicker-minutes td').html(html.join(''));
670
+
671
+ var currentYear = this.date.getUTCFullYear();
672
+ var months = this.picker.find('.datetimepicker-months')
673
+ .find('th:eq(1)')
674
+ .text(year)
675
+ .end()
676
+ .find('span').removeClass('active');
677
+ if (currentYear == year) {
678
+ months.eq(this.date.getUTCMonth()).addClass('active');
679
+ }
680
+ if (year < startYear || year > endYear) {
681
+ months.addClass('disabled');
682
+ }
683
+ if (year == startYear) {
684
+ months.slice(0, startMonth).addClass('disabled');
685
+ }
686
+ if (year == endYear) {
687
+ months.slice(endMonth + 1).addClass('disabled');
688
+ }
689
+
690
+ html = '';
691
+ year = parseInt(year / 10, 10) * 10;
692
+ var yearCont = this.picker.find('.datetimepicker-years')
693
+ .find('th:eq(1)')
694
+ .text(year + '-' + (year + 9))
695
+ .end()
696
+ .find('td');
697
+ year -= 1;
698
+ for (var i = -1; i < 11; i++) {
699
+ html += '<span class="year' + (i == -1 || i == 10 ? ' old' : '') + (currentYear == year ? ' active' : '') + (year < startYear || year > endYear ? ' disabled' : '') + '">' + year + '</span>';
700
+ year += 1;
701
+ }
702
+ yearCont.html(html);
703
+ this.place();
704
+ },
705
+
706
+ updateNavArrows: function () {
707
+ var d = new Date(this.viewDate),
708
+ year = d.getUTCFullYear(),
709
+ month = d.getUTCMonth(),
710
+ day = d.getUTCDate(),
711
+ hour = d.getUTCHours();
712
+ switch (this.viewMode) {
713
+ case 0:
714
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()
715
+ && month <= this.startDate.getUTCMonth()
716
+ && day <= this.startDate.getUTCDate()
717
+ && hour <= this.startDate.getUTCHours()) {
718
+ this.picker.find('.prev').css({visibility: 'hidden'});
719
+ } else {
720
+ this.picker.find('.prev').css({visibility: 'visible'});
721
+ }
722
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()
723
+ && month >= this.endDate.getUTCMonth()
724
+ && day >= this.endDate.getUTCDate()
725
+ && hour >= this.endDate.getUTCHours()) {
726
+ this.picker.find('.next').css({visibility: 'hidden'});
727
+ } else {
728
+ this.picker.find('.next').css({visibility: 'visible'});
729
+ }
730
+ break;
731
+ case 1:
732
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()
733
+ && month <= this.startDate.getUTCMonth()
734
+ && day <= this.startDate.getUTCDate()) {
735
+ this.picker.find('.prev').css({visibility: 'hidden'});
736
+ } else {
737
+ this.picker.find('.prev').css({visibility: 'visible'});
738
+ }
739
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()
740
+ && month >= this.endDate.getUTCMonth()
741
+ && day >= this.endDate.getUTCDate()) {
742
+ this.picker.find('.next').css({visibility: 'hidden'});
743
+ } else {
744
+ this.picker.find('.next').css({visibility: 'visible'});
745
+ }
746
+ break;
747
+ case 2:
748
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()
749
+ && month <= this.startDate.getUTCMonth()) {
750
+ this.picker.find('.prev').css({visibility: 'hidden'});
751
+ } else {
752
+ this.picker.find('.prev').css({visibility: 'visible'});
753
+ }
754
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()
755
+ && month >= this.endDate.getUTCMonth()) {
756
+ this.picker.find('.next').css({visibility: 'hidden'});
757
+ } else {
758
+ this.picker.find('.next').css({visibility: 'visible'});
759
+ }
760
+ break;
761
+ case 3:
762
+ case 4:
763
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()) {
764
+ this.picker.find('.prev').css({visibility: 'hidden'});
765
+ } else {
766
+ this.picker.find('.prev').css({visibility: 'visible'});
767
+ }
768
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()) {
769
+ this.picker.find('.next').css({visibility: 'hidden'});
770
+ } else {
771
+ this.picker.find('.next').css({visibility: 'visible'});
772
+ }
773
+ break;
774
+ }
775
+ },
776
+
777
+ mousewheel: function (e) {
778
+
779
+ e.preventDefault();
780
+ e.stopPropagation();
781
+
782
+ if (this.wheelPause) {
783
+ return;
784
+ }
785
+
786
+ this.wheelPause = true;
787
+
788
+ var originalEvent = e.originalEvent;
789
+
790
+ var delta = originalEvent.wheelDelta;
791
+
792
+ var mode = delta > 0 ? 1 : (delta === 0) ? 0 : -1;
793
+
794
+ if (this.wheelViewModeNavigationInverseDirection) {
795
+ mode = -mode;
796
+ }
797
+
798
+ this.showMode(mode);
799
+
800
+ setTimeout($.proxy(function () {
801
+
802
+ this.wheelPause = false
803
+
804
+ }, this), this.wheelViewModeNavigationDelay);
805
+
806
+ },
807
+
808
+ click: function (e) {
809
+ e.stopPropagation();
810
+ e.preventDefault();
811
+ var target = $(e.target).closest('span, td, th, legend');
812
+ if (target.length == 1) {
813
+ if (target.is('.disabled')) {
814
+ this.element.trigger({
815
+ type: 'outOfRange',
816
+ date: this.viewDate,
817
+ startDate: this.startDate,
818
+ endDate: this.endDate
819
+ });
820
+ return;
821
+ }
822
+ switch (target[0].nodeName.toLowerCase()) {
823
+ case 'th':
824
+ switch (target[0].className) {
825
+ case 'switch':
826
+ this.showMode(1);
827
+ break;
828
+ case 'prev':
829
+ case 'next':
830
+ var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className == 'prev' ? -1 : 1);
831
+ switch (this.viewMode) {
832
+ case 0:
833
+ this.viewDate = this.moveHour(this.viewDate, dir);
834
+ break;
835
+ case 1:
836
+ this.viewDate = this.moveDate(this.viewDate, dir);
837
+ break;
838
+ case 2:
839
+ this.viewDate = this.moveMonth(this.viewDate, dir);
840
+ break;
841
+ case 3:
842
+ case 4:
843
+ this.viewDate = this.moveYear(this.viewDate, dir);
844
+ break;
845
+ }
846
+ this.fill();
847
+ break;
848
+ case 'today':
849
+ var date = new Date();
850
+ date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), 0);
851
+
852
+ // Respect startDate and endDate.
853
+ if (date < this.startDate) date = this.startDate;
854
+ else if (date > this.endDate) date = this.endDate;
855
+
856
+ this.viewMode = this.startViewMode;
857
+ this.showMode(0);
858
+ this._setDate(date);
859
+ this.fill();
860
+ if (this.autoclose) {
861
+ this.hide();
862
+ }
863
+ break;
864
+ }
865
+ break;
866
+ case 'span':
867
+ if (!target.is('.disabled')) {
868
+ var year = this.viewDate.getUTCFullYear(),
869
+ month = this.viewDate.getUTCMonth(),
870
+ day = this.viewDate.getUTCDate(),
871
+ hours = this.viewDate.getUTCHours(),
872
+ minutes = this.viewDate.getUTCMinutes(),
873
+ seconds = this.viewDate.getUTCSeconds();
874
+
875
+ if (target.is('.month')) {
876
+ this.viewDate.setUTCDate(1);
877
+ month = target.parent().find('span').index(target);
878
+ day = this.viewDate.getUTCDate();
879
+ this.viewDate.setUTCMonth(month);
880
+ this.element.trigger({
881
+ type: 'changeMonth',
882
+ date: this.viewDate
883
+ });
884
+ if (this.viewSelect >= 3) {
885
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
886
+ }
887
+ } else if (target.is('.year')) {
888
+ this.viewDate.setUTCDate(1);
889
+ year = parseInt(target.text(), 10) || 0;
890
+ this.viewDate.setUTCFullYear(year);
891
+ this.element.trigger({
892
+ type: 'changeYear',
893
+ date: this.viewDate
894
+ });
895
+ if (this.viewSelect >= 4) {
896
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
897
+ }
898
+ } else if (target.is('.hour')) {
899
+ hours = parseInt(target.text(), 10) || 0;
900
+ if (target.hasClass('hour_am') || target.hasClass('hour_pm')) {
901
+ if (hours == 12 && target.hasClass('hour_am')) {
902
+ hours = 0;
903
+ } else if (hours != 12 && target.hasClass('hour_pm')) {
904
+ hours += 12;
905
+ }
906
+ }
907
+ this.viewDate.setUTCHours(hours);
908
+ this.element.trigger({
909
+ type: 'changeHour',
910
+ date: this.viewDate
911
+ });
912
+ if (this.viewSelect >= 1) {
913
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
914
+ }
915
+ } else if (target.is('.minute')) {
916
+ minutes = parseInt(target.text().substr(target.text().indexOf(':') + 1), 10) || 0;
917
+ this.viewDate.setUTCMinutes(minutes);
918
+ this.element.trigger({
919
+ type: 'changeMinute',
920
+ date: this.viewDate
921
+ });
922
+ if (this.viewSelect >= 0) {
923
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
924
+ }
925
+ }
926
+ if (this.viewMode != 0) {
927
+ var oldViewMode = this.viewMode;
928
+ this.showMode(-1);
929
+ this.fill();
930
+ if (oldViewMode == this.viewMode && this.autoclose) {
931
+ this.hide();
932
+ }
933
+ } else {
934
+ this.fill();
935
+ if (this.autoclose) {
936
+ this.hide();
937
+ }
938
+ }
939
+ }
940
+ break;
941
+ case 'td':
942
+ if (target.is('.day') && !target.is('.disabled')) {
943
+ var day = parseInt(target.text(), 10) || 1;
944
+ var year = this.viewDate.getUTCFullYear(),
945
+ month = this.viewDate.getUTCMonth(),
946
+ hours = this.viewDate.getUTCHours(),
947
+ minutes = this.viewDate.getUTCMinutes(),
948
+ seconds = this.viewDate.getUTCSeconds();
949
+ if (target.is('.old')) {
950
+ if (month === 0) {
951
+ month = 11;
952
+ year -= 1;
953
+ } else {
954
+ month -= 1;
955
+ }
956
+ } else if (target.is('.new')) {
957
+ if (month == 11) {
958
+ month = 0;
959
+ year += 1;
960
+ } else {
961
+ month += 1;
962
+ }
963
+ }
964
+ this.viewDate.setUTCFullYear(year);
965
+ this.viewDate.setUTCMonth(month, day);
966
+ this.element.trigger({
967
+ type: 'changeDay',
968
+ date: this.viewDate
969
+ });
970
+ if (this.viewSelect >= 2) {
971
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
972
+ }
973
+ }
974
+ var oldViewMode = this.viewMode;
975
+ this.showMode(-1);
976
+ this.fill();
977
+ if (oldViewMode == this.viewMode && this.autoclose) {
978
+ this.hide();
979
+ }
980
+ break;
981
+ }
982
+ }
983
+ },
984
+
985
+ _setDate: function (date, which) {
986
+ if (!which || which == 'date')
987
+ this.date = date;
988
+ if (!which || which == 'view')
989
+ this.viewDate = date;
990
+ this.fill();
991
+ this.setValue();
992
+ var element;
993
+ if (this.isInput) {
994
+ element = this.element;
995
+ } else if (this.component) {
996
+ element = this.element.find('input');
997
+ }
998
+ if (element) {
999
+ element.change();
1000
+ if (this.autoclose && (!which || which == 'date')) {
1001
+ //this.hide();
1002
+ }
1003
+ }
1004
+ this.element.trigger({
1005
+ type: 'changeDate',
1006
+ date: this.date
1007
+ });
1008
+ },
1009
+
1010
+ moveMinute: function (date, dir) {
1011
+ if (!dir) return date;
1012
+ var new_date = new Date(date.valueOf());
1013
+ //dir = dir > 0 ? 1 : -1;
1014
+ new_date.setUTCMinutes(new_date.getUTCMinutes() + (dir * this.minuteStep));
1015
+ return new_date;
1016
+ },
1017
+
1018
+ moveHour: function (date, dir) {
1019
+ if (!dir) return date;
1020
+ var new_date = new Date(date.valueOf());
1021
+ //dir = dir > 0 ? 1 : -1;
1022
+ new_date.setUTCHours(new_date.getUTCHours() + dir);
1023
+ return new_date;
1024
+ },
1025
+
1026
+ moveDate: function (date, dir) {
1027
+ if (!dir) return date;
1028
+ var new_date = new Date(date.valueOf());
1029
+ //dir = dir > 0 ? 1 : -1;
1030
+ new_date.setUTCDate(new_date.getUTCDate() + dir);
1031
+ return new_date;
1032
+ },
1033
+
1034
+ moveMonth: function (date, dir) {
1035
+ if (!dir) return date;
1036
+ var new_date = new Date(date.valueOf()),
1037
+ day = new_date.getUTCDate(),
1038
+ month = new_date.getUTCMonth(),
1039
+ mag = Math.abs(dir),
1040
+ new_month, test;
1041
+ dir = dir > 0 ? 1 : -1;
1042
+ if (mag == 1) {
1043
+ test = dir == -1
1044
+ // If going back one month, make sure month is not current month
1045
+ // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
1046
+ ? function () {
1047
+ return new_date.getUTCMonth() == month;
1048
+ }
1049
+ // If going forward one month, make sure month is as expected
1050
+ // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
1051
+ : function () {
1052
+ return new_date.getUTCMonth() != new_month;
1053
+ };
1054
+ new_month = month + dir;
1055
+ new_date.setUTCMonth(new_month);
1056
+ // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
1057
+ if (new_month < 0 || new_month > 11)
1058
+ new_month = (new_month + 12) % 12;
1059
+ } else {
1060
+ // For magnitudes >1, move one month at a time...
1061
+ for (var i = 0; i < mag; i++)
1062
+ // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
1063
+ new_date = this.moveMonth(new_date, dir);
1064
+ // ...then reset the day, keeping it in the new month
1065
+ new_month = new_date.getUTCMonth();
1066
+ new_date.setUTCDate(day);
1067
+ test = function () {
1068
+ return new_month != new_date.getUTCMonth();
1069
+ };
1070
+ }
1071
+ // Common date-resetting loop -- if date is beyond end of month, make it
1072
+ // end of month
1073
+ while (test()) {
1074
+ new_date.setUTCDate(--day);
1075
+ new_date.setUTCMonth(new_month);
1076
+ }
1077
+ return new_date;
1078
+ },
1079
+
1080
+ moveYear: function (date, dir) {
1081
+ return this.moveMonth(date, dir * 12);
1082
+ },
1083
+
1084
+ dateWithinRange: function (date) {
1085
+ return date >= this.startDate && date <= this.endDate;
1086
+ },
1087
+
1088
+ keydown: function (e) {
1089
+ if (this.picker.is(':not(:visible)')) {
1090
+ if (e.keyCode == 27) // allow escape to hide and re-show picker
1091
+ this.show();
1092
+ return;
1093
+ }
1094
+ var dateChanged = false,
1095
+ dir, day, month,
1096
+ newDate, newViewDate;
1097
+ switch (e.keyCode) {
1098
+ case 27: // escape
1099
+ this.hide();
1100
+ e.preventDefault();
1101
+ break;
1102
+ case 37: // left
1103
+ case 39: // right
1104
+ if (!this.keyboardNavigation) break;
1105
+ dir = e.keyCode == 37 ? -1 : 1;
1106
+ viewMode = this.viewMode;
1107
+ if (e.ctrlKey) {
1108
+ viewMode += 2;
1109
+ } else if (e.shiftKey) {
1110
+ viewMode += 1;
1111
+ }
1112
+ if (viewMode == 4) {
1113
+ newDate = this.moveYear(this.date, dir);
1114
+ newViewDate = this.moveYear(this.viewDate, dir);
1115
+ } else if (viewMode == 3) {
1116
+ newDate = this.moveMonth(this.date, dir);
1117
+ newViewDate = this.moveMonth(this.viewDate, dir);
1118
+ } else if (viewMode == 2) {
1119
+ newDate = this.moveDate(this.date, dir);
1120
+ newViewDate = this.moveDate(this.viewDate, dir);
1121
+ } else if (viewMode == 1) {
1122
+ newDate = this.moveHour(this.date, dir);
1123
+ newViewDate = this.moveHour(this.viewDate, dir);
1124
+ } else if (viewMode == 0) {
1125
+ newDate = this.moveMinute(this.date, dir);
1126
+ newViewDate = this.moveMinute(this.viewDate, dir);
1127
+ }
1128
+ if (this.dateWithinRange(newDate)) {
1129
+ this.date = newDate;
1130
+ this.viewDate = newViewDate;
1131
+ this.setValue();
1132
+ this.update();
1133
+ e.preventDefault();
1134
+ dateChanged = true;
1135
+ }
1136
+ break;
1137
+ case 38: // up
1138
+ case 40: // down
1139
+ if (!this.keyboardNavigation) break;
1140
+ dir = e.keyCode == 38 ? -1 : 1;
1141
+ viewMode = this.viewMode;
1142
+ if (e.ctrlKey) {
1143
+ viewMode += 2;
1144
+ } else if (e.shiftKey) {
1145
+ viewMode += 1;
1146
+ }
1147
+ if (viewMode == 4) {
1148
+ newDate = this.moveYear(this.date, dir);
1149
+ newViewDate = this.moveYear(this.viewDate, dir);
1150
+ } else if (viewMode == 3) {
1151
+ newDate = this.moveMonth(this.date, dir);
1152
+ newViewDate = this.moveMonth(this.viewDate, dir);
1153
+ } else if (viewMode == 2) {
1154
+ newDate = this.moveDate(this.date, dir * 7);
1155
+ newViewDate = this.moveDate(this.viewDate, dir * 7);
1156
+ } else if (viewMode == 1) {
1157
+ if (this.showMeridian) {
1158
+ newDate = this.moveHour(this.date, dir * 6);
1159
+ newViewDate = this.moveHour(this.viewDate, dir * 6);
1160
+ } else {
1161
+ newDate = this.moveHour(this.date, dir * 4);
1162
+ newViewDate = this.moveHour(this.viewDate, dir * 4);
1163
+ }
1164
+ } else if (viewMode == 0) {
1165
+ newDate = this.moveMinute(this.date, dir * 4);
1166
+ newViewDate = this.moveMinute(this.viewDate, dir * 4);
1167
+ }
1168
+ if (this.dateWithinRange(newDate)) {
1169
+ this.date = newDate;
1170
+ this.viewDate = newViewDate;
1171
+ this.setValue();
1172
+ this.update();
1173
+ e.preventDefault();
1174
+ dateChanged = true;
1175
+ }
1176
+ break;
1177
+ case 13: // enter
1178
+ if (this.viewMode != 0) {
1179
+ var oldViewMode = this.viewMode;
1180
+ this.showMode(-1);
1181
+ this.fill();
1182
+ if (oldViewMode == this.viewMode && this.autoclose) {
1183
+ this.hide();
1184
+ }
1185
+ } else {
1186
+ this.fill();
1187
+ if (this.autoclose) {
1188
+ this.hide();
1189
+ }
1190
+ }
1191
+ e.preventDefault();
1192
+ break;
1193
+ case 9: // tab
1194
+ this.hide();
1195
+ break;
1196
+ }
1197
+ if (dateChanged) {
1198
+ var element;
1199
+ if (this.isInput) {
1200
+ element = this.element;
1201
+ } else if (this.component) {
1202
+ element = this.element.find('input');
1203
+ }
1204
+ if (element) {
1205
+ element.change();
1206
+ }
1207
+ this.element.trigger({
1208
+ type: 'changeDate',
1209
+ date: this.date
1210
+ });
1211
+ }
1212
+ },
1213
+
1214
+ showMode: function (dir) {
1215
+ if (dir) {
1216
+ var newViewMode = Math.max(0, Math.min(DPGlobal.modes.length - 1, this.viewMode + dir));
1217
+ if (newViewMode >= this.minView && newViewMode <= this.maxView) {
1218
+ this.element.trigger({
1219
+ type: 'changeMode',
1220
+ date: this.viewDate,
1221
+ oldViewMode: this.viewMode,
1222
+ newViewMode: newViewMode
1223
+ });
1224
+
1225
+ this.viewMode = newViewMode;
1226
+ }
1227
+ }
1228
+ /*
1229
+ vitalets: fixing bug of very special conditions:
1230
+ jquery 1.7.1 + webkit + show inline datetimepicker in bootstrap popover.
1231
+ Method show() does not set display css correctly and datetimepicker is not shown.
1232
+ Changed to .css('display', 'block') solve the problem.
1233
+ See https://github.com/vitalets/x-editable/issues/37
1234
+
1235
+ In jquery 1.7.2+ everything works fine.
1236
+ */
1237
+ //this.picker.find('>div').hide().filter('.datetimepicker-'+DPGlobal.modes[this.viewMode].clsName).show();
1238
+ this.picker.find('>div').hide().filter('.datetimepicker-' + DPGlobal.modes[this.viewMode].clsName).css('display', 'block');
1239
+ this.updateNavArrows();
1240
+ },
1241
+
1242
+ reset: function (e) {
1243
+ this._setDate(null, 'date');
1244
+ }
1245
+ };
1246
+
1247
+ $.fn.datetimepicker = function (option) {
1248
+ var args = Array.apply(null, arguments);
1249
+ args.shift();
1250
+ var internal_return;
1251
+ this.each(function () {
1252
+ var $this = $(this),
1253
+ data = $this.data('datetimepicker'),
1254
+ options = typeof option == 'object' && option;
1255
+ if (!data) {
1256
+ $this.data('datetimepicker', (data = new Datetimepicker(this, $.extend({}, $.fn.datetimepicker.defaults, options))));
1257
+ }
1258
+ if (typeof option == 'string' && typeof data[option] == 'function') {
1259
+ internal_return = data[option].apply(data, args);
1260
+ if (internal_return !== undefined) {
1261
+ return false;
1262
+ }
1263
+ }
1264
+ });
1265
+ if (internal_return !== undefined)
1266
+ return internal_return;
1267
+ else
1268
+ return this;
1269
+ };
1270
+
1271
+ $.fn.datetimepicker.defaults = {
1272
+ };
1273
+ $.fn.datetimepicker.Constructor = Datetimepicker;
1274
+ var dates = $.fn.datetimepicker.dates = {
1275
+ en: {
1276
+ days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
1277
+ daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
1278
+ daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
1279
+ months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
1280
+ monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
1281
+ meridiem: ["am", "pm"],
1282
+ suffix: ["st", "nd", "rd", "th"],
1283
+ today: "Today"
1284
+ }
1285
+ };
1286
+
1287
+ var DPGlobal = {
1288
+ modes: [
1289
+ {
1290
+ clsName: 'minutes',
1291
+ navFnc: 'Hours',
1292
+ navStep: 1
1293
+ },
1294
+ {
1295
+ clsName: 'hours',
1296
+ navFnc: 'Date',
1297
+ navStep: 1
1298
+ },
1299
+ {
1300
+ clsName: 'days',
1301
+ navFnc: 'Month',
1302
+ navStep: 1
1303
+ },
1304
+ {
1305
+ clsName: 'months',
1306
+ navFnc: 'FullYear',
1307
+ navStep: 1
1308
+ },
1309
+ {
1310
+ clsName: 'years',
1311
+ navFnc: 'FullYear',
1312
+ navStep: 10
1313
+ }
1314
+ ],
1315
+ isLeapYear: function (year) {
1316
+ return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
1317
+ },
1318
+ getDaysInMonth: function (year, month) {
1319
+ return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
1320
+ },
1321
+ getDefaultFormat: function (type, field) {
1322
+ if (type == "standard") {
1323
+ if (field == 'input')
1324
+ return 'yyyy-mm-dd hh:ii';
1325
+ else
1326
+ return 'yyyy-mm-dd hh:ii:ss';
1327
+ } else if (type == "php") {
1328
+ if (field == 'input')
1329
+ return 'Y-m-d H:i';
1330
+ else
1331
+ return 'Y-m-d H:i:s';
1332
+ } else {
1333
+ throw new Error("Invalid format type.");
1334
+ }
1335
+ },
1336
+ validParts: function (type) {
1337
+ if (type == "standard") {
1338
+ return /hh?|HH?|p|P|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g;
1339
+ } else if (type == "php") {
1340
+ return /[dDjlNwzFmMnStyYaABgGhHis]/g;
1341
+ } else {
1342
+ throw new Error("Invalid format type.");
1343
+ }
1344
+ },
1345
+ nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\rTZ]+/g,
1346
+ parseFormat: function (format, type) {
1347
+ // IE treats \0 as a string end in inputs (truncating the value),
1348
+ // so it's a bad format delimiter, anyway
1349
+ var separators = format.replace(this.validParts(type), '\0').split('\0'),
1350
+ parts = format.match(this.validParts(type));
1351
+ if (!separators || !separators.length || !parts || parts.length == 0) {
1352
+ throw new Error("Invalid date format.");
1353
+ }
1354
+ return {separators: separators, parts: parts};
1355
+ },
1356
+ parseDate: function (date, format, language, type) {
1357
+ if (date instanceof Date) {
1358
+ var dateUTC = new Date(date.valueOf() - date.getTimezoneOffset() * 60000);
1359
+ dateUTC.setMilliseconds(0);
1360
+ return dateUTC;
1361
+ }
1362
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(date)) {
1363
+ format = this.parseFormat('yyyy-mm-dd', type);
1364
+ }
1365
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(date)) {
1366
+ format = this.parseFormat('yyyy-mm-dd hh:ii', type);
1367
+ }
1368
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(date)) {
1369
+ format = this.parseFormat('yyyy-mm-dd hh:ii:ss', type);
1370
+ }
1371
+ if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) {
1372
+ var part_re = /([-+]\d+)([dmwy])/,
1373
+ parts = date.match(/([-+]\d+)([dmwy])/g),
1374
+ part, dir;
1375
+ date = new Date();
1376
+ for (var i = 0; i < parts.length; i++) {
1377
+ part = part_re.exec(parts[i]);
1378
+ dir = parseInt(part[1]);
1379
+ switch (part[2]) {
1380
+ case 'd':
1381
+ date.setUTCDate(date.getUTCDate() + dir);
1382
+ break;
1383
+ case 'm':
1384
+ date = Datetimepicker.prototype.moveMonth.call(Datetimepicker.prototype, date, dir);
1385
+ break;
1386
+ case 'w':
1387
+ date.setUTCDate(date.getUTCDate() + dir * 7);
1388
+ break;
1389
+ case 'y':
1390
+ date = Datetimepicker.prototype.moveYear.call(Datetimepicker.prototype, date, dir);
1391
+ break;
1392
+ }
1393
+ }
1394
+ return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), 0);
1395
+ }
1396
+ var parts = date && date.match(this.nonpunctuation) || [],
1397
+ date = new Date(0, 0, 0, 0, 0, 0, 0),
1398
+ parsed = {},
1399
+ setters_order = ['hh', 'h', 'ii', 'i', 'ss', 's', 'yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'D', 'DD', 'd', 'dd', 'H', 'HH', 'p', 'P'],
1400
+ setters_map = {
1401
+ hh: function (d, v) {
1402
+ return d.setUTCHours(v);
1403
+ },
1404
+ h: function (d, v) {
1405
+ return d.setUTCHours(v);
1406
+ },
1407
+ HH: function (d, v) {
1408
+ return d.setUTCHours(v == 12 ? 0 : v);
1409
+ },
1410
+ H: function (d, v) {
1411
+ return d.setUTCHours(v == 12 ? 0 : v);
1412
+ },
1413
+ ii: function (d, v) {
1414
+ return d.setUTCMinutes(v);
1415
+ },
1416
+ i: function (d, v) {
1417
+ return d.setUTCMinutes(v);
1418
+ },
1419
+ ss: function (d, v) {
1420
+ return d.setUTCSeconds(v);
1421
+ },
1422
+ s: function (d, v) {
1423
+ return d.setUTCSeconds(v);
1424
+ },
1425
+ yyyy: function (d, v) {
1426
+ return d.setUTCFullYear(v);
1427
+ },
1428
+ yy: function (d, v) {
1429
+ return d.setUTCFullYear(2000 + v);
1430
+ },
1431
+ m: function (d, v) {
1432
+ v -= 1;
1433
+ while (v < 0) v += 12;
1434
+ v %= 12;
1435
+ d.setUTCMonth(v);
1436
+ while (d.getUTCMonth() != v)
1437
+ if (isNaN(d.getUTCMonth()))
1438
+ return d;
1439
+ else
1440
+ d.setUTCDate(d.getUTCDate() - 1);
1441
+ return d;
1442
+ },
1443
+ d: function (d, v) {
1444
+ return d.setUTCDate(v);
1445
+ },
1446
+ p: function (d, v) {
1447
+ return d.setUTCHours(v == 1 ? d.getUTCHours() + 12 : d.getUTCHours());
1448
+ }
1449
+ },
1450
+ val, filtered, part;
1451
+ setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
1452
+ setters_map['dd'] = setters_map['d'];
1453
+ setters_map['P'] = setters_map['p'];
1454
+ date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
1455
+ if (parts.length == format.parts.length) {
1456
+ for (var i = 0, cnt = format.parts.length; i < cnt; i++) {
1457
+ val = parseInt(parts[i], 10);
1458
+ part = format.parts[i];
1459
+ if (isNaN(val)) {
1460
+ switch (part) {
1461
+ case 'MM':
1462
+ filtered = $(dates[language].months).filter(function () {
1463
+ var m = this.slice(0, parts[i].length),
1464
+ p = parts[i].slice(0, m.length);
1465
+ return m == p;
1466
+ });
1467
+ val = $.inArray(filtered[0], dates[language].months) + 1;
1468
+ break;
1469
+ case 'M':
1470
+ filtered = $(dates[language].monthsShort).filter(function () {
1471
+ var m = this.slice(0, parts[i].length),
1472
+ p = parts[i].slice(0, m.length);
1473
+ return m.toLowerCase() == p.toLowerCase();
1474
+ });
1475
+ val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
1476
+ break;
1477
+ case 'p':
1478
+ case 'P':
1479
+ val = $.inArray(parts[i].toLowerCase(), dates[language].meridiem);
1480
+ break;
1481
+ }
1482
+ }
1483
+ parsed[part] = val;
1484
+ }
1485
+ for (var i = 0, s; i < setters_order.length; i++) {
1486
+ s = setters_order[i];
1487
+ if (s in parsed && !isNaN(parsed[s]))
1488
+ setters_map[s](date, parsed[s])
1489
+ }
1490
+ }
1491
+ return date;
1492
+ },
1493
+ formatDate: function (date, format, language, type) {
1494
+ if (date == null) {
1495
+ return '';
1496
+ }
1497
+ var val;
1498
+ if (type == 'standard') {
1499
+ val = {
1500
+ // year
1501
+ yy: date.getUTCFullYear().toString().substring(2),
1502
+ yyyy: date.getUTCFullYear(),
1503
+ // month
1504
+ m: date.getUTCMonth() + 1,
1505
+ M: dates[language].monthsShort[date.getUTCMonth()],
1506
+ MM: dates[language].months[date.getUTCMonth()],
1507
+ // day
1508
+ d: date.getUTCDate(),
1509
+ D: dates[language].daysShort[date.getUTCDay()],
1510
+ DD: dates[language].days[date.getUTCDay()],
1511
+ p: (dates[language].meridiem.length == 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''),
1512
+ // hour
1513
+ h: date.getUTCHours(),
1514
+ // minute
1515
+ i: date.getUTCMinutes(),
1516
+ // second
1517
+ s: date.getUTCSeconds()
1518
+ };
1519
+
1520
+ if (dates[language].meridiem.length == 2) {
1521
+ val.H = (val.h % 12 == 0 ? 12 : val.h % 12);
1522
+ }
1523
+ else {
1524
+ val.H = val.h;
1525
+ }
1526
+ val.HH = (val.H < 10 ? '0' : '') + val.H;
1527
+ val.P = val.p.toUpperCase();
1528
+ val.hh = (val.h < 10 ? '0' : '') + val.h;
1529
+ val.ii = (val.i < 10 ? '0' : '') + val.i;
1530
+ val.ss = (val.s < 10 ? '0' : '') + val.s;
1531
+ val.dd = (val.d < 10 ? '0' : '') + val.d;
1532
+ val.mm = (val.m < 10 ? '0' : '') + val.m;
1533
+ } else if (type == 'php') {
1534
+ // php format
1535
+ val = {
1536
+ // year
1537
+ y: date.getUTCFullYear().toString().substring(2),
1538
+ Y: date.getUTCFullYear(),
1539
+ // month
1540
+ F: dates[language].months[date.getUTCMonth()],
1541
+ M: dates[language].monthsShort[date.getUTCMonth()],
1542
+ n: date.getUTCMonth() + 1,
1543
+ t: DPGlobal.getDaysInMonth(date.getUTCFullYear(), date.getUTCMonth()),
1544
+ // day
1545
+ j: date.getUTCDate(),
1546
+ l: dates[language].days[date.getUTCDay()],
1547
+ D: dates[language].daysShort[date.getUTCDay()],
1548
+ w: date.getUTCDay(), // 0 -> 6
1549
+ N: (date.getUTCDay() == 0 ? 7 : date.getUTCDay()), // 1 -> 7
1550
+ S: (date.getUTCDate() % 10 <= dates[language].suffix.length ? dates[language].suffix[date.getUTCDate() % 10 - 1] : ''),
1551
+ // hour
1552
+ a: (dates[language].meridiem.length == 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''),
1553
+ g: (date.getUTCHours() % 12 == 0 ? 12 : date.getUTCHours() % 12),
1554
+ G: date.getUTCHours(),
1555
+ // minute
1556
+ i: date.getUTCMinutes(),
1557
+ // second
1558
+ s: date.getUTCSeconds()
1559
+ };
1560
+ val.m = (val.n < 10 ? '0' : '') + val.n;
1561
+ val.d = (val.j < 10 ? '0' : '') + val.j;
1562
+ val.A = val.a.toString().toUpperCase();
1563
+ val.h = (val.g < 10 ? '0' : '') + val.g;
1564
+ val.H = (val.G < 10 ? '0' : '') + val.G;
1565
+ val.i = (val.i < 10 ? '0' : '') + val.i;
1566
+ val.s = (val.s < 10 ? '0' : '') + val.s;
1567
+ } else {
1568
+ throw new Error("Invalid format type.");
1569
+ }
1570
+ var date = [],
1571
+ seps = $.extend([], format.separators);
1572
+ for (var i = 0, cnt = format.parts.length; i < cnt; i++) {
1573
+ if (seps.length) {
1574
+ date.push(seps.shift());
1575
+ }
1576
+ date.push(val[format.parts[i]]);
1577
+ }
1578
+ if (seps.length) {
1579
+ date.push(seps.shift());
1580
+ }
1581
+ return date.join('');
1582
+ },
1583
+ convertViewMode: function (viewMode) {
1584
+ switch (viewMode) {
1585
+ case 4:
1586
+ case 'decade':
1587
+ viewMode = 4;
1588
+ break;
1589
+ case 3:
1590
+ case 'year':
1591
+ viewMode = 3;
1592
+ break;
1593
+ case 2:
1594
+ case 'month':
1595
+ viewMode = 2;
1596
+ break;
1597
+ case 1:
1598
+ case 'day':
1599
+ viewMode = 1;
1600
+ break;
1601
+ case 0:
1602
+ case 'hour':
1603
+ viewMode = 0;
1604
+ break;
1605
+ }
1606
+
1607
+ return viewMode;
1608
+ },
1609
+ headTemplate: '<thead>' +
1610
+ '<tr>' +
1611
+ '<th class="prev"><i class="icon-arrow-left"/></th>' +
1612
+ '<th colspan="5" class="switch"></th>' +
1613
+ '<th class="next"><i class="icon-arrow-right"/></th>' +
1614
+ '</tr>' +
1615
+ '</thead>',
1616
+ headTemplateV3: '<thead>' +
1617
+ '<tr>' +
1618
+ '<th class="prev"><span class="glyphicon glyphicon-arrow-left"></span> </th>' +
1619
+ '<th colspan="5" class="switch"></th>' +
1620
+ '<th class="next"><span class="glyphicon glyphicon-arrow-right"></span> </th>' +
1621
+ '</tr>' +
1622
+ '</thead>',
1623
+ contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
1624
+ footTemplate: '<tfoot><tr><th colspan="7" class="today"></th></tr></tfoot>'
1625
+ };
1626
+ DPGlobal.template = '<div class="datetimepicker">' +
1627
+ '<div class="datetimepicker-minutes">' +
1628
+ '<table class=" table-condensed">' +
1629
+ DPGlobal.headTemplate +
1630
+ DPGlobal.contTemplate +
1631
+ DPGlobal.footTemplate +
1632
+ '</table>' +
1633
+ '</div>' +
1634
+ '<div class="datetimepicker-hours">' +
1635
+ '<table class=" table-condensed">' +
1636
+ DPGlobal.headTemplate +
1637
+ DPGlobal.contTemplate +
1638
+ DPGlobal.footTemplate +
1639
+ '</table>' +
1640
+ '</div>' +
1641
+ '<div class="datetimepicker-days">' +
1642
+ '<table class=" table-condensed">' +
1643
+ DPGlobal.headTemplate +
1644
+ '<tbody></tbody>' +
1645
+ DPGlobal.footTemplate +
1646
+ '</table>' +
1647
+ '</div>' +
1648
+ '<div class="datetimepicker-months">' +
1649
+ '<table class="table-condensed">' +
1650
+ DPGlobal.headTemplate +
1651
+ DPGlobal.contTemplate +
1652
+ DPGlobal.footTemplate +
1653
+ '</table>' +
1654
+ '</div>' +
1655
+ '<div class="datetimepicker-years">' +
1656
+ '<table class="table-condensed">' +
1657
+ DPGlobal.headTemplate +
1658
+ DPGlobal.contTemplate +
1659
+ DPGlobal.footTemplate +
1660
+ '</table>' +
1661
+ '</div>' +
1662
+ '</div>';
1663
+ DPGlobal.templateV3 = '<div class="datetimepicker">' +
1664
+ '<div class="datetimepicker-minutes">' +
1665
+ '<table class=" table-condensed">' +
1666
+ DPGlobal.headTemplateV3 +
1667
+ DPGlobal.contTemplate +
1668
+ DPGlobal.footTemplate +
1669
+ '</table>' +
1670
+ '</div>' +
1671
+ '<div class="datetimepicker-hours">' +
1672
+ '<table class=" table-condensed">' +
1673
+ DPGlobal.headTemplateV3 +
1674
+ DPGlobal.contTemplate +
1675
+ DPGlobal.footTemplate +
1676
+ '</table>' +
1677
+ '</div>' +
1678
+ '<div class="datetimepicker-days">' +
1679
+ '<table class=" table-condensed">' +
1680
+ DPGlobal.headTemplateV3 +
1681
+ '<tbody></tbody>' +
1682
+ DPGlobal.footTemplate +
1683
+ '</table>' +
1684
+ '</div>' +
1685
+ '<div class="datetimepicker-months">' +
1686
+ '<table class="table-condensed">' +
1687
+ DPGlobal.headTemplateV3 +
1688
+ DPGlobal.contTemplate +
1689
+ DPGlobal.footTemplate +
1690
+ '</table>' +
1691
+ '</div>' +
1692
+ '<div class="datetimepicker-years">' +
1693
+ '<table class="table-condensed">' +
1694
+ DPGlobal.headTemplateV3 +
1695
+ DPGlobal.contTemplate +
1696
+ DPGlobal.footTemplate +
1697
+ '</table>' +
1698
+ '</div>' +
1699
+ '</div>';
1700
+ $.fn.datetimepicker.DPGlobal = DPGlobal;
1701
+
1702
+ /* DATETIMEPICKER NO CONFLICT
1703
+ * =================== */
1704
+
1705
+ $.fn.datetimepicker.noConflict = function () {
1706
+ $.fn.datetimepicker = old;
1707
+ return this;
1708
+ };
1709
+
1710
+ /* DATETIMEPICKER DATA-API
1711
+ * ================== */
1712
+
1713
+ $(document).on(
1714
+ 'focus.datetimepicker.data-api click.datetimepicker.data-api',
1715
+ '[data-provide="datetimepicker"]',
1716
+ function (e) {
1717
+ var $this = $(this);
1718
+ if ($this.data('datetimepicker')) return;
1719
+ e.preventDefault();
1720
+ // component click requires us to explicitly show it
1721
+ $this.datetimepicker('show');
1722
+ }
1723
+ );
1724
+ $(function () {
1725
+ $('[data-provide="datetimepicker-inline"]').datetimepicker();
1726
+ });
1727
+
1728
+ }(window.jQuery);