foundation-datetimepicker-rails 0.1.1 → 0.1.2

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.
@@ -1,5 +1,5 @@
1
1
  module FoundationDatetimepicker
2
2
  module Rails
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.2"
4
4
  end
5
5
  end
@@ -4,11 +4,9 @@
4
4
  * project website http://foundation-datepicker.peterbeno.com
5
5
  *
6
6
  * original project:
7
- * bootstrap-datepicker.js
8
- * http://www.eyecon.ro/bootstrap-datepicker
9
- * =========================================================
10
7
  * Copyright 2012 Stefan Petre
11
8
  * Improvements by Andrew Rowls
9
+ * Improvements by Sébastien Malot
12
10
  *
13
11
  * Licensed under the Apache License, Version 2.0 (the "License");
14
12
  * you may not use this file except in compliance with the License.
@@ -30,33 +28,60 @@
30
28
  }
31
29
  function UTCToday(){
32
30
  var today = new Date();
33
- return UTCDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate());
31
+ return UTCDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate(), today.getUTCHours(), today.getUTCMinutes(), today.getUTCSeconds());
34
32
  }
35
33
 
36
34
  // Picker object
37
35
 
38
- var Datepicker = function(element, options) {
36
+ var Datetimepicker = function(element, options) {
39
37
  var that = this;
40
38
 
41
39
  this.element = $(element);
42
40
  this.closeButton = options.closeButton;
43
- this.language = options.language||this.element.data('date-language')||"en";
44
- this.language = this.language in dates ? this.language : this.language.split('-')[0]; //Check if "de-DE" style date is available, if not language should fallback to 2 letter code eg "de"
41
+ this.language = options.language || this.element.data('date-language') || "en";
45
42
  this.language = this.language in dates ? this.language : "en";
46
- this.isRTL = dates[this.language].rtl||false;
47
- this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||dates[this.language].format||'mm/dd/yyyy');
43
+ this.isRTL = dates[this.language].rtl || false;
44
+ this.format = DPGlobal.parseFormat(options.format || this.element.data('date-format') || 'yyyy-mm-dd hh:ii');
48
45
  this.isInline = false;
49
46
  this.isInput = this.element.is('input');
50
- this.component = this.element.is('.date') ? this.element.find('.prefix') : false;
47
+ this.component = this.element.is('.date') ? this.element.find('.prefix').parent() : false;
48
+ this.componentReset = this.element.is('.date') ? this.element.find('.prefix').parent() : false;
51
49
  this.hasInput = this.component && this.element.find('input').length;
52
-
53
-
54
- this.onRender = options.onRender || function () {};
55
- if(this.component && this.component.length === 0)
50
+ if (this.component && this.component.length === 0) {
56
51
  this.component = false;
52
+ }
53
+ this.linkField = options.linkField || this.element.data('link-field') || false;
54
+ this.linkFormat = DPGlobal.parseFormat(options.linkFormat || this.element.data('link-format') || 'yyyy-mm-dd hh:ii:ss');
55
+ this.minuteStep = options.minuteStep || this.element.data('minute-step') || 5;
56
+ this.pickerPosition = options.pickerPosition || this.element.data('picker-position') || 'bottom-right';
57
57
 
58
58
  this._attachEvents();
59
59
 
60
+ this.minView = 0;
61
+ if ('minView' in options) {
62
+ this.minView = options.minView;
63
+ } else if ('minView' in this.element.data()) {
64
+ this.minView = this.element.data('min-view');
65
+ }
66
+ this.minView = DPGlobal.convertViewMode(this.minView);
67
+
68
+ this.maxView = DPGlobal.modes.length-1;
69
+ if ('maxView' in options) {
70
+ this.maxView = options.maxView;
71
+ } else if ('maxView' in this.element.data()) {
72
+ this.maxView = this.element.data('max-view');
73
+ }
74
+ this.maxView = DPGlobal.convertViewMode(this.maxView);
75
+
76
+ this.startViewMode = 2;
77
+ if ('startView' in options) {
78
+ this.startViewMode = options.startView;
79
+ } else if ('startView' in this.element.data()) {
80
+ this.startViewMode = this.element.data('start-view');
81
+ }
82
+ this.startViewMode = DPGlobal.convertViewMode(this.startViewMode);
83
+ this.viewMode = this.startViewMode;
84
+
60
85
  this.forceParse = true;
61
86
  if ('forceParse' in options) {
62
87
  this.forceParse = options.forceParse;
@@ -64,7 +89,6 @@
64
89
  this.forceParse = this.element.data('date-force-parse');
65
90
  }
66
91
 
67
-
68
92
  this.picker = $(DPGlobal.template)
69
93
  .appendTo(this.isInline ? this.element : 'body')
70
94
  .on({
@@ -72,22 +96,27 @@
72
96
  mousedown: $.proxy(this.mousedown, this)
73
97
  });
74
98
  if (this.closeButton){
75
- this.picker.find('a.datepicker-close').show();
99
+ this.picker.find('a.datetimepicker-close').show();
76
100
  }
77
-
78
- if(this.isInline) {
79
- this.picker.addClass('datepicker-inline');
101
+
102
+ if (this.isInline) {
103
+ this.picker.addClass('datetimepicker-inline');
104
+
80
105
  } else {
81
- this.picker.addClass('datepicker-dropdown dropdown-menu');
106
+ if (this.component && this.pickerPosition == 'bottom-left') {
107
+ this.picker.addClass('datetimepicker-dropdown-left dropdown-menu');
108
+ } else {
109
+ this.picker.addClass('datetimepicker-dropdown dropdown-menu');
110
+ }
82
111
  }
83
112
  if (this.isRTL){
84
- this.picker.addClass('datepicker-rtl');
113
+ this.picker.addClass('datetimepicker-rtl');
85
114
  this.picker.find('.prev i, .next i')
86
- .toggleClass('icon-arrow-left icon-arrow-right');
115
+ .toggleClass('icon-chevron-left icon-chevron-right');
87
116
  }
88
117
  $(document).on('mousedown', function (e) {
89
- // Clicked outside the datepicker, hide it
90
- if ($(e.target).closest('.datepicker.datepicker-inline, .datepicker.datepicker-dropdown').length === 0) {
118
+ // Clicked outside the datetimepicker, hide it
119
+ if ($(e.target).closest('.datetimepicker').length === 0) {
91
120
  that.hide();
92
121
  }
93
122
  });
@@ -106,54 +135,29 @@
106
135
  this.keyboardNavigation = this.element.data('date-keyboard-navigation');
107
136
  }
108
137
 
109
- this.viewMode = this.startViewMode = 0;
110
- switch(options.startView || this.element.data('date-start-view')){
111
- case 2:
112
- case 'decade':
113
- this.viewMode = this.startViewMode = 2;
114
- break;
115
- case 1:
116
- case 'year':
117
- this.viewMode = this.startViewMode = 1;
118
- break;
119
- }
120
-
121
- this.todayBtn = (options.todayBtn||this.element.data('date-today-btn')||false);
122
- this.todayHighlight = (options.todayHighlight||this.element.data('date-today-highlight')||false);
138
+ this.todayBtn = (options.todayBtn || this.element.data('date-today-btn') || false);
139
+ this.todayHighlight = (options.todayHighlight || this.element.data('date-today-highlight') || false);
123
140
 
124
- this.calendarWeeks = false;
125
- if ('calendarWeeks' in options) {
126
- this.calendarWeeks = options.calendarWeeks;
127
- } else if ('dateCalendarWeeks' in this.element.data()) {
128
- this.calendarWeeks = this.element.data('date-calendar-weeks');
129
- }
130
- if (this.calendarWeeks)
131
- this.picker.find('tfoot th.today')
132
- .attr('colspan', function(i, val){
133
- return parseInt(val) + 1;
134
- });
135
-
136
- this.weekStart = ((options.weekStart||this.element.data('date-weekstart')||dates[this.language].weekStart||0) % 7);
141
+ this.weekStart = ((options.weekStart || this.element.data('date-weekstart') || dates[this.language].weekStart || 0) % 7);
137
142
  this.weekEnd = ((this.weekStart + 6) % 7);
138
143
  this.startDate = -Infinity;
139
144
  this.endDate = Infinity;
140
145
  this.daysOfWeekDisabled = [];
141
- this.setStartDate(options.startDate||this.element.data('date-startdate'));
142
- this.setEndDate(options.endDate||this.element.data('date-enddate'));
143
- this.setDaysOfWeekDisabled(options.daysOfWeekDisabled||this.element.data('date-days-of-week-disabled'));
144
-
146
+ this.setStartDate(options.startDate || this.element.data('date-startdate'));
147
+ this.setEndDate(options.endDate || this.element.data('date-enddate'));
148
+ this.setDaysOfWeekDisabled(options.daysOfWeekDisabled || this.element.data('date-days-of-week-disabled'));
145
149
  this.fillDow();
146
150
  this.fillMonths();
147
151
  this.update();
148
152
  this.showMode();
149
153
 
150
154
  if(this.isInline) {
151
- this.show();
155
+ this.picker.show();
152
156
  }
153
157
  };
154
158
 
155
- Datepicker.prototype = {
156
- constructor: Datepicker,
159
+ Datetimepicker.prototype = {
160
+ constructor: Datetimepicker,
157
161
 
158
162
  _events: [],
159
163
  _attachEvents: function(){
@@ -179,10 +183,16 @@
179
183
  click: $.proxy(this.show, this)
180
184
  }]
181
185
  ];
186
+ if (this.componentReset) {
187
+ this._events.push([
188
+ this.componentReset,
189
+ {click: $.proxy(this.reset, this)}
190
+ ]);
191
+ }
192
+ }
193
+ else if (this.element.is('div')) { // inline datetimepicker
194
+ this.isInline = true;
182
195
  }
183
- else if (this.element.is('div')) { // inline datepicker
184
- this.isInline = true;
185
- }
186
196
  else {
187
197
  this._events = [
188
198
  [this.element, {
@@ -196,6 +206,7 @@
196
206
  el.on(ev);
197
207
  }
198
208
  },
209
+
199
210
  _detachEvents: function(){
200
211
  for (var i=0, el, ev; i<this._events.length; i++){
201
212
  el = this._events[i][0];
@@ -208,10 +219,12 @@
208
219
  show: function(e) {
209
220
  this.picker.show();
210
221
  this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
211
- this.update();
222
+ if (this.forceParse) {
223
+ this.update();
224
+ }
212
225
  this.place();
213
226
  $(window).on('resize', $.proxy(this.place, this));
214
- if (e ) {
227
+ if (e) {
215
228
  e.stopPropagation();
216
229
  e.preventDefault();
217
230
  }
@@ -223,7 +236,6 @@
223
236
 
224
237
  hide: function(e){
225
238
  if(this.isInline) return;
226
- if (!this.picker.is(':visible')) return;
227
239
  this.picker.hide();
228
240
  $(window).off('resize', this.place);
229
241
  this.viewMode = this.startViewMode;
@@ -235,7 +247,7 @@
235
247
  if (
236
248
  this.forceParse &&
237
249
  (
238
- this.isInput && this.element.val() ||
250
+ this.isInput && this.element.val() ||
239
251
  this.hasInput && this.element.find('input').val()
240
252
  )
241
253
  )
@@ -249,7 +261,7 @@
249
261
  remove: function() {
250
262
  this._detachEvents();
251
263
  this.picker.remove();
252
- delete this.element.data().datepicker;
264
+ delete this.element.data().datetimepicker;
253
265
  },
254
266
 
255
267
  getDate: function() {
@@ -266,30 +278,43 @@
266
278
  },
267
279
 
268
280
  setUTCDate: function(d) {
269
- this.date = d;
270
- this.setValue();
281
+ if (d >= this.startDate && d <= this.endDate) {
282
+ this.date = d;
283
+ this.setValue();
284
+ this.viewDate = this.date;
285
+ this.fill();
286
+ } else {
287
+ this.element.trigger({
288
+ type: 'outOfRange',
289
+ date: d,
290
+ startDate: this.startDate,
291
+ endDate: this.endDate
292
+ });
293
+ }
271
294
  },
272
295
 
273
296
  setValue: function() {
274
297
  var formatted = this.getFormattedDate();
275
298
  if (!this.isInput) {
276
299
  if (this.component){
277
- this.element.find('input').val(formatted);
300
+ this.element.find('input').prop('value', formatted);
278
301
  }
279
302
  this.element.data('date', formatted);
280
303
  } else {
281
- this.element.val(formatted);
304
+ this.element.prop('value', formatted);
305
+ }
306
+ if (this.linkField) {
307
+ $('#' + this.linkField).val(this.getFormattedDate(this.linkFormat));
282
308
  }
283
309
  },
284
310
 
285
311
  getFormattedDate: function(format) {
286
- if (format === undefined)
287
- format = this.format;
312
+ if(format == undefined) format = this.format;
288
313
  return DPGlobal.formatDate(this.date, format, this.language);
289
314
  },
290
315
 
291
316
  setStartDate: function(startDate){
292
- this.startDate = startDate||-Infinity;
317
+ this.startDate = startDate || -Infinity;
293
318
  if (this.startDate !== -Infinity) {
294
319
  this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language);
295
320
  }
@@ -298,7 +323,7 @@
298
323
  },
299
324
 
300
325
  setEndDate: function(endDate){
301
- this.endDate = endDate||Infinity;
326
+ this.endDate = endDate || Infinity;
302
327
  if (this.endDate !== Infinity) {
303
328
  this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language);
304
329
  }
@@ -307,7 +332,7 @@
307
332
  },
308
333
 
309
334
  setDaysOfWeekDisabled: function(daysOfWeekDisabled){
310
- this.daysOfWeekDisabled = daysOfWeekDisabled||[];
335
+ this.daysOfWeekDisabled = daysOfWeekDisabled || [];
311
336
  if (!$.isArray(this.daysOfWeekDisabled)) {
312
337
  this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/);
313
338
  }
@@ -317,20 +342,28 @@
317
342
  this.update();
318
343
  this.updateNavArrows();
319
344
  },
320
-
345
+
321
346
  place: function(){
322
- if(this.isInline) return;
323
- var zIndex = parseInt(this.element.parents().filter(function() {
324
- return $(this).css('z-index') != 'auto';
325
- }).first().css('z-index'))+10;
326
- var textbox = this.component ? this.component : this.element;
327
- var offset = textbox.offset();
328
- var height = textbox.outerHeight() + parseInt(textbox.css('margin-top'));
329
- this.picker.css({
330
- top: offset.top + height,
331
- left: offset.left,
332
- zIndex: zIndex
333
- });
347
+ if(this.isInline) return;
348
+ var zIndex = parseInt(this.element.parents().filter(function() {
349
+ return $(this).css('z-index') != 'auto';
350
+ }).first().css('z-index'))+10;
351
+ var offset, left;
352
+ if (this.component) {
353
+ offset = this.component.offset();
354
+ left = offset.left;
355
+ if (this.pickerPosition == 'bottom-left') {
356
+ left += this.component.outerWidth() - this.picker.outerWidth();
357
+ }
358
+ } else {
359
+ offset = this.element.offset();
360
+ left = offset.left;
361
+ }
362
+ this.picker.css({
363
+ top: offset.top + this.height,
364
+ left: left,
365
+ zIndex: zIndex
366
+ });
334
367
  },
335
368
 
336
369
  update: function(){
@@ -339,9 +372,9 @@
339
372
  date = arguments[0];
340
373
  fromArgs = true;
341
374
  } else {
342
- date = this.isInput ? this.element.val() : this.element.data('date') || this.element.find('input').val();
375
+ date = this.isInput ? this.element.prop('value') : this.element.data('date') || this.element.find('input').prop('value');
343
376
  }
344
-
377
+
345
378
  this.date = DPGlobal.parseDate(date, this.format, this.language);
346
379
 
347
380
  if(fromArgs) this.setValue();
@@ -359,16 +392,11 @@
359
392
  fillDow: function(){
360
393
  var dowCnt = this.weekStart,
361
394
  html = '<tr>';
362
- if(this.calendarWeeks){
363
- var cell = '<th class="cw">&nbsp;</th>';
364
- html += cell;
365
- this.picker.find('.datepicker-days thead tr:first-child').prepend(cell);
366
- }
367
395
  while (dowCnt < this.weekStart + 7) {
368
396
  html += '<th class="dow">'+dates[this.language].daysMin[(dowCnt++)%7]+'</th>';
369
397
  }
370
398
  html += '</tr>';
371
- this.picker.find('.datepicker-days thead').append(html);
399
+ this.picker.find('.datetimepicker-days thead').append(html);
372
400
  },
373
401
 
374
402
  fillMonths: function(){
@@ -377,30 +405,39 @@
377
405
  while (i < 12) {
378
406
  html += '<span class="month">'+dates[this.language].monthsShort[i++]+'</span>';
379
407
  }
380
- this.picker.find('.datepicker-months td').html(html);
408
+ this.picker.find('.datetimepicker-months td').html(html);
381
409
  },
382
410
 
383
411
  fill: function() {
412
+ if (this.date == null || this.viewDate == null) {
413
+ return;
414
+ }
415
+
384
416
  var d = new Date(this.viewDate),
385
417
  year = d.getUTCFullYear(),
386
418
  month = d.getUTCMonth(),
419
+ dayMonth = d.getUTCDate(),
420
+ hours = d.getUTCHours(),
421
+ minutes = d.getUTCMinutes(),
387
422
  startYear = this.startDate !== -Infinity ? this.startDate.getUTCFullYear() : -Infinity,
388
423
  startMonth = this.startDate !== -Infinity ? this.startDate.getUTCMonth() : -Infinity,
389
424
  endYear = this.endDate !== Infinity ? this.endDate.getUTCFullYear() : Infinity,
390
425
  endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity,
391
- currentDate = this.date && this.date.valueOf(),
426
+ currentDate = (new UTCDate(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.date.getUTCDate())).valueOf(),
392
427
  today = new Date();
393
- this.picker.find('.datepicker-days thead th.date-switch')
428
+ this.picker.find('.datetimepicker-days thead th:eq(1)')
394
429
  .text(dates[this.language].months[month]+' '+year);
430
+ this.picker.find('.datetimepicker-hours thead th:eq(1)')
431
+ .text(dayMonth+' '+dates[this.language].months[month]+' '+year);
432
+ this.picker.find('.datetimepicker-minutes thead th:eq(1)')
433
+ .text(dayMonth+' '+dates[this.language].months[month]+' '+year);
395
434
  this.picker.find('tfoot th.today')
396
435
  .text(dates[this.language].today)
397
436
  .toggle(this.todayBtn !== false);
398
437
  this.updateNavArrows();
399
438
  this.fillMonths();
400
- var prevMonth = UTCDate(year, month-1, 28,0,0,0,0),
401
- day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
402
- prevMonth.setUTCDate(day);
403
- prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7)%7);
439
+ var prevMonth = UTCDate(year, month, 0,0,0,0,0);
440
+ prevMonth.setUTCDate(prevMonth.getDate() - (prevMonth.getUTCDay() - this.weekStart + 7)%7);
404
441
  var nextMonth = new Date(prevMonth);
405
442
  nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
406
443
  nextMonth = nextMonth.valueOf();
@@ -409,15 +446,8 @@
409
446
  while(prevMonth.valueOf() < nextMonth) {
410
447
  if (prevMonth.getUTCDay() == this.weekStart) {
411
448
  html.push('<tr>');
412
- if(this.calendarWeeks){
413
- // adapted from https://github.com/timrwood/moment/blob/master/moment.js#L128
414
- var a = new Date(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth(), prevMonth.getUTCDate() - prevMonth.getDay() + 10 - (this.weekStart && this.weekStart%7 < 5 && 7)),
415
- b = new Date(a.getFullYear(), 0, 4),
416
- calWeek = ~~((a - b) / 864e5 / 7 + 1.5);
417
- html.push('<td class="cw">'+ calWeek +'</td>');
418
- }
419
449
  }
420
- clsName = ' '+this.onRender(prevMonth)+' ';
450
+ clsName = '';
421
451
  if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() < month)) {
422
452
  clsName += ' old';
423
453
  } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() > month)) {
@@ -430,10 +460,10 @@
430
460
  prevMonth.getUTCDate() == today.getDate()) {
431
461
  clsName += ' today';
432
462
  }
433
- if (currentDate && prevMonth.valueOf() == currentDate) {
463
+ if (prevMonth.valueOf() == currentDate) {
434
464
  clsName += ' active';
435
465
  }
436
- if (prevMonth.valueOf() < this.startDate || prevMonth.valueOf() > this.endDate ||
466
+ if ((prevMonth.valueOf() + 86400000) < this.startDate || prevMonth.valueOf() > this.endDate ||
437
467
  $.inArray(prevMonth.getUTCDay(), this.daysOfWeekDisabled) !== -1) {
438
468
  clsName += ' disabled';
439
469
  }
@@ -443,15 +473,42 @@
443
473
  }
444
474
  prevMonth.setUTCDate(prevMonth.getUTCDate()+1);
445
475
  }
446
- this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
447
- var currentYear = this.date && this.date.getUTCFullYear();
476
+ this.picker.find('.datetimepicker-days tbody').empty().append(html.join(''));
448
477
 
449
- var months = this.picker.find('.datepicker-months')
478
+ html = [];
479
+ for (var i=0;i<24;i++) {
480
+ var actual = UTCDate(year, month, dayMonth, i);
481
+ clsName = '';
482
+ // We want the previous hour for the startDate
483
+ if ((actual.valueOf() + 3600000) < this.startDate || actual.valueOf() > this.endDate) {
484
+ clsName += ' disabled';
485
+ } else if (hours == i) {
486
+ clsName += ' active';
487
+ }
488
+ html.push('<span class="hour'+clsName+'">'+i+':00</span>');
489
+ }
490
+ this.picker.find('.datetimepicker-hours td').html(html.join(''));
491
+
492
+ html = [];
493
+ for(var i=0;i<60;i+=this.minuteStep) {
494
+ var actual = UTCDate(year, month, dayMonth, hours, i);
495
+ clsName = '';
496
+ if (actual.valueOf() < this.startDate || actual.valueOf() > this.endDate) {
497
+ clsName += ' disabled';
498
+ } else if (Math.floor(minutes/this.minuteStep) == Math.floor(i/this.minuteStep)) {
499
+ clsName += ' active';
500
+ }
501
+ html.push('<span class="minute'+clsName+'">'+hours+':'+(i<10?'0'+i:i)+'</span>');
502
+ }
503
+ this.picker.find('.datetimepicker-minutes td').html(html.join(''));
504
+
505
+ var currentYear = this.date.getUTCFullYear();
506
+ var months = this.picker.find('.datetimepicker-months')
450
507
  .find('th:eq(1)')
451
- .text(year)
452
- .end()
508
+ .text(year)
509
+ .end()
453
510
  .find('span').removeClass('active');
454
- if (currentYear && currentYear == year) {
511
+ if (currentYear == year) {
455
512
  months.eq(this.date.getUTCMonth()).addClass('active');
456
513
  }
457
514
  if (year < startYear || year > endYear) {
@@ -466,10 +523,10 @@
466
523
 
467
524
  html = '';
468
525
  year = parseInt(year/10, 10) * 10;
469
- var yearCont = this.picker.find('.datepicker-years')
526
+ var yearCont = this.picker.find('.datetimepicker-years')
470
527
  .find('th:eq(1)')
471
- .text(year + '-' + (year + 9))
472
- .end()
528
+ .text(year + '-' + (year + 9))
529
+ .end()
473
530
  .find('td');
474
531
  year -= 1;
475
532
  for (var i = -1; i < 11; i++) {
@@ -482,22 +539,60 @@
482
539
  updateNavArrows: function() {
483
540
  var d = new Date(this.viewDate),
484
541
  year = d.getUTCFullYear(),
485
- month = d.getUTCMonth();
542
+ month = d.getUTCMonth(),
543
+ day = d.getUTCDate(),
544
+ hour = d.getUTCHours();
486
545
  switch (this.viewMode) {
487
546
  case 0:
488
- if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() && month <= this.startDate.getUTCMonth()) {
547
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()
548
+ && month <= this.startDate.getUTCMonth()
549
+ && day <= this.startDate.getUTCDate()
550
+ && hour <= this.startDate.getUTCHours()) {
489
551
  this.picker.find('.prev').css({visibility: 'hidden'});
490
552
  } else {
491
553
  this.picker.find('.prev').css({visibility: 'visible'});
492
554
  }
493
- if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() && month >= this.endDate.getUTCMonth()) {
555
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()
556
+ && month >= this.endDate.getUTCMonth()
557
+ && day >= this.endDate.getUTCDate()
558
+ && hour >= this.endDate.getUTCHours()) {
494
559
  this.picker.find('.next').css({visibility: 'hidden'});
495
560
  } else {
496
561
  this.picker.find('.next').css({visibility: 'visible'});
497
562
  }
498
563
  break;
499
564
  case 1:
565
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()
566
+ && month <= this.startDate.getUTCMonth()
567
+ && day <= this.startDate.getUTCDate()) {
568
+ this.picker.find('.prev').css({visibility: 'hidden'});
569
+ } else {
570
+ this.picker.find('.prev').css({visibility: 'visible'});
571
+ }
572
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()
573
+ && month >= this.endDate.getUTCMonth()
574
+ && day >= this.endDate.getUTCDate()) {
575
+ this.picker.find('.next').css({visibility: 'hidden'});
576
+ } else {
577
+ this.picker.find('.next').css({visibility: 'visible'});
578
+ }
579
+ break;
500
580
  case 2:
581
+ if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()
582
+ && month <= this.startDate.getUTCMonth()) {
583
+ this.picker.find('.prev').css({visibility: 'hidden'});
584
+ } else {
585
+ this.picker.find('.prev').css({visibility: 'visible'});
586
+ }
587
+ if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()
588
+ && month >= this.endDate.getUTCMonth()) {
589
+ this.picker.find('.next').css({visibility: 'hidden'});
590
+ } else {
591
+ this.picker.find('.next').css({visibility: 'visible'});
592
+ }
593
+ break;
594
+ case 3:
595
+ case 4:
501
596
  if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()) {
502
597
  this.picker.find('.prev').css({visibility: 'hidden'});
503
598
  } else {
@@ -516,16 +611,25 @@
516
611
  e.stopPropagation();
517
612
  e.preventDefault();
518
613
 
519
- if ($(e.target).hasClass('datepicker-close')){
614
+ if ($(e.target).hasClass('datetimepicker-close')){
520
615
  this.hide();
521
616
  }
522
617
 
523
618
  var target = $(e.target).closest('span, td, th');
524
619
  if (target.length == 1) {
620
+ if (target.is('.disabled')) {
621
+ this.element.trigger({
622
+ type: 'outOfRange',
623
+ date: this.viewDate,
624
+ startDate: this.startDate,
625
+ endDate: this.endDate
626
+ });
627
+ return;
628
+ }
525
629
  switch(target[0].nodeName.toLowerCase()) {
526
630
  case 'th':
527
631
  switch(target[0].className) {
528
- case 'date-switch':
632
+ case 'switch':
529
633
  this.showMode(1);
530
634
  break;
531
635
  case 'prev':
@@ -533,10 +637,16 @@
533
637
  var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className == 'prev' ? -1 : 1);
534
638
  switch(this.viewMode){
535
639
  case 0:
536
- this.viewDate = this.moveMonth(this.viewDate, dir);
640
+ this.viewDate = this.moveHour(this.viewDate, dir);
537
641
  break;
538
642
  case 1:
643
+ this.viewDate = this.moveDate(this.viewDate, dir);
644
+ break;
539
645
  case 2:
646
+ this.viewDate = this.moveMonth(this.viewDate, dir);
647
+ break;
648
+ case 3:
649
+ case 4:
540
650
  this.viewDate = this.moveYear(this.viewDate, dir);
541
651
  break;
542
652
  }
@@ -544,41 +654,72 @@
544
654
  break;
545
655
  case 'today':
546
656
  var date = new Date();
547
- date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
657
+ date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
548
658
 
549
- this.showMode(-2);
550
- var which = this.todayBtn == 'linked' ? null : 'view';
551
- this._setDate(date, which);
659
+ this.viewMode = this.startViewMode;
660
+ this.showMode(0);
661
+ this._setDate(date);
552
662
  break;
553
663
  }
554
664
  break;
555
665
  case 'span':
556
666
  if (!target.is('.disabled')) {
557
- this.viewDate.setUTCDate(1);
558
667
  if (target.is('.month')) {
668
+ this.viewDate.setUTCDate(1);
559
669
  var month = target.parent().find('span').index(target);
560
670
  this.viewDate.setUTCMonth(month);
561
671
  this.element.trigger({
562
672
  type: 'changeMonth',
563
673
  date: this.viewDate
564
674
  });
565
- } else {
566
- var year = parseInt(target.text(), 10)||0;
675
+ } else if (target.is('.year')) {
676
+ this.viewDate.setUTCDate(1);
677
+ var year = parseInt(target.text(), 10) || 0;
567
678
  this.viewDate.setUTCFullYear(year);
568
679
  this.element.trigger({
569
680
  type: 'changeYear',
570
681
  date: this.viewDate
571
682
  });
683
+ } else if (target.is('.hour')){
684
+ var hours = parseInt(target.text(), 10) || 0;
685
+ var year = this.viewDate.getUTCFullYear(),
686
+ month = this.viewDate.getUTCMonth(),
687
+ day = this.viewDate.getUTCDate(),
688
+ minutes = this.viewDate.getUTCMinutes(),
689
+ seconds = this.viewDate.getUTCSeconds();
690
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
691
+ } else if (target.is('.minute')){
692
+ var minutes = parseInt(target.text().substr(target.text().indexOf(':')+1), 10) || 0;
693
+ var year = this.viewDate.getUTCFullYear(),
694
+ month = this.viewDate.getUTCMonth(),
695
+ day = this.viewDate.getUTCDate(),
696
+ hours = this.viewDate.getUTCHours(),
697
+ seconds = this.viewDate.getUTCSeconds();
698
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
699
+ }
700
+ if (this.viewMode != 0) {
701
+ var oldViewMode = this.viewMode;
702
+ this.showMode(-1);
703
+ this.fill();
704
+ if (oldViewMode == this.viewMode && this.autoclose) {
705
+ this.hide();
706
+ }
707
+ } else {
708
+ this.fill();
709
+ if (this.autoclose) {
710
+ this.hide();
711
+ }
572
712
  }
573
- this.showMode(-1);
574
- this.fill();
575
713
  }
576
714
  break;
577
715
  case 'td':
578
716
  if (target.is('.day') && !target.is('.disabled')){
579
- var day = parseInt(target.text(), 10)||1;
717
+ var day = parseInt(target.text(), 10) || 1;
580
718
  var year = this.viewDate.getUTCFullYear(),
581
- month = this.viewDate.getUTCMonth();
719
+ month = this.viewDate.getUTCMonth(),
720
+ hours = this.viewDate.getUTCHours(),
721
+ minutes = this.viewDate.getUTCMinutes(),
722
+ seconds = this.viewDate.getUTCSeconds();
582
723
  if (target.is('.old')) {
583
724
  if (month === 0) {
584
725
  month = 11;
@@ -594,7 +735,13 @@
594
735
  month += 1;
595
736
  }
596
737
  }
597
- this._setDate(UTCDate(year, month, day,0,0,0,0));
738
+ this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0));
739
+ }
740
+ var oldViewMode = this.viewMode;
741
+ this.showMode(-1);
742
+ this.fill();
743
+ if (oldViewMode == this.viewMode && this.autoclose) {
744
+ this.hide();
598
745
  }
599
746
  break;
600
747
  }
@@ -607,11 +754,11 @@
607
754
  if (!which || which == 'view')
608
755
  this.viewDate = date;
609
756
  this.fill();
610
- this.setValue();
611
757
  this.element.trigger({
612
758
  type: 'changeDate',
613
759
  date: this.date
614
760
  });
761
+ this.setValue();
615
762
  var element;
616
763
  if (this.isInput) {
617
764
  element = this.element;
@@ -621,11 +768,27 @@
621
768
  if (element) {
622
769
  element.change();
623
770
  if (this.autoclose && (!which || which == 'date')) {
624
- this.hide();
771
+ //this.hide();
625
772
  }
626
773
  }
627
774
  },
628
775
 
776
+ moveHour: function(date, dir){
777
+ if (!dir) return date;
778
+ var new_date = new Date(date.valueOf());
779
+ dir = dir > 0 ? 1 : -1;
780
+ new_date.setUTCHours(new_date.getUTCHours() + dir);
781
+ return new_date;
782
+ },
783
+
784
+ moveDate: function(date, dir){
785
+ if (!dir) return date;
786
+ var new_date = new Date(date.valueOf());
787
+ dir = dir > 0 ? 1 : -1;
788
+ new_date.setUTCDate(new_date.getUTCDate() + dir);
789
+ return new_date;
790
+ },
791
+
629
792
  moveMonth: function(date, dir){
630
793
  if (!dir) return date;
631
794
  var new_date = new Date(date.valueOf()),
@@ -765,32 +928,39 @@
765
928
 
766
929
  showMode: function(dir) {
767
930
  if (dir) {
768
- this.viewMode = Math.max(0, Math.min(2, this.viewMode + dir));
931
+ var newViewMode = Math.max(0, Math.min(DPGlobal.modes.length - 1, this.viewMode + dir));
932
+ if (newViewMode >= this.minView && newViewMode <= this.maxView) {
933
+ this.viewMode = newViewMode;
934
+ }
769
935
  }
770
936
  /*
771
- vitalets: fixing bug of very special conditions:
772
- jquery 1.7.1 + webkit + show inline datepicker in bootstrap popover.
773
- Method show() does not set display css correctly and datepicker is not shown.
774
- Changed to .css('display', 'block') solve the problem.
775
- See https://github.com/vitalets/x-editable/issues/37
937
+ vitalets: fixing bug of very special conditions:
938
+ jquery 1.7.1 + webkit + show inline datetimepicker in bootstrap popover.
939
+ Method show() does not set display css correctly and datetimepicker is not shown.
940
+ Changed to .css('display', 'block') solve the problem.
941
+ See https://github.com/vitalets/x-editable/issues/37
776
942
 
777
- In jquery 1.7.2+ everything works fine.
943
+ In jquery 1.7.2+ everything works fine.
778
944
  */
779
- //this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show();
780
- this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).css('display', 'block');
945
+ //this.picker.find('>div').hide().filter('.datetimepicker-'+DPGlobal.modes[this.viewMode].clsName).show();
946
+ this.picker.find('>div').hide().filter('.datetimepicker-'+DPGlobal.modes[this.viewMode].clsName).css('display', 'block');
781
947
  this.updateNavArrows();
948
+ },
949
+
950
+ reset: function(e) {
951
+ this._setDate(null, 'date');
782
952
  }
783
953
  };
784
954
 
785
- $.fn.fdatepicker = function ( option ) {
955
+ $.fn.fdatetimepicker = function ( option ) {
786
956
  var args = Array.apply(null, arguments);
787
957
  args.shift();
788
958
  return this.each(function () {
789
959
  var $this = $(this),
790
- data = $this.data('datepicker'),
960
+ data = $this.data('datetimepicker'),
791
961
  options = typeof option == 'object' && option;
792
962
  if (!data) {
793
- $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.fdatepicker.defaults,options))));
963
+ $this.data('datetimepicker', (data = new Datetimepicker(this, $.extend({}, $.fn.fdatetimepicker.defaults,options))));
794
964
  }
795
965
  if (typeof option == 'string' && typeof data[option] == 'function') {
796
966
  data[option].apply(data, args);
@@ -798,13 +968,10 @@
798
968
  });
799
969
  };
800
970
 
801
- $.fn.fdatepicker.defaults = {
802
- onRender: function(date) {
803
- return '';
804
- }
805
- };
806
- $.fn.fdatepicker.Constructor = Datepicker;
807
- var dates = $.fn.fdatepicker.dates = {
971
+ $.fn.fdatetimepicker.defaults = {
972
+ };
973
+ $.fn.fdatetimepicker.Constructor = Datetimepicker;
974
+ var dates = $.fn.fdatetimepicker.dates = {
808
975
  en: {
809
976
  days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
810
977
  daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
@@ -817,6 +984,16 @@
817
984
 
818
985
  var DPGlobal = {
819
986
  modes: [
987
+ {
988
+ clsName: 'minutes',
989
+ navFnc: 'Hours',
990
+ navStep: 1
991
+ },
992
+ {
993
+ clsName: 'hours',
994
+ navFnc: 'Date',
995
+ navStep: 1
996
+ },
820
997
  {
821
998
  clsName: 'days',
822
999
  navFnc: 'Month',
@@ -833,28 +1010,37 @@
833
1010
  navStep: 10
834
1011
  }],
835
1012
  isLeapYear: function (year) {
836
- return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));
1013
+ return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
837
1014
  },
838
1015
  getDaysInMonth: function (year, month) {
839
- return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
1016
+ return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
840
1017
  },
841
- validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
842
- nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g,
1018
+ validParts: /hh?|ii?|ss?|dd?|mm?|MM?|yy(?:yy)?/g,
1019
+ nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\rTZ]+/g,
843
1020
  parseFormat: function(format){
844
1021
  // IE treats \0 as a string end in inputs (truncating the value),
845
1022
  // so it's a bad format delimiter, anyway
846
1023
  var separators = format.replace(this.validParts, '\0').split('\0'),
847
1024
  parts = format.match(this.validParts);
848
- if (!separators || !separators.length || !parts || parts.length === 0){
1025
+ if (!separators || !separators.length || !parts || parts.length == 0){
849
1026
  throw new Error("Invalid date format.");
850
1027
  }
851
1028
  return {separators: separators, parts: parts};
852
1029
  },
853
1030
  parseDate: function(date, format, language) {
854
- if (date instanceof Date) return date;
855
- if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)) {
856
- var part_re = /([\-+]\d+)([dmwy])/,
857
- parts = date.match(/([\-+]\d+)([dmwy])/g),
1031
+ if (date instanceof Date) return new Date(date.valueOf() - date.getTimezoneOffset() * 60000);
1032
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(date)) {
1033
+ format = this.parseFormat('yyyy-mm-dd');
1034
+ }
1035
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(date)) {
1036
+ format = this.parseFormat('yyyy-mm-dd hh:ii');
1037
+ }
1038
+ if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(date)) {
1039
+ format = this.parseFormat('yyyy-mm-dd hh:ii:ss');
1040
+ }
1041
+ if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) {
1042
+ var part_re = /([-+]\d+)([dmwy])/,
1043
+ parts = date.match(/([-+]\d+)([dmwy])/g),
858
1044
  part, dir;
859
1045
  date = new Date();
860
1046
  for (var i=0; i<parts.length; i++) {
@@ -865,23 +1051,29 @@
865
1051
  date.setUTCDate(date.getUTCDate() + dir);
866
1052
  break;
867
1053
  case 'm':
868
- date = Datepicker.prototype.moveMonth.call(Datepicker.prototype, date, dir);
1054
+ date = Datetimepicker.prototype.moveMonth.call(Datetimepicker.prototype, date, dir);
869
1055
  break;
870
1056
  case 'w':
871
1057
  date.setUTCDate(date.getUTCDate() + dir * 7);
872
1058
  break;
873
1059
  case 'y':
874
- date = Datepicker.prototype.moveYear.call(Datepicker.prototype, date, dir);
1060
+ date = Datetimepicker.prototype.moveYear.call(Datetimepicker.prototype, date, dir);
875
1061
  break;
876
1062
  }
877
1063
  }
878
- return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);
1064
+ return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
879
1065
  }
880
1066
  var parts = date && date.match(this.nonpunctuation) || [],
881
1067
  date = new Date(),
882
1068
  parsed = {},
883
- setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
1069
+ setters_order = ['hh', 'h', 'ii', 'i', 'ss', 's', 'yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
884
1070
  setters_map = {
1071
+ hh: function(d,v){ return d.setUTCHours(v); },
1072
+ h: function(d,v){ return d.setUTCHours(v); },
1073
+ ii: function(d,v){ return d.setUTCMinutes(v); },
1074
+ i: function(d,v){ return d.setUTCMinutes(v); },
1075
+ ss: function(d,v){ return d.setUTCSeconds(v); },
1076
+ s: function(d,v){ return d.setUTCSeconds(v); },
885
1077
  yyyy: function(d,v){ return d.setUTCFullYear(v); },
886
1078
  yy: function(d,v){ return d.setUTCFullYear(2000+v); },
887
1079
  m: function(d,v){
@@ -898,19 +1090,11 @@
898
1090
  val, filtered, part;
899
1091
  setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
900
1092
  setters_map['dd'] = setters_map['d'];
901
- date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
902
- var fparts = format.parts.slice();
903
- // Remove noop parts
904
- if (parts.length != fparts.length) {
905
- fparts = $(fparts).filter(function(i,p){
906
- return $.inArray(p, setters_order) !== -1;
907
- }).toArray();
908
- }
909
- // Process remainder
910
- if (parts.length == fparts.length) {
911
- for (var i=0, cnt = fparts.length; i < cnt; i++) {
1093
+ date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);//date.getHours(), date.getMinutes(), date.getSeconds());
1094
+ if (parts.length == format.parts.length) {
1095
+ for (var i=0, cnt = format.parts.length; i < cnt; i++) {
912
1096
  val = parseInt(parts[i], 10);
913
- part = fparts[i];
1097
+ part = format.parts[i];
914
1098
  if (isNaN(val)) {
915
1099
  switch(part) {
916
1100
  case 'MM':
@@ -936,69 +1120,115 @@
936
1120
  for (var i=0, s; i<setters_order.length; i++){
937
1121
  s = setters_order[i];
938
1122
  if (s in parsed && !isNaN(parsed[s]))
939
- setters_map[s](date, parsed[s]);
1123
+ setters_map[s](date, parsed[s])
940
1124
  }
941
1125
  }
942
1126
  return date;
943
1127
  },
944
1128
  formatDate: function(date, format, language){
1129
+ if (date == null) {
1130
+ return '';
1131
+ }
945
1132
  var val = {
1133
+ h: date.getUTCHours(),
1134
+ i: date.getUTCMinutes(),
1135
+ s: date.getUTCSeconds(),
946
1136
  d: date.getUTCDate(),
947
- D: dates[language].daysShort[date.getUTCDay()],
948
- DD: dates[language].days[date.getUTCDay()],
949
1137
  m: date.getUTCMonth() + 1,
950
1138
  M: dates[language].monthsShort[date.getUTCMonth()],
951
1139
  MM: dates[language].months[date.getUTCMonth()],
952
1140
  yy: date.getUTCFullYear().toString().substring(2),
953
1141
  yyyy: date.getUTCFullYear()
954
1142
  };
1143
+ val.hh = (val.h < 10 ? '0' : '') + val.h;
1144
+ val.ii = (val.i < 10 ? '0' : '') + val.i;
1145
+ val.ss = (val.s < 10 ? '0' : '') + val.s;
955
1146
  val.dd = (val.d < 10 ? '0' : '') + val.d;
956
1147
  val.mm = (val.m < 10 ? '0' : '') + val.m;
957
1148
  var date = [],
958
1149
  seps = $.extend([], format.separators);
959
1150
  for (var i=0, cnt = format.parts.length; i < cnt; i++) {
960
1151
  if (seps.length)
961
- date.push(seps.shift());
1152
+ date.push(seps.shift())
962
1153
  date.push(val[format.parts[i]]);
963
1154
  }
964
1155
  return date.join('');
965
1156
  },
1157
+ convertViewMode: function(viewMode){
1158
+ switch (viewMode) {
1159
+ case 4:
1160
+ case 'decade':
1161
+ viewMode = 4;
1162
+ break;
1163
+ case 3:
1164
+ case 'year':
1165
+ viewMode = 3;
1166
+ break;
1167
+ case 2:
1168
+ case 'month':
1169
+ viewMode = 2;
1170
+ break;
1171
+ case 1:
1172
+ case 'day':
1173
+ viewMode = 1;
1174
+ break;
1175
+ case 0:
1176
+ case 'hour':
1177
+ viewMode = 0;
1178
+ break;
1179
+ }
1180
+
1181
+ return viewMode;
1182
+ },
966
1183
  headTemplate: '<thead>'+
967
1184
  '<tr>'+
968
1185
  '<th class="prev"><i class="icon-chevron-left"/></th>'+
969
- '<th colspan="5" class="date-switch"></th>'+
1186
+ '<th colspan="5" class="switch"></th>'+
970
1187
  '<th class="next"><i class="icon-chevron-right"/></th>'+
971
1188
  '</tr>'+
972
1189
  '</thead>',
973
1190
  contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
974
1191
  footTemplate: '<tfoot><tr><th colspan="7" class="today"></th></tr></tfoot>'
975
1192
  };
976
- DPGlobal.template = '<div class="datepicker">'+
977
-
978
- '<div class="datepicker-days">'+
1193
+ DPGlobal.template = '<div class="datetimepicker">'+
1194
+ '<div class="datetimepicker-minutes">'+
1195
+ '<table class=" table-condensed">'+
1196
+ DPGlobal.headTemplate+
1197
+ DPGlobal.contTemplate+
1198
+ DPGlobal.footTemplate+
1199
+ '</table>'+
1200
+ '</div>'+
1201
+ '<div class="datetimepicker-hours">'+
1202
+ '<table class=" table-condensed">'+
1203
+ DPGlobal.headTemplate+
1204
+ DPGlobal.contTemplate+
1205
+ DPGlobal.footTemplate+
1206
+ '</table>'+
1207
+ '</div>'+
1208
+ '<div class="datetimepicker-days">'+
979
1209
  '<table class=" table-condensed">'+
980
1210
  DPGlobal.headTemplate+
981
1211
  '<tbody></tbody>'+
982
1212
  DPGlobal.footTemplate+
983
1213
  '</table>'+
984
1214
  '</div>'+
985
- '<div class="datepicker-months">'+
1215
+ '<div class="datetimepicker-months">'+
986
1216
  '<table class="table-condensed">'+
987
1217
  DPGlobal.headTemplate+
988
1218
  DPGlobal.contTemplate+
989
1219
  DPGlobal.footTemplate+
990
1220
  '</table>'+
991
1221
  '</div>'+
992
- '<div class="datepicker-years">'+
1222
+ '<div class="datetimepicker-years">'+
993
1223
  '<table class="table-condensed">'+
994
1224
  DPGlobal.headTemplate+
995
1225
  DPGlobal.contTemplate+
996
1226
  DPGlobal.footTemplate+
997
1227
  '</table>'+
998
1228
  '</div>'+
999
- '<a class="button datepicker-close small alert right" style="width:auto;"><i class="icon-remove"></i></a>'+
1229
+ '<a class="button datetimepicker-close small alert right" style="width:auto;"><i class="icon-remove"></i></a>'+
1000
1230
  '</div>';
1001
1231
 
1002
- $.fn.fdatepicker.DPGlobal = DPGlobal;
1232
+ $.fn.fdatetimepicker.DPGlobal = DPGlobal;
1003
1233
 
1004
1234
  }( window.jQuery );
@@ -1,8 +1,8 @@
1
1
  /*
2
2
  .datepicker {
3
3
  .prev, .next {font-style:normal;}
4
- .prev:after {content:"«";}
5
- .next:after {content:"»";}
4
+ .prev:after {content:"«";}
5
+ .next:after {content:"»";}
6
6
  }
7
7
  */
8
8
  /*!
@@ -16,5 +16,5 @@
16
16
  * Improvements by Andrew Rowls
17
17
  * Licensed under the Apache License v2.0
18
18
  * http://www.apache.org/licenses/LICENSE-2.0
19
- */.datepicker.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;color:#333;font-family:"Open Sans",sans-serif;font-size:13px;line-height:18px}.datepicker.dropdown-menu th,.datepicker.dropdown-menu td{padding:4px 5px}.datepicker{display:none;position:absolute;padding:4px;margin-top:1px;direction:ltr}.datepicker-inline{width:220px}.datepicker-rtl{direction:rtl}.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);position:absolute;top:-7px;left:6px}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.datepicker>div{display:none}.datepicker.days div.datepicker-days{display:block}.datepicker.months div.datepicker-months{display:block}.datepicker.years div.datepicker-years{display:block}.datepicker table{border:0;margin:0}.datepicker td,.datepicker th{text-align:center;width:20px;height:20px;border:0;font-size:12px;padding:4px 8px;background:#fff;cursor:pointer}.datepicker td.active.day,.datepicker th.active.day{background:#2ba6cb}.datepicker td.active.year,.datepicker th.active.year{background:#2ba6cb}.datepicker td span.active,.datepicker th span.active{background:#2ba6cb}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer}.datepicker th.date-switch{width:145px}.datepicker thead tr:first-child th,.datepicker tfoot tr:first-child th{cursor:pointer}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child th.cw{cursor:default;background-color:transparent}.datepicker-dropdown::before,.datepicker-dropdown::after{display:none}.datepicker-close{position:absolute;top:-30px;right:0;width:15px;height:30px;padding:0;display:none}.datepicker td.old,.datepicker td.new{color:#999}.datepicker td.day.disabled{color:#eee}
20
- /* This beautiful CSS-File has been crafted with LESS (lesscss.org) and compiled by simpLESS (wearekiss.com/simpless) */
19
+ */.datetimepicker.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;color:#333;font-family:"Open Sans",sans-serif;font-size:13px;line-height:18px}.datetimepicker.dropdown-menu th,.datetimepicker.dropdown-menu td{padding:4px 5px}.datetimepicker{display:none;position:absolute;padding:4px;margin-top:1px;direction:ltr}.datetimepicker-inline{width:220px;display:none}.datetimepicker-rtl{direction:rtl}.datetimepicker-rtl table tr td span{float:right}.datetimepicker-dropdown{top:0;left:0}.datetimepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);position:absolute;top:-7px;left:6px}.datetimepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.datetimepicker>div{display:none}.datetimepicker.days div.datepicker-days{display:block}.datetimepicker.months div.datepicker-months{display:block}.datetimepicker.years div.datepicker-years{display:block}.datetimepicker table{border:0;margin:0}.datetimepicker td,.datetimepicker th{text-align:center;width:20px;height:20px;border:0;font-size:12px;padding:4px 8px;background:#fff;cursor:pointer}.datetimepicker td.active.day,.datetimepicker th.active.day{background:#2ba6cb}.datetimepicker td.active.year,.datetimepicker th.active.year{background:#2ba6cb}.datetimepicker td span.active,.datetimepicker th span.active{background:#2ba6cb}.table-striped .datetimepicker table tr td,.table-striped .datetimepicker table tr th{background-color:transparent}.datetimepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer}.datetimepicker th.switch{width:145px}.datetimepicker thead tr:first-child th,.datetimepicker tfoot tr:first-child th{cursor:pointer}.datetimepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datetimepicker thead tr:first-child th.cw{cursor:default;background-color:transparent}.datetimepicker-dropdown::before,.datetimepicker-dropdown::after{display:none}.datetimepicker-close{position:absolute;top:-30px;right:0;width:15px;height:30px;padding:0;display:none}
20
+ /* This beautiful CSS-File has been crafted with LESS (lesscss.org) and compiled by simpLESS (wearekiss.com/simpless) */
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foundation-datetimepicker-rails
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 1
10
- version: 0.1.1
9
+ - 2
10
+ version: 0.1.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ali Ibrahim