jquery-timepicker-rails 1.11.4 → 1.11.10

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.
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