jquery-timepicker-rails 1.2.5.0 → 1.3.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 05a01eddbe0f274448f77ffaa36ada2bc2f75b00
4
+ data.tar.gz: d52cfce42dfa37d144f673fb90d54c468b870926
5
+ SHA512:
6
+ metadata.gz: d8021357d8803771eaec9cddb5e42685ba8f340166b0bc7c9c2d0a84b4ac00fca0e2c383b770575b70fa47bd7167dd238a7a152d5a31c233867ef8037ca3920a
7
+ data.tar.gz: cb87077aac414733be31d7d900de65f2a7819198ecc0e50bcfdc41f52a6163a72a897677b70a8b9b036e9c1b8c08f1a5ea981bb98496725525d211834760b1cb
data/README.md CHANGED
@@ -27,9 +27,9 @@ Add the following stylesheet file to `app/assets/stylesheets/application.css`:
27
27
 
28
28
  *= require jquery.timepicker.css
29
29
 
30
- Optionally, you can also use `datepair.js`:
30
+ Optionally, you can also use `jquery.datepair.js`:
31
31
 
32
- //= require datepair.js
32
+ //= require jquery.datepair.js
33
33
 
34
34
  Most people will prefer to copy-paste this file in order to customize it.
35
35
 
@@ -39,4 +39,4 @@ jquery-timepicker depends on jQuery and [bootstrap-datepicker](http://github.com
39
39
 
40
40
  jquery-timepicker is being developed by [Jon Thornton](http://jonthornton.com/) and is under [MIT license](http://en.wikipedia.org/wiki/MIT_License).
41
41
 
42
- This gem is also licensed under [MIT license](https://raw.github.com/tkrotoff/jquery-timepicker-rails/master/LICENSE).
42
+ This gem is also licensed under [MIT license](https://raw.github.com/tkrotoff/jquery-timepicker-rails/master/LICENSE.txt).
@@ -6,11 +6,11 @@ require 'jquery-timepicker-rails/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "jquery-timepicker-rails"
8
8
  spec.version = Jquery::Timepicker::Rails::VERSION
9
- spec.authors = ["Tanguy Krotoff (jQuery plugin by Jon Thornton)"]
9
+ spec.authors = ["Tanguy Krotoff (jQuery plugin by Jon Thornton)", "Fabio Cantoni"]
10
10
  spec.email = ["tkrotoff@gmail.com"]
11
11
  spec.description = %q{A jQuery timepicker plugin inspired by Google Calendar}
12
12
  spec.summary = %q{jquery-timepicker packaged for the Rails 3.1+ asset pipeline}
13
- spec.homepage = "http://github.com/tkrotoff/jquery-timepicker-rails"
13
+ spec.homepage = "https://github.com/cover/jquery-timepicker-rails"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Timepicker
3
3
  module Rails
4
- VERSION = "1.2.5.0"
4
+ VERSION = "1.3.3"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,305 @@
1
+ /************************
2
+ jquery-datepair v1.2.13
3
+ http://jonthornton.github.com/jquery-datepair/
4
+
5
+ requires jQuery 1.7+
6
+ ************************/
7
+
8
+
9
+ (function (factory) {
10
+ if (typeof define === 'function' && define.amd) {
11
+ // AMD. Register as an anonymous module.
12
+ define(['jquery'], factory);
13
+ } else {
14
+ // Browser globals
15
+ factory(jQuery);
16
+ }
17
+ }(function ($) {
18
+ var _ONE_DAY = 86400000;
19
+ var _defaults = {
20
+ startClass: 'start',
21
+ endClass: 'end',
22
+ timeClass: 'time',
23
+ dateClass: 'date',
24
+ defaultDateDelta: 0,
25
+ defaultTimeDelta: 3600000,
26
+ parseTime: function($input){
27
+ return $input.timepicker('getTime');
28
+ },
29
+ updateTime: function($input, dateObj){
30
+ $input.timepicker('setTime', dateObj);
31
+ },
32
+ parseDate: function($input){
33
+ return $input.datepicker('getDate');
34
+ },
35
+ updateDate: function($input, dateObj){
36
+ $input.datepicker('update', dateObj);
37
+ },
38
+ setMinTime: function($input, dateObj){
39
+ $input.timepicker('option', 'minTime', dateObj);
40
+ }
41
+ };
42
+
43
+ var methods =
44
+ {
45
+ init: function(options)
46
+ {
47
+ return this.each(function()
48
+ {
49
+ var $self = $(this);
50
+
51
+ var settings = $.extend({}, _defaults);
52
+
53
+ if (options) {
54
+ settings = $.extend(settings, options);
55
+ }
56
+
57
+ settings = _parseSettings(settings);
58
+
59
+ $self.data('datepair-settings', settings);
60
+ _bindChangeHandler($self);
61
+
62
+ // initialize datepair-datedelta
63
+ var $startDateInput = _getStartDateInput($self);
64
+ var $endDateInput = _getEndDateInput($self);
65
+
66
+ if ($startDateInput.val() && $endDateInput.val()) {
67
+ var startDate = settings.parseDate($startDateInput);
68
+ var endDate = settings.parseDate($endDateInput);
69
+ $self.data('datepair-datedelta', endDate.getTime() - startDate.getTime());
70
+ }
71
+
72
+ // initialize datepair-timedelta
73
+ var $startTimeInput = _getStartTimeInput($self);
74
+ var $endTimeInput = _getEndTimeInput($self);
75
+
76
+ if ($startTimeInput.val() && $endTimeInput.val()) {
77
+ var startTime = settings.parseTime($startTimeInput);
78
+ var endTime = settings.parseTime($endTimeInput);
79
+ $self.data('datepair-timedelta', endTime.getTime() - startTime.getTime());
80
+ }
81
+
82
+ _updateEndMintime($self);
83
+ });
84
+ },
85
+
86
+ option: function(key, value)
87
+ {
88
+ var self = this;
89
+ var settings = self.data('datepair-settings');
90
+
91
+ if (typeof key == 'object') {
92
+ settings = $.extend(settings, key);
93
+
94
+ } else if (typeof key == 'string' && typeof value != 'undefined') {
95
+ settings[key] = value;
96
+
97
+ } else if (typeof key == 'string') {
98
+ return settings[key];
99
+ }
100
+
101
+ settings = _parseSettings(settings);
102
+
103
+ self.data('datepair-settings', settings);
104
+
105
+ return self;
106
+ },
107
+
108
+ remove: function()
109
+ {
110
+ var self = this;
111
+ self.removeData('datepair-settings');
112
+ self.off('.timepicker');
113
+ }
114
+ };
115
+
116
+ // private methods
117
+
118
+ function _parseSettings(settings)
119
+ {
120
+ // if (settings.startClass) {
121
+ // settings.minTime = _time2int(settings.minTime);
122
+ // }
123
+
124
+ return settings;
125
+ }
126
+
127
+ function _bindChangeHandler($self)
128
+ {
129
+ $self.on('change.datepair', null, _inputChanged);
130
+ }
131
+
132
+ function _unbindChangeHandler($self)
133
+ {
134
+ $self.off('change.datepair');
135
+ }
136
+
137
+ function _inputChanged(e)
138
+ {
139
+ var $self = $(this);
140
+
141
+ // temporarily unbind the change handler to prevent triggering this
142
+ // if we update other inputs
143
+ _unbindChangeHandler($self);
144
+
145
+ var settings = $self.data('datepair-settings');
146
+ var $target = $(e.target);
147
+
148
+ if ($target.val() != '') {
149
+ if ($target.hasClass(settings.dateClass)) {
150
+ _dateChanged($self, $target);
151
+
152
+ } else if ($target.hasClass(settings.timeClass)) {
153
+ _timeChanged($self, $target);
154
+ }
155
+ }
156
+
157
+ _bindChangeHandler($self);
158
+ }
159
+
160
+ function _getStartDateInput($self)
161
+ {
162
+ var settings = $self.data('datepair-settings');
163
+ return $self.find('.'+settings.startClass+'.'+settings.dateClass);
164
+ }
165
+
166
+ function _getEndDateInput($self)
167
+ {
168
+ var settings = $self.data('datepair-settings');
169
+ return $self.find('.'+settings.endClass+'.'+settings.dateClass);
170
+ }
171
+
172
+ function _getStartTimeInput($self)
173
+ {
174
+ var settings = $self.data('datepair-settings');
175
+ return $self.find('.'+settings.startClass+'.'+settings.timeClass);
176
+ }
177
+
178
+ function _getEndTimeInput($self)
179
+ {
180
+ var settings = $self.data('datepair-settings');
181
+ return $self.find('.'+settings.endClass+'.'+settings.timeClass);
182
+ }
183
+
184
+ function _dateChanged($self, $target)
185
+ {
186
+ var settings = $self.data('datepair-settings');
187
+
188
+ var $startDateInput = _getStartDateInput($self);
189
+ var $endDateInput = _getEndDateInput($self);
190
+
191
+ if (!$startDateInput.val() || !$endDateInput.val()) {
192
+ if (settings.defaultDateDelta !== null) {
193
+ if ($startDateInput.val()) {
194
+ var startDate = settings.parseDate($startDateInput);
195
+ var newEnd = new Date(startDate.getTime() + settings.defaultDateDelta * _ONE_DAY);
196
+ settings.updateDate($endDateInput, newEnd);
197
+ } else if ($endDateInput.val()) {
198
+ var endDate = settings.parseDate($endDateInput);
199
+ var newStart = new Date(endDate.getTime() + settings.defaultDateDelta * _ONE_DAY);
200
+ settings.updateDate($startDateInput, newStart);
201
+ }
202
+
203
+ $self.data('datepair-datedelta', settings.defaultDateDelta * _ONE_DAY);
204
+ } else {
205
+ $self.data('datepair-datedelta', null);
206
+ }
207
+
208
+ _updateEndMintime($self);
209
+ return;
210
+ }
211
+
212
+ var startDate = settings.parseDate($startDateInput);
213
+ var endDate = settings.parseDate($endDateInput);
214
+
215
+ if ($target.hasClass(settings.startClass)) {
216
+ var newEndDate = new Date(startDate.getTime()+$self.data('datepair-datedelta'));
217
+ settings.updateDate($endDateInput, newEndDate);
218
+ } else if ($target.hasClass(settings.endClass)) {
219
+ if (endDate < startDate) {
220
+ $self.data('datepair-datedelta', 0);
221
+ settings.updateDate($startDateInput, endDate);
222
+ } else {
223
+ $self.data('datepair-datedelta', endDate.getTime() - startDate.getTime());
224
+ }
225
+ }
226
+
227
+ _updateEndMintime($self);
228
+ }
229
+
230
+ function _updateEndMintime($self)
231
+ {
232
+ var settings = $self.data('datepair-settings');
233
+ if (typeof settings.setMinTime != 'function') return;
234
+
235
+ var startTime;
236
+ if ($self.data('datepair-datedelta') <= _ONE_DAY || !$self.data('datepair-datedelta')) {
237
+ var $startTimeInput = _getStartTimeInput($self);
238
+ var startTime = settings.parseTime($startTimeInput);
239
+ }
240
+
241
+ var $endTimeInput = _getEndTimeInput($self);
242
+ settings.setMinTime($endTimeInput, startTime);
243
+ }
244
+
245
+ function _timeChanged($self, $target)
246
+ {
247
+ var settings = $self.data('datepair-settings');
248
+
249
+ var $startTimeInput = _getStartTimeInput($self);
250
+ var $endTimeInput = _getEndTimeInput($self);
251
+
252
+ if (!$startTimeInput.val() || !$endTimeInput.val()) {
253
+ if (settings.defaultTimeDelta !== null) {
254
+ if ($startTimeInput.val()) {
255
+ var startTime = settings.parseTime($startTimeInput);
256
+ var newEnd = new Date(startTime.getTime() + settings.defaultTimeDelta);
257
+ settings.updateTime($endTimeInput, newEnd);
258
+ } else if ($endTimeInput.val()) {
259
+ var endTime = settings.parseTime($endTimeInput);
260
+ var newStart = new Date(endDate.getTime() + settings.defaultTimeDelta);
261
+ settings.updateTime($startTimeInput, newStart);
262
+ }
263
+
264
+ $self.data('datepair-timedelta', settings.defaultTimeDelta);
265
+ } else {
266
+ $self.data('datepair-timedelta', null);
267
+ }
268
+
269
+ _updateEndMintime($self);
270
+ return;
271
+ }
272
+
273
+ var startTime = settings.parseTime($startTimeInput);
274
+ var endTime = settings.parseTime($endTimeInput);
275
+
276
+ if ($target.hasClass(settings.startClass)) {
277
+ var newEndTime = new Date(startTime.getTime()+$self.data('datepair-timedelta'));
278
+ settings.updateTime($endTimeInput, newEndTime);
279
+ endTime = settings.parseTime($endTimeInput);
280
+ }
281
+
282
+ if ((endTime.getTime() - startTime.getTime()) * $self.data('datepair-timedelta') < 0) {
283
+ var $endDateInput = _getEndDateInput($self);
284
+ var endDate = settings.parseDate($endDateInput);
285
+ var offset = (endTime < startTime) ? _ONE_DAY : -1 * _ONE_DAY;
286
+
287
+ settings.updateDate($endDateInput, new Date(endDate.getTime() + offset));
288
+ var newDelta = $self.data('datepair-timedelta') + offset;
289
+ $self.data('datepair-timedelta', newDelta);
290
+ }
291
+
292
+ $self.data('datepair-timedelta', endTime.getTime() - startTime.getTime());
293
+
294
+ _updateEndMintime($self);
295
+ }
296
+
297
+
298
+ // Plugin entry
299
+ $.fn.datepair = function(method)
300
+ {
301
+ if(methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); }
302
+ else if(typeof method === "object" || !method) { return methods.init.apply(this, arguments); }
303
+ else { $.error("Method "+ method + " does not exist on jQuery.datepair"); }
304
+ };
305
+ }));
@@ -1,5 +1,5 @@
1
1
  /************************
2
- jquery-timepicker v1.2.5
2
+ jquery-timepicker v1.3.3
3
3
  http://jonthornton.github.com/jquery-timepicker/
4
4
 
5
5
  requires jQuery 1.7+
@@ -28,12 +28,13 @@ requires jQuery 1.7+
28
28
  scrollDefaultNow: false,
29
29
  scrollDefaultTime: false,
30
30
  selectOnBlur: false,
31
- disableTouchKeyboard: true,
31
+ disableTouchKeyboard: false,
32
32
  forceRoundTime: false,
33
33
  appendTo: 'body',
34
34
  disableTimeRanges: [],
35
35
  closeOnWindowScroll: false,
36
- disableTextInput: false
36
+ typeaheadHighlight: true,
37
+ noneOption: false
37
38
  };
38
39
  var _lang = {
39
40
  decimal: '.',
@@ -50,49 +51,52 @@ requires jQuery 1.7+
50
51
  {
51
52
  var self = $(this);
52
53
 
53
- // convert dropdowns to text input
54
- if (self[0].tagName == 'SELECT') {
55
- var attrs = { 'type': 'text', 'value': self.val() };
56
- var raw_attrs = self[0].attributes;
57
-
58
- for (var i=0; i < raw_attrs.length; i++) {
59
- attrs[raw_attrs[i].nodeName] = raw_attrs[i].nodeValue;
54
+ // pick up settings from data attributes
55
+ var attributeOptions = [];
56
+ for (key in _defaults) {
57
+ if (self.data(key)) {
58
+ attributeOptions[key] = self.data(key);
60
59
  }
61
-
62
- var input = $('<input />', attrs);
63
- self.replaceWith(input);
64
- self = input;
65
60
  }
66
61
 
67
- var settings = $.extend({}, _defaults);
68
-
69
- if (options) {
70
- settings = $.extend(settings, options);
71
- }
62
+ var settings = $.extend({}, _defaults, attributeOptions, options);
72
63
 
73
64
  if (settings.lang) {
74
65
  _lang = $.extend(_lang, settings.lang);
75
66
  }
76
67
 
77
68
  settings = _parseSettings(settings);
78
-
79
69
  self.data('timepicker-settings', settings);
80
- self.prop('autocomplete', 'off');
81
- self.on('click.timepicker focus.timepicker', methods.show);
82
- self.on('change.timepicker', _formatValue);
83
- self.on('keydown.timepicker', _keydownhandler);
84
- self.on('keyup.timepicker', _keyuphandler);
85
70
  self.addClass('ui-timepicker-input');
86
71
 
87
- _formatValue.call(self.get(0));
72
+ if (settings.useSelect) {
73
+ _render(self);
74
+ } else {
75
+ self.prop('autocomplete', 'off');
76
+ self.on('click.timepicker focus.timepicker', methods.show);
77
+ self.on('change.timepicker', _formatValue);
78
+ self.on('keydown.timepicker', _keydownhandler);
79
+ self.on('keyup.timepicker', _keyuphandler);
80
+
81
+ _formatValue.call(self.get(0));
82
+ }
88
83
  });
89
84
  },
90
85
 
91
86
  show: function(e)
92
87
  {
88
+ if (e) {
89
+ e.preventDefault();
90
+ }
91
+
93
92
  var self = $(this);
94
93
  var settings = self.data('timepicker-settings');
95
94
 
95
+ if (settings.useSelect) {
96
+ self.data('timepicker-list').focus();
97
+ return;
98
+ }
99
+
96
100
  if (_hideKeyboard(self)) {
97
101
  // block the keyboard on mobile devices
98
102
  self.blur();
@@ -154,13 +158,26 @@ requires jQuery 1.7+
154
158
  list.scrollTop(0);
155
159
  }
156
160
 
157
- _attachCloseHandler(settings);
161
+ // attach close handlers
162
+ $(document).on('touchstart.ui-timepicker mousedown.ui-timepicker', _closeHandler);
163
+ if (settings.closeOnWindowScroll) {
164
+ $(document).on('scroll.ui-timepicker', _closeHandler);
165
+ }
158
166
 
159
167
  self.trigger('showTimepicker');
168
+
169
+ return this;
160
170
  },
161
171
 
162
172
  hide: function(e)
163
173
  {
174
+ var self = $(this);
175
+ var settings = self.data('timepicker-settings');
176
+
177
+ if (settings && settings.useSelect) {
178
+ self.blur();
179
+ }
180
+
164
181
  $('.ui-timepicker-wrapper:visible').each(function() {
165
182
  var list = $(this);
166
183
  var self = list.data('timepicker-input');
@@ -173,6 +190,8 @@ requires jQuery 1.7+
173
190
  list.hide();
174
191
  self.trigger('hideTimepicker');
175
192
  });
193
+
194
+ return this;
176
195
  },
177
196
 
178
197
  option: function(key, value)
@@ -200,7 +219,11 @@ requires jQuery 1.7+
200
219
  self.data('timepicker-list', false);
201
220
  }
202
221
 
203
- return self;
222
+ if (settings.useSelect) {
223
+ _render(self);
224
+ }
225
+
226
+ return this;
204
227
  },
205
228
 
206
229
  getSecondsFromMidnight: function()
@@ -211,12 +234,18 @@ requires jQuery 1.7+
211
234
  getTime: function(relative_date)
212
235
  {
213
236
  var self = this;
237
+
238
+ var time_string = _getTimeValue(self);
239
+ if (!time_string) {
240
+ return null;
241
+ }
242
+
214
243
  if (!relative_date) {
215
244
  relative_date = new Date();
216
245
  }
217
246
 
218
247
  relative_date.setHours(0, 0, 0, 0);
219
- return new Date(relative_date.valueOf() + (_time2int(_getTimeValue(self))*1000));
248
+ return new Date(relative_date.valueOf() + (_time2int(time_string)*1000));
220
249
  },
221
250
 
222
251
  setTime: function(value)
@@ -228,6 +257,8 @@ requires jQuery 1.7+
228
257
  if (self.data('timepicker-list')) {
229
258
  _setSelected(self, self.data('timepicker-list'));
230
259
  }
260
+
261
+ return this;
231
262
  },
232
263
 
233
264
  remove: function()
@@ -250,6 +281,8 @@ requires jQuery 1.7+
250
281
  }
251
282
 
252
283
  self.removeData('timepicker-list');
284
+
285
+ return this;
253
286
  }
254
287
  };
255
288
 
@@ -282,6 +315,17 @@ requires jQuery 1.7+
282
315
  settings.disableTimeRanges = settings.disableTimeRanges.sort(function(a, b){
283
316
  return a[0] - b[0];
284
317
  });
318
+
319
+ // merge any overlapping ranges
320
+ for (var i = settings.disableTimeRanges.length-1; i > 0; i--) {
321
+ if (settings.disableTimeRanges[i][0] <= settings.disableTimeRanges[i-1][1]) {
322
+ settings.disableTimeRanges[i-1] = [
323
+ Math.min(settings.disableTimeRanges[i][0], settings.disableTimeRanges[i-1][0]),
324
+ Math.max(settings.disableTimeRanges[i][1], settings.disableTimeRanges[i-1][1])
325
+ ];
326
+ settings.disableTimeRanges.splice(i, 1);
327
+ }
328
+ }
285
329
  }
286
330
 
287
331
  return settings;
@@ -297,11 +341,25 @@ requires jQuery 1.7+
297
341
  self.data('timepicker-list', false);
298
342
  }
299
343
 
300
- list = $('<ul />', { 'class': 'ui-timepicker-list' });
344
+ if (settings.useSelect) {
345
+ list = $('<select />', { 'class': 'ui-timepicker-select' });
346
+ var wrapped_list = list;
347
+ } else {
348
+ list = $('<ul />', { 'class': 'ui-timepicker-list' });
301
349
 
302
- var wrapped_list = $('<div />', { 'class': 'ui-timepicker-wrapper', 'tabindex': -1 });
303
- wrapped_list.css({'display':'none', 'position': 'absolute' }).append(list);
350
+ var wrapped_list = $('<div />', { 'class': 'ui-timepicker-wrapper', 'tabindex': -1 });
351
+ wrapped_list.css({'display':'none', 'position': 'absolute' }).append(list);
352
+ }
304
353
 
354
+ if (settings.noneOption) {
355
+ var defaultLabel = (settings.useSelect) ? 'Time...' : 'None';
356
+ var label = (typeof settings.noneOption == 'string') ? settings.noneOption : defaultLabel;
357
+ if (settings.useSelect) {
358
+ list.append($('<option value="">'+label+'</option>'));
359
+ } else {
360
+ list.append($('<li>'+label+'</li>'));
361
+ }
362
+ }
305
363
 
306
364
  if (settings.className) {
307
365
  wrapped_list.addClass(settings.className);
@@ -325,22 +383,37 @@ requires jQuery 1.7+
325
383
  end += _ONE_DAY;
326
384
  }
327
385
 
386
+ if (end === _ONE_DAY-1 && settings.timeFormat.indexOf('H') !== -1) {
387
+ // show a 24:00 option when using military time
388
+ end = _ONE_DAY;
389
+ }
390
+
328
391
  var dr = settings.disableTimeRanges;
329
392
  var drCur = 0;
330
393
  var drLen = dr.length;
331
394
 
332
395
  for (var i=start; i <= end; i += settings.step*60) {
333
- var timeInt = i%_ONE_DAY;
396
+ var timeInt = i;
397
+ var timeString = _int2time(timeInt, settings.timeFormat);
334
398
 
335
- var row = $('<li />');
336
- row.data('time', timeInt);
337
- row.text(_int2time(timeInt, settings.timeFormat));
399
+ if (settings.useSelect) {
400
+ var row = $('<option />', { 'value': timeString });
401
+ row.text(timeString);
402
+ } else {
403
+ var row = $('<li />');
404
+ row.data('time', (timeInt <= 86400 ? timeInt : timeInt % 86400));
405
+ row.text(timeString);
406
+ }
338
407
 
339
408
  if ((settings.minTime !== null || settings.durationTime !== null) && settings.showDuration) {
340
- var duration = $('<span />');
341
- duration.addClass('ui-timepicker-duration');
342
- duration.text(' ('+_int2duration(i - durStart)+')');
343
- row.append(duration);
409
+ var durationString = _int2duration(i - durStart);
410
+ if (settings.useSelect) {
411
+ row.text(row.text()+' ('+durationString+')');
412
+ } else {
413
+ var duration = $('<span />', { 'class': 'ui-timepicker-duration' });
414
+ duration.text(' ('+durationString+')');
415
+ row.append(duration);
416
+ }
344
417
  }
345
418
 
346
419
  if (drCur < drLen) {
@@ -349,7 +422,11 @@ requires jQuery 1.7+
349
422
  }
350
423
 
351
424
  if (dr[drCur] && timeInt >= dr[drCur][0] && timeInt < dr[drCur][1]) {
352
- row.addClass('ui-timepicker-disabled');
425
+ if (settings.useSelect) {
426
+ row.prop('disabled', true);
427
+ } else {
428
+ row.addClass('ui-timepicker-disabled');
429
+ }
353
430
  }
354
431
  }
355
432
 
@@ -359,58 +436,76 @@ requires jQuery 1.7+
359
436
  wrapped_list.data('timepicker-input', self);
360
437
  self.data('timepicker-list', wrapped_list);
361
438
 
362
- var appendTo = settings.appendTo;
363
- if (typeof appendTo === 'string') {
364
- appendTo = $(appendTo);
365
- } else if (typeof appendTo === 'function') {
366
- appendTo = appendTo(self);
367
- }
368
- appendTo.append(wrapped_list);
369
- _setSelected(self, list);
370
-
371
- list.on('click', 'li', function(e) {
372
-
373
- // hack: temporarily disable the focus handler
374
- // to deal with the fact that IE fires 'focus'
375
- // events asynchronously
376
- self.off('focus.timepicker');
377
- self.on('focus.timepicker-ie-hack', function(){
378
- self.off('focus.timepicker-ie-hack');
379
- self.on('focus.timepicker', methods.show);
439
+ if (settings.useSelect) {
440
+ list.val(_roundTime(self.val(), settings));
441
+ list.on('focus', function(){
442
+ $(this).data('timepicker-input').trigger('showTimepicker');
443
+ });
444
+ list.on('blur', function(){
445
+ $(this).data('timepicker-input').trigger('hideTimepicker');
446
+ });
447
+ list.on('change', function(){
448
+ _setTimeValue(self, $(this).val(), 'select');
380
449
  });
381
450
 
382
- if (!_hideKeyboard(self)) {
383
- self[0].focus();
451
+ self.hide().after(list);
452
+ } else {
453
+ var appendTo = settings.appendTo;
454
+ if (typeof appendTo === 'string') {
455
+ appendTo = $(appendTo);
456
+ } else if (typeof appendTo === 'function') {
457
+ appendTo = appendTo(self);
384
458
  }
459
+ appendTo.append(wrapped_list);
460
+ _setSelected(self, list);
385
461
 
386
- // make sure only the clicked row is selected
387
- list.find('li').removeClass('ui-timepicker-selected');
388
- $(this).addClass('ui-timepicker-selected');
462
+ list.on('click', 'li', function(e) {
389
463
 
390
- if (_selectValue(self)) {
391
- self.trigger('hideTimepicker');
392
- wrapped_list.hide();
393
- }
394
- });
395
- }
464
+ // hack: temporarily disable the focus handler
465
+ // to deal with the fact that IE fires 'focus'
466
+ // events asynchronously
467
+ self.off('focus.timepicker');
468
+ self.on('focus.timepicker-ie-hack', function(){
469
+ self.off('focus.timepicker-ie-hack');
470
+ self.on('focus.timepicker', methods.show);
471
+ });
396
472
 
397
- function _generateBaseDate()
398
- {
399
- return new Date(1970, 1, 1, 0, 0, 0);
473
+ if (!_hideKeyboard(self)) {
474
+ self[0].focus();
475
+ }
476
+
477
+ // make sure only the clicked row is selected
478
+ list.find('li').removeClass('ui-timepicker-selected');
479
+ $(this).addClass('ui-timepicker-selected');
480
+
481
+ if (_selectValue(self)) {
482
+ self.trigger('hideTimepicker');
483
+ wrapped_list.hide();
484
+ }
485
+ });
486
+ }
400
487
  }
401
488
 
402
- function _attachCloseHandler(settings)
489
+ function _roundTime(time, settings)
403
490
  {
404
- if ('ontouchstart' in document) {
405
- $('body').on('touchstart.ui-timepicker', _closeHandler);
491
+ if (!$.isNumeric(time)) {
492
+ time = _time2int(time);
493
+ }
494
+
495
+ if (time === null) {
496
+ return null;
406
497
  } else {
407
- $('body').on('mousedown.ui-timepicker', _closeHandler);
408
- if (settings.closeOnWindowScroll) {
409
- $(window).on('scroll.ui-timepicker', _closeHandler);
410
- }
498
+ var step = settings.step*60;
499
+ // round to the nearest step
500
+ return _int2time(Math.round(time / step) * step, settings.timeFormat);
411
501
  }
412
502
  }
413
503
 
504
+ function _generateBaseDate()
505
+ {
506
+ return new Date(1970, 1, 1, 0, 0, 0);
507
+ }
508
+
414
509
  // event handler to decide whether to close timepicker
415
510
  function _closeHandler(e)
416
511
  {
@@ -418,8 +513,7 @@ requires jQuery 1.7+
418
513
  var input = target.closest('.ui-timepicker-input');
419
514
  if (input.length === 0 && target.closest('.ui-timepicker-wrapper').length === 0) {
420
515
  methods.hide();
421
- $('body').unbind('.ui-timepicker');
422
- $(window).unbind('.ui-timepicker');
516
+ $(document).unbind('.ui-timepicker');
423
517
  }
424
518
  }
425
519
 
@@ -550,12 +644,17 @@ requires jQuery 1.7+
550
644
 
551
645
  function _setTimeValue(self, value, source)
552
646
  {
553
- if (self.data('ui-timepicker-value') != value) {
554
- self.data('ui-timepicker-value', value);
555
- if (self.is('input')) {
556
- self.val(value);
647
+ if (self.is('input')) {
648
+ self.val(value);
649
+
650
+ var settings = self.data('timepicker-settings');
651
+ if (settings.useSelect) {
652
+ self.data('timepicker-list').val(_roundTime(value, settings));
557
653
  }
654
+ }
558
655
 
656
+ if (self.data('ui-timepicker-value') != value) {
657
+ self.data('ui-timepicker-value', value);
559
658
  if (source == 'select') {
560
659
  self.trigger('selectTime').trigger('changeTime').trigger('change');
561
660
  } else if (source != 'error') {
@@ -583,7 +682,7 @@ requires jQuery 1.7+
583
682
  self.focus();
584
683
  }
585
684
  } else {
586
- return _screenInput(e, self);
685
+ return true;
587
686
  }
588
687
  }
589
688
 
@@ -653,15 +752,10 @@ requires jQuery 1.7+
653
752
  break;
654
753
 
655
754
  default:
656
- return _screenInput(e, self);
755
+ return true;
657
756
  }
658
757
  }
659
758
 
660
- function _screenInput(e, self)
661
- {
662
- return !self.data('timepicker-settings').disableTextInput || e.ctrlKey || e.altKey || e.metaKey || (e.keyCode != 2 && e.keyCode < 46);
663
- }
664
-
665
759
  /*
666
760
  * Time typeahead
667
761
  */
@@ -674,6 +768,11 @@ requires jQuery 1.7+
674
768
  return true;
675
769
  }
676
770
 
771
+ if (!self.data('timepicker-settings').typeaheadHighlight) {
772
+ list.find('li').removeClass('ui-timepicker-selected');
773
+ return true;
774
+ }
775
+
677
776
  switch (e.keyCode) {
678
777
 
679
778
  case 96: // numpad numerals
@@ -769,6 +868,11 @@ requires jQuery 1.7+
769
868
  }
770
869
 
771
870
  var time = new Date(_baseDate.valueOf() + (seconds*1000));
871
+
872
+ if (isNaN(time.getTime())) {
873
+ return;
874
+ }
875
+
772
876
  var output = '';
773
877
  var hour, code;
774
878
 
@@ -806,6 +910,7 @@ requires jQuery 1.7+
806
910
 
807
911
  case 'H':
808
912
  hour = time.getHours();
913
+ if (seconds === _ONE_DAY) hour = 24;
809
914
  output += (hour > 9) ? hour : '0'+hour;
810
915
  break;
811
916
 
@@ -883,7 +988,14 @@ requires jQuery 1.7+
883
988
  // Plugin entry
884
989
  $.fn.timepicker = function(method)
885
990
  {
886
- if(methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); }
991
+ if (!this.length) return this;
992
+ if (methods[method]) {
993
+ // check if this element is a timepicker
994
+ if (!this.hasClass('ui-timepicker-input')) {
995
+ return this;
996
+ }
997
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
998
+ }
887
999
  else if(typeof method === "object" || !method) { return methods.init.apply(this, arguments); }
888
1000
  else { $.error("Method "+ method + " does not exist on jQuery.timepicker"); }
889
1001
  };
@@ -1,67 +1,67 @@
1
- .ui-timepicker-wrapper {
2
- overflow-y: auto;
3
- height: 150px;
4
- width: 6.5em;
5
- background: #fff;
6
- border: 1px solid #ddd;
7
- -webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);
8
- -moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);
9
- box-shadow:0 5px 10px rgba(0,0,0,0.2);
10
- outline: none;
11
- z-index: 10001;
12
- margin: 0;
13
- }
14
-
15
- .ui-timepicker-wrapper.ui-timepicker-with-duration {
16
- width: 11em;
17
- }
18
-
19
- .ui-timepicker-list {
20
- margin: 0;
21
- padding: 0;
22
- list-style: none;
23
- }
24
-
25
- .ui-timepicker-duration {
26
- margin-left: 5px; color: #888;
27
- }
28
-
29
- .ui-timepicker-list:hover .ui-timepicker-duration {
30
- color: #888;
31
- }
32
-
33
- .ui-timepicker-list li {
34
- padding: 3px 0 3px 5px;
35
- cursor: pointer;
36
- white-space: nowrap;
37
- color: #000;
38
- list-style: none;
39
- margin: 0;
40
- }
41
-
42
- .ui-timepicker-list:hover .ui-timepicker-selected {
43
- background: #fff; color: #000;
44
- }
45
-
46
- li.ui-timepicker-selected,
47
- .ui-timepicker-list li:hover,
48
- .ui-timepicker-list .ui-timepicker-selected:hover {
49
- background: #1980EC; color: #fff;
50
- }
51
-
52
- li.ui-timepicker-selected .ui-timepicker-duration,
53
- .ui-timepicker-list li:hover .ui-timepicker-duration {
54
- color: #ccc;
55
- }
56
-
57
- .ui-timepicker-list li.ui-timepicker-disabled,
58
- .ui-timepicker-list li.ui-timepicker-disabled:hover,
59
- .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
60
- color: #888;
61
- cursor: default;
62
- }
63
-
64
- .ui-timepicker-list li.ui-timepicker-disabled:hover,
65
- .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
66
- background: #f2f2f2;
67
- }
1
+ .ui-timepicker-wrapper {
2
+ overflow-y: auto;
3
+ height: 150px;
4
+ width: 6.5em;
5
+ background: #fff;
6
+ border: 1px solid #ddd;
7
+ -webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);
8
+ -moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);
9
+ box-shadow:0 5px 10px rgba(0,0,0,0.2);
10
+ outline: none;
11
+ z-index: 10001;
12
+ margin: 0;
13
+ }
14
+
15
+ .ui-timepicker-wrapper.ui-timepicker-with-duration {
16
+ width: 11em;
17
+ }
18
+
19
+ .ui-timepicker-list {
20
+ margin: 0;
21
+ padding: 0;
22
+ list-style: none;
23
+ }
24
+
25
+ .ui-timepicker-duration {
26
+ margin-left: 5px; color: #888;
27
+ }
28
+
29
+ .ui-timepicker-list:hover .ui-timepicker-duration {
30
+ color: #888;
31
+ }
32
+
33
+ .ui-timepicker-list li {
34
+ padding: 3px 0 3px 5px;
35
+ cursor: pointer;
36
+ white-space: nowrap;
37
+ color: #000;
38
+ list-style: none;
39
+ margin: 0;
40
+ }
41
+
42
+ .ui-timepicker-list:hover .ui-timepicker-selected {
43
+ background: #fff; color: #000;
44
+ }
45
+
46
+ li.ui-timepicker-selected,
47
+ .ui-timepicker-list li:hover,
48
+ .ui-timepicker-list .ui-timepicker-selected:hover {
49
+ background: #1980EC; color: #fff;
50
+ }
51
+
52
+ li.ui-timepicker-selected .ui-timepicker-duration,
53
+ .ui-timepicker-list li:hover .ui-timepicker-duration {
54
+ color: #ccc;
55
+ }
56
+
57
+ .ui-timepicker-list li.ui-timepicker-disabled,
58
+ .ui-timepicker-list li.ui-timepicker-disabled:hover,
59
+ .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
60
+ color: #888;
61
+ cursor: default;
62
+ }
63
+
64
+ .ui-timepicker-list li.ui-timepicker-disabled:hover,
65
+ .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
66
+ background: #f2f2f2;
67
+ }
metadata CHANGED
@@ -1,62 +1,56 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jquery-timepicker-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.5.0
5
- prerelease:
4
+ version: 1.3.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tanguy Krotoff (jQuery plugin by Jon Thornton)
8
+ - Fabio Cantoni
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-30 00:00:00.000000000 Z
12
+ date: 2014-02-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
16
16
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
17
  requirements:
19
- - - ! '>='
18
+ - - ">="
20
19
  - !ruby/object:Gem::Version
21
20
  version: 3.1.0
22
21
  type: :runtime
23
22
  prerelease: false
24
23
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
24
  requirements:
27
- - - ! '>='
25
+ - - ">="
28
26
  - !ruby/object:Gem::Version
29
27
  version: 3.1.0
30
28
  - !ruby/object:Gem::Dependency
31
29
  name: bundler
32
30
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
31
  requirements:
35
- - - ~>
32
+ - - "~>"
36
33
  - !ruby/object:Gem::Version
37
34
  version: '1.3'
38
35
  type: :development
39
36
  prerelease: false
40
37
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
38
  requirements:
43
- - - ~>
39
+ - - "~>"
44
40
  - !ruby/object:Gem::Version
45
41
  version: '1.3'
46
42
  - !ruby/object:Gem::Dependency
47
43
  name: rake
48
44
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
45
  requirements:
51
- - - ! '>='
46
+ - - ">="
52
47
  - !ruby/object:Gem::Version
53
48
  version: '0'
54
49
  type: :development
55
50
  prerelease: false
56
51
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
52
  requirements:
59
- - - ! '>='
53
+ - - ">="
60
54
  - !ruby/object:Gem::Version
61
55
  version: '0'
62
56
  description: A jQuery timepicker plugin inspired by Google Calendar
@@ -66,7 +60,7 @@ executables: []
66
60
  extensions: []
67
61
  extra_rdoc_files: []
68
62
  files:
69
- - .gitignore
63
+ - ".gitignore"
70
64
  - Gemfile
71
65
  - LICENSE.txt
72
66
  - README.md
@@ -74,32 +68,31 @@ files:
74
68
  - jquery-timepicker-rails.gemspec
75
69
  - lib/jquery-timepicker-rails.rb
76
70
  - lib/jquery-timepicker-rails/version.rb
77
- - vendor/assets/javascripts/datepair.js
71
+ - vendor/assets/javascripts/jquery.datepair.js
78
72
  - vendor/assets/javascripts/jquery.timepicker.js
79
73
  - vendor/assets/stylesheets/jquery.timepicker.css
80
- homepage: http://github.com/tkrotoff/jquery-timepicker-rails
74
+ homepage: https://github.com/cover/jquery-timepicker-rails
81
75
  licenses:
82
76
  - MIT
77
+ metadata: {}
83
78
  post_install_message:
84
79
  rdoc_options: []
85
80
  require_paths:
86
81
  - lib
87
82
  required_ruby_version: !ruby/object:Gem::Requirement
88
- none: false
89
83
  requirements:
90
- - - ! '>='
84
+ - - ">="
91
85
  - !ruby/object:Gem::Version
92
86
  version: '0'
93
87
  required_rubygems_version: !ruby/object:Gem::Requirement
94
- none: false
95
88
  requirements:
96
- - - ! '>='
89
+ - - ">="
97
90
  - !ruby/object:Gem::Version
98
91
  version: '0'
99
92
  requirements: []
100
93
  rubyforge_project:
101
- rubygems_version: 1.8.23
94
+ rubygems_version: 2.2.0
102
95
  signing_key:
103
- specification_version: 3
96
+ specification_version: 4
104
97
  summary: jquery-timepicker packaged for the Rails 3.1+ asset pipeline
105
98
  test_files: []
@@ -1,226 +0,0 @@
1
- $(function() {
2
- var DATEPICKER_FORMAT = 'yyyy-m-d';
3
- var TIMEPICKER_FORMAT = 'g:ia';
4
- var DATE_FORMAT = 'Y-n-j'; // for this format see http://php.net/manual/function.date.php
5
-
6
- $('.datepair input.date').each(function(){
7
- var $this = $(this);
8
-
9
- $this.datepicker({
10
- 'format': DATEPICKER_FORMAT,
11
- 'autoclose': true
12
- });
13
-
14
- if ($this.hasClass('start') || $this.hasClass('end')) {
15
- $this.on('changeDate change', doDatepair);
16
- }
17
-
18
- });
19
-
20
- $('.datepair input.time').each(function() {
21
- var $this = $(this);
22
-
23
- $this.timepicker({
24
- 'showDuration': true,
25
- 'timeFormat': TIMEPICKER_FORMAT,
26
- 'scrollDefaultNow': true
27
- });
28
-
29
- if ($this.hasClass('start') || $this.hasClass('end')) {
30
- $this.on('changeTime change', doDatepair);
31
- }
32
-
33
- if ($this.hasClass('end')) {
34
- $this.on('focus', function(){$('.ui-timepicker-with-duration').scrollTop(0);});
35
- }
36
-
37
- });
38
-
39
- $('.datepair').each(initDatepair);
40
-
41
- function initDatepair()
42
- {
43
- var container = $(this);
44
-
45
- var startDateInput = container.find('input.start.date');
46
- var endDateInput = container.find('input.end.date');
47
- var dateDelta = 0;
48
-
49
- if (startDateInput.length && endDateInput.length) {
50
- var startDate = parseDate(startDateInput.val(), DATEPICKER_FORMAT);
51
- var endDate = parseDate(endDateInput.val(), DATEPICKER_FORMAT);
52
-
53
- dateDelta = endDate.getTime() - startDate.getTime();
54
- container.data('dateDelta', dateDelta);
55
- }
56
-
57
- var startTimeInput = container.find('input.start.time');
58
- var endTimeInput = container.find('input.end.time');
59
-
60
- if (startTimeInput.length && endTimeInput.length) {
61
- var startInt = startTimeInput.timepicker('getSecondsFromMidnight');
62
- var endInt = endTimeInput.timepicker('getSecondsFromMidnight');
63
-
64
- container.data('timeDelta', endInt - startInt);
65
-
66
- if (dateDelta < 86400000) {
67
- endTimeInput.timepicker('option', 'minTime', startInt);
68
- }
69
- }
70
- }
71
-
72
- function doDatepair()
73
- {
74
- var target = $(this);
75
- if (target.val() == '') {
76
- return;
77
- }
78
-
79
- var container = target.closest('.datepair');
80
-
81
- if (target.hasClass('date')) {
82
- updateDatePair(target, container);
83
-
84
- } else if (target.hasClass('time')) {
85
- updateTimePair(target, container);
86
- }
87
- }
88
-
89
- function updateDatePair(target, container)
90
- {
91
- var start = container.find('input.start.date');
92
- var end = container.find('input.end.date');
93
- if (!start.length || !end.length) {
94
- return;
95
- }
96
-
97
- var startDate = parseDate(start.val(), DATEPICKER_FORMAT);
98
- var endDate = parseDate(end.val(), DATEPICKER_FORMAT);
99
-
100
- var oldDelta = container.data('dateDelta');
101
-
102
- if (!isNaN(oldDelta) && oldDelta !== null && target.hasClass('start')) {
103
- var newEnd = new Date(startDate.getTime()+oldDelta);
104
- end.val(newEnd.format(DATE_FORMAT));
105
- end.datepicker('update');
106
- return;
107
-
108
- } else {
109
- var newDelta = endDate.getTime() - startDate.getTime();
110
-
111
- if (newDelta < 0) {
112
- newDelta = 0;
113
-
114
- if (target.hasClass('start')) {
115
- end.val(start.val());
116
- end.datepicker('update');
117
- } else if (target.hasClass('end')) {
118
- start.val(end.val());
119
- start.datepicker('update');
120
- }
121
- }
122
-
123
- if (newDelta < 86400000) {
124
- var startTimeVal = container.find('input.start.time').val();
125
-
126
- if (startTimeVal) {
127
- container.find('input.end.time').timepicker('option', {'minTime': startTimeVal});
128
- }
129
- } else {
130
- container.find('input.end.time').timepicker('option', {'minTime': null});
131
- }
132
-
133
- container.data('dateDelta', newDelta);
134
- }
135
- }
136
-
137
- function updateTimePair(target, container)
138
- {
139
- var start = container.find('input.start.time');
140
- var end = container.find('input.end.time');
141
-
142
- if (!start.length) {
143
- return;
144
- }
145
-
146
- var startInt = start.timepicker('getSecondsFromMidnight');
147
- var dateDelta = container.data('dateDelta');
148
-
149
- if (target.hasClass('start') && (!dateDelta || dateDelta < 86400000)) {
150
- end.timepicker('option', 'minTime', startInt);
151
- }
152
-
153
- if (!end.length) {
154
- return;
155
- }
156
-
157
- var endInt = end.timepicker('getSecondsFromMidnight');
158
- var oldDelta = container.data('timeDelta');
159
-
160
- var endDateAdvance = 0;
161
- var newDelta;
162
-
163
- if (oldDelta && target.hasClass('start')) {
164
- // lock the duration and advance the end time
165
-
166
- var newEnd = (startInt+oldDelta)%86400;
167
-
168
- if (newEnd < 0) {
169
- newEnd += 86400;
170
- }
171
-
172
- end.timepicker('setTime', newEnd);
173
- newDelta = newEnd - startInt;
174
- } else if (startInt !== null && endInt !== null) {
175
- newDelta = endInt - startInt;
176
- } else {
177
- return;
178
- }
179
-
180
- container.data('timeDelta', newDelta);
181
-
182
- if (newDelta < 0 && (!oldDelta || oldDelta > 0)) {
183
- // overnight time span. advance the end date 1 day
184
- endDateAdvance = 86400000;
185
-
186
- } else if (newDelta > 0 && oldDelta < 0) {
187
- // switching from overnight to same-day time span. decrease the end date 1 day
188
- endDateAdvance = -86400000;
189
- }
190
-
191
- var startInput = container.find('.start.date');
192
- var endInput = container.find('.end.date');
193
-
194
- if (startInput.val() && !endInput.val()) {
195
- endInput.val(startInput.val());
196
- endInput.datepicker('update');
197
- dateDelta = 0;
198
- container.data('dateDelta', 0);
199
- }
200
-
201
- if (endDateAdvance != 0) {
202
- if (dateDelta || dateDelta === 0) {
203
- var endDate = parseDate(endInput.val(), DATEPICKER_FORMAT);
204
- var newEnd = new Date(endDate.getTime() + endDateAdvance);
205
- endInput.val(newEnd.format(DATE_FORMAT));
206
- endInput.datepicker('update');
207
- container.data('dateDelta', dateDelta + endDateAdvance);
208
- }
209
- }
210
- }
211
- });
212
-
213
- function parseDate(input, format) {
214
- if (input == '')
215
- return new Date('');
216
-
217
- format = format || 'yyyy-mm-dd'; // default format
218
- var parts = input.match(/(\d+)/g), i = 0, fmt = {};
219
- // extract date-part indexes from the format
220
- format.replace(/(yyyy|dd?|mm?)/g, function(part) { fmt[part] = i++; });
221
-
222
- return new Date(parts[fmt['yyyy']], parts[fmt['mm'] == undefined ? fmt['m'] : fmt['mm']]-1, parts[fmt['dd'] == undefined ? fmt['d'] : fmt['dd']]);
223
- }
224
-
225
- // Simulates PHP's date function
226
- Date.prototype.format=function(format){var returnStr='';var replace=Date.replaceChars;for(var i=0;i<format.length;i++){var curChar=format.charAt(i);if(replace[curChar]){returnStr+=replace[curChar].call(this);}else{returnStr+=curChar;}}return returnStr;};Date.replaceChars={shortMonths:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],longMonths:['January','February','March','April','May','June','July','August','September','October','November','December'],shortDays:['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],longDays:['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],d:function(){return(this.getDate()<10?'0':'')+this.getDate();},D:function(){return Date.replaceChars.shortDays[this.getDay()];},j:function(){return this.getDate();},l:function(){return Date.replaceChars.longDays[this.getDay()];},N:function(){return this.getDay()+1;},S:function(){return(this.getDate()%10==1&&this.getDate()!=11?'st':(this.getDate()%10==2&&this.getDate()!=12?'nd':(this.getDate()%10==3&&this.getDate()!=13?'rd':'th')));},w:function(){return this.getDay();},z:function(){return"Not Yet Supported";},W:function(){return"Not Yet Supported";},F:function(){return Date.replaceChars.longMonths[this.getMonth()];},m:function(){return(this.getMonth()<9?'0':'')+(this.getMonth()+1);},M:function(){return Date.replaceChars.shortMonths[this.getMonth()];},n:function(){return this.getMonth()+1;},t:function(){return"Not Yet Supported";},L:function(){return(((this.getFullYear()%4==0)&&(this.getFullYear()%100!=0))||(this.getFullYear()%400==0))?'1':'0';},o:function(){return"Not Supported";},Y:function(){return this.getFullYear();},y:function(){return(''+this.getFullYear()).substr(2);},a:function(){return this.getHours()<12?'am':'pm';},A:function(){return this.getHours()<12?'AM':'PM';},B:function(){return"Not Yet Supported";},g:function(){return this.getHours()%12||12;},G:function(){return this.getHours();},h:function(){return((this.getHours()%12||12)<10?'0':'')+(this.getHours()%12||12);},H:function(){return(this.getHours()<10?'0':'')+this.getHours();},i:function(){return(this.getMinutes()<10?'0':'')+this.getMinutes();},s:function(){return(this.getSeconds()<10?'0':'')+this.getSeconds();},e:function(){return"Not Yet Supported";},I:function(){return"Not Supported";},O:function(){return(-this.getTimezoneOffset()<0?'-':'+')+(Math.abs(this.getTimezoneOffset()/60)<10?'0':'')+(Math.abs(this.getTimezoneOffset()/60))+'00';},P:function(){return(-this.getTimezoneOffset()<0?'-':'+')+(Math.abs(this.getTimezoneOffset()/60)<10?'0':'')+(Math.abs(this.getTimezoneOffset()/60))+':'+(Math.abs(this.getTimezoneOffset()%60)<10?'0':'')+(Math.abs(this.getTimezoneOffset()%60));},T:function(){var m=this.getMonth();this.setMonth(0);var result=this.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/,'$1');this.setMonth(m);return result;},Z:function(){return-this.getTimezoneOffset()*60;},c:function(){return this.format("Y-m-d")+"T"+this.format("H:i:sP");},r:function(){return this.toString();},U:function(){return this.getTime()/1000;}};