bootstrap-timepicker-rails-addon 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +22 -22
- data/README.md +71 -71
- data/lib/bootstrap-timepicker-rails-addon.rb +12 -12
- data/lib/bootstrap-timepicker-rails-addon/version.rb +9 -9
- data/vendor/assets/javascripts/bootstrap-timepicker.js +1177 -1169
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73dc4f56352b35fbb9925588df3ec51854da7f17
|
4
|
+
data.tar.gz: 237a487ad4ba951ac198028ff951cc1104a9b185
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c47312f2fbf678096bbb410552217107073ec9fef8bbc9b84a5e5b9d694379d9ddf63f599d8a1bf87d975a961e2881d9148c15147d864af482439b2829f300c
|
7
|
+
data.tar.gz: 93d96b0642b59adf9002adbe7113383b29bb60b8345d259223ab072ba97204931d00ceb427553318433b5d2e03e50708d366fefdd73706481c6cdce121249ec9
|
data/LICENSE
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
Copyright (c) 2013
|
2
|
-
|
3
|
-
MIT License
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
a copy of this software and associated documentation files (the
|
7
|
-
"Software"), to deal in the Software without restriction, including
|
8
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
-
permit persons to whom the Software is furnished to do so, subject to
|
11
|
-
the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
included in all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
1
|
+
Copyright (c) 2013
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -1,71 +1,71 @@
|
|
1
|
-
# Bootstrap::Timepicker::Rails::Addon
|
2
|
-
This is the GEMified version of [bootstrap-timepicker](https://github.com/jdewit/bootstrap-timepicker)
|
3
|
-
|
4
|
-
bootstrap-timepicker-rails-addon project integrates Timepicker for Twitter Bootstrap 3 with Rails 3 and
|
5
|
-
|
6
|
-
## Installation
|
7
|
-
|
8
|
-
Add this line to your application's Gemfile:
|
9
|
-
|
10
|
-
1) if you used Bootstrap 3 version,
|
11
|
-
```ruby
|
12
|
-
gem 'bootstrap-sass', '~> 3.3.
|
13
|
-
gem 'bootstrap-timepicker-rails-addon', '~> 0.5.1'
|
14
|
-
```
|
15
|
-
|
16
|
-
2) if you used Bootstrap 2 version,
|
17
|
-
```ruby
|
18
|
-
gem 'bootstrap-sass', '~> 2.3.2.0'
|
19
|
-
gem 'bootstrap-timepicker-rails-addon', '0.3.0'
|
20
|
-
```
|
21
|
-
|
22
|
-
Or you can install from latest build(only support Bootstrap 3 version in master branch):
|
23
|
-
|
24
|
-
```ruby
|
25
|
-
gem 'bootstrap-sass', '~> 3.3.
|
26
|
-
gem 'bootstrap-timepicker-rails-addon', :require => 'bootstrap-timepicker-rails-addon',
|
27
|
-
:git => 'git://github.com/ywjno/bootstrap-timepicker-rails-addon.git'
|
28
|
-
```
|
29
|
-
|
30
|
-
And then execute:
|
31
|
-
|
32
|
-
$ bundle
|
33
|
-
|
34
|
-
Or install it yourself as:
|
35
|
-
|
36
|
-
$ gem install bootstrap-timepicker-rails-addon
|
37
|
-
|
38
|
-
## Usage
|
39
|
-
|
40
|
-
Add this line to app/assets/javascripts/application.js
|
41
|
-
|
42
|
-
//= require bootstrap-timepicker
|
43
|
-
|
44
|
-
Add this line to app/assets/stylesheets/application.css.scss
|
45
|
-
|
46
|
-
@import "bootstrap-timepicker";
|
47
|
-
|
48
|
-
Just call timepicker() with any selector in view.
|
49
|
-
|
50
|
-
```javascript
|
51
|
-
$('#timepicker').timepicker();
|
52
|
-
```
|
53
|
-
|
54
|
-
And here is the html code sample.
|
55
|
-
|
56
|
-
```html
|
57
|
-
<div class="input-group bootstrap-timepicker timepicker">
|
58
|
-
<input id="timepicker1" type="text" class="form-control input-small">
|
59
|
-
<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span>
|
60
|
-
</div>
|
61
|
-
```
|
62
|
-
|
63
|
-
Please view the bootstrap-timepicker <a href="http://jdewit.github.io/bootstrap-timepicker/">demos & documentation</a>.
|
64
|
-
|
65
|
-
## Contributing
|
66
|
-
|
67
|
-
1. Fork it
|
68
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
69
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
70
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
71
|
-
5. Create new Pull Request
|
1
|
+
# Bootstrap::Timepicker::Rails::Addon
|
2
|
+
This is the GEMified version of [bootstrap-timepicker](https://github.com/jdewit/bootstrap-timepicker)
|
3
|
+
|
4
|
+
bootstrap-timepicker-rails-addon project integrates Timepicker for Twitter Bootstrap 3 with Rails 3, 4 and 5 assets pipeline.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
1) if you used Bootstrap 3 version,
|
11
|
+
```ruby
|
12
|
+
gem 'bootstrap-sass', '~> 3.3.7'
|
13
|
+
gem 'bootstrap-timepicker-rails-addon', '~> 0.5.1'
|
14
|
+
```
|
15
|
+
|
16
|
+
2) if you used Bootstrap 2 version,
|
17
|
+
```ruby
|
18
|
+
gem 'bootstrap-sass', '~> 2.3.2.0'
|
19
|
+
gem 'bootstrap-timepicker-rails-addon', '0.3.0'
|
20
|
+
```
|
21
|
+
|
22
|
+
Or you can install from latest build(only support Bootstrap 3 version in master branch):
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
gem 'bootstrap-sass', '~> 3.3.7'
|
26
|
+
gem 'bootstrap-timepicker-rails-addon', :require => 'bootstrap-timepicker-rails-addon',
|
27
|
+
:git => 'git://github.com/ywjno/bootstrap-timepicker-rails-addon.git'
|
28
|
+
```
|
29
|
+
|
30
|
+
And then execute:
|
31
|
+
|
32
|
+
$ bundle
|
33
|
+
|
34
|
+
Or install it yourself as:
|
35
|
+
|
36
|
+
$ gem install bootstrap-timepicker-rails-addon
|
37
|
+
|
38
|
+
## Usage
|
39
|
+
|
40
|
+
Add this line to app/assets/javascripts/application.js
|
41
|
+
|
42
|
+
//= require bootstrap-timepicker
|
43
|
+
|
44
|
+
Add this line to app/assets/stylesheets/application.css.scss
|
45
|
+
|
46
|
+
@import "bootstrap-timepicker";
|
47
|
+
|
48
|
+
Just call timepicker() with any selector in view.
|
49
|
+
|
50
|
+
```javascript
|
51
|
+
$('#timepicker').timepicker();
|
52
|
+
```
|
53
|
+
|
54
|
+
And here is the html code sample.
|
55
|
+
|
56
|
+
```html
|
57
|
+
<div class="input-group bootstrap-timepicker timepicker">
|
58
|
+
<input id="timepicker1" type="text" class="form-control input-small">
|
59
|
+
<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span>
|
60
|
+
</div>
|
61
|
+
```
|
62
|
+
|
63
|
+
Please view the bootstrap-timepicker <a href="http://jdewit.github.io/bootstrap-timepicker/">demos & documentation</a>.
|
64
|
+
|
65
|
+
## Contributing
|
66
|
+
|
67
|
+
1. Fork it
|
68
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
69
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
70
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
71
|
+
5. Create new Pull Request
|
@@ -1,12 +1,12 @@
|
|
1
|
-
require "bootstrap-timepicker-rails-addon/version"
|
2
|
-
|
3
|
-
module Bootstrap
|
4
|
-
module Timepicker
|
5
|
-
module Rails
|
6
|
-
module Addon
|
7
|
-
class Engine < ::Rails::Engine
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
1
|
+
require "bootstrap-timepicker-rails-addon/version"
|
2
|
+
|
3
|
+
module Bootstrap
|
4
|
+
module Timepicker
|
5
|
+
module Rails
|
6
|
+
module Addon
|
7
|
+
class Engine < ::Rails::Engine
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
module Bootstrap
|
2
|
-
module Timepicker
|
3
|
-
module Rails
|
4
|
-
module Addon
|
5
|
-
VERSION = "0.5.
|
6
|
-
end
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
1
|
+
module Bootstrap
|
2
|
+
module Timepicker
|
3
|
+
module Rails
|
4
|
+
module Addon
|
5
|
+
VERSION = "0.5.2"
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -1,1169 +1,1177 @@
|
|
1
|
-
/*!
|
2
|
-
* Timepicker Component for Twitter Bootstrap
|
3
|
-
*
|
4
|
-
* Copyright 2013 Joris de Wit
|
5
|
-
*
|
6
|
-
* Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors
|
7
|
-
*
|
8
|
-
* For the full copyright and license information, please view the LICENSE
|
9
|
-
* file that was distributed with this source code.
|
10
|
-
*/
|
11
|
-
(function($, window, document) {
|
12
|
-
'use strict';
|
13
|
-
|
14
|
-
// TIMEPICKER PUBLIC CLASS DEFINITION
|
15
|
-
var Timepicker = function(element, options) {
|
16
|
-
this.widget = '';
|
17
|
-
this.$element = $(element);
|
18
|
-
this.defaultTime = options.defaultTime;
|
19
|
-
this.disableFocus = options.disableFocus;
|
20
|
-
this.disableMousewheel = options.disableMousewheel;
|
21
|
-
this.isOpen = options.isOpen;
|
22
|
-
this.minuteStep = options.minuteStep;
|
23
|
-
this.modalBackdrop = options.modalBackdrop;
|
24
|
-
this.orientation = options.orientation;
|
25
|
-
this.secondStep = options.secondStep;
|
26
|
-
this.snapToStep = options.snapToStep;
|
27
|
-
this.showInputs = options.showInputs;
|
28
|
-
this.showMeridian = options.showMeridian;
|
29
|
-
this.showSeconds = options.showSeconds;
|
30
|
-
this.template = options.template;
|
31
|
-
this.appendWidgetTo = options.appendWidgetTo;
|
32
|
-
this.showWidgetOnAddonClick = options.showWidgetOnAddonClick;
|
33
|
-
this.
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
//
|
40
|
-
|
41
|
-
|
42
|
-
self.$widget.
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
'
|
63
|
-
'
|
64
|
-
'
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
'
|
72
|
-
'
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
'
|
79
|
-
'
|
80
|
-
'
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
this.$widget =
|
89
|
-
}
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
'
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
this.
|
113
|
-
this.
|
114
|
-
|
115
|
-
this
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
this.hour
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
this.
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
this.
|
132
|
-
}
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
this.hour
|
138
|
-
}
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
newVal = this.minute -
|
149
|
-
}
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
this.minute = newVal;
|
156
|
-
}
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
this.second = newVal;
|
167
|
-
}
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
this.
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
case '
|
202
|
-
this.
|
203
|
-
this.
|
204
|
-
break;
|
205
|
-
case '
|
206
|
-
this.
|
207
|
-
this.
|
208
|
-
break;
|
209
|
-
case '
|
210
|
-
this.
|
211
|
-
this.
|
212
|
-
break;
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
this.
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
case '
|
229
|
-
this.
|
230
|
-
this.
|
231
|
-
break;
|
232
|
-
case '
|
233
|
-
this.
|
234
|
-
this.
|
235
|
-
break;
|
236
|
-
case '
|
237
|
-
this.
|
238
|
-
this.
|
239
|
-
break;
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
(this.
|
294
|
-
'<td class="separator"> </td>'+
|
295
|
-
'<td
|
296
|
-
: '') +
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
'
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
(this.
|
307
|
-
'<td class="separator"
|
308
|
-
'<td>'+
|
309
|
-
: '') +
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
'
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
(this.
|
320
|
-
'<td class="separator"> </td>'+
|
321
|
-
'<td><a href="#" data-action="
|
322
|
-
: '') +
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
'<div class="modal-
|
334
|
-
|
335
|
-
|
336
|
-
'
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
this
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
'
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
}
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
this
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
this.
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
this.
|
415
|
-
}
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
this.
|
439
|
-
}
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
this.
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
if (
|
599
|
-
e.
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
this.
|
623
|
-
break;
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
var
|
664
|
-
|
665
|
-
|
666
|
-
var
|
667
|
-
|
668
|
-
this
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
}
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
top
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
seconds =
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
this.
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
this.
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
this.
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
}
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
if (
|
862
|
-
|
863
|
-
}
|
864
|
-
|
865
|
-
if (
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
timeMode =
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
this.
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
if (this
|
913
|
-
return;
|
914
|
-
}
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
'
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
|
943
|
-
|
944
|
-
|
945
|
-
|
946
|
-
|
947
|
-
}
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
}
|
952
|
-
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
this.
|
958
|
-
},
|
959
|
-
|
960
|
-
|
961
|
-
this.
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
'
|
974
|
-
|
975
|
-
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
},
|
981
|
-
|
982
|
-
|
983
|
-
this
|
984
|
-
},
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1006
|
-
this
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
|
1034
|
-
|
1035
|
-
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
1039
|
-
|
1040
|
-
|
1041
|
-
|
1042
|
-
|
1043
|
-
|
1044
|
-
|
1045
|
-
|
1046
|
-
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1051
|
-
|
1052
|
-
|
1053
|
-
|
1054
|
-
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1063
|
-
|
1064
|
-
|
1065
|
-
|
1066
|
-
|
1067
|
-
|
1068
|
-
|
1069
|
-
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1089
|
-
|
1090
|
-
|
1091
|
-
|
1092
|
-
|
1093
|
-
|
1094
|
-
|
1095
|
-
|
1096
|
-
|
1097
|
-
|
1098
|
-
|
1099
|
-
|
1100
|
-
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1125
|
-
|
1126
|
-
|
1127
|
-
if (
|
1128
|
-
data
|
1129
|
-
}
|
1130
|
-
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1151
|
-
|
1152
|
-
|
1153
|
-
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1163
|
-
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1
|
+
/*!
|
2
|
+
* Timepicker Component for Twitter Bootstrap
|
3
|
+
*
|
4
|
+
* Copyright 2013 Joris de Wit and bootstrap-timepicker contributors
|
5
|
+
*
|
6
|
+
* Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors
|
7
|
+
*
|
8
|
+
* For the full copyright and license information, please view the LICENSE
|
9
|
+
* file that was distributed with this source code.
|
10
|
+
*/
|
11
|
+
(function($, window, document) {
|
12
|
+
'use strict';
|
13
|
+
|
14
|
+
// TIMEPICKER PUBLIC CLASS DEFINITION
|
15
|
+
var Timepicker = function(element, options) {
|
16
|
+
this.widget = '';
|
17
|
+
this.$element = $(element);
|
18
|
+
this.defaultTime = options.defaultTime;
|
19
|
+
this.disableFocus = options.disableFocus;
|
20
|
+
this.disableMousewheel = options.disableMousewheel;
|
21
|
+
this.isOpen = options.isOpen;
|
22
|
+
this.minuteStep = options.minuteStep;
|
23
|
+
this.modalBackdrop = options.modalBackdrop;
|
24
|
+
this.orientation = options.orientation;
|
25
|
+
this.secondStep = options.secondStep;
|
26
|
+
this.snapToStep = options.snapToStep;
|
27
|
+
this.showInputs = options.showInputs;
|
28
|
+
this.showMeridian = options.showMeridian;
|
29
|
+
this.showSeconds = options.showSeconds;
|
30
|
+
this.template = options.template;
|
31
|
+
this.appendWidgetTo = options.appendWidgetTo;
|
32
|
+
this.showWidgetOnAddonClick = options.showWidgetOnAddonClick;
|
33
|
+
this.icons = options.icons;
|
34
|
+
this.maxHours = options.maxHours;
|
35
|
+
this.explicitMode = options.explicitMode; // If true 123 = 1:23, 12345 = 1:23:45, else invalid.
|
36
|
+
|
37
|
+
this.handleDocumentClick = function (e) {
|
38
|
+
var self = e.data.scope;
|
39
|
+
// This condition was inspired by bootstrap-datepicker.
|
40
|
+
// The element the timepicker is invoked on is the input but it has a sibling for addon/button.
|
41
|
+
if (!(self.$element.parent().find(e.target).length ||
|
42
|
+
self.$widget.is(e.target) ||
|
43
|
+
self.$widget.find(e.target).length)) {
|
44
|
+
self.hideWidget();
|
45
|
+
}
|
46
|
+
};
|
47
|
+
|
48
|
+
this._init();
|
49
|
+
};
|
50
|
+
|
51
|
+
Timepicker.prototype = {
|
52
|
+
|
53
|
+
constructor: Timepicker,
|
54
|
+
_init: function() {
|
55
|
+
var self = this;
|
56
|
+
|
57
|
+
if (this.showWidgetOnAddonClick && (this.$element.parent().hasClass('input-group') && this.$element.parent().hasClass('bootstrap-timepicker'))) {
|
58
|
+
this.$element.parent('.input-group.bootstrap-timepicker').find('.input-group-addon').on({
|
59
|
+
'click.timepicker': $.proxy(this.showWidget, this)
|
60
|
+
});
|
61
|
+
this.$element.on({
|
62
|
+
'focus.timepicker': $.proxy(this.highlightUnit, this),
|
63
|
+
'click.timepicker': $.proxy(this.highlightUnit, this),
|
64
|
+
'keydown.timepicker': $.proxy(this.elementKeydown, this),
|
65
|
+
'blur.timepicker': $.proxy(this.blurElement, this),
|
66
|
+
'mousewheel.timepicker DOMMouseScroll.timepicker': $.proxy(this.mousewheel, this)
|
67
|
+
});
|
68
|
+
} else {
|
69
|
+
if (this.template) {
|
70
|
+
this.$element.on({
|
71
|
+
'focus.timepicker': $.proxy(this.showWidget, this),
|
72
|
+
'click.timepicker': $.proxy(this.showWidget, this),
|
73
|
+
'blur.timepicker': $.proxy(this.blurElement, this),
|
74
|
+
'mousewheel.timepicker DOMMouseScroll.timepicker': $.proxy(this.mousewheel, this)
|
75
|
+
});
|
76
|
+
} else {
|
77
|
+
this.$element.on({
|
78
|
+
'focus.timepicker': $.proxy(this.highlightUnit, this),
|
79
|
+
'click.timepicker': $.proxy(this.highlightUnit, this),
|
80
|
+
'keydown.timepicker': $.proxy(this.elementKeydown, this),
|
81
|
+
'blur.timepicker': $.proxy(this.blurElement, this),
|
82
|
+
'mousewheel.timepicker DOMMouseScroll.timepicker': $.proxy(this.mousewheel, this)
|
83
|
+
});
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
if (this.template !== false) {
|
88
|
+
this.$widget = $(this.getTemplate()).on('click', $.proxy(this.widgetClick, this));
|
89
|
+
} else {
|
90
|
+
this.$widget = false;
|
91
|
+
}
|
92
|
+
|
93
|
+
if (this.showInputs && this.$widget !== false) {
|
94
|
+
this.$widget.find('input').each(function() {
|
95
|
+
$(this).on({
|
96
|
+
'click.timepicker': function() { $(this).select(); },
|
97
|
+
'keydown.timepicker': $.proxy(self.widgetKeydown, self),
|
98
|
+
'keyup.timepicker': $.proxy(self.widgetKeyup, self)
|
99
|
+
});
|
100
|
+
});
|
101
|
+
}
|
102
|
+
|
103
|
+
this.setDefaultTime(this.defaultTime);
|
104
|
+
},
|
105
|
+
|
106
|
+
blurElement: function() {
|
107
|
+
this.highlightedUnit = null;
|
108
|
+
this.updateFromElementVal();
|
109
|
+
},
|
110
|
+
|
111
|
+
clear: function() {
|
112
|
+
this.hour = '';
|
113
|
+
this.minute = '';
|
114
|
+
this.second = '';
|
115
|
+
this.meridian = '';
|
116
|
+
|
117
|
+
this.$element.val('');
|
118
|
+
},
|
119
|
+
|
120
|
+
decrementHour: function() {
|
121
|
+
if (this.showMeridian) {
|
122
|
+
if (this.hour === 1) {
|
123
|
+
this.hour = 12;
|
124
|
+
} else if (this.hour === 12) {
|
125
|
+
this.hour--;
|
126
|
+
|
127
|
+
return this.toggleMeridian();
|
128
|
+
} else if (this.hour === 0) {
|
129
|
+
this.hour = 11;
|
130
|
+
|
131
|
+
return this.toggleMeridian();
|
132
|
+
} else {
|
133
|
+
this.hour--;
|
134
|
+
}
|
135
|
+
} else {
|
136
|
+
if (this.hour <= 0) {
|
137
|
+
this.hour = this.maxHours - 1;
|
138
|
+
} else {
|
139
|
+
this.hour--;
|
140
|
+
}
|
141
|
+
}
|
142
|
+
},
|
143
|
+
|
144
|
+
decrementMinute: function(step) {
|
145
|
+
var newVal;
|
146
|
+
|
147
|
+
if (step) {
|
148
|
+
newVal = this.minute - step;
|
149
|
+
} else {
|
150
|
+
newVal = this.minute - this.minuteStep;
|
151
|
+
}
|
152
|
+
|
153
|
+
if (newVal < 0) {
|
154
|
+
this.decrementHour();
|
155
|
+
this.minute = newVal + 60;
|
156
|
+
} else {
|
157
|
+
this.minute = newVal;
|
158
|
+
}
|
159
|
+
},
|
160
|
+
|
161
|
+
decrementSecond: function() {
|
162
|
+
var newVal = this.second - this.secondStep;
|
163
|
+
|
164
|
+
if (newVal < 0) {
|
165
|
+
this.decrementMinute(true);
|
166
|
+
this.second = newVal + 60;
|
167
|
+
} else {
|
168
|
+
this.second = newVal;
|
169
|
+
}
|
170
|
+
},
|
171
|
+
|
172
|
+
elementKeydown: function(e) {
|
173
|
+
switch (e.which) {
|
174
|
+
case 9: //tab
|
175
|
+
if (e.shiftKey) {
|
176
|
+
if (this.highlightedUnit === 'hour') {
|
177
|
+
this.hideWidget();
|
178
|
+
break;
|
179
|
+
}
|
180
|
+
this.highlightPrevUnit();
|
181
|
+
} else if ((this.showMeridian && this.highlightedUnit === 'meridian') || (this.showSeconds && this.highlightedUnit === 'second') || (!this.showMeridian && !this.showSeconds && this.highlightedUnit ==='minute')) {
|
182
|
+
this.hideWidget();
|
183
|
+
break;
|
184
|
+
} else {
|
185
|
+
this.highlightNextUnit();
|
186
|
+
}
|
187
|
+
e.preventDefault();
|
188
|
+
this.updateFromElementVal();
|
189
|
+
break;
|
190
|
+
case 27: // escape
|
191
|
+
this.updateFromElementVal();
|
192
|
+
break;
|
193
|
+
case 37: // left arrow
|
194
|
+
e.preventDefault();
|
195
|
+
this.highlightPrevUnit();
|
196
|
+
this.updateFromElementVal();
|
197
|
+
break;
|
198
|
+
case 38: // up arrow
|
199
|
+
e.preventDefault();
|
200
|
+
switch (this.highlightedUnit) {
|
201
|
+
case 'hour':
|
202
|
+
this.incrementHour();
|
203
|
+
this.highlightHour();
|
204
|
+
break;
|
205
|
+
case 'minute':
|
206
|
+
this.incrementMinute();
|
207
|
+
this.highlightMinute();
|
208
|
+
break;
|
209
|
+
case 'second':
|
210
|
+
this.incrementSecond();
|
211
|
+
this.highlightSecond();
|
212
|
+
break;
|
213
|
+
case 'meridian':
|
214
|
+
this.toggleMeridian();
|
215
|
+
this.highlightMeridian();
|
216
|
+
break;
|
217
|
+
}
|
218
|
+
this.update();
|
219
|
+
break;
|
220
|
+
case 39: // right arrow
|
221
|
+
e.preventDefault();
|
222
|
+
this.highlightNextUnit();
|
223
|
+
this.updateFromElementVal();
|
224
|
+
break;
|
225
|
+
case 40: // down arrow
|
226
|
+
e.preventDefault();
|
227
|
+
switch (this.highlightedUnit) {
|
228
|
+
case 'hour':
|
229
|
+
this.decrementHour();
|
230
|
+
this.highlightHour();
|
231
|
+
break;
|
232
|
+
case 'minute':
|
233
|
+
this.decrementMinute();
|
234
|
+
this.highlightMinute();
|
235
|
+
break;
|
236
|
+
case 'second':
|
237
|
+
this.decrementSecond();
|
238
|
+
this.highlightSecond();
|
239
|
+
break;
|
240
|
+
case 'meridian':
|
241
|
+
this.toggleMeridian();
|
242
|
+
this.highlightMeridian();
|
243
|
+
break;
|
244
|
+
}
|
245
|
+
|
246
|
+
this.update();
|
247
|
+
break;
|
248
|
+
}
|
249
|
+
},
|
250
|
+
|
251
|
+
getCursorPosition: function() {
|
252
|
+
var input = this.$element.get(0);
|
253
|
+
|
254
|
+
if ('selectionStart' in input) {// Standard-compliant browsers
|
255
|
+
|
256
|
+
return input.selectionStart;
|
257
|
+
} else if (document.selection) {// IE fix
|
258
|
+
input.focus();
|
259
|
+
var sel = document.selection.createRange(),
|
260
|
+
selLen = document.selection.createRange().text.length;
|
261
|
+
|
262
|
+
sel.moveStart('character', - input.value.length);
|
263
|
+
|
264
|
+
return sel.text.length - selLen;
|
265
|
+
}
|
266
|
+
},
|
267
|
+
|
268
|
+
getTemplate: function() {
|
269
|
+
var template,
|
270
|
+
hourTemplate,
|
271
|
+
minuteTemplate,
|
272
|
+
secondTemplate,
|
273
|
+
meridianTemplate,
|
274
|
+
templateContent;
|
275
|
+
|
276
|
+
if (this.showInputs) {
|
277
|
+
hourTemplate = '<input type="text" class="bootstrap-timepicker-hour" maxlength="2"/>';
|
278
|
+
minuteTemplate = '<input type="text" class="bootstrap-timepicker-minute" maxlength="2"/>';
|
279
|
+
secondTemplate = '<input type="text" class="bootstrap-timepicker-second" maxlength="2"/>';
|
280
|
+
meridianTemplate = '<input type="text" class="bootstrap-timepicker-meridian" maxlength="2"/>';
|
281
|
+
} else {
|
282
|
+
hourTemplate = '<span class="bootstrap-timepicker-hour"></span>';
|
283
|
+
minuteTemplate = '<span class="bootstrap-timepicker-minute"></span>';
|
284
|
+
secondTemplate = '<span class="bootstrap-timepicker-second"></span>';
|
285
|
+
meridianTemplate = '<span class="bootstrap-timepicker-meridian"></span>';
|
286
|
+
}
|
287
|
+
|
288
|
+
templateContent = '<table>'+
|
289
|
+
'<tr>'+
|
290
|
+
'<td><a href="#" data-action="incrementHour"><span class="'+ this.icons.up +'"></span></a></td>'+
|
291
|
+
'<td class="separator"> </td>'+
|
292
|
+
'<td><a href="#" data-action="incrementMinute"><span class="'+ this.icons.up +'"></span></a></td>'+
|
293
|
+
(this.showSeconds ?
|
294
|
+
'<td class="separator"> </td>'+
|
295
|
+
'<td><a href="#" data-action="incrementSecond"><span class="'+ this.icons.up +'"></span></a></td>'
|
296
|
+
: '') +
|
297
|
+
(this.showMeridian ?
|
298
|
+
'<td class="separator"> </td>'+
|
299
|
+
'<td class="meridian-column"><a href="#" data-action="toggleMeridian"><span class="'+ this.icons.up +'"></span></a></td>'
|
300
|
+
: '') +
|
301
|
+
'</tr>'+
|
302
|
+
'<tr>'+
|
303
|
+
'<td>'+ hourTemplate +'</td> '+
|
304
|
+
'<td class="separator">:</td>'+
|
305
|
+
'<td>'+ minuteTemplate +'</td> '+
|
306
|
+
(this.showSeconds ?
|
307
|
+
'<td class="separator">:</td>'+
|
308
|
+
'<td>'+ secondTemplate +'</td>'
|
309
|
+
: '') +
|
310
|
+
(this.showMeridian ?
|
311
|
+
'<td class="separator"> </td>'+
|
312
|
+
'<td>'+ meridianTemplate +'</td>'
|
313
|
+
: '') +
|
314
|
+
'</tr>'+
|
315
|
+
'<tr>'+
|
316
|
+
'<td><a href="#" data-action="decrementHour"><span class="'+ this.icons.down +'"></span></a></td>'+
|
317
|
+
'<td class="separator"></td>'+
|
318
|
+
'<td><a href="#" data-action="decrementMinute"><span class="'+ this.icons.down +'"></span></a></td>'+
|
319
|
+
(this.showSeconds ?
|
320
|
+
'<td class="separator"> </td>'+
|
321
|
+
'<td><a href="#" data-action="decrementSecond"><span class="'+ this.icons.down +'"></span></a></td>'
|
322
|
+
: '') +
|
323
|
+
(this.showMeridian ?
|
324
|
+
'<td class="separator"> </td>'+
|
325
|
+
'<td><a href="#" data-action="toggleMeridian"><span class="'+ this.icons.down +'"></span></a></td>'
|
326
|
+
: '') +
|
327
|
+
'</tr>'+
|
328
|
+
'</table>';
|
329
|
+
|
330
|
+
switch(this.template) {
|
331
|
+
case 'modal':
|
332
|
+
template = '<div class="bootstrap-timepicker-widget modal hide fade in" data-backdrop="'+ (this.modalBackdrop ? 'true' : 'false') +'">'+
|
333
|
+
'<div class="modal-header">'+
|
334
|
+
'<a href="#" class="close" data-dismiss="modal">×</a>'+
|
335
|
+
'<h3>Pick a Time</h3>'+
|
336
|
+
'</div>'+
|
337
|
+
'<div class="modal-content">'+
|
338
|
+
templateContent +
|
339
|
+
'</div>'+
|
340
|
+
'<div class="modal-footer">'+
|
341
|
+
'<a href="#" class="btn btn-primary" data-dismiss="modal">OK</a>'+
|
342
|
+
'</div>'+
|
343
|
+
'</div>';
|
344
|
+
break;
|
345
|
+
case 'dropdown':
|
346
|
+
template = '<div class="bootstrap-timepicker-widget dropdown-menu">'+ templateContent +'</div>';
|
347
|
+
break;
|
348
|
+
}
|
349
|
+
|
350
|
+
return template;
|
351
|
+
},
|
352
|
+
|
353
|
+
getTime: function() {
|
354
|
+
if (this.hour === '') {
|
355
|
+
return '';
|
356
|
+
}
|
357
|
+
|
358
|
+
return this.hour + ':' + (this.minute.toString().length === 1 ? '0' + this.minute : this.minute) + (this.showSeconds ? ':' + (this.second.toString().length === 1 ? '0' + this.second : this.second) : '') + (this.showMeridian ? ' ' + this.meridian : '');
|
359
|
+
},
|
360
|
+
|
361
|
+
hideWidget: function() {
|
362
|
+
if (this.isOpen === false) {
|
363
|
+
return;
|
364
|
+
}
|
365
|
+
|
366
|
+
this.$element.trigger({
|
367
|
+
'type': 'hide.timepicker',
|
368
|
+
'time': {
|
369
|
+
'value': this.getTime(),
|
370
|
+
'hours': this.hour,
|
371
|
+
'minutes': this.minute,
|
372
|
+
'seconds': this.second,
|
373
|
+
'meridian': this.meridian
|
374
|
+
}
|
375
|
+
});
|
376
|
+
|
377
|
+
if (this.template === 'modal' && this.$widget.modal) {
|
378
|
+
this.$widget.modal('hide');
|
379
|
+
} else {
|
380
|
+
this.$widget.removeClass('open');
|
381
|
+
}
|
382
|
+
|
383
|
+
$(document).off('mousedown.timepicker, touchend.timepicker', this.handleDocumentClick);
|
384
|
+
|
385
|
+
this.isOpen = false;
|
386
|
+
// show/hide approach taken by datepicker
|
387
|
+
this.$widget.detach();
|
388
|
+
},
|
389
|
+
|
390
|
+
highlightUnit: function() {
|
391
|
+
this.position = this.getCursorPosition();
|
392
|
+
if (this.position >= 0 && this.position <= 2) {
|
393
|
+
this.highlightHour();
|
394
|
+
} else if (this.position >= 3 && this.position <= 5) {
|
395
|
+
this.highlightMinute();
|
396
|
+
} else if (this.position >= 6 && this.position <= 8) {
|
397
|
+
if (this.showSeconds) {
|
398
|
+
this.highlightSecond();
|
399
|
+
} else {
|
400
|
+
this.highlightMeridian();
|
401
|
+
}
|
402
|
+
} else if (this.position >= 9 && this.position <= 11) {
|
403
|
+
this.highlightMeridian();
|
404
|
+
}
|
405
|
+
},
|
406
|
+
|
407
|
+
highlightNextUnit: function() {
|
408
|
+
switch (this.highlightedUnit) {
|
409
|
+
case 'hour':
|
410
|
+
this.highlightMinute();
|
411
|
+
break;
|
412
|
+
case 'minute':
|
413
|
+
if (this.showSeconds) {
|
414
|
+
this.highlightSecond();
|
415
|
+
} else if (this.showMeridian){
|
416
|
+
this.highlightMeridian();
|
417
|
+
} else {
|
418
|
+
this.highlightHour();
|
419
|
+
}
|
420
|
+
break;
|
421
|
+
case 'second':
|
422
|
+
if (this.showMeridian) {
|
423
|
+
this.highlightMeridian();
|
424
|
+
} else {
|
425
|
+
this.highlightHour();
|
426
|
+
}
|
427
|
+
break;
|
428
|
+
case 'meridian':
|
429
|
+
this.highlightHour();
|
430
|
+
break;
|
431
|
+
}
|
432
|
+
},
|
433
|
+
|
434
|
+
highlightPrevUnit: function() {
|
435
|
+
switch (this.highlightedUnit) {
|
436
|
+
case 'hour':
|
437
|
+
if(this.showMeridian){
|
438
|
+
this.highlightMeridian();
|
439
|
+
} else if (this.showSeconds) {
|
440
|
+
this.highlightSecond();
|
441
|
+
} else {
|
442
|
+
this.highlightMinute();
|
443
|
+
}
|
444
|
+
break;
|
445
|
+
case 'minute':
|
446
|
+
this.highlightHour();
|
447
|
+
break;
|
448
|
+
case 'second':
|
449
|
+
this.highlightMinute();
|
450
|
+
break;
|
451
|
+
case 'meridian':
|
452
|
+
if (this.showSeconds) {
|
453
|
+
this.highlightSecond();
|
454
|
+
} else {
|
455
|
+
this.highlightMinute();
|
456
|
+
}
|
457
|
+
break;
|
458
|
+
}
|
459
|
+
},
|
460
|
+
|
461
|
+
highlightHour: function() {
|
462
|
+
var $element = this.$element.get(0),
|
463
|
+
self = this;
|
464
|
+
|
465
|
+
this.highlightedUnit = 'hour';
|
466
|
+
|
467
|
+
if ($element.setSelectionRange) {
|
468
|
+
setTimeout(function() {
|
469
|
+
if (self.hour < 10) {
|
470
|
+
$element.setSelectionRange(0,1);
|
471
|
+
} else {
|
472
|
+
$element.setSelectionRange(0,2);
|
473
|
+
}
|
474
|
+
}, 0);
|
475
|
+
}
|
476
|
+
},
|
477
|
+
|
478
|
+
highlightMinute: function() {
|
479
|
+
var $element = this.$element.get(0),
|
480
|
+
self = this;
|
481
|
+
|
482
|
+
this.highlightedUnit = 'minute';
|
483
|
+
|
484
|
+
if ($element.setSelectionRange) {
|
485
|
+
setTimeout(function() {
|
486
|
+
if (self.hour < 10) {
|
487
|
+
$element.setSelectionRange(2,4);
|
488
|
+
} else {
|
489
|
+
$element.setSelectionRange(3,5);
|
490
|
+
}
|
491
|
+
}, 0);
|
492
|
+
}
|
493
|
+
},
|
494
|
+
|
495
|
+
highlightSecond: function() {
|
496
|
+
var $element = this.$element.get(0),
|
497
|
+
self = this;
|
498
|
+
|
499
|
+
this.highlightedUnit = 'second';
|
500
|
+
|
501
|
+
if ($element.setSelectionRange) {
|
502
|
+
setTimeout(function() {
|
503
|
+
if (self.hour < 10) {
|
504
|
+
$element.setSelectionRange(5,7);
|
505
|
+
} else {
|
506
|
+
$element.setSelectionRange(6,8);
|
507
|
+
}
|
508
|
+
}, 0);
|
509
|
+
}
|
510
|
+
},
|
511
|
+
|
512
|
+
highlightMeridian: function() {
|
513
|
+
var $element = this.$element.get(0),
|
514
|
+
self = this;
|
515
|
+
|
516
|
+
this.highlightedUnit = 'meridian';
|
517
|
+
|
518
|
+
if ($element.setSelectionRange) {
|
519
|
+
if (this.showSeconds) {
|
520
|
+
setTimeout(function() {
|
521
|
+
if (self.hour < 10) {
|
522
|
+
$element.setSelectionRange(8,10);
|
523
|
+
} else {
|
524
|
+
$element.setSelectionRange(9,11);
|
525
|
+
}
|
526
|
+
}, 0);
|
527
|
+
} else {
|
528
|
+
setTimeout(function() {
|
529
|
+
if (self.hour < 10) {
|
530
|
+
$element.setSelectionRange(5,7);
|
531
|
+
} else {
|
532
|
+
$element.setSelectionRange(6,8);
|
533
|
+
}
|
534
|
+
}, 0);
|
535
|
+
}
|
536
|
+
}
|
537
|
+
},
|
538
|
+
|
539
|
+
incrementHour: function() {
|
540
|
+
if (this.showMeridian) {
|
541
|
+
if (this.hour === 11) {
|
542
|
+
this.hour++;
|
543
|
+
return this.toggleMeridian();
|
544
|
+
} else if (this.hour === 12) {
|
545
|
+
this.hour = 0;
|
546
|
+
}
|
547
|
+
}
|
548
|
+
if (this.hour === this.maxHours - 1) {
|
549
|
+
this.hour = 0;
|
550
|
+
|
551
|
+
return;
|
552
|
+
}
|
553
|
+
this.hour++;
|
554
|
+
},
|
555
|
+
|
556
|
+
incrementMinute: function(step) {
|
557
|
+
var newVal;
|
558
|
+
|
559
|
+
if (step) {
|
560
|
+
newVal = this.minute + step;
|
561
|
+
} else {
|
562
|
+
newVal = this.minute + this.minuteStep - (this.minute % this.minuteStep);
|
563
|
+
}
|
564
|
+
|
565
|
+
if (newVal > 59) {
|
566
|
+
this.incrementHour();
|
567
|
+
this.minute = newVal - 60;
|
568
|
+
} else {
|
569
|
+
this.minute = newVal;
|
570
|
+
}
|
571
|
+
},
|
572
|
+
|
573
|
+
incrementSecond: function() {
|
574
|
+
var newVal = this.second + this.secondStep - (this.second % this.secondStep);
|
575
|
+
|
576
|
+
if (newVal > 59) {
|
577
|
+
this.incrementMinute(true);
|
578
|
+
this.second = newVal - 60;
|
579
|
+
} else {
|
580
|
+
this.second = newVal;
|
581
|
+
}
|
582
|
+
},
|
583
|
+
|
584
|
+
mousewheel: function(e) {
|
585
|
+
if (this.disableMousewheel) {
|
586
|
+
return;
|
587
|
+
}
|
588
|
+
|
589
|
+
e.preventDefault();
|
590
|
+
e.stopPropagation();
|
591
|
+
|
592
|
+
var delta = e.originalEvent.wheelDelta || -e.originalEvent.detail,
|
593
|
+
scrollTo = null;
|
594
|
+
|
595
|
+
if (e.type === 'mousewheel') {
|
596
|
+
scrollTo = (e.originalEvent.wheelDelta * -1);
|
597
|
+
}
|
598
|
+
else if (e.type === 'DOMMouseScroll') {
|
599
|
+
scrollTo = 40 * e.originalEvent.detail;
|
600
|
+
}
|
601
|
+
|
602
|
+
if (scrollTo) {
|
603
|
+
e.preventDefault();
|
604
|
+
$(this).scrollTop(scrollTo + $(this).scrollTop());
|
605
|
+
}
|
606
|
+
|
607
|
+
switch (this.highlightedUnit) {
|
608
|
+
case 'minute':
|
609
|
+
if (delta > 0) {
|
610
|
+
this.incrementMinute();
|
611
|
+
} else {
|
612
|
+
this.decrementMinute();
|
613
|
+
}
|
614
|
+
this.highlightMinute();
|
615
|
+
break;
|
616
|
+
case 'second':
|
617
|
+
if (delta > 0) {
|
618
|
+
this.incrementSecond();
|
619
|
+
} else {
|
620
|
+
this.decrementSecond();
|
621
|
+
}
|
622
|
+
this.highlightSecond();
|
623
|
+
break;
|
624
|
+
case 'meridian':
|
625
|
+
this.toggleMeridian();
|
626
|
+
this.highlightMeridian();
|
627
|
+
break;
|
628
|
+
default:
|
629
|
+
if (delta > 0) {
|
630
|
+
this.incrementHour();
|
631
|
+
} else {
|
632
|
+
this.decrementHour();
|
633
|
+
}
|
634
|
+
this.highlightHour();
|
635
|
+
break;
|
636
|
+
}
|
637
|
+
|
638
|
+
return false;
|
639
|
+
},
|
640
|
+
|
641
|
+
/**
|
642
|
+
* Given a segment value like 43, will round and snap the segment
|
643
|
+
* to the nearest "step", like 45 if step is 15. Segment will
|
644
|
+
* "overflow" to 0 if it's larger than 59 or would otherwise
|
645
|
+
* round up to 60.
|
646
|
+
*/
|
647
|
+
changeToNearestStep: function (segment, step) {
|
648
|
+
if (segment % step === 0) {
|
649
|
+
return segment;
|
650
|
+
}
|
651
|
+
if (Math.round((segment % step) / step)) {
|
652
|
+
return (segment + (step - segment % step)) % 60;
|
653
|
+
} else {
|
654
|
+
return segment - segment % step;
|
655
|
+
}
|
656
|
+
},
|
657
|
+
|
658
|
+
// This method was adapted from bootstrap-datepicker.
|
659
|
+
place : function() {
|
660
|
+
if (this.isInline) {
|
661
|
+
return;
|
662
|
+
}
|
663
|
+
var widgetWidth = this.$widget.outerWidth(), widgetHeight = this.$widget.outerHeight(), visualPadding = 10, windowWidth =
|
664
|
+
$(window).width(), windowHeight = $(window).height(), scrollTop = $(window).scrollTop();
|
665
|
+
|
666
|
+
var zIndex = parseInt(this.$element.parents().filter(function() { return $(this).css('z-index') !== 'auto'; }).first().css('z-index'), 10) + 10;
|
667
|
+
var offset = this.component ? this.component.parent().offset() : this.$element.offset();
|
668
|
+
var height = this.component ? this.component.outerHeight(true) : this.$element.outerHeight(false);
|
669
|
+
var width = this.component ? this.component.outerWidth(true) : this.$element.outerWidth(false);
|
670
|
+
var left = offset.left, top = offset.top;
|
671
|
+
|
672
|
+
this.$widget.removeClass('timepicker-orient-top timepicker-orient-bottom timepicker-orient-right timepicker-orient-left');
|
673
|
+
|
674
|
+
if (this.orientation.x !== 'auto') {
|
675
|
+
this.$widget.addClass('timepicker-orient-' + this.orientation.x);
|
676
|
+
if (this.orientation.x === 'right') {
|
677
|
+
left -= widgetWidth - width;
|
678
|
+
}
|
679
|
+
} else{
|
680
|
+
// auto x orientation is best-placement: if it crosses a window edge, fudge it sideways
|
681
|
+
// Default to left
|
682
|
+
this.$widget.addClass('timepicker-orient-left');
|
683
|
+
if (offset.left < 0) {
|
684
|
+
left -= offset.left - visualPadding;
|
685
|
+
} else if (offset.left + widgetWidth > windowWidth) {
|
686
|
+
left = windowWidth - widgetWidth - visualPadding;
|
687
|
+
}
|
688
|
+
}
|
689
|
+
// auto y orientation is best-situation: top or bottom, no fudging, decision based on which shows more of the widget
|
690
|
+
var yorient = this.orientation.y, topOverflow, bottomOverflow;
|
691
|
+
if (yorient === 'auto') {
|
692
|
+
topOverflow = -scrollTop + offset.top - widgetHeight;
|
693
|
+
bottomOverflow = scrollTop + windowHeight - (offset.top + height + widgetHeight);
|
694
|
+
if (Math.max(topOverflow, bottomOverflow) === bottomOverflow) {
|
695
|
+
yorient = 'top';
|
696
|
+
} else {
|
697
|
+
yorient = 'bottom';
|
698
|
+
}
|
699
|
+
}
|
700
|
+
this.$widget.addClass('timepicker-orient-' + yorient);
|
701
|
+
if (yorient === 'top'){
|
702
|
+
top += height;
|
703
|
+
} else{
|
704
|
+
top -= widgetHeight + parseInt(this.$widget.css('padding-top'), 10);
|
705
|
+
}
|
706
|
+
|
707
|
+
this.$widget.css({
|
708
|
+
top : top,
|
709
|
+
left : left,
|
710
|
+
zIndex : zIndex
|
711
|
+
});
|
712
|
+
},
|
713
|
+
|
714
|
+
remove: function() {
|
715
|
+
$('document').off('.timepicker');
|
716
|
+
if (this.$widget) {
|
717
|
+
this.$widget.remove();
|
718
|
+
}
|
719
|
+
delete this.$element.data().timepicker;
|
720
|
+
},
|
721
|
+
|
722
|
+
setDefaultTime: function(defaultTime) {
|
723
|
+
if (!this.$element.val()) {
|
724
|
+
if (defaultTime === 'current') {
|
725
|
+
var dTime = new Date(),
|
726
|
+
hours = dTime.getHours(),
|
727
|
+
minutes = dTime.getMinutes(),
|
728
|
+
seconds = dTime.getSeconds(),
|
729
|
+
meridian = 'AM';
|
730
|
+
|
731
|
+
if (seconds !== 0) {
|
732
|
+
seconds = Math.ceil(dTime.getSeconds() / this.secondStep) * this.secondStep;
|
733
|
+
if (seconds === 60) {
|
734
|
+
minutes += 1;
|
735
|
+
seconds = 0;
|
736
|
+
}
|
737
|
+
}
|
738
|
+
|
739
|
+
if (minutes !== 0) {
|
740
|
+
minutes = Math.ceil(dTime.getMinutes() / this.minuteStep) * this.minuteStep;
|
741
|
+
if (minutes === 60) {
|
742
|
+
hours += 1;
|
743
|
+
minutes = 0;
|
744
|
+
}
|
745
|
+
}
|
746
|
+
|
747
|
+
if (this.showMeridian) {
|
748
|
+
if (hours === 0) {
|
749
|
+
hours = 12;
|
750
|
+
} else if (hours >= 12) {
|
751
|
+
if (hours > 12) {
|
752
|
+
hours = hours - 12;
|
753
|
+
}
|
754
|
+
meridian = 'PM';
|
755
|
+
} else {
|
756
|
+
meridian = 'AM';
|
757
|
+
}
|
758
|
+
}
|
759
|
+
|
760
|
+
this.hour = hours;
|
761
|
+
this.minute = minutes;
|
762
|
+
this.second = seconds;
|
763
|
+
this.meridian = meridian;
|
764
|
+
|
765
|
+
this.update();
|
766
|
+
|
767
|
+
} else if (defaultTime === false) {
|
768
|
+
this.hour = 0;
|
769
|
+
this.minute = 0;
|
770
|
+
this.second = 0;
|
771
|
+
this.meridian = 'AM';
|
772
|
+
} else {
|
773
|
+
this.setTime(defaultTime);
|
774
|
+
}
|
775
|
+
} else {
|
776
|
+
this.updateFromElementVal();
|
777
|
+
}
|
778
|
+
},
|
779
|
+
|
780
|
+
setTime: function(time, ignoreWidget) {
|
781
|
+
if (!time) {
|
782
|
+
this.clear();
|
783
|
+
return;
|
784
|
+
}
|
785
|
+
|
786
|
+
var timeMode,
|
787
|
+
timeArray,
|
788
|
+
hour,
|
789
|
+
minute,
|
790
|
+
second,
|
791
|
+
meridian;
|
792
|
+
|
793
|
+
if (typeof time === 'object' && time.getMonth){
|
794
|
+
// this is a date object
|
795
|
+
hour = time.getHours();
|
796
|
+
minute = time.getMinutes();
|
797
|
+
second = time.getSeconds();
|
798
|
+
|
799
|
+
if (this.showMeridian){
|
800
|
+
meridian = 'AM';
|
801
|
+
if (hour > 12){
|
802
|
+
meridian = 'PM';
|
803
|
+
hour = hour % 12;
|
804
|
+
}
|
805
|
+
|
806
|
+
if (hour === 12){
|
807
|
+
meridian = 'PM';
|
808
|
+
}
|
809
|
+
}
|
810
|
+
} else {
|
811
|
+
timeMode = ((/a/i).test(time) ? 1 : 0) + ((/p/i).test(time) ? 2 : 0); // 0 = none, 1 = AM, 2 = PM, 3 = BOTH.
|
812
|
+
if (timeMode > 2) { // If both are present, fail.
|
813
|
+
this.clear();
|
814
|
+
return;
|
815
|
+
}
|
816
|
+
|
817
|
+
timeArray = time.replace(/[^0-9\:]/g, '').split(':');
|
818
|
+
|
819
|
+
hour = timeArray[0] ? timeArray[0].toString() : timeArray.toString();
|
820
|
+
|
821
|
+
if(this.explicitMode && hour.length > 2 && (hour.length % 2) !== 0 ) {
|
822
|
+
this.clear();
|
823
|
+
return;
|
824
|
+
}
|
825
|
+
|
826
|
+
minute = timeArray[1] ? timeArray[1].toString() : '';
|
827
|
+
second = timeArray[2] ? timeArray[2].toString() : '';
|
828
|
+
|
829
|
+
// adaptive time parsing
|
830
|
+
if (hour.length > 4) {
|
831
|
+
second = hour.slice(-2);
|
832
|
+
hour = hour.slice(0, -2);
|
833
|
+
}
|
834
|
+
|
835
|
+
if (hour.length > 2) {
|
836
|
+
minute = hour.slice(-2);
|
837
|
+
hour = hour.slice(0, -2);
|
838
|
+
}
|
839
|
+
|
840
|
+
if (minute.length > 2) {
|
841
|
+
second = minute.slice(-2);
|
842
|
+
minute = minute.slice(0, -2);
|
843
|
+
}
|
844
|
+
|
845
|
+
hour = parseInt(hour, 10);
|
846
|
+
minute = parseInt(minute, 10);
|
847
|
+
second = parseInt(second, 10);
|
848
|
+
|
849
|
+
if (isNaN(hour)) {
|
850
|
+
hour = 0;
|
851
|
+
}
|
852
|
+
if (isNaN(minute)) {
|
853
|
+
minute = 0;
|
854
|
+
}
|
855
|
+
if (isNaN(second)) {
|
856
|
+
second = 0;
|
857
|
+
}
|
858
|
+
|
859
|
+
// Adjust the time based upon unit boundary.
|
860
|
+
// NOTE: Negatives will never occur due to time.replace() above.
|
861
|
+
if (second > 59) {
|
862
|
+
second = 59;
|
863
|
+
}
|
864
|
+
|
865
|
+
if (minute > 59) {
|
866
|
+
minute = 59;
|
867
|
+
}
|
868
|
+
|
869
|
+
if (hour >= this.maxHours) {
|
870
|
+
// No day/date handling.
|
871
|
+
hour = this.maxHours - 1;
|
872
|
+
}
|
873
|
+
|
874
|
+
if (this.showMeridian) {
|
875
|
+
if (hour > 12) {
|
876
|
+
// Force PM.
|
877
|
+
timeMode = 2;
|
878
|
+
hour -= 12;
|
879
|
+
}
|
880
|
+
if (!timeMode) {
|
881
|
+
timeMode = 1;
|
882
|
+
}
|
883
|
+
if (hour === 0) {
|
884
|
+
hour = 12; // AM or PM, reset to 12. 0 AM = 12 AM. 0 PM = 12 PM, etc.
|
885
|
+
}
|
886
|
+
meridian = timeMode === 1 ? 'AM' : 'PM';
|
887
|
+
} else if (hour < 12 && timeMode === 2) {
|
888
|
+
hour += 12;
|
889
|
+
} else {
|
890
|
+
if (hour >= this.maxHours) {
|
891
|
+
hour = this.maxHours - 1;
|
892
|
+
} else if ((hour < 0) || (hour === 12 && timeMode === 1)){
|
893
|
+
hour = 0;
|
894
|
+
}
|
895
|
+
}
|
896
|
+
}
|
897
|
+
|
898
|
+
this.hour = hour;
|
899
|
+
if (this.snapToStep) {
|
900
|
+
this.minute = this.changeToNearestStep(minute, this.minuteStep);
|
901
|
+
this.second = this.changeToNearestStep(second, this.secondStep);
|
902
|
+
} else {
|
903
|
+
this.minute = minute;
|
904
|
+
this.second = second;
|
905
|
+
}
|
906
|
+
this.meridian = meridian;
|
907
|
+
|
908
|
+
this.update(ignoreWidget);
|
909
|
+
},
|
910
|
+
|
911
|
+
showWidget: function() {
|
912
|
+
if (this.isOpen) {
|
913
|
+
return;
|
914
|
+
}
|
915
|
+
|
916
|
+
if (this.$element.is(':disabled')) {
|
917
|
+
return;
|
918
|
+
}
|
919
|
+
|
920
|
+
// show/hide approach taken by datepicker
|
921
|
+
this.$widget.appendTo(this.appendWidgetTo);
|
922
|
+
$(document).on('mousedown.timepicker, touchend.timepicker', {scope: this}, this.handleDocumentClick);
|
923
|
+
|
924
|
+
this.$element.trigger({
|
925
|
+
'type': 'show.timepicker',
|
926
|
+
'time': {
|
927
|
+
'value': this.getTime(),
|
928
|
+
'hours': this.hour,
|
929
|
+
'minutes': this.minute,
|
930
|
+
'seconds': this.second,
|
931
|
+
'meridian': this.meridian
|
932
|
+
}
|
933
|
+
});
|
934
|
+
|
935
|
+
this.place();
|
936
|
+
if (this.disableFocus) {
|
937
|
+
this.$element.blur();
|
938
|
+
}
|
939
|
+
|
940
|
+
// widget shouldn't be empty on open
|
941
|
+
if (this.hour === '') {
|
942
|
+
if (this.defaultTime) {
|
943
|
+
this.setDefaultTime(this.defaultTime);
|
944
|
+
} else {
|
945
|
+
this.setTime('0:0:0');
|
946
|
+
}
|
947
|
+
}
|
948
|
+
|
949
|
+
if (this.template === 'modal' && this.$widget.modal) {
|
950
|
+
this.$widget.modal('show').on('hidden', $.proxy(this.hideWidget, this));
|
951
|
+
} else {
|
952
|
+
if (this.isOpen === false) {
|
953
|
+
this.$widget.addClass('open');
|
954
|
+
}
|
955
|
+
}
|
956
|
+
|
957
|
+
this.isOpen = true;
|
958
|
+
},
|
959
|
+
|
960
|
+
toggleMeridian: function() {
|
961
|
+
this.meridian = this.meridian === 'AM' ? 'PM' : 'AM';
|
962
|
+
},
|
963
|
+
|
964
|
+
update: function(ignoreWidget) {
|
965
|
+
this.updateElement();
|
966
|
+
if (!ignoreWidget) {
|
967
|
+
this.updateWidget();
|
968
|
+
}
|
969
|
+
|
970
|
+
this.$element.trigger({
|
971
|
+
'type': 'changeTime.timepicker',
|
972
|
+
'time': {
|
973
|
+
'value': this.getTime(),
|
974
|
+
'hours': this.hour,
|
975
|
+
'minutes': this.minute,
|
976
|
+
'seconds': this.second,
|
977
|
+
'meridian': this.meridian
|
978
|
+
}
|
979
|
+
});
|
980
|
+
},
|
981
|
+
|
982
|
+
updateElement: function() {
|
983
|
+
this.$element.val(this.getTime()).change();
|
984
|
+
},
|
985
|
+
|
986
|
+
updateFromElementVal: function() {
|
987
|
+
this.setTime(this.$element.val());
|
988
|
+
},
|
989
|
+
|
990
|
+
updateWidget: function() {
|
991
|
+
if (this.$widget === false) {
|
992
|
+
return;
|
993
|
+
}
|
994
|
+
|
995
|
+
var hour = this.hour,
|
996
|
+
minute = this.minute.toString().length === 1 ? '0' + this.minute : this.minute,
|
997
|
+
second = this.second.toString().length === 1 ? '0' + this.second : this.second;
|
998
|
+
|
999
|
+
if (this.showInputs) {
|
1000
|
+
this.$widget.find('input.bootstrap-timepicker-hour').val(hour);
|
1001
|
+
this.$widget.find('input.bootstrap-timepicker-minute').val(minute);
|
1002
|
+
|
1003
|
+
if (this.showSeconds) {
|
1004
|
+
this.$widget.find('input.bootstrap-timepicker-second').val(second);
|
1005
|
+
}
|
1006
|
+
if (this.showMeridian) {
|
1007
|
+
this.$widget.find('input.bootstrap-timepicker-meridian').val(this.meridian);
|
1008
|
+
}
|
1009
|
+
} else {
|
1010
|
+
this.$widget.find('span.bootstrap-timepicker-hour').text(hour);
|
1011
|
+
this.$widget.find('span.bootstrap-timepicker-minute').text(minute);
|
1012
|
+
|
1013
|
+
if (this.showSeconds) {
|
1014
|
+
this.$widget.find('span.bootstrap-timepicker-second').text(second);
|
1015
|
+
}
|
1016
|
+
if (this.showMeridian) {
|
1017
|
+
this.$widget.find('span.bootstrap-timepicker-meridian').text(this.meridian);
|
1018
|
+
}
|
1019
|
+
}
|
1020
|
+
},
|
1021
|
+
|
1022
|
+
updateFromWidgetInputs: function() {
|
1023
|
+
if (this.$widget === false) {
|
1024
|
+
return;
|
1025
|
+
}
|
1026
|
+
|
1027
|
+
var t = this.$widget.find('input.bootstrap-timepicker-hour').val() + ':' +
|
1028
|
+
this.$widget.find('input.bootstrap-timepicker-minute').val() +
|
1029
|
+
(this.showSeconds ? ':' + this.$widget.find('input.bootstrap-timepicker-second').val() : '') +
|
1030
|
+
(this.showMeridian ? this.$widget.find('input.bootstrap-timepicker-meridian').val() : '')
|
1031
|
+
;
|
1032
|
+
|
1033
|
+
this.setTime(t, true);
|
1034
|
+
},
|
1035
|
+
|
1036
|
+
widgetClick: function(e) {
|
1037
|
+
e.stopPropagation();
|
1038
|
+
e.preventDefault();
|
1039
|
+
|
1040
|
+
var $input = $(e.target),
|
1041
|
+
action = $input.closest('a').data('action');
|
1042
|
+
|
1043
|
+
if (action) {
|
1044
|
+
this[action]();
|
1045
|
+
}
|
1046
|
+
this.update();
|
1047
|
+
|
1048
|
+
if ($input.is('input')) {
|
1049
|
+
$input.get(0).setSelectionRange(0,2);
|
1050
|
+
}
|
1051
|
+
},
|
1052
|
+
|
1053
|
+
widgetKeydown: function(e) {
|
1054
|
+
var $input = $(e.target),
|
1055
|
+
name = $input.attr('class').replace('bootstrap-timepicker-', '');
|
1056
|
+
|
1057
|
+
switch (e.which) {
|
1058
|
+
case 9: //tab
|
1059
|
+
if (e.shiftKey) {
|
1060
|
+
if (name === 'hour') {
|
1061
|
+
return this.hideWidget();
|
1062
|
+
}
|
1063
|
+
} else if ((this.showMeridian && name === 'meridian') || (this.showSeconds && name === 'second') || (!this.showMeridian && !this.showSeconds && name === 'minute')) {
|
1064
|
+
return this.hideWidget();
|
1065
|
+
}
|
1066
|
+
break;
|
1067
|
+
case 27: // escape
|
1068
|
+
this.hideWidget();
|
1069
|
+
break;
|
1070
|
+
case 38: // up arrow
|
1071
|
+
e.preventDefault();
|
1072
|
+
switch (name) {
|
1073
|
+
case 'hour':
|
1074
|
+
this.incrementHour();
|
1075
|
+
break;
|
1076
|
+
case 'minute':
|
1077
|
+
this.incrementMinute();
|
1078
|
+
break;
|
1079
|
+
case 'second':
|
1080
|
+
this.incrementSecond();
|
1081
|
+
break;
|
1082
|
+
case 'meridian':
|
1083
|
+
this.toggleMeridian();
|
1084
|
+
break;
|
1085
|
+
}
|
1086
|
+
this.setTime(this.getTime());
|
1087
|
+
$input.get(0).setSelectionRange(0,2);
|
1088
|
+
break;
|
1089
|
+
case 40: // down arrow
|
1090
|
+
e.preventDefault();
|
1091
|
+
switch (name) {
|
1092
|
+
case 'hour':
|
1093
|
+
this.decrementHour();
|
1094
|
+
break;
|
1095
|
+
case 'minute':
|
1096
|
+
this.decrementMinute();
|
1097
|
+
break;
|
1098
|
+
case 'second':
|
1099
|
+
this.decrementSecond();
|
1100
|
+
break;
|
1101
|
+
case 'meridian':
|
1102
|
+
this.toggleMeridian();
|
1103
|
+
break;
|
1104
|
+
}
|
1105
|
+
this.setTime(this.getTime());
|
1106
|
+
$input.get(0).setSelectionRange(0,2);
|
1107
|
+
break;
|
1108
|
+
}
|
1109
|
+
},
|
1110
|
+
|
1111
|
+
widgetKeyup: function(e) {
|
1112
|
+
if ((e.which === 65) || (e.which === 77) || (e.which === 80) || (e.which === 46) || (e.which === 8) || (e.which >= 48 && e.which <= 57) || (e.which >= 96 && e.which <= 105)) {
|
1113
|
+
this.updateFromWidgetInputs();
|
1114
|
+
}
|
1115
|
+
}
|
1116
|
+
};
|
1117
|
+
|
1118
|
+
//TIMEPICKER PLUGIN DEFINITION
|
1119
|
+
$.fn.timepicker = function(option) {
|
1120
|
+
var args = Array.apply(null, arguments);
|
1121
|
+
args.shift();
|
1122
|
+
return this.each(function() {
|
1123
|
+
var $this = $(this),
|
1124
|
+
data = $this.data('timepicker'),
|
1125
|
+
options = typeof option === 'object' && option;
|
1126
|
+
|
1127
|
+
if (!data) {
|
1128
|
+
$this.data('timepicker', (data = new Timepicker(this, $.extend({}, $.fn.timepicker.defaults, options, $(this).data()))));
|
1129
|
+
}
|
1130
|
+
|
1131
|
+
if (typeof option === 'string') {
|
1132
|
+
data[option].apply(data, args);
|
1133
|
+
}
|
1134
|
+
});
|
1135
|
+
};
|
1136
|
+
|
1137
|
+
$.fn.timepicker.defaults = {
|
1138
|
+
defaultTime: 'current',
|
1139
|
+
disableFocus: false,
|
1140
|
+
disableMousewheel: false,
|
1141
|
+
isOpen: false,
|
1142
|
+
minuteStep: 15,
|
1143
|
+
modalBackdrop: false,
|
1144
|
+
orientation: { x: 'auto', y: 'auto'},
|
1145
|
+
secondStep: 15,
|
1146
|
+
snapToStep: false,
|
1147
|
+
showSeconds: false,
|
1148
|
+
showInputs: true,
|
1149
|
+
showMeridian: true,
|
1150
|
+
template: 'dropdown',
|
1151
|
+
appendWidgetTo: 'body',
|
1152
|
+
showWidgetOnAddonClick: true,
|
1153
|
+
icons: {
|
1154
|
+
up: 'glyphicon glyphicon-chevron-up',
|
1155
|
+
down: 'glyphicon glyphicon-chevron-down'
|
1156
|
+
},
|
1157
|
+
maxHours: 24,
|
1158
|
+
explicitMode: false
|
1159
|
+
};
|
1160
|
+
|
1161
|
+
$.fn.timepicker.Constructor = Timepicker;
|
1162
|
+
|
1163
|
+
$(document).on(
|
1164
|
+
'focus.timepicker.data-api click.timepicker.data-api',
|
1165
|
+
'[data-provide="timepicker"]',
|
1166
|
+
function(e){
|
1167
|
+
var $this = $(this);
|
1168
|
+
if ($this.data('timepicker')) {
|
1169
|
+
return;
|
1170
|
+
}
|
1171
|
+
e.preventDefault();
|
1172
|
+
// component click requires us to explicitly show it
|
1173
|
+
$this.timepicker();
|
1174
|
+
}
|
1175
|
+
);
|
1176
|
+
|
1177
|
+
})(jQuery, window, document);
|