/** * Javascript code to be used with input type datepicker. * * @author Stephan Gambke * */ /*jshint -W069 */ window.PF_DP_init = function ( input_id, params ) { var inputShow = jQuery( '#' + input_id ); inputShow.attr( 'id', input_id + '_show' ); var input; if ( !params.partOfDTP ) { input = jQuery( '' ); input.attr( { id: input_id, name: inputShow.attr( 'name' ), value: inputShow.val() } ); inputShow.after( input ); inputShow.removeAttr( 'name' ); } else { input = inputShow; } var tabindex = inputShow.attr( 'tabindex' ); var re = /\d{4}\/\d{2}\/\d{2}/; if ( params.disabled ) { // append inert datepicker button inputShow.after( '' ); // set value for input fields if ( re.test( params.currValue ) ) { inputShow.val( jQuery.datepicker.formatDate( params.dateFormat, jQuery.datepicker.parseDate( "yy/mm/dd", params.currValue, null ), null ) ); } else { inputShow.val( params.currValue ); } } else { inputShow.datepicker( { 'showOn': 'both', 'buttonImage': params.buttonImage, 'buttonImageOnly': false, 'changeMonth': true, 'changeYear': true, 'altFormat': 'yy/mm/dd', 'showButtonPanel': true, 'firstDay': params.firstDay, 'dateFormat': params.dateFormat, 'beforeShowDay': function ( date ) {return PF_DP_checkDate( '#' + input_id + '_show', date );} } ); // at least in Firefox, the tabindex needs to be set delayed setTimeout( function () { inputShow.siblings( 'button' ).attr( 'tabindex', tabindex ); }, 0 ); if ( params.minDate ) { inputShow.datepicker( 'option', 'minDate', jQuery.datepicker.parseDate( 'yy/mm/dd', params.minDate, null ) ); } if ( params.maxDate ) { inputShow.datepicker( 'option', 'maxDate', jQuery.datepicker.parseDate( 'yy/mm/dd', params.maxDate, null ) ); } if ( params.userClasses ) { inputShow.datepicker( 'widget' ).addClass( params.userClasses ); jQuery( '#' + input_id + ' + button' ).addClass( params.userClasses ); } var i; if ( params.disabledDates ) { var disabledDates = []; for ( i in params.disabledDates ) { if ( params.disabledDates[ i ] ) { disabledDates.push( [ new Date( params.disabledDates[ i ][ 0 ], params.disabledDates[ i ][ 1 ], params.disabledDates[ i ][ 2 ] ), new Date( params.disabledDates[ i ][ 3 ], params.disabledDates[ i ][ 4 ], params.disabledDates[ i ][ 5 ] ) ] ); } } inputShow.datepicker( 'option', 'disabledDates', disabledDates ); disabledDates = null; } if ( params.highlightedDates ) { var highlightedDates = []; for ( i in params.highlightedDates ) { if ( params.highlightedDates[ i ] ) { highlightedDates.push( [ new Date( params.highlightedDates[ i ][ 0 ], params.highlightedDates[ i ][ 1 ], params.highlightedDates[ i ][ 2 ] ), new Date( params.highlightedDates[ i ][ 3 ], params.highlightedDates[ i ][ 4 ], params.highlightedDates[ i ][ 5 ] ) ] ); } } inputShow.datepicker( 'option', 'highlightedDates', highlightedDates ); highlightedDates = null; } if ( params.disabledDays ) { inputShow.datepicker( 'option', 'disabledDays', params.disabledDays ); } if ( params.highlightedDays ) { inputShow.datepicker( 'option', 'highlightedDays', params.highlightedDays ); } if ( !params.partOfDTP ) { inputShow.datepicker( 'option', 'altField', input ); // when the input loses focus set the date value inputShow.change( function () { // try parsing the value try { var value = jQuery.datepicker.parseDate( params.dateFormat, this.value, null ); input.val( jQuery.datepicker.formatDate( 'yy/mm/dd', value ) ); } catch ( e ) { // value does not conform to specified format // just return the value as is input.val( this.value ); } } ); } if ( re.test( params.currValue ) ) { inputShow.datepicker( 'setDate', jQuery.datepicker.parseDate( 'yy/mm/dd', params.currValue, null ) ); } else { inputShow.val( params.currValue ); input.val( params.currValue ); } inputShow.datepicker( 'widget' ).hide(); } }; /** * Checks a date if it is to be enabled or highlighted * * This function is a callback function given to the jQuery datepicker to be * called for every date before it is displayed. * * @param input the input the datepicker works on * @param date the date object that is to be displayed * @return Array(Boolean enabled, Boolean highlighted, "") determining the style and behaviour */ function PF_DP_checkDate( input, date ) { var jInput = jQuery( input ); var enable = true; var disabledDays = jInput.datepicker( 'option', 'disabledDays' ); var i = 0; if ( disabledDays ) { enable = !disabledDays[ date.getDay() ]; } if ( enable ) { var disabledDates = jInput.datepicker( 'option', 'disabledDates' ); if ( disabledDates ) { for ( i = 0; i < disabledDates.length; ++i ) { if ( (date >= disabledDates[ i ][ 0 ] ) && ( date <= disabledDates[ i ][ 1 ] ) ) { enable = false; break; } } } } var highlight = ''; var highlightedDays = jInput.datepicker( 'option', 'highlightedDays' ); if ( highlightedDays && highlightedDays[ date.getDay() ] ) { highlight = 'ui-state-highlight'; } else { var highlightedDates = jInput.datepicker( 'option', 'highlightedDates' ); if ( highlightedDates ) { for ( i = 0; i < highlightedDates.length; ++i ) { if ( ( date >= highlightedDates[ i ][ 0 ] ) && ( date <= highlightedDates[ i ][ 1 ] ) ) { highlight = 'ui-state-highlight'; break; } } } } return [ enable, highlight, '' ]; } jQuery( function () { mediaWiki.loader.using( 'jquery.ui.datepicker', function () { jQuery.datepicker.regional[ 'wiki' ] = mediaWiki.config.get( 'ext.pf.datepicker.regional' ); jQuery.datepicker.setDefaults( jQuery.datepicker.regional[ 'wiki' ] ); } ); } );