jquery-timepicker-rails 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Timepicker
3
3
  module Rails
4
- VERSION = "0.0.2"
4
+ VERSION = "0.1.0"
5
5
  end
6
6
  end
7
7
  end
@@ -1,8 +1,14 @@
1
1
  $(function() {
2
2
 
3
+ var DATE_FORMAT = 'Y-m-d';
4
+ var DATEPICKER_FORMAT = 'yyyy-m-d';
5
+
3
6
  $('.datepair input.date').each(function(){
4
7
  var $this = $(this);
5
- $this.datepicker({ 'dateFormat': 'm/d/yy' });
8
+ $this.datepicker({
9
+ 'format': DATEPICKER_FORMAT,
10
+ 'autoclose': true
11
+ });
6
12
 
7
13
  if ($this.hasClass('start') || $this.hasClass('end')) {
8
14
  $this.on('changeDate change', doDatepair);
@@ -61,7 +67,7 @@ $(function() {
61
67
  if (target.val() == '') {
62
68
  return;
63
69
  }
64
-
70
+
65
71
  var container = target.closest('.datepair');
66
72
 
67
73
  if (target.hasClass('date')) {
@@ -88,7 +94,7 @@ $(function() {
88
94
 
89
95
  if (oldDelta && target.hasClass('start')) {
90
96
  var newEnd = new Date(startDate.getTime()+oldDelta);
91
- end.val(newEnd.format('m/d/Y'));
97
+ end.val(newEnd.format(DATE_FORMAT));
92
98
  end.datepicker('update');
93
99
  return;
94
100
 
@@ -99,10 +105,10 @@ $(function() {
99
105
  newDelta = 0;
100
106
 
101
107
  if (target.hasClass('start')) {
102
- end.val(startDate.format('m/d/Y'));
108
+ end.val(start.val());
103
109
  end.datepicker('update');
104
110
  } else if (target.hasClass('end')) {
105
- start.val(endDate.format('m/d/Y'));
111
+ start.val(end.val());
106
112
  start.datepicker('update');
107
113
  }
108
114
  }
@@ -185,7 +191,7 @@ $(function() {
185
191
  if (dateDelta || dateDelta === 0) {
186
192
  var endDate = new Date(endInput.val());
187
193
  var newEnd = new Date(endDate.getTime() + endDateAdvance);
188
- endInput.val(newEnd.format('m/d/Y'));
194
+ endInput.val(newEnd.format(DATE_FORMAT));
189
195
  endInput.datepicker('update');
190
196
  container.data('dateDelta', dateDelta + endDateAdvance);
191
197
  }
@@ -2,15 +2,22 @@
2
2
  jquery-timepicker
3
3
  http://jonthornton.github.com/jquery-timepicker/
4
4
 
5
- requires jQuery 1.6+
5
+ requires jQuery 1.7+
6
6
  ************************/
7
7
 
8
8
 
9
- !(function($)
10
- {
11
-
9
+ (function (factory) {
10
+ if (typeof define === 'function' && define.amd) {
11
+ // AMD. Register as an anonymous module.
12
+ define(['jquery'], factory);
13
+ } else {
14
+ // Browser globals
15
+ factory(jQuery);
16
+ }
17
+ }(function ($) {
12
18
  var _baseDate = _generateBaseDate();
13
19
  var _ONE_DAY = 86400;
20
+ var _closeEvent = 'ontouchstart' in document ? 'touchstart' : 'mousedown';
14
21
  var _defaults = {
15
22
  className: null,
16
23
  minTime: null,
@@ -21,7 +28,9 @@ requires jQuery 1.6+
21
28
  timeFormat: 'g:ia',
22
29
  scrollDefaultNow: false,
23
30
  scrollDefaultTime: false,
24
- selectOnBlur: false
31
+ selectOnBlur: false,
32
+ forceRoundTime: false,
33
+ appendTo: 'body'
25
34
  };
26
35
  var _lang = {
27
36
  decimal: '.',
@@ -87,8 +96,10 @@ requires jQuery 1.6+
87
96
 
88
97
  if (!globalInit) {
89
98
  // close the dropdown when container loses focus
90
- $('body').on('click', function(e) {
91
- if ($(e.target).closest('.ui-timepicker-input').length == 0 && $(e.target).closest('.ui-timepicker-list').length == 0) {
99
+ $('body').on(_closeEvent, function(e) {
100
+ var target = $(e.target);
101
+ var input = target.closest('.ui-timepicker-input');
102
+ if (input.length === 0 && target.closest('.ui-timepicker-list').length === 0) {
92
103
  methods.hide();
93
104
  }
94
105
  });
@@ -100,6 +111,12 @@ requires jQuery 1.6+
100
111
  show: function(e)
101
112
  {
102
113
  var self = $(this);
114
+
115
+ if ('ontouchstart' in document) {
116
+ // block the keyboard on mobile devices
117
+ self.blur();
118
+ }
119
+
103
120
  var list = self.data('timepicker-list');
104
121
 
105
122
  // check if input is readonly
@@ -108,7 +125,7 @@ requires jQuery 1.6+
108
125
  }
109
126
 
110
127
  // check if list needs to be rendered
111
- if (!list || list.length == 0) {
128
+ if (!list || list.length === 0) {
112
129
  _render(self);
113
130
  list = self.data('timepicker-list');
114
131
  }
@@ -127,15 +144,12 @@ requires jQuery 1.6+
127
144
  // make sure other pickers are hidden
128
145
  methods.hide();
129
146
 
130
- var topMargin = parseInt(self.css('marginTop').slice(0, -2));
131
- if (!topMargin) topMargin = 0; // correct for IE returning "auto"
132
-
133
147
  if ((self.offset().top + self.outerHeight(true) + list.outerHeight()) > $(window).height() + $(window).scrollTop()) {
134
148
  // position the dropdown on top
135
- list.css({ 'left':(self.offset().left), 'top': self.offset().top + topMargin - list.outerHeight() });
149
+ list.css({ 'left':(self.offset().left), 'top': self.offset().top - list.outerHeight() });
136
150
  } else {
137
151
  // put it under the input
138
- list.css({ 'left':(self.offset().left), 'top': self.offset().top + topMargin + self.outerHeight() });
152
+ list.css({ 'left':(self.offset().left), 'top': self.offset().top + self.outerHeight() });
139
153
  }
140
154
 
141
155
  list.show();
@@ -145,13 +159,13 @@ requires jQuery 1.6+
145
159
  var selected = list.find('.ui-timepicker-selected');
146
160
 
147
161
  if (!selected.length) {
148
- if (self.val()) {
149
- selected = _findRow(self, list, _time2int(self.val()));
150
- } else if (settings.minTime === null && settings.scrollDefaultNow) {
151
- selected = _findRow(self, list, _time2int(new Date()));
152
- } else if (settings.scrollDefaultTime !== false) {
153
- selected = _findRow(self, list, _time2int(settings.scrollDefaultTime));
154
- }
162
+ if (self.val()) {
163
+ selected = _findRow(self, list, _time2int(self.val()));
164
+ } else if (settings.scrollDefaultNow) {
165
+ selected = _findRow(self, list, _time2int(new Date()));
166
+ } else if (settings.scrollDefaultTime !== false) {
167
+ selected = _findRow(self, list, _time2int(settings.scrollDefaultTime));
168
+ }
155
169
  }
156
170
 
157
171
  if (selected && selected.length) {
@@ -278,7 +292,7 @@ requires jQuery 1.6+
278
292
 
279
293
  list.css({'display':'none', 'position': 'absolute' });
280
294
 
281
- if (settings.minTime !== null && settings.showDuration) {
295
+ if ((settings.minTime !== null || settings.durationTime !== null) && settings.showDuration) {
282
296
  list.addClass('ui-timepicker-with-duration');
283
297
  }
284
298
 
@@ -294,14 +308,14 @@ requires jQuery 1.6+
294
308
  for (var i=start; i <= end; i += settings.step*60) {
295
309
  var timeInt = i%_ONE_DAY;
296
310
  var row = $('<li />');
297
- row.data('time', timeInt)
311
+ row.data('time', timeInt);
298
312
  row.text(_int2time(timeInt, settings.timeFormat));
299
313
 
300
- if (settings.minTime !== null && settings.showDuration) {
314
+ if ((settings.minTime !== null || settings.durationTime !== null) && settings.showDuration) {
301
315
  var duration = $('<span />');
302
316
  duration.addClass('ui-timepicker-duration');
303
317
  duration.text(' ('+_int2duration(i - durStart)+')');
304
- row.append(duration)
318
+ row.append(duration);
305
319
  }
306
320
 
307
321
  list.append(row);
@@ -310,7 +324,13 @@ requires jQuery 1.6+
310
324
  list.data('timepicker-input', self);
311
325
  self.data('timepicker-list', list);
312
326
 
313
- $('body').append(list);
327
+ var appendTo = settings.appendTo;
328
+ if (typeof appendTo === 'string') {
329
+ appendTo = $(appendTo);
330
+ } else if (typeof appendTo === 'function') {
331
+ appendTo = appendTo(self);
332
+ }
333
+ appendTo.append(list);
314
334
  _setSelected(self, list);
315
335
 
316
336
  list.on('click', 'li', function(e) {
@@ -324,7 +344,7 @@ requires jQuery 1.6+
324
344
  _selectValue(self);
325
345
  list.hide();
326
346
  });
327
- };
347
+ }
328
348
 
329
349
  function _generateBaseDate()
330
350
  {
@@ -344,13 +364,16 @@ requires jQuery 1.6+
344
364
 
345
365
  var settings = self.data('timepicker-settings');
346
366
  var out = false;
367
+ var halfStep = settings.step*30;
347
368
 
348
369
  // loop through the menu items
349
370
  list.find('li').each(function(i, obj) {
350
371
  var jObj = $(obj);
351
372
 
373
+ var offset = jObj.data('time') - value;
374
+
352
375
  // check if the value is less than half a step from each row
353
- if (Math.abs(jObj.data('time') - value) <= settings.step*30) {
376
+ if (Math.abs(offset) < halfStep || offset == halfStep) {
354
377
  out = jObj;
355
378
  return false;
356
379
  }
@@ -370,19 +393,33 @@ requires jQuery 1.6+
370
393
 
371
394
  function _formatValue()
372
395
  {
373
- if (this.value == '') {
396
+ if (this.value === '') {
374
397
  return;
375
398
  }
376
399
 
377
400
  var self = $(this);
378
- var timeInt = _time2int(this.value);
401
+ var seconds = _time2int(this.value);
379
402
 
380
- if (timeInt === null) {
403
+ if (seconds === null) {
381
404
  self.trigger('timeFormatError');
382
405
  return;
383
406
  }
384
407
 
385
- var prettyTime = _int2time(timeInt, self.data('timepicker-settings').timeFormat);
408
+ var settings = self.data('timepicker-settings');
409
+
410
+ if (settings.forceRoundTime) {
411
+ var offset = seconds % (settings.step*60); // step is in minutes
412
+
413
+ if (offset >= settings.step*30) {
414
+ // if offset is larger than a half step, round up
415
+ seconds += (settings.step*60) - offset;
416
+ } else {
417
+ // round down
418
+ seconds -= offset;
419
+ }
420
+ }
421
+
422
+ var prettyTime = _int2time(seconds, settings.timeFormat);
386
423
  self.val(prettyTime);
387
424
  }
388
425
 
@@ -397,7 +434,7 @@ requires jQuery 1.6+
397
434
  } else {
398
435
  return true;
399
436
  }
400
- };
437
+ }
401
438
 
402
439
  switch (e.keyCode) {
403
440
 
@@ -406,13 +443,11 @@ requires jQuery 1.6+
406
443
  methods.hide.apply(this);
407
444
  e.preventDefault();
408
445
  return false;
409
- break;
410
446
 
411
447
  case 38: // up
412
448
  var selected = list.find('.ui-timepicker-selected');
413
449
 
414
450
  if (!selected.length) {
415
- var selected;
416
451
  list.children().each(function(i, obj) {
417
452
  if ($(obj).position().top > 0) {
418
453
  selected = $(obj);
@@ -433,10 +468,9 @@ requires jQuery 1.6+
433
468
  break;
434
469
 
435
470
  case 40: // down
436
- var selected = list.find('.ui-timepicker-selected');
471
+ selected = list.find('.ui-timepicker-selected');
437
472
 
438
- if (selected.length == 0) {
439
- var selected;
473
+ if (selected.length === 0) {
440
474
  list.children().each(function(i, obj) {
441
475
  if ($(obj).position().top > 0) {
442
476
  selected = $(obj);
@@ -483,11 +517,11 @@ requires jQuery 1.6+
483
517
  list.find('li').removeClass('ui-timepicker-selected');
484
518
  return;
485
519
  }
486
- };
520
+ }
487
521
 
488
522
  function _selectValue(self)
489
523
  {
490
- var settings = self.data('timepicker-settings')
524
+ var settings = self.data('timepicker-settings');
491
525
  var list = self.data('timepicker-list');
492
526
  var timeValue = null;
493
527
 
@@ -495,12 +529,12 @@ requires jQuery 1.6+
495
529
 
496
530
  if (cursor.length) {
497
531
  // selected value found
498
- var timeValue = cursor.data('time');
532
+ timeValue = cursor.data('time');
499
533
 
500
534
  } else if (self.val()) {
501
535
 
502
536
  // no selected value; fall back on input value
503
- var timeValue = _time2int(self.val());
537
+ timeValue = _time2int(self.val());
504
538
 
505
539
  _setSelected(self, list);
506
540
  }
@@ -511,14 +545,14 @@ requires jQuery 1.6+
511
545
  }
512
546
 
513
547
  self.trigger('change').trigger('changeTime');
514
- };
548
+ }
515
549
 
516
550
  function _int2duration(seconds)
517
551
  {
518
552
  var minutes = Math.round(seconds/60);
519
553
  var duration;
520
554
 
521
- if (minutes < 60) {
555
+ if (Math.abs(minutes) < 60) {
522
556
  duration = [minutes, _lang.mins];
523
557
  } else if (minutes == 60) {
524
558
  duration = ['1', _lang.hr];
@@ -529,7 +563,7 @@ requires jQuery 1.6+
529
563
  }
530
564
 
531
565
  return duration.join(' ');
532
- };
566
+ }
533
567
 
534
568
  function _int2time(seconds, format)
535
569
  {
@@ -539,10 +573,11 @@ requires jQuery 1.6+
539
573
 
540
574
  var time = new Date(_baseDate.valueOf() + (seconds*1000));
541
575
  var output = '';
576
+ var hour, code;
542
577
 
543
578
  for (var i=0; i<format.length; i++) {
544
579
 
545
- var code = format.charAt(i);
580
+ code = format.charAt(i);
546
581
  switch (code) {
547
582
 
548
583
  case 'a':
@@ -554,8 +589,8 @@ requires jQuery 1.6+
554
589
  break;
555
590
 
556
591
  case 'g':
557
- var hour = time.getHours() % 12;
558
- output += (hour == 0) ? '12' : hour;
592
+ hour = time.getHours() % 12;
593
+ output += (hour === 0) ? '12' : hour;
559
594
  break;
560
595
 
561
596
  case 'G':
@@ -563,17 +598,17 @@ requires jQuery 1.6+
563
598
  break;
564
599
 
565
600
  case 'h':
566
- var hour = time.getHours() % 12;
601
+ hour = time.getHours() % 12;
567
602
 
568
- if (hour != 0 && hour < 10) {
603
+ if (hour !== 0 && hour < 10) {
569
604
  hour = '0'+hour;
570
605
  }
571
606
 
572
- output += (hour == 0) ? '12' : hour;
607
+ output += (hour === 0) ? '12' : hour;
573
608
  break;
574
609
 
575
610
  case 'H':
576
- var hour = time.getHours();
611
+ hour = time.getHours();
577
612
  output += (hour > 9) ? hour : '0'+hour;
578
613
  break;
579
614
 
@@ -583,7 +618,7 @@ requires jQuery 1.6+
583
618
  break;
584
619
 
585
620
  case 's':
586
- var seconds = time.getSeconds();
621
+ seconds = time.getSeconds();
587
622
  output += (seconds > 9) ? seconds : '0'+seconds;
588
623
  break;
589
624
 
@@ -593,11 +628,11 @@ requires jQuery 1.6+
593
628
  }
594
629
 
595
630
  return output;
596
- };
631
+ }
597
632
 
598
633
  function _time2int(timeString)
599
634
  {
600
- if (timeString == '') return null;
635
+ if (timeString === '') return null;
601
636
  if (timeString+0 == timeString) return timeString;
602
637
 
603
638
  if (typeof(timeString) == 'object') {
@@ -605,29 +640,30 @@ requires jQuery 1.6+
605
640
  }
606
641
 
607
642
  var d = new Date(0);
608
- var time = timeString.toLowerCase().match(/(\d{1,2})(?::(\d{2}))?(?::(\d{2}))?\s*([pa]?)/);
643
+ var time = timeString.toLowerCase().match(/(\d{1,2})(?::(\d{1,2}))?(?::(\d{2}))?\s*([pa]?)/);
609
644
 
610
645
  if (!time) {
611
646
  return null;
612
647
  }
613
648
 
614
- var hour = parseInt(time[1]*1);
649
+ var hour = parseInt(time[1]*1, 10);
650
+ var hours;
615
651
 
616
652
  if (time[4]) {
617
653
  if (hour == 12) {
618
- var hours = (time[4] == 'p') ? 12 : 0;
654
+ hours = (time[4] == 'p') ? 12 : 0;
619
655
  } else {
620
- var hours = (hour + (time[4] == 'p' ? 12 : 0));
656
+ hours = (hour + (time[4] == 'p' ? 12 : 0));
621
657
  }
622
658
 
623
659
  } else {
624
- var hours = hour;
660
+ hours = hour;
625
661
  }
626
662
 
627
663
  var minutes = ( time[2]*1 || 0 );
628
664
  var seconds = ( time[3]*1 || 0 );
629
665
  return hours*3600 + minutes*60 + seconds;
630
- };
666
+ }
631
667
 
632
668
  // Plugin entry
633
669
  $.fn.timepicker = function(method)
@@ -636,4 +672,4 @@ requires jQuery 1.6+
636
672
  else if(typeof method === "object" || !method) { return methods.init.apply(this, arguments); }
637
673
  else { $.error("Method "+ method + " does not exist on jQuery.timepicker"); }
638
674
  };
639
- })(jQuery);
675
+ }));
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: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-05 00:00:00.000000000 Z
12
+ date: 2013-01-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
16
- requirement: &26367564 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,12 @@ dependencies:
21
21
  version: 3.1.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *26367564
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 3.1.0
25
30
  description: A jQuery timepicker plugin inspired by Google Calendar
26
31
  email:
27
32
  - tkrotoff@gmail.com
@@ -60,7 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
65
  version: '0'
61
66
  requirements: []
62
67
  rubyforge_project:
63
- rubygems_version: 1.8.16
68
+ rubygems_version: 1.8.23
64
69
  signing_key:
65
70
  specification_version: 3
66
71
  summary: jquery-timepicker packaged for the Rails 3.1+ asset pipeline