(bug 7925) Change Special:Allmessages message name filter javascript to be
authorIlmari Karonen <vyznev@users.mediawiki.org>
Sat, 16 Dec 2006 19:58:25 +0000 (19:58 +0000)
committerIlmari Karonen <vyznev@users.mediawiki.org>
Sat, 16 Dec 2006 19:58:25 +0000 (19:58 +0000)
a bit more responsive and easier on the CPU.  The main improvement is actually
a delay; the new code won't start filtering until you stop typing for half a
second.  Tested on Firefox, Opera and Konqueror; needs testing on IE at least.

RELEASE-NOTES
includes/DefaultSettings.php
skins/common/wikibits.js

index 2926358..1e22e99 100644 (file)
@@ -326,6 +326,8 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
   to the localised one, parameters/subpages are omitted
 * (bug 8164) Special:Booksources should use GET for form submission
 * Rewrite Special:Booksources to clean up interface and remove redundant code
+* (bug 7925) Change Special:Allmessages message name filter javascript to be
+  a bit more responsive and easier on the CPU.
 
 == Languages updated ==
 
index a260d33..80c175b 100644 (file)
@@ -1038,7 +1038,7 @@ $wgCacheEpoch = '20030516000000';
  * to ensure that client-side caches don't keep obsolete copies of global
  * styles.
  */
-$wgStyleVersion = '33';
+$wgStyleVersion = '34';
 
 
 # Server-side caching:
index ef4ebc6..9f9a9f0 100644 (file)
@@ -724,86 +724,90 @@ function scrollEditBox() {
 
 hookEvent("load", scrollEditBox);
 
+var allmessages_nodelist = false;
+var allmessages_modified = false;
+var allmessages_timeout = false;
+var allmessages_running = false;
+
+function allmessagesmodified() {
+       allmessages_modified = !allmessages_modified;
+       allmessagesfilter();
+}
+
 function allmessagesfilter() {
+       if ( allmessages_timeout )
+               window.clearTimeout( allmessages_timeout );
+
+       if ( !allmessages_running )
+               allmessages_timeout = window.setTimeout( 'allmessagesfilter_do();', 500 );
+}
+
+function allmessagesfilter_do() {
+       if ( !allmessages_nodelist )
+               return;
+
        var text = document.getElementById('allmessagesinput').value;
-       var k = document.getElementById('allmessagestable');
-       if (!k) { return; }
+       var nodef = allmessages_modified;
 
-       var items = k.getElementsByTagName('span');
+       allmessages_running = true;
 
-       var i, j;
-       if ( text.length > allmessages_prev.length ) {
-               for (i = items.length-1, j = 0; i >= 0; i--) {
-                       j = allmessagesforeach(items, i, j, text);
-               }
-       } else {
-               for (i = 0, j = 0; i < items.length; i++) {
-                       j = allmessagesforeach(items, i, j, text);
-               }
+       for ( var name in allmessages_nodelist ) {
+               var nodes = allmessages_nodelist[name];
+               var display = ( name.indexOf( text ) == -1 ? 'none' : '' );
+
+               for ( var i = 0; i < nodes.length; i++)
+                       nodes[i].style.display =
+                               ( nodes[i].className == "def" && nodef
+                                 ? 'none' : display );
        }
-       allmessages_prev = text;
+
+       if ( text != document.getElementById('allmessagesinput').value ||
+            nodef != allmessages_modified )
+               allmessagesfilter_do();  // repeat
+
+       allmessages_running = false;
 }
 
-function allmessagesforeach(items, i, j, text) {
-       var hItem = items[i].getAttribute('id');
-       if (hItem.substring(0,17) == 'sp-allmessages-i-') {
-               var itemA, itemB, s, k;
-               if (items[i].firstChild && items[i].firstChild.nodeName == '#text' && items[i].firstChild.nodeValue.indexOf(text) != -1) {
-                       itemA = document.getElementById( hItem.replace('i', 'r1') );
-                       itemB = document.getElementById( hItem.replace('i', 'r2') );
-                       if ( itemA.style.display !== '' ) {
-                               s = "allmessageshider(\"" + hItem.replace('i', 'r1') + "\", \"" + hItem.replace('i', 'r2') + "\", '')";
-                               k = window.setTimeout(s,j++*5);
-                       }
-               } else {
-                       itemA = document.getElementById( hItem.replace('i', 'r1') );
-                       itemB = document.getElementById( hItem.replace('i', 'r2') );
-                       if ( itemA.style.display != 'none' ) {
-                               s = "allmessageshider(\"" + hItem.replace('i', 'r1') + "\", \"" + hItem.replace('i', 'r2') + "\", 'none')";
-                               k = window.setTimeout(s,j++*5);
-                       }
-               }
+function allmessagesfilter_init() {
+       if ( allmessages_nodelist )
+               return;
+
+       var nodelist = new Array();
+       var templist = new Array();
+
+       var table = document.getElementById('allmessagestable');
+       if ( !table ) return;
+
+       var rows = document.getElementsByTagName('tr');
+       for ( var i = 0; i < rows.length; i++ ) {
+               var id = rows[i].getAttribute('id')
+               if ( id && id.substring(0,16) != 'sp-allmessages-r' ) continue;
+               templist[ id ] = rows[i];
        }
-       return j;
-}
 
+       var spans = table.getElementsByTagName('span');
+       for ( var i = 0; i < spans.length; i++ ) {
+               var id = spans[i].getAttribute('id')
+               if ( id && id.substring(0,17) != 'sp-allmessages-i-' ) continue;
+               if ( !spans[i].firstChild || spans[i].firstChild.nodeType != 3 ) continue;
 
-function allmessageshider(idA, idB, cstyle) {
-       var itemA = document.getElementById( idA );
-       var itemB = document.getElementById( idB );
-       if (itemA) { itemA.style.display = cstyle; }
-       if (itemB) { itemB.style.display = cstyle; }
-}
+               var nodes = new Array();
+               var row1 = templist[ id.replace('i', 'r1') ];
+               var row2 = templist[ id.replace('i', 'r2') ];
 
-function allmessagesmodified() {
-       allmessages_modified = !allmessages_modified;
-       var k = document.getElementById('allmessagestable');
-       if (!k) { return; }
-       var items = k.getElementsByTagName('tr');
-       for (var i = 0, j = 0; i< items.length; i++) {
-               var s;
-               if (!allmessages_modified ) {
-                       if ( items[i].style.display !== '' ) {
-                               s = "allmessageshider(\"" + items[i].getAttribute('id') + "\", null, '')";
-                               k = window.setTimeout(s,j++*5);
-                       }
-               } else if (items[i].getAttribute('class') == 'def' && allmessages_modified) {
-                       if ( items[i].style.display != 'none' ) {
-                               s = "allmessageshider(\"" + items[i].getAttribute('id') + "\", null, 'none')";
-                               k = window.setTimeout(s,j++*5);
-                       }
-               }
+               if ( row1 ) nodes[nodes.length] = row1;
+               if ( row2 ) nodes[nodes.length] = row2;
+               nodelist[ spans[i].firstChild.nodeValue ] = nodes;
        }
-}
 
-function allmessagesshow() {
        var k = document.getElementById('allmessagesfilter');
        if (k) { k.style.display = ''; }
 
-       allmessages_prev = '';
-       allmessages_modified = false;
+       allmessages_nodelist = nodelist;
 }
 
+hookEvent( "load", allmessagesfilter_init );
+
 /*
        Written by Jonathan Snook, http://www.snook.ca/jonathan
        Add-ons by Robert Nyman, http://www.robertnyman.com
@@ -885,5 +889,4 @@ function runOnloadHook() {
 //      so the below should be redundant. It's there just in case.
 hookEvent("load", runOnloadHook);
 
-hookEvent("load", allmessagesshow);
 hookEvent("load", mwSetupToolbar);