jquery-timepicker-rails 1.11.4 → 1.11.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ef2cbc213827a30a13b9d4fdfbfd7998f5c93b9f
4
- data.tar.gz: be613ced6533e11f03a24b3cb5fd2d16b0ed3b68
3
+ metadata.gz: 3a397fd3da149e1039b92dc3886bf3849df093f1
4
+ data.tar.gz: ac9349fbcbc15cf5c9b44cb9ffe0e0042810677f
5
5
  SHA512:
6
- metadata.gz: d7ad75d6a2e4810859c057c92d668e83bcf5d53f0c0591925ca9d717c6907465926234fd0e13f8d170b65ea245e0130df4dbf2d9ea949e0eea1823d6578f631a
7
- data.tar.gz: cc1976e3ccc106ee026c1bf648bc6b7835af6ebb12dd97960940eb5a3da2d4e5a06395dc50059b2c0727a2a887c15dbfcaf6468d8d4c44e8215c1fb8cdf82b49
6
+ metadata.gz: 66686385c46b9dbff562210de8a3020c370cff440d88033ba56fb6e4c7d390afcf44e29ca5f95cb55f9821936c1d9b2da42c64713cdb2b7052d9948407b78cf0
7
+ data.tar.gz: '0308a662a4dec4d0b66faa483fb03b2425a5bbd346cc62ff29d070cfc2185480b4e1f6da7d463cb048e513c0059758a9a591615fa9c898d3d64e53f49fcff7c4'
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Timepicker
3
3
  module Rails
4
- VERSION = '1.11.4'
4
+ VERSION = '1.11.10'
5
5
  end
6
6
  end
7
7
  end
@@ -1,347 +1,361 @@
1
- var _ONE_DAY = 86400000;
2
- var jq = window.Zepto || window.jQuery;
3
-
4
- function simpleExtend(obj1, obj2) {
5
- var out = obj2 || {};
6
-
7
- for (var i in obj1) {
8
- if (!(i in out)) {
9
- out[i] = obj1[i];
1
+ /*!
2
+ * datepair.js v0.4.15 - A javascript plugin for intelligently selecting date and time ranges inspired by Google Calendar.
3
+ * Copyright (c) 2016 Jon Thornton - http://jonthornton.github.com/Datepair.js
4
+ * License: MIT
5
+ */
6
+
7
+ (function(window, document) {
8
+
9
+ 'use strict';
10
+
11
+ var _ONE_DAY = 86400000;
12
+ var jq = window.Zepto || window.jQuery;
13
+
14
+ function simpleExtend(obj1, obj2) {
15
+ var out = obj2 || {};
16
+
17
+ for (var i in obj1) {
18
+ if (!(i in out)) {
19
+ out[i] = obj1[i];
20
+ }
10
21
  }
22
+
23
+ return out;
11
24
  }
12
-
13
- return out;
14
- }
15
-
16
- // IE's custom event support is totally borked.
17
- // Use jQuery if possible
18
- function triggerSimpleCustomEvent(el, eventName) {
19
- if (jq) {
20
- jq(el).trigger(eventName);
21
- } else {
22
- var event = document.createEvent('CustomEvent');
23
- event.initCustomEvent(eventName, true, true, {});
24
- el.dispatchEvent(event);
25
+
26
+ // IE's custom event support is totally borked.
27
+ // Use jQuery if possible
28
+ function triggerSimpleCustomEvent(el, eventName) {
29
+ if (jq) {
30
+ jq(el).trigger(eventName);
31
+ } else {
32
+ var event = document.createEvent('CustomEvent');
33
+ event.initCustomEvent(eventName, true, true, {});
34
+ el.dispatchEvent(event);
35
+ }
25
36
  }
26
- }
27
-
28
- // el.classList not supported by < IE10
29
- // use jQuery if available
30
- function hasClass(el, className) {
31
- if (jq) {
32
- return jq(el).hasClass(className);
33
- } else {
34
- return el.classList.contains(className);
37
+
38
+ // el.classList not supported by < IE10
39
+ // use jQuery if available
40
+ function hasClass(el, className) {
41
+ if (jq) {
42
+ return jq(el).hasClass(className);
43
+ } else {
44
+ return el.classList.contains(className);
45
+ }
35
46
  }
36
- }
37
-
38
- function Datepair(container, options) {
39
- this.dateDelta = null;
40
- this.timeDelta = null;
41
- this._defaults = {
42
- startClass: 'start',
43
- endClass: 'end',
44
- timeClass: 'time',
45
- dateClass: 'date',
46
- defaultDateDelta: 0,
47
- defaultTimeDelta: 3600000,
48
- anchor: 'start',
49
-
50
- // defaults for jquery-timepicker; override when using other input widgets
51
- parseTime: function(input){
52
- return jq(input).timepicker('getTime');
47
+
48
+ function Datepair(container, options) {
49
+ this.dateDelta = null;
50
+ this.timeDelta = null;
51
+ this._defaults = {
52
+ startClass: 'start',
53
+ endClass: 'end',
54
+ timeClass: 'time',
55
+ dateClass: 'date',
56
+ defaultDateDelta: 0,
57
+ defaultTimeDelta: 3600000,
58
+ anchor: 'start',
59
+
60
+ // defaults for jquery-timepicker; override when using other input widgets
61
+ parseTime: function(input){
62
+ return jq(input).timepicker('getTime');
63
+ },
64
+ updateTime: function(input, dateObj){
65
+ jq(input).timepicker('setTime', dateObj);
66
+ },
67
+ setMinTime: function(input, dateObj){
68
+ jq(input).timepicker('option', 'minTime', dateObj);
69
+ },
70
+
71
+ // defaults for bootstrap datepicker; override when using other input widgets
72
+ parseDate: function(input){
73
+ return input.value && jq(input).datepicker('getDate');
74
+ },
75
+ updateDate: function(input, dateObj){
76
+ jq(input).datepicker('update', dateObj);
77
+ }
78
+ };
79
+
80
+ this.container = container;
81
+ this.settings = simpleExtend(this._defaults, options);
82
+
83
+ this.startDateInput = this.container.querySelector('.'+this.settings.startClass+'.'+this.settings.dateClass);
84
+ this.endDateInput = this.container.querySelector('.'+this.settings.endClass+'.'+this.settings.dateClass);
85
+ this.startTimeInput = this.container.querySelector('.'+this.settings.startClass+'.'+this.settings.timeClass);
86
+ this.endTimeInput = this.container.querySelector('.'+this.settings.endClass+'.'+this.settings.timeClass);
87
+
88
+ // initialize date and time deltas
89
+ this.refresh();
90
+
91
+ // init starts here
92
+ this._bindChangeHandler();
93
+ }
94
+
95
+ Datepair.prototype = {
96
+ constructor: Datepair,
97
+
98
+ option: function(key, value)
99
+ {
100
+ if (typeof key == 'object') {
101
+ this.settings = simpleExtend(this.settings, key);
102
+
103
+ } else if (typeof key == 'string' && typeof value != 'undefined') {
104
+ this.settings[key] = value;
105
+
106
+ } else if (typeof key == 'string') {
107
+ return this.settings[key];
108
+ }
109
+
110
+ this._updateEndMintime();
53
111
  },
54
- updateTime: function(input, dateObj){
55
- jq(input).timepicker('setTime', dateObj);
112
+
113
+ getTimeDiff: function()
114
+ {
115
+ // due to the fact that times can wrap around, timeDiff for any
116
+ // time-only pair will always be >= 0
117
+ var delta = this.dateDelta + this.timeDelta;
118
+ if (delta < 0 && (!this.startDateInput || !this.endDateInput) ) {
119
+ delta += _ONE_DAY;
120
+ }
121
+
122
+ return delta;
56
123
  },
57
- setMinTime: function(input, dateObj){
58
- jq(input).timepicker('option', 'minTime', dateObj);
124
+
125
+ refresh: function()
126
+ {
127
+ if (this.startDateInput && this.startDateInput.value && this.endDateInput && this.endDateInput.value) {
128
+ var startDate = this.settings.parseDate(this.startDateInput);
129
+ var endDate = this.settings.parseDate(this.endDateInput);
130
+ if (startDate && endDate) {
131
+ this.dateDelta = endDate.getTime() - startDate.getTime();
132
+ }
133
+ }
134
+ if (this.startTimeInput && this.startTimeInput.value && this.endTimeInput && this.endTimeInput.value) {
135
+ var startTime = this.settings.parseTime(this.startTimeInput);
136
+ var endTime = this.settings.parseTime(this.endTimeInput);
137
+ if (startTime && endTime) {
138
+ this.timeDelta = endTime.getTime() - startTime.getTime();
139
+ this._updateEndMintime();
140
+ }
141
+ }
59
142
  },
60
-
61
- // defaults for bootstrap datepicker; override when using other input widgets
62
- parseDate: function(input){
63
- return input.value && jq(input).datepicker('getDate');
143
+
144
+ remove: function()
145
+ {
146
+ this._unbindChangeHandler();
64
147
  },
65
- updateDate: function(input, dateObj){
66
- jq(input).datepicker('update', dateObj);
67
- }
68
- };
69
-
70
- this.container = container;
71
- this.settings = simpleExtend(this._defaults, options);
72
-
73
- this.startDateInput = this.container.querySelector('.'+this.settings.startClass+'.'+this.settings.dateClass);
74
- this.endDateInput = this.container.querySelector('.'+this.settings.endClass+'.'+this.settings.dateClass);
75
- this.startTimeInput = this.container.querySelector('.'+this.settings.startClass+'.'+this.settings.timeClass);
76
- this.endTimeInput = this.container.querySelector('.'+this.settings.endClass+'.'+this.settings.timeClass);
77
-
78
- // initialize date and time deltas
79
- this.refresh();
80
-
81
- // init starts here
82
- this._bindChangeHandler();
83
- }
84
-
85
- Datepair.prototype = {
86
- constructor: Datepair,
87
-
88
- option: function(key, value)
89
- {
90
- if (typeof key == 'object') {
91
- this.settings = simpleExtend(this.settings, key);
92
-
93
- } else if (typeof key == 'string' && typeof value != 'undefined') {
94
- this.settings[key] = value;
95
-
96
- } else if (typeof key == 'string') {
97
- return this.settings[key];
98
- }
99
-
100
- this._updateEndMintime();
101
- },
102
-
103
- getTimeDiff: function()
104
- {
105
- // due to the fact that times can wrap around, timeDiff for any
106
- // time-only pair will always be >= 0
107
- var delta = this.dateDelta + this.timeDelta;
108
- if (delta < 0 && (!this.startDateInput || !this.endDateInput) ) {
109
- delta += _ONE_DAY;
110
- }
111
-
112
- return delta;
113
- },
114
-
115
- refresh: function()
116
- {
117
- if (this.startDateInput && this.startDateInput.value && this.endDateInput && this.endDateInput.value) {
148
+
149
+ _bindChangeHandler: function(){
150
+ // addEventListener doesn't work with synthetic "change" events
151
+ // fired by jQuery's trigger() functioin. If jQuery is present,
152
+ // use that for event binding
153
+ if (jq) {
154
+ jq(this.container).on('change.datepair', jq.proxy(this.handleEvent, this));
155
+ } else {
156
+ this.container.addEventListener('change', this, false);
157
+ }
158
+ },
159
+
160
+ _unbindChangeHandler: function(){
161
+ if (jq) {
162
+ jq(this.container).off('change.datepair');
163
+ } else {
164
+ this.container.removeEventListener('change', this, false);
165
+ }
166
+ },
167
+
168
+ // This function will be called when passing 'this' to addEventListener
169
+ handleEvent: function(e){
170
+ // temporarily unbind the change handler to prevent triggering this
171
+ // if we update other inputs
172
+ this._unbindChangeHandler();
173
+
174
+ if (hasClass(e.target, this.settings.dateClass)) {
175
+ if (e.target.value != '') {
176
+ this._dateChanged(e.target);
177
+ this._timeChanged(e.target);
178
+ } else {
179
+ this.dateDelta = null;
180
+ }
181
+
182
+ } else if (hasClass(e.target, this.settings.timeClass)) {
183
+ if (e.target.value != '') {
184
+ this._timeChanged(e.target);
185
+ } else {
186
+ this.timeDelta = null;
187
+ }
188
+ }
189
+
190
+ this._validateRanges();
191
+ this._updateEndMintime();
192
+ this._bindChangeHandler();
193
+ },
194
+
195
+ _dateChanged: function(target){
196
+ if (!this.startDateInput || !this.endDateInput) {
197
+ return;
198
+ }
199
+
118
200
  var startDate = this.settings.parseDate(this.startDateInput);
119
201
  var endDate = this.settings.parseDate(this.endDateInput);
120
- if (startDate && endDate) {
121
- this.dateDelta = endDate.getTime() - startDate.getTime();
202
+
203
+ if (!startDate || !endDate) {
204
+ if (this.settings.defaultDateDelta !== null) {
205
+ if (startDate) {
206
+ var newEnd = new Date(startDate.getTime() + this.settings.defaultDateDelta * _ONE_DAY);
207
+ this.settings.updateDate(this.endDateInput, newEnd);
208
+
209
+ } else if (endDate) {
210
+ var newStart = new Date(endDate.getTime() - this.settings.defaultDateDelta * _ONE_DAY);
211
+ this.settings.updateDate(this.startDateInput, newStart);
212
+ }
213
+
214
+ this.dateDelta = this.settings.defaultDateDelta * _ONE_DAY;
215
+ } else {
216
+ this.dateDelta = null;
217
+ }
218
+
219
+ return;
122
220
  }
123
- }
124
- if (this.startTimeInput && this.startTimeInput.value && this.endTimeInput && this.endTimeInput.value) {
221
+
222
+ if (this.settings.anchor == 'start' && hasClass(target, this.settings.startClass)) {
223
+ var newDate = new Date(startDate.getTime() + this.dateDelta);
224
+ this.settings.updateDate(this.endDateInput, newDate);
225
+ } else if (this.settings.anchor == 'end' && hasClass(target, this.settings.endClass)) {
226
+ var newDate = new Date(endDate.getTime() - this.dateDelta);
227
+ this.settings.updateDate(this.startDateInput, newDate);
228
+ } else {
229
+ if (endDate < startDate) {
230
+ var otherInput = hasClass(target, this.settings.startClass) ? this.endDateInput : this.startDateInput;
231
+ var selectedDate = this.settings.parseDate(target);
232
+ this.dateDelta = 0;
233
+ this.settings.updateDate(otherInput, selectedDate);
234
+ } else {
235
+ this.dateDelta = endDate.getTime() - startDate.getTime();
236
+ }
237
+ }
238
+ },
239
+
240
+ _timeChanged: function(target){
241
+ if (!this.startTimeInput || !this.endTimeInput) {
242
+ return;
243
+ }
244
+
125
245
  var startTime = this.settings.parseTime(this.startTimeInput);
126
246
  var endTime = this.settings.parseTime(this.endTimeInput);
127
- if (startTime && endTime) {
128
- this.timeDelta = endTime.getTime() - startTime.getTime();
129
- this._updateEndMintime();
247
+
248
+ if (!startTime || !endTime) {
249
+ if (this.settings.defaultTimeDelta !== null) {
250
+ if (startTime) {
251
+ var newEnd = new Date(startTime.getTime() + this.settings.defaultTimeDelta);
252
+ this.settings.updateTime(this.endTimeInput, newEnd);
253
+ } else if (endTime) {
254
+ var newStart = new Date(endTime.getTime() - this.settings.defaultTimeDelta);
255
+ this.settings.updateTime(this.startTimeInput, newStart);
256
+ }
257
+
258
+ this.timeDelta = this.settings.defaultTimeDelta;
259
+ } else {
260
+ this.timeDelta = null;
261
+ }
262
+
263
+ return;
130
264
  }
131
- }
132
- },
133
-
134
- remove: function()
135
- {
136
- this._unbindChangeHandler();
137
- },
138
-
139
- _bindChangeHandler: function(){
140
- // addEventListener doesn't work with synthetic "change" events
141
- // fired by jQuery's trigger() functioin. If jQuery is present,
142
- // use that for event binding
143
- if (jq) {
144
- jq(this.container).on('change.datepair', jq.proxy(this.handleEvent, this));
145
- } else {
146
- this.container.addEventListener('change', this, false);
147
- }
148
- },
149
-
150
- _unbindChangeHandler: function(){
151
- if (jq) {
152
- jq(this.container).off('change.datepair');
153
- } else {
154
- this.container.removeEventListener('change', this, false);
155
- }
156
- },
157
-
158
- // This function will be called when passing 'this' to addEventListener
159
- handleEvent: function(e){
160
- // temporarily unbind the change handler to prevent triggering this
161
- // if we update other inputs
162
- this._unbindChangeHandler();
163
-
164
- if (hasClass(e.target, this.settings.dateClass)) {
165
- if (e.target.value != '') {
166
- this._dateChanged(e.target);
167
- this._timeChanged(e.target);
265
+
266
+ if (this.settings.anchor == 'start' && hasClass(target, this.settings.startClass)) {
267
+ var newTime = new Date(startTime.getTime() + this.timeDelta);
268
+ this.settings.updateTime(this.endTimeInput, newTime);
269
+ endTime = this.settings.parseTime(this.endTimeInput);
270
+
271
+ this._doMidnightRollover(startTime, endTime);
272
+ } else if (this.settings.anchor == 'end' && hasClass(target, this.settings.endClass)) {
273
+ var newTime = new Date(endTime.getTime() - this.timeDelta);
274
+ this.settings.updateTime(this.startTimeInput, newTime);
275
+ startTime = this.settings.parseTime(this.startTimeInput);
276
+
277
+ this._doMidnightRollover(startTime, endTime);
168
278
  } else {
169
- this.dateDelta = null;
279
+ this._doMidnightRollover(startTime, endTime);
280
+
281
+ var startDate, endDate;
282
+ if (this.startDateInput && this.endDateInput) {
283
+ startDate = this.settings.parseDate(this.startDateInput);
284
+ endDate = this.settings.parseDate(this.endDateInput);
285
+ }
286
+
287
+ if ((+startDate == +endDate) && (endTime < startTime)) {
288
+ var thisInput = hasClass(target, this.settings.endClass) ? this.endTimeInput : this.startTimeInput;
289
+ var otherInput = hasClass(target, this.settings.startClass) ? this.endTimeInput : this.startTimeInput;
290
+ var selectedTime = this.settings.parseTime(thisInput);
291
+ this.timeDelta = 0;
292
+ this.settings.updateTime(otherInput, selectedTime);
293
+ } else {
294
+ this.timeDelta = endTime.getTime() - startTime.getTime();
295
+ }
170
296
  }
171
-
172
- } else if (hasClass(e.target, this.settings.timeClass)) {
173
- if (e.target.value != '') {
174
- this._timeChanged(e.target);
175
- } else {
176
- this.timeDelta = null;
297
+
298
+
299
+ },
300
+
301
+ _doMidnightRollover: function(startTime, endTime) {
302
+ if (!this.startDateInput || !this.endDateInput) {
303
+ return;
177
304
  }
178
- }
179
-
180
- this._validateRanges();
181
- this._updateEndMintime();
182
- this._bindChangeHandler();
183
- },
184
-
185
- _dateChanged: function(target){
186
- if (!this.startDateInput || !this.endDateInput) {
187
- return;
188
- }
189
-
190
- var startDate = this.settings.parseDate(this.startDateInput);
191
- var endDate = this.settings.parseDate(this.endDateInput);
192
-
193
- if (!startDate || !endDate) {
194
- if (this.settings.defaultDateDelta !== null) {
195
- if (startDate) {
196
- var newEnd = new Date(startDate.getTime() + this.settings.defaultDateDelta * _ONE_DAY);
197
- this.settings.updateDate(this.endDateInput, newEnd);
198
-
199
- } else if (endDate) {
200
- var newStart = new Date(endDate.getTime() - this.settings.defaultDateDelta * _ONE_DAY);
201
- this.settings.updateDate(this.startDateInput, newStart);
305
+
306
+ var endDate = this.settings.parseDate(this.endDateInput);
307
+ var startDate = this.settings.parseDate(this.startDateInput);
308
+ var newDelta = endTime.getTime() - startTime.getTime();
309
+ var offset = (endTime < startTime) ? _ONE_DAY : -1 * _ONE_DAY;
310
+
311
+ if (this.dateDelta !== null
312
+ && this.dateDelta + this.timeDelta <= _ONE_DAY
313
+ && this.dateDelta + newDelta != 0
314
+ && (offset > 0 || this.dateDelta != 0)
315
+ && ((newDelta >= 0 && this.timeDelta < 0) || (newDelta < 0 && this.timeDelta >= 0))) {
316
+
317
+ if (this.settings.anchor == 'start') {
318
+ this.settings.updateDate(this.endDateInput, new Date(endDate.getTime() + offset));
319
+ this._dateChanged(this.endDateInput);
320
+ } else if (this.settings.anchor == 'end') {
321
+ this.settings.updateDate(this.startDateInput, new Date(startDate.getTime() - offset));
322
+ this._dateChanged(this.startDateInput);
202
323
  }
203
-
204
- this.dateDelta = this.settings.defaultDateDelta * _ONE_DAY;
205
- } else {
206
- this.dateDelta = null;
207
324
  }
208
-
209
- return;
210
- }
211
-
212
- if (this.settings.anchor == 'start' && hasClass(target, this.settings.startClass)) {
213
- var newDate = new Date(startDate.getTime() + this.dateDelta);
214
- this.settings.updateDate(this.endDateInput, newDate);
215
- } else if (this.settings.anchor == 'end' && hasClass(target, this.settings.endClass)) {
216
- var newDate = new Date(endDate.getTime() - this.dateDelta);
217
- this.settings.updateDate(this.startDateInput, newDate);
218
- } else {
219
- if (endDate < startDate) {
220
- var otherInput = hasClass(target, this.settings.startClass) ? this.endDateInput : this.startDateInput;
221
- var selectedDate = this.settings.parseDate(target);
222
- this.dateDelta = 0;
223
- this.settings.updateDate(otherInput, selectedDate);
224
- } else {
225
- this.dateDelta = endDate.getTime() - startDate.getTime();
325
+ this.timeDelta = newDelta;
326
+ },
327
+
328
+ _updateEndMintime: function(){
329
+ if (typeof this.settings.setMinTime != 'function') return;
330
+
331
+ var baseTime = null;
332
+ if (this.settings.anchor == 'start' && (!this.dateDelta || this.dateDelta < _ONE_DAY || (this.timeDelta && this.dateDelta + this.timeDelta < _ONE_DAY))) {
333
+ baseTime = this.settings.parseTime(this.startTimeInput);
226
334
  }
227
- }
228
- },
229
-
230
- _timeChanged: function(target){
231
- if (!this.startTimeInput || !this.endTimeInput) {
232
- return;
233
- }
234
-
235
- var startTime = this.settings.parseTime(this.startTimeInput);
236
- var endTime = this.settings.parseTime(this.endTimeInput);
237
-
238
- if (!startTime || !endTime) {
239
- if (this.settings.defaultTimeDelta !== null) {
240
- if (startTime) {
241
- var newEnd = new Date(startTime.getTime() + this.settings.defaultTimeDelta);
242
- this.settings.updateTime(this.endTimeInput, newEnd);
243
- } else if (endTime) {
244
- var newStart = new Date(endTime.getTime() - this.settings.defaultTimeDelta);
245
- this.settings.updateTime(this.startTimeInput, newStart);
246
- }
247
-
248
- this.timeDelta = this.settings.defaultTimeDelta;
249
- } else {
250
- this.timeDelta = null;
335
+
336
+ this.settings.setMinTime(this.endTimeInput, baseTime);
337
+ },
338
+
339
+ _validateRanges: function(){
340
+ if (this.startTimeInput && this.endTimeInput && this.timeDelta === null) {
341
+ triggerSimpleCustomEvent(this.container, 'rangeIncomplete');
342
+ return;
251
343
  }
252
-
253
- return;
254
- }
255
-
256
- if (this.settings.anchor == 'start' && hasClass(target, this.settings.startClass)) {
257
- var newTime = new Date(startTime.getTime() + this.timeDelta);
258
- this.settings.updateTime(this.endTimeInput, newTime);
259
- endTime = this.settings.parseTime(this.endTimeInput);
260
-
261
- this._doMidnightRollover(startTime, endTime);
262
- } else if (this.settings.anchor == 'end' && hasClass(target, this.settings.endClass)) {
263
- var newTime = new Date(endTime.getTime() - this.timeDelta);
264
- this.settings.updateTime(this.startTimeInput, newTime);
265
- startTime = this.settings.parseTime(this.startTimeInput);
266
-
267
- this._doMidnightRollover(startTime, endTime);
268
- } else {
269
- this._doMidnightRollover(startTime, endTime);
270
-
271
- var startDate, endDate;
272
- if (this.startDateInput && this.endDateInput) {
273
- startDate = this.settings.parseDate(this.startDateInput);
274
- endDate = this.settings.parseDate(this.endDateInput);
344
+
345
+ if (this.startDateInput && this.endDateInput && this.dateDelta === null) {
346
+ triggerSimpleCustomEvent(this.container, 'rangeIncomplete');
347
+ return;
275
348
  }
276
-
277
- if ((+startDate == +endDate) && (endTime < startTime)) {
278
- var thisInput = hasClass(target, this.settings.endClass) ? this.endTimeInput : this.startTimeInput;
279
- var otherInput = hasClass(target, this.settings.startClass) ? this.endTimeInput : this.startTimeInput;
280
- var selectedTime = this.settings.parseTime(thisInput);
281
- this.timeDelta = 0;
282
- this.settings.updateTime(otherInput, selectedTime);
349
+
350
+ // due to the fact that times can wrap around, any time-only pair will be considered valid
351
+ if (!this.startDateInput || !this.endDateInput || this.dateDelta + this.timeDelta >= 0) {
352
+ triggerSimpleCustomEvent(this.container, 'rangeSelected');
283
353
  } else {
284
- this.timeDelta = endTime.getTime() - startTime.getTime();
285
- }
286
- }
287
-
288
-
289
- },
290
-
291
- _doMidnightRollover: function(startTime, endTime) {
292
- if (!this.startDateInput || !this.endDateInput) {
293
- return;
294
- }
295
-
296
- var endDate = this.settings.parseDate(this.endDateInput);
297
- var startDate = this.settings.parseDate(this.startDateInput);
298
- var newDelta = endTime.getTime() - startTime.getTime();
299
- var offset = (endTime < startTime) ? _ONE_DAY : -1 * _ONE_DAY;
300
-
301
- if (this.dateDelta !== null
302
- && this.dateDelta + this.timeDelta <= _ONE_DAY
303
- && this.dateDelta + newDelta != 0
304
- && (offset > 0 || this.dateDelta != 0)
305
- && ((newDelta >= 0 && this.timeDelta < 0) || (newDelta < 0 && this.timeDelta >= 0))) {
306
-
307
- if (this.settings.anchor == 'start') {
308
- this.settings.updateDate(this.endDateInput, new Date(endDate.getTime() + offset));
309
- this._dateChanged(this.endDateInput);
310
- } else if (this.settings.anchor == 'end') {
311
- this.settings.updateDate(this.startDateInput, new Date(startDate.getTime() - offset));
312
- this._dateChanged(this.startDateInput);
354
+ triggerSimpleCustomEvent(this.container, 'rangeError');
313
355
  }
314
356
  }
315
- this.timeDelta = newDelta;
316
- },
317
-
318
- _updateEndMintime: function(){
319
- if (typeof this.settings.setMinTime != 'function') return;
320
-
321
- var baseTime = null;
322
- if (this.settings.anchor == 'start' && (!this.dateDelta || this.dateDelta < _ONE_DAY || (this.timeDelta && this.dateDelta + this.timeDelta < _ONE_DAY))) {
323
- baseTime = this.settings.parseTime(this.startTimeInput);
324
- }
325
-
326
- this.settings.setMinTime(this.endTimeInput, baseTime);
327
- },
328
-
329
- _validateRanges: function(){
330
- if (this.startTimeInput && this.endTimeInput && this.timeDelta === null) {
331
- triggerSimpleCustomEvent(this.container, 'rangeIncomplete');
332
- return;
333
- }
357
+ };
334
358
 
335
- if (this.startDateInput && this.endDateInput && this.dateDelta === null) {
336
- triggerSimpleCustomEvent(this.container, 'rangeIncomplete');
337
- return;
338
- }
359
+ window.Datepair = Datepair;
339
360
 
340
- // due to the fact that times can wrap around, any time-only pair will be considered valid
341
- if (!this.startDateInput || !this.endDateInput || this.dateDelta + this.timeDelta >= 0) {
342
- triggerSimpleCustomEvent(this.container, 'rangeSelected');
343
- } else {
344
- triggerSimpleCustomEvent(this.container, 'rangeError');
345
- }
346
- }
347
- };
361
+ }(window, document));
@@ -1,3 +1,9 @@
1
+ /*!
2
+ * datepair.js v0.4.15 - A javascript plugin for intelligently selecting date and time ranges inspired by Google Calendar.
3
+ * Copyright (c) 2016 Jon Thornton - http://jonthornton.github.com/Datepair.js
4
+ * License: MIT
5
+ */
6
+
1
7
  (function($) {
2
8
 
3
9
  if(!$) {
@@ -20,6 +26,11 @@
20
26
  $this.data('datepair', data);
21
27
  }
22
28
 
29
+ if (option === 'remove') {
30
+ out = data['remove']();
31
+ $this.removeData('datepair', data);
32
+ }
33
+
23
34
  if (typeof option === 'string') {
24
35
  out = data[option]();
25
36
  }
@@ -37,4 +48,4 @@
37
48
  $this.datepair($this.data());
38
49
  });
39
50
 
40
- }(window.Zepto || window.jQuery));
51
+ }(window.Zepto || window.jQuery));
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * jquery-timepicker v1.11.4 - A jQuery timepicker plugin inspired by Google Calendar. It supports both mouse and keyboard navigation.
2
+ * jquery-timepicker v1.11.10 - A jQuery timepicker plugin inspired by Google Calendar. It supports both mouse and keyboard navigation.
3
3
  * Copyright (c) 2015 Jon Thornton - http://jonthornton.github.com/jquery-timepicker/
4
4
  * License: MIT
5
5
  */
@@ -30,6 +30,58 @@
30
30
  hrs: 'hrs'
31
31
  };
32
32
 
33
+ var _DEFAULTS = {
34
+ appendTo: 'body',
35
+ className: null,
36
+ closeOnWindowScroll: false,
37
+ disableTextInput: false,
38
+ disableTimeRanges: [],
39
+ disableTouchKeyboard: false,
40
+ durationTime: null,
41
+ forceRoundTime: false,
42
+ maxTime: null,
43
+ minTime: null,
44
+ noneOption: false,
45
+ orientation: 'l',
46
+ roundingFunction: function(seconds, settings) {
47
+ if (seconds === null) {
48
+ return null;
49
+ } else if (typeof settings.step !== "number") {
50
+ // TODO: nearest fit irregular steps
51
+ return seconds;
52
+ } else {
53
+ var offset = seconds % (settings.step*60); // step is in minutes
54
+
55
+ var start = settings.minTime || 0;
56
+
57
+ // adjust offset by start mod step so that the offset is aligned not to 00:00 but to the start
58
+ offset -= start % (settings.step * 60);
59
+
60
+ if (offset >= settings.step*30) {
61
+ // if offset is larger than a half step, round up
62
+ seconds += (settings.step*60) - offset;
63
+ } else {
64
+ // round down
65
+ seconds -= offset;
66
+ }
67
+
68
+ return _moduloSeconds(seconds, settings);
69
+ }
70
+ },
71
+ scrollDefault: null,
72
+ selectOnBlur: false,
73
+ show2400: false,
74
+ showDuration: false,
75
+ showOn: ['click', 'focus'],
76
+ showOnFocus: true,
77
+ step: 30,
78
+ stopScrollPropagation: false,
79
+ timeFormat: 'g:ia',
80
+ typeaheadHighlight: true,
81
+ useSelect: false,
82
+ wrapHours: true
83
+ };
84
+
33
85
  var methods = {
34
86
  init: function(options)
35
87
  {
@@ -39,13 +91,13 @@
39
91
 
40
92
  // pick up settings from data attributes
41
93
  var attributeOptions = [];
42
- for (var key in $.fn.timepicker.defaults) {
94
+ for (var key in _DEFAULTS) {
43
95
  if (self.data(key)) {
44
96
  attributeOptions[key] = self.data(key);
45
97
  }
46
98
  }
47
99
 
48
- var settings = $.extend({}, $.fn.timepicker.defaults, attributeOptions, options);
100
+ var settings = $.extend({}, _DEFAULTS, options, attributeOptions);
49
101
 
50
102
  if (settings.lang) {
51
103
  _lang = $.extend(_lang, settings.lang);
@@ -71,7 +123,7 @@
71
123
  self.on('keydown.timepicker', _disableTextInputHandler);
72
124
  }
73
125
 
74
- _formatValue.call(self.get(0));
126
+ _formatValue.call(self.get(0), null, 'initial');
75
127
  }
76
128
  });
77
129
  },
@@ -243,6 +295,8 @@
243
295
 
244
296
  self.data('timepicker-settings', settings);
245
297
 
298
+ _formatValue.call(self.get(0), {'type':'change'}, 'initial');
299
+
246
300
  if (list) {
247
301
  list.remove();
248
302
  self.data('timepicker-list', false);
@@ -507,8 +561,8 @@
507
561
  row.text(timeString);
508
562
  } else {
509
563
  var row = $('<li />');
510
- row.addClass(timeInt % 86400 < 43200 ? 'ui-timepicker-am' : 'ui-timepicker-pm');
511
- row.data('time', (timeInt <= 86400 ? timeInt : timeInt % 86400));
564
+ row.addClass((timeInt % _ONE_DAY) < (_ONE_DAY / 2) ? 'ui-timepicker-am' : 'ui-timepicker-pm');
565
+ row.data('time', _moduloSeconds(timeInt, settings));
512
566
  row.text(timeString);
513
567
  }
514
568
 
@@ -748,17 +802,21 @@
748
802
  });
749
803
 
750
804
  if (settings.forceRoundTime) {
751
- seconds = settings.roundingFunction(seconds, settings);
805
+ var roundSeconds = settings.roundingFunction(seconds, settings);
806
+ if (roundSeconds != seconds) {
807
+ seconds = roundSeconds;
808
+ origin = null;
809
+ }
752
810
  }
753
811
 
754
812
  var prettyTime = _int2time(seconds, settings);
755
813
 
756
814
  if (rangeError) {
757
- if (_setTimeValue(self, prettyTime, 'error')) {
815
+ if (_setTimeValue(self, prettyTime, 'error') || e && e.type == 'change') {
758
816
  self.trigger('timeRangeError');
759
817
  }
760
818
  } else {
761
- _setTimeValue(self, prettyTime);
819
+ _setTimeValue(self, prettyTime, origin);
762
820
  }
763
821
  }
764
822
 
@@ -787,7 +845,7 @@
787
845
  self.data('ui-timepicker-value', value);
788
846
  if (source == 'select') {
789
847
  self.trigger('selectTime').trigger('changeTime').trigger('change', 'timepicker');
790
- } else if (source != 'error') {
848
+ } else if (['error', 'initial'].indexOf(source) == -1) {
791
849
  self.trigger('changeTime');
792
850
  }
793
851
 
@@ -1174,6 +1232,14 @@
1174
1232
  return ("0" + n).slice(-2);
1175
1233
  }
1176
1234
 
1235
+ function _moduloSeconds(seconds, settings) {
1236
+ if (seconds == _ONE_DAY && settings.show2400) {
1237
+ return seconds;
1238
+ }
1239
+
1240
+ return seconds%_ONE_DAY;
1241
+ }
1242
+
1177
1243
  // Plugin entry
1178
1244
  $.fn.timepicker = function(method)
1179
1245
  {
@@ -1188,55 +1254,4 @@
1188
1254
  else if(typeof method === "object" || !method) { return methods.init.apply(this, arguments); }
1189
1255
  else { $.error("Method "+ method + " does not exist on jQuery.timepicker"); }
1190
1256
  };
1191
- // Global defaults
1192
- $.fn.timepicker.defaults = {
1193
- appendTo: 'body',
1194
- className: null,
1195
- closeOnWindowScroll: false,
1196
- disableTextInput: false,
1197
- disableTimeRanges: [],
1198
- disableTouchKeyboard: false,
1199
- durationTime: null,
1200
- forceRoundTime: false,
1201
- maxTime: null,
1202
- minTime: null,
1203
- noneOption: false,
1204
- orientation: 'l',
1205
- roundingFunction: function(seconds, settings) {
1206
- if (seconds === null) {
1207
- return null;
1208
- } else if (typeof settings.step !== "number") {
1209
- // TODO: nearest fit irregular steps
1210
- return seconds;
1211
- } else {
1212
- var offset = seconds % (settings.step*60); // step is in minutes
1213
-
1214
- if (offset >= settings.step*30) {
1215
- // if offset is larger than a half step, round up
1216
- seconds += (settings.step*60) - offset;
1217
- } else {
1218
- // round down
1219
- seconds -= offset;
1220
- }
1221
-
1222
- if (seconds == _ONE_DAY && settings.show2400) {
1223
- return seconds;
1224
- }
1225
-
1226
- return seconds%_ONE_DAY;
1227
- }
1228
- },
1229
- scrollDefault: null,
1230
- selectOnBlur: false,
1231
- show2400: false,
1232
- showDuration: false,
1233
- showOn: ['click', 'focus'],
1234
- showOnFocus: true,
1235
- step: 30,
1236
- stopScrollPropagation: false,
1237
- timeFormat: 'g:ia',
1238
- typeaheadHighlight: true,
1239
- useSelect: false,
1240
- wrapHours: true
1241
- };
1242
1257
  }));
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jquery-timepicker-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.4
4
+ version: 1.11.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tanguy Krotoff (jQuery plugin by Jon Thornton)
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-09-21 00:00:00.000000000 Z
12
+ date: 2017-03-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
@@ -92,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  version: '0'
93
93
  requirements: []
94
94
  rubyforge_project:
95
- rubygems_version: 2.6.4
95
+ rubygems_version: 2.6.8
96
96
  signing_key:
97
97
  specification_version: 4
98
98
  summary: jquery-timepicker packaged for the Rails 3.1+ asset pipeline