1
1
/*
2
2
* jQuery timepicker addon
3
3
* By: Trent Richardson [http://trentrichardson.com]
4
- * Version 0.9.5
5
- * Last Modified: 05/25 /2011
4
+ * Version 0.9.6
5
+ * Last Modified: 07/20 /2011
6
6
*
7
7
* Copyright 2011 Trent Richardson
8
8
* Dual licensed under the MIT and GPL licenses.
19
19
20
20
( function ( $ ) {
21
21
22
- $ . extend ( $ . ui , { timepicker : { version : "0.9.5 " } } ) ;
22
+ $ . extend ( $ . ui , { timepicker : { version : "0.9.6 " } } ) ;
23
23
24
24
/* Time picker manager.
25
25
Use the singleton instance of this class, $.timepicker, to interact with the time picker.
@@ -33,6 +33,7 @@ function Timepicker() {
33
33
closeText : 'Done' ,
34
34
ampm : false ,
35
35
timeFormat : 'hh:mm tt' ,
36
+ timeSuffix : '' ,
36
37
timeOnlyTitle : 'Choose Time' ,
37
38
timeText : 'Time' ,
38
39
hourText : 'Hour' ,
@@ -161,7 +162,7 @@ $.extend(Timepicker.prototype, {
161
162
tp_inst . $altInput = $ ( o . altField )
162
163
. css ( { cursor : 'pointer' } )
163
164
. focus ( function ( ) { $input . trigger ( "focus" ) ; } ) ;
164
-
165
+
165
166
// datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..
166
167
if ( tp_inst . _defaults . minDate !== undefined && tp_inst . _defaults . minDate instanceof Date )
167
168
tp_inst . _defaults . minDateTime = new Date ( tp_inst . _defaults . minDate . getTime ( ) ) ;
@@ -171,7 +172,7 @@ $.extend(Timepicker.prototype, {
171
172
tp_inst . _defaults . maxDateTime = new Date ( tp_inst . _defaults . maxDate . getTime ( ) ) ;
172
173
if ( tp_inst . _defaults . maxDateTime !== undefined && tp_inst . _defaults . maxDateTime instanceof Date )
173
174
tp_inst . _defaults . maxDate = new Date ( tp_inst . _defaults . maxDateTime . getTime ( ) ) ;
174
-
175
+
175
176
return tp_inst ;
176
177
} ,
177
178
@@ -198,7 +199,7 @@ $.extend(Timepicker.prototype, {
198
199
. replace ( / s { 1 , 2 } / ig, '(\\d?\\d)' )
199
200
. replace ( / t { 1 , 2 } / ig, '(am|pm|a|p)?' )
200
201
. replace ( / z { 1 } / ig, '((\\+|-)\\d\\d\\d\\d)?' )
201
- . replace ( / \s / g, '\\s?' ) + '$' ,
202
+ . replace ( / \s / g, '\\s?' ) + this . _defaults . timeSuffix + '$' ,
202
203
order = this . _getFormatPositions ( ) ,
203
204
treg ;
204
205
@@ -288,9 +289,9 @@ $.extend(Timepicker.prototype, {
288
289
if ( o . showHour && o . hourGrid > 0 ) {
289
290
html += '<dd class="ui_tpicker_hour">' +
290
291
'<div id="ui_tpicker_hour_' + dp_id + '"' + ( ( o . showHour ) ? '' : noDisplay ) + '></div>' +
291
- '<div style="padding-left: 1px"><table><tr>' ;
292
+ '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label" ><tr>' ;
292
293
293
- for ( var h = o . hourMin ; h < hourMax ; h += o . hourGrid ) {
294
+ for ( var h = o . hourMin ; h <= hourMax ; h += o . hourGrid ) {
294
295
hourGridSize ++ ;
295
296
var tmph = ( o . ampm && h > 12 ) ? h - 12 : h ;
296
297
if ( tmph < 10 ) tmph = '0' + tmph ;
@@ -314,9 +315,9 @@ $.extend(Timepicker.prototype, {
314
315
html += '<dd class="ui_tpicker_minute ui_tpicker_minute_' + o . minuteGrid + '">' +
315
316
'<div id="ui_tpicker_minute_' + dp_id + '"' +
316
317
( ( o . showMinute ) ? '' : noDisplay ) + '></div>' +
317
- '<div style="padding-left: 1px"><table><tr>' ;
318
+ '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label" ><tr>' ;
318
319
319
- for ( var m = o . minuteMin ; m < minMax ; m += o . minuteGrid ) {
320
+ for ( var m = o . minuteMin ; m <= minMax ; m += o . minuteGrid ) {
320
321
minuteGridSize ++ ;
321
322
html += '<td>' + ( ( m < 10 ) ? '0' : '' ) + m + '</td>' ;
322
323
}
@@ -335,7 +336,7 @@ $.extend(Timepicker.prototype, {
335
336
( ( o . showSecond ) ? '' : noDisplay ) + '></div>' +
336
337
'<div style="padding-left: 1px"><table><tr>' ;
337
338
338
- for ( var s = o . secondMin ; s < secMax ; s += o . secondGrid ) {
339
+ for ( var s = o . secondMin ; s <= secMax ; s += o . secondGrid ) {
339
340
secondGridSize ++ ;
340
341
html += '<td>' + ( ( s < 10 ) ? '0' : '' ) + s + '</td>' ;
341
342
}
@@ -428,7 +429,7 @@ $.extend(Timepicker.prototype, {
428
429
var h = $ ( this ) . html ( ) ;
429
430
if ( o . ampm ) {
430
431
var ap = h . substring ( 2 ) . toLowerCase ( ) ,
431
- aph = parseInt ( h . substring ( 0 , 2 ) ) ;
432
+ aph = parseInt ( h . substring ( 0 , 2 ) , 10 ) ;
432
433
if ( ap == 'a' ) {
433
434
if ( aph == 12 ) h = 0 ;
434
435
else h = aph ;
@@ -518,8 +519,8 @@ $.extend(Timepicker.prototype, {
518
519
519
520
if ( ! this . _defaults . showTimepicker ) return ; // No time so nothing to check here
520
521
521
- if ( this . _defaults . minDateTime !== null && dp_date ) {
522
- var minDateTime = this . _defaults . minDateTime ,
522
+ if ( $ . datepicker . _get ( dp_inst , ' minDateTime' ) !== null && dp_date ) {
523
+ var minDateTime = $ . datepicker . _get ( dp_inst , ' minDateTime' ) ,
523
524
minDateTimeDate = new Date ( minDateTime . getFullYear ( ) , minDateTime . getMonth ( ) , minDateTime . getDate ( ) , 0 , 0 , 0 , 0 ) ;
524
525
525
526
if ( this . hourMinOriginal === null || this . minuteMinOriginal === null || this . secondMinOriginal === null ) {
@@ -551,8 +552,8 @@ $.extend(Timepicker.prototype, {
551
552
}
552
553
}
553
554
554
- if ( this . _defaults . maxDateTime !== null && dp_date ) {
555
- var maxDateTime = this . _defaults . maxDateTime ,
555
+ if ( $ . datepicker . _get ( dp_inst , ' maxDateTime' ) !== null && dp_date ) {
556
+ var maxDateTime = $ . datepicker . _get ( dp_inst , ' maxDateTime' ) ,
556
557
maxDateTimeDate = new Date ( maxDateTime . getFullYear ( ) , maxDateTime . getMonth ( ) , maxDateTime . getDate ( ) , 0 , 0 , 0 , 0 ) ;
557
558
558
559
if ( this . hourMaxOriginal === null || this . minuteMaxOriginal === null || this . secondMaxOriginal === null ) {
@@ -568,7 +569,7 @@ $.extend(Timepicker.prototype, {
568
569
this . _defaults . minuteMax = maxDateTime . getMinutes ( ) ;
569
570
if ( this . minute >= this . _defaults . minuteMax ) {
570
571
this . minute = this . _defaults . minuteMax ;
571
- this . _defaults . secondMin = maxDateTime . getSeconds ( ) ;
572
+ this . _defaults . secondMax = maxDateTime . getSeconds ( ) ;
572
573
} else {
573
574
if ( this . second > this . _defaults . secondMax ) this . second = this . _defaults . secondMax ;
574
575
this . _defaults . secondMax = this . secondMaxOriginal ;
@@ -585,9 +586,16 @@ $.extend(Timepicker.prototype, {
585
586
}
586
587
587
588
if ( adjustSliders !== undefined && adjustSliders === true ) {
588
- this . hour_slider . slider ( "option" , { min : this . _defaults . hourMin , max : this . _defaults . hourMax } ) . slider ( 'value' , this . hour ) ;
589
- this . minute_slider . slider ( "option" , { min : this . _defaults . minuteMin , max : this . _defaults . minuteMax } ) . slider ( 'value' , this . minute ) ;
590
- this . second_slider . slider ( "option" , { min : this . _defaults . secondMin , max : this . _defaults . secondMax } ) . slider ( 'value' , this . second ) ;
589
+ var hourMax = ( this . _defaults . hourMax - ( this . _defaults . hourMax % this . _defaults . stepHour ) ) . toFixed ( 0 ) ,
590
+ minMax = ( this . _defaults . minuteMax - ( this . _defaults . minuteMax % this . _defaults . stepMinute ) ) . toFixed ( 0 ) ,
591
+ secMax = ( this . _defaults . secondMax - ( this . _defaults . secondMax % this . _defaults . stepSecond ) ) . toFixed ( 0 ) ;
592
+
593
+ if ( this . hour_slider )
594
+ this . hour_slider . slider ( "option" , { min : this . _defaults . hourMin , max : hourMax } ) . slider ( 'value' , this . hour ) ;
595
+ if ( this . minute_slider )
596
+ this . minute_slider . slider ( "option" , { min : this . _defaults . minuteMin , max : minMax } ) . slider ( 'value' , this . minute ) ;
597
+ if ( this . second_slider )
598
+ this . second_slider . slider ( "option" , { min : this . _defaults . secondMin , max : secMax } ) . slider ( 'value' , this . second ) ;
591
599
}
592
600
593
601
} ,
@@ -602,13 +610,18 @@ $.extend(Timepicker.prototype, {
602
610
minute = ( this . minute_slider ) ? this . minute_slider . slider ( 'value' ) : false ,
603
611
second = ( this . second_slider ) ? this . second_slider . slider ( 'value' ) : false ,
604
612
timezone = ( this . timezone_select ) ? this . timezone_select . val ( ) : false ;
605
-
613
+
614
+ if ( typeof ( hour ) == 'object' ) hour = false ;
615
+ if ( typeof ( minute ) == 'object' ) minute = false ;
616
+ if ( typeof ( second ) == 'object' ) second = false ;
617
+ if ( typeof ( timezone ) == 'object' ) timezone = false ;
618
+
606
619
if ( hour !== false ) hour = parseInt ( hour , 10 ) ;
607
620
if ( minute !== false ) minute = parseInt ( minute , 10 ) ;
608
621
if ( second !== false ) second = parseInt ( second , 10 ) ;
609
622
610
623
var ampm = ( hour < 12 ) ? 'AM' : 'PM' ;
611
-
624
+
612
625
// If the update was done in the input field, the input field should not be updated.
613
626
// If the update was done using the sliders, update the input field.
614
627
var hasChanged = ( hour != this . hour || minute != this . minute || second != this . second || ( this . ampm . length > 0 && this . ampm != ampm ) || timezone != this . timezone ) ;
@@ -619,12 +632,15 @@ $.extend(Timepicker.prototype, {
619
632
if ( minute !== false ) this . minute = minute ;
620
633
if ( second !== false ) this . second = second ;
621
634
if ( timezone !== false ) this . timezone = timezone ;
635
+
636
+ if ( ! this . inst ) this . inst = $ . datepicker . _getInst ( this . $input [ 0 ] ) ;
637
+
622
638
this . _limitMinMaxDateTime ( this . inst , true ) ;
623
639
}
624
640
if ( this . _defaults . ampm ) this . ampm = ampm ;
625
641
626
642
this . _formatTime ( ) ;
627
- if ( this . $timeObj ) this . $timeObj . text ( this . formattedTime ) ;
643
+ if ( this . $timeObj ) this . $timeObj . text ( this . formattedTime + this . _defaults . timeSuffix ) ;
628
644
this . timeDefined = true ;
629
645
if ( hasChanged ) this . _updateDateTime ( ) ;
630
646
} ,
@@ -699,7 +715,7 @@ $.extend(Timepicker.prototype, {
699
715
if ( this . _defaults . timeOnly === true ) {
700
716
formattedDateTime = this . formattedTime ;
701
717
} else if ( this . _defaults . timeOnly !== true && ( this . _defaults . alwaysSetTime || timeAvailable ) ) {
702
- formattedDateTime += this . _defaults . separator + this . formattedTime ;
718
+ formattedDateTime += this . _defaults . separator + this . formattedTime + this . _defaults . timeSuffix ;
703
719
}
704
720
705
721
this . formattedDateTime = formattedDateTime ;
@@ -774,7 +790,7 @@ $.datepicker._selectDate = function (id, dateStr) {
774
790
tp_inst . _limitMinMaxDateTime ( inst , true ) ;
775
791
inst . inline = inst . stay_open = true ;
776
792
//This way the onSelect handler called from calendarpicker get the full dateTime
777
- this . _base_selectDate ( id , dateStr + tp_inst . _defaults . separator + tp_inst . formattedTime ) ;
793
+ this . _base_selectDate ( id , dateStr + tp_inst . _defaults . separator + tp_inst . formattedTime + tp_inst . _defaults . timeSuffix ) ;
778
794
inst . inline = inst . stay_open = false ;
779
795
this . _notifyChange ( inst ) ;
780
796
this . _updateDatepicker ( inst ) ;
@@ -788,6 +804,16 @@ $.datepicker._selectDate = function (id, dateStr) {
788
804
//#############################################################################################
789
805
$ . datepicker . _base_updateDatepicker = $ . datepicker . _updateDatepicker ;
790
806
$ . datepicker . _updateDatepicker = function ( inst ) {
807
+
808
+ // don't popup the datepicker if there is another instance already opened
809
+ var input = inst . input [ 0 ] ;
810
+ if ( $ . datepicker . _curInst &&
811
+ $ . datepicker . _curInst != inst &&
812
+ $ . datepicker . _datepickerShowing &&
813
+ $ . datepicker . _lastInput != input ) {
814
+ return ;
815
+ }
816
+
791
817
if ( typeof ( inst . stay_open ) !== 'boolean' || inst . stay_open === false ) {
792
818
793
819
this . _base_updateDatepicker ( inst ) ;
@@ -799,7 +825,7 @@ $.datepicker._updateDatepicker = function(inst) {
799
825
} ;
800
826
801
827
//#######################################################################################
802
- // third bad hack :/ override datepicker so it allows spaces and colan in the input field
828
+ // third bad hack :/ override datepicker so it allows spaces and colon in the input field
803
829
//#######################################################################################
804
830
$ . datepicker . _base_doKeyPress = $ . datepicker . _doKeyPress ;
805
831
$ . datepicker . _doKeyPress = function ( event ) {
@@ -809,6 +835,7 @@ $.datepicker._doKeyPress = function(event) {
809
835
if ( tp_inst ) {
810
836
if ( $ . datepicker . _get ( inst , 'constrainInput' ) ) {
811
837
var ampm = tp_inst . _defaults . ampm ,
838
+ dateChars = $ . datepicker . _possibleChars ( $ . datepicker . _get ( inst , 'dateFormat' ) ) ,
812
839
datetimeChars = tp_inst . _defaults . timeFormat . toString ( )
813
840
. replace ( / [ h m s ] / g, '' )
814
841
. replace ( / T T / g, ampm ? 'APM' : '' )
@@ -819,9 +846,11 @@ $.datepicker._doKeyPress = function(event) {
819
846
. replace ( / t / g, ampm ? 'ap' : '' ) +
820
847
" " +
821
848
tp_inst . _defaults . separator +
822
- $ . datepicker . _possibleChars ( $ . datepicker . _get ( inst , 'dateFormat' ) ) ,
849
+ tp_inst . _defaults . timeSuffix +
850
+ ( tp_inst . _defaults . showTimezone ? tp_inst . _defaults . timezoneList . join ( '' ) : '' ) +
851
+ dateChars ,
823
852
chr = String . fromCharCode ( event . charCode === undefined ? event . keyCode : event . charCode ) ;
824
- return event . ctrlKey || ( chr < ' ' || ! datetimeChars || datetimeChars . indexOf ( chr ) > - 1 ) ;
853
+ return event . ctrlKey || ( chr < ' ' || ! dateChars || datetimeChars . indexOf ( chr ) > - 1 ) ;
825
854
}
826
855
}
827
856
@@ -902,12 +931,13 @@ $.datepicker._setTime = function(inst, date) {
902
931
second = defaults . secondMin ;
903
932
}
904
933
934
+ tp_inst . hour = hour ;
935
+ tp_inst . minute = minute ;
936
+ tp_inst . second = second ;
937
+
905
938
if ( tp_inst . hour_slider ) tp_inst . hour_slider . slider ( 'value' , hour ) ;
906
- else tp_inst . hour = hour ;
907
939
if ( tp_inst . minute_slider ) tp_inst . minute_slider . slider ( 'value' , minute ) ;
908
- else tp_inst . minute = minute ;
909
940
if ( tp_inst . second_slider ) tp_inst . second_slider . slider ( 'value' , second ) ;
910
- else tp_inst . second = second ;
911
941
912
942
tp_inst . _onTimeChange ( ) ;
913
943
tp_inst . _updateDateTime ( inst ) ;
@@ -968,13 +998,31 @@ $.datepicker._getDateDatepicker = function(target, noDefault) {
968
998
return this . _base_getDateDatepicker ( target , noDefault ) ;
969
999
} ;
970
1000
1001
+ //#######################################################################################
1002
+ // override parseDate() because UI 1.8.14 throws an error about "Extra characters"
1003
+ // An option in datapicker to ignore extra format characters would be nicer.
1004
+ //#######################################################################################
1005
+ $ . datepicker . _base_parseDate = $ . datepicker . parseDate ;
1006
+ $ . datepicker . parseDate = function ( format , value , settings ) {
1007
+ var date ;
1008
+ try {
1009
+ date = this . _base_parseDate ( format , value , settings ) ;
1010
+ } catch ( err ) {
1011
+ // Hack! The error message ends with a colon, a space, and
1012
+ // the "extra" characters. We rely on that instead of
1013
+ // attempting to perfectly reproduce the parsing algorithm.
1014
+ date = this . _base_parseDate ( format , value . substring ( 0 , value . length - ( err . length - err . indexOf ( ':' ) - 2 ) ) , settings ) ;
1015
+ }
1016
+ return date ;
1017
+ } ;
1018
+
971
1019
//#######################################################################################
972
1020
// override options setter to add time to maxDate(Time) and minDate(Time)
973
1021
//#######################################################################################
974
1022
$ . datepicker . _base_optionDatepicker = $ . datepicker . _optionDatepicker ;
975
1023
$ . datepicker . _optionDatepicker = function ( target , name , value ) {
976
1024
this . _base_optionDatepicker ( target , name , value ) ;
977
- var inst = this . _getInst ( target ) ,
1025
+ var inst = this . _getInst ( target ) ,
978
1026
tp_inst = this . _get ( inst , 'timepicker' ) ;
979
1027
if ( tp_inst ) {
980
1028
//Set minimum and maximum date values if we have timepicker
@@ -1007,6 +1055,6 @@ function extendRemove(target, props) {
1007
1055
}
1008
1056
1009
1057
$ . timepicker = new Timepicker ( ) ; // singleton instance
1010
- $ . timepicker . version = "0.9.5 " ;
1058
+ $ . timepicker . version = "0.9.6 " ;
1011
1059
1012
1060
} ) ( jQuery ) ;
0 commit comments