@@ -58,6 +58,10 @@ function Timepicker() {
5858 hourMax : 23 ,
5959 minuteMax : 59 ,
6060 secondMax : 59 ,
61+
62+ minDateTime : null ,
63+ maxDateTime : null ,
64+
6165 hourGrid : 0 ,
6266 minuteGrid : 0 ,
6367 secondGrid : 0 ,
@@ -77,6 +81,12 @@ $.extend(Timepicker.prototype, {
7781 hour : 0 ,
7882 minute : 0 ,
7983 second : 0 ,
84+ hourMinOriginal : null ,
85+ minuteMinOriginal : null ,
86+ secondMinOriginal : null ,
87+ hourMaxOriginal : null ,
88+ minuteMaxOriginal : null ,
89+ secondMaxOriginal : null ,
8090 ampm : '' ,
8191 formattedDate : '' ,
8292 formattedTime : '' ,
@@ -145,12 +155,13 @@ $.extend(Timepicker.prototype, {
145155 //########################################################################
146156 // add our sliders to the calendar
147157 //########################################################################
148- _addTimePicker : function ( ) {
158+ _addTimePicker : function ( dp_inst ) {
149159 var currDT = ( this . $altInput ) ?
150160 this . $input . val ( ) + ' ' + this . $altInput . val ( ) :
151161 this . $input . val ( ) ;
152162
153163 this . timeDefined = this . _parseTime ( currDT ) ;
164+ this . _limitMinMaxDateTime ( dp_inst , false ) ;
154165 this . _injectTimePicker ( ) ;
155166 } ,
156167
@@ -438,6 +449,67 @@ $.extend(Timepicker.prototype, {
438449 }
439450 } ,
440451
452+ //########################################################################
453+ // This function tries to limit the ability to go outside the
454+ // min/max date range
455+ //########################################################################
456+ _limitMinMaxDateTime : function ( dp_inst , adjustSliders ) {
457+ var o = this . _defaults ,
458+ dp_date = new Date ( dp_inst . selectedYear , dp_inst . selectedMonth , dp_inst . selectedDay ) ,
459+ tp_date = new Date ( dp_inst . selectedYear , dp_inst . selectedMonth , dp_inst . selectedDay , this . hour , this . minute , this . second , 0 ) ;
460+
461+ if ( this . _defaults . minDateTime !== null && dp_date ) {
462+ var minDateTime = this . _defaults . minDateTime ,
463+ minDateTimeDate = new Date ( minDateTime . getFullYear ( ) , minDateTime . getMonth ( ) , minDateTime . getDate ( ) , 0 , 0 , 0 , 0 ) ;
464+
465+ if ( this . hourMinOriginal === null || this . minuteMinOriginal === null || this . secondMinOriginal === null ) {
466+ this . hourMinOriginal = o . hourMin ;
467+ this . minuteMinOriginal = o . minuteMin ;
468+ this . secondMinOriginal = o . secondMin ;
469+ }
470+
471+ if ( minDateTimeDate . getTime ( ) == dp_date . getTime ( ) ) {
472+ this . _defaults . hourMin = minDateTime . getHours ( ) ;
473+ this . _defaults . minuteMin = minDateTime . getMinutes ( ) ;
474+ this . _defaults . secondMin = minDateTime . getSeconds ( ) ;
475+ } else {
476+ this . _defaults . hourMin = this . hourMinOriginal ;
477+ this . _defaults . minuteMin = this . minuteMinOriginal ;
478+ this . _defaults . secondMin = this . secondMinOriginal ;
479+ }
480+ }
481+
482+ if ( this . _defaults . maxDateTime !== null && dp_date ) {
483+ var maxDateTime = this . _defaults . maxDateTime ,
484+ maxDateTimeDate = new Date ( maxDateTime . getFullYear ( ) , maxDateTime . getMonth ( ) , maxDateTime . getDate ( ) , 0 , 0 , 0 , 0 ) ;
485+
486+ if ( this . hourMaxOriginal === null || this . minuteMaxOriginal === null || this . secondMaxOriginal === null ) {
487+ this . hourMaxOriginal = o . hourMax ;
488+ this . minuteMaxOriginal = o . minuteMax ;
489+ this . secondMaxOriginal = o . secondMax ;
490+ }
491+
492+ if ( maxDateTimeDate . getTime ( ) == dp_date . getTime ( ) ) {
493+ this . _defaults . hourMax = maxDateTime . getHours ( ) ;
494+ this . _defaults . minuteMax = maxDateTime . getMinutes ( ) ;
495+ this . _defaults . secondMax = maxDateTime . getSeconds ( ) ;
496+ } else {
497+ this . _defaults . hourMax = this . hourMaxOriginal ;
498+ this . _defaults . minuteMax = this . minuteMaxOriginal ;
499+ this . _defaults . secondMax = this . secondMaxOriginal ;
500+ }
501+ }
502+
503+ if ( adjustSliders !== undefined && adjustSliders === true ) {
504+ this . hour_slider . slider ( "option" , { min : this . _defaults . hourMin , max : this . _defaults . hourMax } ) ;
505+ this . minute_slider . slider ( "option" , { min : this . _defaults . minuteMin , max : this . _defaults . minuteMax } ) ;
506+ this . second_slider . slider ( "option" , { min : this . _defaults . secondMin , max : this . _defaults . secondMax } ) ;
507+ }
508+
509+ $ . datepicker . _setTime ( dp_inst , tp_date ) ;
510+
511+ } ,
512+
441513 //########################################################################
442514 // when a slider moves, set the internal time...
443515 // on time change is also called when the time is updated in the text field
@@ -581,6 +653,7 @@ $.datepicker._selectDate = function (id, dateStr) {
581653 tp_inst = this . _get ( inst , 'timepicker' ) ;
582654
583655 if ( tp_inst ) {
656+ tp_inst . _limitMinMaxDateTime ( inst , true ) ;
584657 inst . inline = inst . stay_open = true ;
585658 this . _base_selectDate ( id , dateStr ) ;
586659 inst . inline = inst . stay_open = false ;
@@ -597,10 +670,12 @@ $.datepicker._selectDate = function (id, dateStr) {
597670$ . datepicker . _base_updateDatepicker = $ . datepicker . _updateDatepicker ;
598671$ . datepicker . _updateDatepicker = function ( inst ) {
599672 if ( typeof ( inst . stay_open ) !== 'boolean' || inst . stay_open === false ) {
673+
600674 this . _base_updateDatepicker ( inst ) ;
675+
601676 // Reload the time control when changing something in the input text field.
602677 var tp_inst = this . _get ( inst , 'timepicker' ) ;
603- if ( tp_inst ) tp_inst . _addTimePicker ( ) ;
678+ if ( tp_inst ) tp_inst . _addTimePicker ( inst ) ;
604679 }
605680} ;
606681
0 commit comments