1
1
/*
2
2
* jQuery timepicker addon
3
3
* By: Trent Richardson [http://trentrichardson.com]
4
- * Version 0.9.1 dev
5
- * Last Modified: 12/2 /2010
4
+ * Version 0.9.1- dev
5
+ * Last Modified: 12/13 /2010 by Charles Phillips
6
6
*
7
7
* Copyright 2010 Trent Richardson
8
8
* Dual licensed under the MIT and GPL licenses.
@@ -97,6 +97,13 @@ $.extend(Timepicker.prototype, {
97
97
var tp_inst = new Timepicker ( ) ,
98
98
inlineSettings = { } ;
99
99
100
+ tp_inst . hour = tp_inst . _defaults . hour ;
101
+ tp_inst . minute = tp_inst . _defaults . minute ;
102
+ tp_inst . second = tp_inst . _defaults . second ;
103
+ tp_inst . ampm = '' ;
104
+ tp_inst . $input = $input ;
105
+
106
+
100
107
for ( var attrName in this . _defaults ) {
101
108
var attrValue = $input . attr ( 'time:' + attrName ) ;
102
109
if ( attrValue ) {
@@ -109,19 +116,12 @@ $.extend(Timepicker.prototype, {
109
116
}
110
117
tp_inst . _defaults = $ . extend ( { } , this . _defaults , inlineSettings , o , {
111
118
beforeShow : function ( input , dp_inst ) {
112
- tp_inst . hour = tp_inst . _defaults . hour ;
113
- tp_inst . minute = tp_inst . _defaults . minute ;
114
- tp_inst . second = tp_inst . _defaults . second ;
115
- tp_inst . ampm = '' ;
116
- tp_inst . $input = $ ( input ) ;
117
119
if ( o . altField )
118
120
tp_inst . $altInput = $ ( $ . datepicker . _get ( dp_inst , 'altField' ) )
119
121
. css ( { cursor : 'pointer' } )
120
122
. focus ( function ( ) {
121
123
$input . trigger ( "focus" ) ;
122
124
} ) ;
123
- tp_inst . inst = dp_inst ;
124
- tp_inst . _addTimePicker ( ) ;
125
125
if ( $ . isFunction ( o . beforeShow ) )
126
126
o . beforeShow ( input , dp_inst ) ;
127
127
} ,
@@ -148,10 +148,9 @@ $.extend(Timepicker.prototype, {
148
148
_addTimePicker : function ( ) {
149
149
var currDT = ( this . $altInput ) ?
150
150
this . $input . val ( ) + ' ' + this . $altInput . val ( ) :
151
- this . $input . val ( ) ,
152
- parsedDT = this . _parseTime ( currDT ) ;
151
+ this . $input . val ( ) ;
153
152
154
- this . timeDefined = ( parsedDT ) ? true : false ;
153
+ this . timeDefined = this . _parseTime ( currDT ) ;
155
154
this . _injectTimePicker ( ) ;
156
155
} ,
157
156
@@ -165,9 +164,10 @@ $.extend(Timepicker.prototype, {
165
164
. replace ( / s { 1 , 2 } / ig, '(\\d?\\d)' )
166
165
. replace ( / t { 1 , 2 } / ig, '(am|pm|a|p)?' )
167
166
. replace ( / \s / g, '\\s?' ) + '$' ,
167
+ order = this . _getFormatPositions ( ) ,
168
+ treg ;
168
169
169
- treg = timeString . match ( new RegExp ( regstr , 'i' ) ) ,
170
- order = this . _getFormatPositions ( ) ;
170
+ if ( ! this . inst ) this . inst = $ . datepicker . _getInst ( this . $input [ 0 ] ) ;
171
171
172
172
if ( withDate || ! this . _defaults . timeOnly ) {
173
173
// the time should come after x number of characters and a space.
@@ -176,6 +176,8 @@ $.extend(Timepicker.prototype, {
176
176
regstr = '.{' + dp_dateFormat . length + ',}\\s+' + regstr ;
177
177
}
178
178
179
+ treg = timeString . match ( new RegExp ( regstr , 'i' ) ) ;
180
+
179
181
if ( treg ) {
180
182
if ( order . t !== - 1 )
181
183
this . ampm = ( ( treg [ order . t ] === undefined || treg [ order . t ] . length === 0 ) ?
@@ -187,12 +189,15 @@ $.extend(Timepicker.prototype, {
187
189
this . hour = 0 ; // 12am = 0 hour
188
190
else if ( this . ampm == 'PM' && treg [ order . h ] != '12' )
189
191
this . hour = ( parseFloat ( treg [ order . h ] ) + 12 ) . toFixed ( 0 ) ; // 12pm = 12 hour, any other pm = hour + 12
190
- else this . hour = treg [ order . h ] ;
192
+ else this . hour = Number ( treg [ order . h ] ) ;
191
193
}
192
194
193
- if ( order . m !== - 1 ) this . minute = treg [ order . m ] ;
194
- if ( order . s !== - 1 ) this . second = treg [ order . s ] ;
195
- }
195
+ if ( order . m !== - 1 ) this . minute = Number ( treg [ order . m ] ) ;
196
+ if ( order . s !== - 1 ) this . second = Number ( treg [ order . s ] ) ;
197
+
198
+ return true ;
199
+
200
+ } else return false ;
196
201
} ,
197
202
198
203
//########################################################################
@@ -434,34 +439,33 @@ $.extend(Timepicker.prototype, {
434
439
} ,
435
440
436
441
//########################################################################
437
- // when a slider moves...
442
+ // when a slider moves, set the internal time ...
438
443
// on time change is also called when the time is updated in the text field
439
444
//########################################################################
440
- _onTimeChange : function ( force ) {
441
- var hour = ( this . hour_slider ) ? this . hour_slider . slider ( 'value' ) : this . hour ,
442
- minute = ( this . minute_slider ) ? this . minute_slider . slider ( 'value' ) : this . minute ,
443
- second = ( this . second_slider ) ? this . second_slider . slider ( 'value' ) : this . second ,
444
- ampm = ( hour < 11.5 ) ? 'AM' : 'PM' ,
445
- hasChanged = false ;
446
- hour = ( hour >= 11.5 && hour < 12 ) ? 12 : hour ;
447
-
448
- // If the update was done in the input field, this field should not be updated.
445
+ _onTimeChange : function ( ) {
446
+ var hour = ( this . hour_slider ) ? this . hour_slider . slider ( 'value' ) : false ,
447
+ minute = ( this . minute_slider ) ? this . minute_slider . slider ( 'value' ) : false ,
448
+ second = ( this . second_slider ) ? this . second_slider . slider ( 'value' ) : false ,
449
+ ampm = ( hour < 12 ) ? 'AM' : 'PM' ;
450
+
451
+ // If the update was done in the input field, the input field should not be updated.
449
452
// If the update was done using the sliders, update the input field.
450
- if ( force || this . hour != hour || this . minute != minute || this . second != second || ( this . ampm . length > 0 && this . ampm != ampm ) )
451
- hasChanged = true ;
453
+ var hasChanged = ( hour != this . hour || minute != this . minute || second != this . second || ( this . ampm . length > 0 && this . ampm != ampm ) ) ;
454
+
455
+ if ( hasChanged ) {
452
456
453
- this . hour = parseFloat ( hour ) . toFixed ( 0 ) ;
454
- this . minute = parseFloat ( minute ) . toFixed ( 0 ) ;
455
- this . second = parseFloat ( second ) . toFixed ( 0 ) ;
456
- this . ampm = ampm ;
457
+ if ( hour ) {
458
+ this . hour = parseFloat ( hour ) . toFixed ( 0 ) ;
459
+ this . ampm = ampm ;
460
+ }
461
+ if ( minute ) this . minute = parseFloat ( minute ) . toFixed ( 0 ) ;
462
+ if ( second ) this . second = parseFloat ( second ) . toFixed ( 0 ) ;
457
463
464
+ }
458
465
this . _formatTime ( ) ;
459
466
if ( this . $timeObj ) this . $timeObj . text ( this . formattedTime ) ;
460
-
461
- if ( hasChanged ) {
462
- this . _updateDateTime ( ) ;
463
- this . timeDefined = true ;
464
- }
467
+ this . timeDefined = true ;
468
+ if ( hasChanged ) this . _updateDateTime ( ) ;
465
469
} ,
466
470
467
471
//########################################################################
@@ -504,15 +508,14 @@ $.extend(Timepicker.prototype, {
504
508
//########################################################################
505
509
// update our input with the new date time..
506
510
//########################################################################
507
- _updateDateTime : function ( ) {
508
- var dp_inst = this . inst ,
511
+ _updateDateTime : function ( dp_inst ) {
512
+ dp_inst = this . inst || dp_inst ,
509
513
dt = new Date ( dp_inst . selectedYear , dp_inst . selectedMonth , dp_inst . selectedDay ) ,
510
514
dateFmt = $ . datepicker . _get ( dp_inst , 'dateFormat' ) ,
511
515
formatCfg = $ . datepicker . _getFormatConfig ( dp_inst ) ,
512
516
timeAvailable = dt !== null && this . timeDefined ;
513
517
this . formattedDate = $ . datepicker . formatDate ( dateFmt , ( dt === null ? new Date ( ) : dt ) , formatCfg ) ;
514
518
var formattedDateTime = this . formattedDate ;
515
-
516
519
if ( dp_inst . lastVal !== undefined && ( dp_inst . lastVal . length > 0 && this . $input . val ( ) . length === 0 ) )
517
520
return ;
518
521
@@ -561,7 +564,8 @@ $.fn.extend({
561
564
}
562
565
else
563
566
return this . each ( function ( ) {
564
- $ ( this ) . datepicker ( $ . timepicker . _newInst ( $input , o ) . _defaults ) ;
567
+ var $t = $ ( this ) ;
568
+ $t . datepicker ( $ . timepicker . _newInst ( $t , o ) . _defaults ) ;
565
569
} ) ;
566
570
}
567
571
} ) ;
@@ -594,16 +598,8 @@ $.datepicker._updateDatepicker = function(inst) {
594
598
if ( typeof ( inst . stay_open ) !== 'boolean' || inst . stay_open === false ) {
595
599
this . _base_updateDatepicker ( inst ) ;
596
600
// Reload the time control when changing something in the input text field.
597
- this . _beforeShow ( inst . input , inst ) ;
598
- }
599
- } ;
600
-
601
- $ . datepicker . _beforeShow = function ( input , inst ) {
602
- var beforeShow = this . _get ( inst , 'beforeShow' ) ;
603
- if ( beforeShow ) {
604
- inst . stay_open = true ;
605
- beforeShow . apply ( ( inst . input ? inst . input [ 0 ] : null ) , [ inst . input , inst ] ) ;
606
- inst . stay_open = false ;
601
+ var tp_inst = this . _get ( inst , 'timepicker' ) ;
602
+ if ( tp_inst ) tp_inst . _addTimePicker ( ) ;
607
603
}
608
604
} ;
609
605
@@ -669,7 +665,6 @@ $.datepicker._gotoToday = function(id) {
669
665
//#######################################################################################
670
666
$ . datepicker . _setTime = function ( inst , date ) {
671
667
var tp_inst = this . _get ( inst , 'timepicker' ) ;
672
-
673
668
if ( tp_inst ) {
674
669
var defaults = tp_inst . _defaults ,
675
670
// calling _setTime with no date sets time to defaults
@@ -691,7 +686,8 @@ $.datepicker._setTime = function(inst, date) {
691
686
if ( tp_inst . second_slider ) tp_inst . second_slider . slider ( 'value' , second ) ;
692
687
else tp_inst . second = second ;
693
688
694
- tp_inst . _onTimeChange ( true ) ;
689
+ tp_inst . _onTimeChange ( ) ;
690
+ //tp_inst._updateDateTime(inst);
695
691
}
696
692
} ;
697
693
@@ -703,6 +699,7 @@ $.datepicker._setTimeDatepicker = function(target, date, withDate) {
703
699
tp_inst = this . _get ( inst , 'timepicker' ) ;
704
700
705
701
if ( tp_inst ) {
702
+ this . _setDateFromField ( inst ) ;
706
703
var tp_date ;
707
704
if ( date ) {
708
705
if ( typeof date == "string" ) {
@@ -724,9 +721,9 @@ $.datepicker._setTimeDatepicker = function(target, date, withDate) {
724
721
$ . datepicker . _base_setDateDatepicker = $ . datepicker . _setDateDatepicker ;
725
722
$ . datepicker . _setDateDatepicker = function ( target , date ) {
726
723
var inst = this . _getInst ( target ) ,
727
- tp_date = ! ! date ? new Date ( date . getTime ( ) ) : date ;
728
-
729
- this . _updateDatepicker ( inst ) ;
724
+ tp_date = ! ! date ? new Date ( date . getTime ( ) ) : date ;
725
+
726
+ this . _updateDatepicker ( inst ) ;
730
727
this . _base_setDateDatepicker . apply ( this , arguments ) ;
731
728
this . _setTimeDatepicker ( target , tp_date , true ) ;
732
729
} ;
@@ -738,16 +735,14 @@ $.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;
738
735
$ . datepicker . _getDateDatepicker = function ( target , noDefault ) {
739
736
var inst = this . _getInst ( target ) ,
740
737
tp_inst = this . _get ( inst , 'timepicker' ) ;
741
-
742
- if ( tp_inst ) {
738
+
739
+ if ( tp_inst ) {
743
740
this . _setDateFromField ( inst , noDefault ) ;
744
- this . _updateDatepicker ( inst ) ;
745
-
746
- return ( ! inst . currentYear || ( inst . input && inst . input . val ( ) == '' ) ) ?
747
- null :
748
- ( new Date ( inst . currentYear , inst . currentMonth , inst . currentDay , tp_inst . hour , tp_inst . minute , tp_inst . second ) ) ;
741
+ var date = this . _getDate ( inst ) ;
742
+ if ( date && tp_inst . _parseTime ( $ ( target ) . val ( ) , true ) ) date . setHours ( tp_inst . hour , tp_inst . minute , tp_inst . second ) ;
743
+ return date ;
749
744
}
750
- return this . _base_getDateDatepicker ( target , noDefault ) ;
745
+ else return this . _base_getDateDatepicker ( target , noDefault ) ;
751
746
} ;
752
747
753
748
//#######################################################################################
0 commit comments