diff options
Diffstat (limited to 'resources/mediawiki.special/mediawiki.special.preferences.js')
-rw-r--r-- | resources/mediawiki.special/mediawiki.special.preferences.js | 172 |
1 files changed, 135 insertions, 37 deletions
diff --git a/resources/mediawiki.special/mediawiki.special.preferences.js b/resources/mediawiki.special/mediawiki.special.preferences.js index 1775bec4..2e07e7f1 100644 --- a/resources/mediawiki.special/mediawiki.special.preferences.js +++ b/resources/mediawiki.special/mediawiki.special.preferences.js @@ -2,44 +2,61 @@ * JavaScript for Special:Preferences */ ( function( $, mw ) { - $( '#prefsubmit' ).attr( 'id', 'prefcontrol' ); -$( '#preferences' ) +var $preftoc = $('<ul id="preftoc"></ul>'); +var $preferences = $( '#preferences' ) .addClass( 'jsprefs' ) - .before( $( '<ul id="preftoc"></ul>' ) ) - .children( 'fieldset' ) - .hide() - .addClass( 'prefsection' ) - .children( 'legend' ) - .addClass( 'mainLegend' ) - .each( function( i ) { - $(this).parent().attr( 'id', 'prefsection-' + i ); - if ( i === 0 ) { - $(this).parent().show(); - } - $( '#preftoc' ).append( - $( '<li></li>' ) - .addClass( i === 0 ? 'selected' : null ) - .append( - $( '<a></a>') - .text( $(this).text() ) - .attr( 'href', '#prefsection-' + i ) - .mousedown( function( e ) { - $(this).parent().parent().find( 'li' ).removeClass( 'selected' ); - $(this).parent().addClass( 'selected' ); - e.preventDefault(); - return false; - } ) - .click( function( e ) { - $( '#preferences > fieldset' ).hide(); - $( '#prefsection-' + i ).show(); - e.preventDefault(); - return false; - } ) - ) - ); - } - ); + .before( $preftoc ); + +var $fieldsets = $preferences.children( 'fieldset' ) + .hide() + .addClass( 'prefsection' ); + +var $legends = $fieldsets.children( 'legend' ) + .addClass( 'mainLegend' ); + +// Populate the prefToc +$legends.each( function( i, legend ) { + var $legend = $(legend); + if ( i === 0 ) { + $legend.parent().show(); + } + var ident = $legend.parent().attr( 'id' ); + + var $li = $( '<li/>', { + 'class' : ( i === 0 ) ? 'selected' : null + }); + var $a = $( '<a/>', { + text : $legend.text(), + id : ident.replace( 'mw-prefsection', 'preftab' ), + href : '#' + ident + }).click( function( e ) { + e.preventDefault(); + // Handle hash manually to prevent jumping + // Therefore save and restore scrollTop to prevent jumping + var scrollTop = $(window).scrollTop(); + window.location.hash = $(this).attr('href'); + $(window).scrollTop(scrollTop); + + $preftoc.find( 'li' ).removeClass( 'selected' ); + $(this).parent().addClass( 'selected' ); + $( '#preferences > fieldset' ).hide(); + $( '#' + ident ).show(); + }); + $li.append( $a ); + $preftoc.append( $li ); +} ); + +// If we've reloaded the page or followed an open-in-new-window, +// make the selected tab visible. +// On document ready: +$( function() { + var hash = window.location.hash; + if( hash.match( /^#mw-prefsection-[\w-]+/ ) ) { + var $tab = $( hash.replace( 'mw-prefsection', 'preftab' ) ); + $tab.click(); + } +} ); /** * Given an email validity status (true, false, null) update the label CSS class @@ -74,4 +91,85 @@ $( '#mw-input-wpemailaddress' ).one( 'blur', function() { updateMailValidityLabel( $(this).val() ); } ); } ); -} )( jQuery, mediaWiki );
\ No newline at end of file + + + +/** +* Timezone functions. +* Guesses Timezone from browser and updates fields onchange +*/ + +var $tzSelect = $( '#mw-input-wptimecorrection' ); +var $tzTextbox = $( '#mw-input-wptimecorrection-other' ); + +var $localtimeHolder = $( '#wpLocalTime' ); +var servertime = parseInt( $( 'input[name=wpServerTime]' ).val(), 10 ); +var minuteDiff = 0; + +var minutesToHours = function( min ) { + var tzHour = Math.floor( Math.abs( min ) / 60 ); + var tzMin = Math.abs( min ) % 60; + var tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour + + ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin; + return tzString; +}; + +var hoursToMinutes = function( hour ) { + var arr = hour.split( ':' ); + arr[0] = parseInt( arr[0], 10 ); + + var minutes; + if ( arr.length == 1 ) { + // Specification is of the form [-]XX + minutes = arr[0] * 60; + } else { + // Specification is of the form [-]XX:XX + minutes = Math.abs( arr[0] ) * 60 + parseInt( arr[1], 10 ); + if ( arr[0] < 0 ) { + minutes *= -1; + } + } + // Gracefully handle non-numbers. + if ( isNaN( minutes ) ) { + return 0; + } else { + return minutes; + } +}; + +var updateTimezoneSelection = function() { + var type = $tzSelect.val(); + if ( type == 'guess' ) { + // Get browser timezone & fill it in + minuteDiff = -new Date().getTimezoneOffset(); + $tzTextbox.val( minutesToHours( minuteDiff ) ); + $tzSelect.val( 'other' ); + $tzTextbox.get( 0 ).disabled = false; + } else if ( type == 'other' ) { + // Grab data from the textbox, parse it. + minuteDiff = hoursToMinutes( $tzTextbox.val() ); + } else { + // Grab data from the $tzSelect value + minuteDiff = parseInt( type.split( '|' )[1], 10 ) || 0; + $tzTextbox.val( minutesToHours( minuteDiff ) ); + } + + // Determine local time from server time and minutes difference, for display. + var localTime = servertime + minuteDiff; + + // Bring time within the [0,1440) range. + while ( localTime < 0 ) { + localTime += 1440; + } + while ( localTime >= 1440 ) { + localTime -= 1440; + } + $localtimeHolder.text( minutesToHours( localTime ) ); +}; + +if ( $tzSelect.length && $tzTextbox.length ) { + $tzSelect.change( function() { updateTimezoneSelection(); } ); + $tzTextbox.blur( function() { updateTimezoneSelection(); } ); + updateTimezoneSelection(); +} +} )( jQuery, mediaWiki ); |