]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - skins/common/prefs.js
MediaWiki 1.16.0
[autoinstallsdev/mediawiki.git] / skins / common / prefs.js
index c2554c00d56e7e5b1b2d92e1fd1f40389dc1d029..ca55632c957b0357cf095bcaa058c99deee8f9d7 100644 (file)
@@ -1,73 +1,74 @@
-
 // generate toc from prefs form, fold sections
 // XXX: needs testing on IE/Mac and safari
 // more comments to follow
 function tabbedprefs() {
-       var prefform = document.getElementById('preferences');
-       if (!prefform || !document.createElement) {
+       var prefform = document.getElementById( 'preferences' );
+       if ( !prefform || !document.createElement ) {
                return;
        }
-       if (prefform.nodeName.toLowerCase() == 'a') {
+       if ( prefform.nodeName.toLowerCase() == 'a' ) {
                return; // Occasional IE problem
        }
        prefform.className = prefform.className + 'jsprefs';
        var sections = [];
        var children = prefform.childNodes;
        var seci = 0;
-       for (var i = 0; i < children.length; i++) {
-               if (children[i].nodeName.toLowerCase() == 'fieldset') {
+       for ( var i = 0; i < children.length; i++ ) {
+               if ( children[i].nodeName.toLowerCase() == 'fieldset' ) {
                        children[i].id = 'prefsection-' + seci;
                        children[i].className = 'prefsection';
-                       if (is_opera || is_khtml) {
+                       if ( is_opera ) {
                                children[i].className = 'prefsection operaprefsection';
                        }
                        var legends = children[i].getElementsByTagName('legend');
                        sections[seci] = {};
-                       if (legends[0]) legends[0].className = 'mainLegend';
-                       if (legends[0] && legends[0].firstChild.nodeValue) {
+                       if ( legends[0] ) {
+                               legends[0].className = 'mainLegend';
+                       }
+                       if ( legends[0] && legends[0].firstChild.nodeValue ) {
                                sections[seci].text = legends[0].firstChild.nodeValue;
                        } else {
                                sections[seci].text = '# ' + seci;
                        }
                        sections[seci].secid = children[i].id;
                        seci++;
-                       if (sections.length != 1) {
+                       if ( sections.length != 1 ) {
                                children[i].style.display = 'none';
                        } else {
                                var selectedid = children[i].id;
                        }
                }
        }
-       var toc = document.createElement('ul');
+       var toc = document.createElement( 'ul' );
        toc.id = 'preftoc';
        toc.selectedid = selectedid;
-       for (i = 0; i < sections.length; i++) {
-               var li = document.createElement('li');
-               if (i === 0) {
+       for ( i = 0; i < sections.length; i++ ) {
+               var li = document.createElement( 'li' );
+               if ( i === 0 ) {
                        li.className = 'selected';
                }
-               var a = document.createElement('a');
+               var a = document.createElement( 'a' );
                a.href = '#' + sections[i].secid;
                a.onmousedown = a.onclick = uncoversection;
-               a.appendChild(document.createTextNode(sections[i].text));
+               a.appendChild( document.createTextNode( sections[i].text ) );
                a.secid = sections[i].secid;
-               li.appendChild(a);
-               toc.appendChild(li);
+               li.appendChild( a );
+               toc.appendChild( li );
        }
-       prefform.parentNode.insertBefore(toc, prefform.parentNode.childNodes[0]);
-       document.getElementById('prefsubmit').id = 'prefcontrol';
+       prefform.parentNode.insertBefore( toc, prefform.parentNode.childNodes[0] );
+       document.getElementById( 'prefsubmit' ).id = 'prefcontrol';
 }
 
 function uncoversection() {
        var oldsecid = this.parentNode.parentNode.selectedid;
-       var newsec = document.getElementById(this.secid);
-       if (oldsecid != this.secid) {
-               var ul = document.getElementById('preftoc');
-               document.getElementById(oldsecid).style.display = 'none';
+       var newsec = document.getElementById( this.secid );
+       if ( oldsecid != this.secid ) {
+               var ul = document.getElementById( 'preftoc' );
+               document.getElementById( oldsecid ).style.display = 'none';
                newsec.style.display = 'block';
                ul.selectedid = this.secid;
-               var lis = ul.getElementsByTagName('li');
-               for (var i = 0; i< lis.length; i++) {
+               var lis = ul.getElementsByTagName( 'li' );
+               for ( var i = 0; i< lis.length; i++ ) {
                        lis[i].className = '';
                }
                this.parentNode.className = 'selected';
@@ -77,25 +78,29 @@ function uncoversection() {
 
 // Timezone stuff
 // tz in format [+-]HHMM
-function checkTimezone(tz, msg) {
+function checkTimezone( tz, msg ) {
        var localclock = new Date();
        // returns negative offset from GMT in minutes
        var tzRaw = localclock.getTimezoneOffset();
-       var tzHour = Math.floor( Math.abs(tzRaw) / 60);
-       var tzMin = Math.abs(tzRaw) % 60;
-       var tzString = ((tzRaw >= 0) ? "-" : "+") + ((tzHour < 10) ? "0" : "") + tzHour + ((tzMin < 10) ? "0" : "") + tzMin;
-       if (tz != tzString) {
+       var tzHour = Math.floor( Math.abs( tzRaw ) / 60 );
+       var tzMin = Math.abs( tzRaw ) % 60;
+       var tzString = ( ( tzRaw >= 0 ) ? '-' : '+' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
+       if ( tz != tzString ) {
                var junk = msg.split('$1');
-               document.write(junk[0] + "UTC" + tzString + junk[1]);
+               document.write( junk[0] + 'UTC' + tzString + junk[1] );
        }
 }
 
-function unhidetzbutton() {
-       var tzb = document.getElementById('guesstimezonebutton');
-       if (tzb) {
-               tzb.style.display = 'inline';
+function timezoneSetup() {
+       var tzSelect = document.getElementById( 'mw-input-timecorrection' );
+       var tzTextbox = document.getElementById( 'mw-input-timecorrection-other' );
+
+       if ( tzSelect && tzTextbox ) {
+               addHandler( tzSelect, 'change', function( e ) { updateTimezoneSelection( false ); } );
+               addHandler( tzTextbox, 'blur', function( e ) { updateTimezoneSelection( true ); } );
        }
-       updateTimezoneSelection(false);
+
+       updateTimezoneSelection( false );
 }
 
 // in [-]HH:MM format...
@@ -105,60 +110,108 @@ function fetchTimezone() {
        var localclock = new Date();
        // returns negative offset from GMT in minutes
        var tzRaw = localclock.getTimezoneOffset();
-       var tzHour = Math.floor( Math.abs(tzRaw) / 60);
-       var tzMin = Math.abs(tzRaw) % 60;
-       var tzString = ((tzRaw >= 0) ? "-" : "") + ((tzHour < 10) ? "0" : "") + tzHour +
-               ":" + ((tzMin < 10) ? "0" : "") + tzMin;
+       var tzHour = Math.floor( Math.abs( tzRaw ) / 60 );
+       var tzMin = Math.abs( tzRaw ) % 60;
+       var tzString = ( ( tzRaw >= 0 ) ? '-' : '' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
+               ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
        return tzString;
 }
 
-function guessTimezone(box) {
-       document.getElementsByName("wpHourDiff")[0].value = fetchTimezone();
-       updateTimezoneSelection(true);
+function guessTimezone() {
+       var textbox = document.getElementById( 'mw-input-timecorrection-other' );
+       var selector = document.getElementById( 'mw-input-timecorrection' );
+
+       selector.value = 'other';
+       textbox.value = fetchTimezone();
+       textbox.disabled = false; // The changed handler doesn't trip, obviously.
+       updateTimezoneSelection( true );
 }
 
-function updateTimezoneSelection(force_offset) {
-       var wpTimeZone = document.getElementsByName("wpTimeZone")[0];
-       var wpHourDiff = document.getElementsByName("wpHourDiff")[0];
-       var wpLocalTime = document.getElementById("wpLocalTime");
-       var wpServerTime = document.getElementsByName("wpServerTime")[0];
+function updateTimezoneSelection( force_offset ) {
+       var selector = document.getElementById( 'mw-input-timecorrection' );
+
+       if ( selector.value == 'guess' ) {
+               return guessTimezone();
+       }
+
+       var textbox = document.getElementById( 'mw-input-timecorrection-other' );
+       var localtimeHolder = document.getElementById( 'wpLocalTime' );
+       var servertime = document.getElementsByName( 'wpServerTime' )[0].value;
        var minDiff = 0;
 
-       if (force_offset) wpTimeZone.selectedIndex = 1;
-       if (wpTimeZone.selectedIndex == 1) {
-               wpHourDiff.disabled = false;
-               var diffArr = wpHourDiff.value.split(':');
-               if (diffArr.length == 1) {
-                       minDiff = parseInt(diffArr[0], 10) * 60;
+       // Compatibility code.
+       if ( !selector.value ) {
+               selector.value = selector.options[selector.selectedIndex].value;
+       }
+
+       // Handle force_offset
+       if ( force_offset ) {
+               selector.value = 'other';
+       }
+
+       // Get min_diff
+       if ( selector.value == 'other' ) {
+               // Grab data from the textbox, parse it.
+               var diffArr = textbox.value.split(':');
+               if ( diffArr.length == 1 ) {
+                       // Specification is of the form [-]XX
+                       minDiff = parseInt( diffArr[0], 10 ) * 60;
                } else {
-                       minDiff = Math.abs(parseInt(diffArr[0], 10))*60 + parseInt(diffArr[1], 10);
-                       if (parseInt(diffArr[0], 10) < 0) minDiff = -minDiff;
+                       // Specification is of the form [-]XX:XX
+                       minDiff = Math.abs( parseInt( diffArr[0], 10 ) ) * 60 + parseInt( diffArr[1], 10 );
+                       if ( parseInt( diffArr[0], 10 ) < 0 ) {
+                               minDiff = -minDiff;
+                       }
                }
        } else {
-               wpHourDiff.disabled = true;
-               var diffArr = wpTimeZone.options[wpTimeZone.selectedIndex].value.split('|');
-               minDiff = parseInt(diffArr[1], 10);
+               // Grab data from the selector value
+               var diffArr = selector.value.split('|');
+               minDiff = parseInt( diffArr[1], 10 );
+       }
+
+       // Gracefully handle non-numbers.
+       if ( isNaN( minDiff ) ) {
+               minDiff = 0;
+       }
+
+       // Determine local time from server time and minutes difference, for display.
+       var localTime = parseInt( servertime, 10 ) + minDiff;
+
+       // Bring time within the [0,1440) range.
+       while ( localTime < 0 ) {
+               localTime += 1440;
+       }
+       while ( localTime >= 1440 ) {
+               localTime -= 1440;
        }
-       if (isNaN(minDiff)) minDiff = 0;
-       var localTime = parseInt(wpServerTime.value, 10) + minDiff;
-       while (localTime < 0) localTime += 1440;
-       while (localTime >= 1440) localTime -= 1440;
 
-       var hour = String(Math.floor(localTime/60));
-       if (hour.length<2) hour = '0'+hour;
+       // Split to hour and minute
+       var hour = String( Math.floor( localTime / 60 ) );
+       if ( hour.length < 2 ) {
+               hour = '0' + hour;
+       }
        var min = String(localTime%60);
-       if (min.length<2) min = '0'+min;
-       changeText(wpLocalTime, hour+':'+min);
+       if ( min.length < 2 ) {
+               min = '0' + min;
+       }
+       changeText( localtimeHolder, hour + ':' + min );
 
-       if (wpTimeZone.selectedIndex != 1) {
-               hour = String(Math.abs(Math.floor(minDiff/60)));
-               if (hour.length<2) hour = '0'+hour;
-               if (minDiff < 0) hour = '-'+hour;
+       // If the user selected from the drop-down, fill the offset field.
+       if ( selector.value != 'other' ) {
+               hour = String( Math.abs( Math.floor( minDiff / 60 ) ) );
+               if ( hour.length < 2 ) {
+                       hour = '0' + hour;
+               }
+               if ( minDiff < 0 ) {
+                       hour = '-' + hour;
+               }
                min = String(minDiff%60);
-               if (min.length<2) min = '0'+min;
-               wpHourDiff.value = hour+':'+min;
+               if ( min.length < 2 ) {
+                       min = '0' + min;
+               }
+               textbox.value = hour + ':' + min;
        }
 }
 
-hookEvent("load", unhidetzbutton);
-hookEvent("load", tabbedprefs);
+addOnloadHook( timezoneSetup );
+addOnloadHook( tabbedprefs );