MediaWiki:Common.js: Difference between revisions

From XentaxWiki
Jump to navigation Jump to search
imported>Dinoguy1000
mNo edit summary
imported>Dinoguy1000
(copy/update from wikipedia:MediaWiki:Common.js)
Line 1: Line 1:
/* {{MediaWiki:Clearyourcache}} */
// <syntaxhighlight lang="javascript">


/** Tooltips and access keys **************************************************
/* Begin import stuff - this is copied verbatim from Wikipedia until I look through all the stuff and see
  *
  what we want; in the meantime browser error consoles probably won't be very pretty */
  *  To be replaced with MediaWiki:Accesskey-* when mw software gets updated
  */
   
   
  ta = new Object();
/* Import more specific scripts if necessary */
ta['pt-userpage']          = new Array('.','My user page');
   
ta['pt-anonuserpage']      = new Array('.','The user page for the ip you\'re editing as');
if (wgAction == "edit" || wgAction == "submit" || wgPageName == "Special:Upload") //scripts specific to editing pages
ta['pt-mytalk']            = new Array('n','My talk page');
{
ta['pt-anontalk']          = new Array('n','Discussion about edits from this ip address');
    importScript("MediaWiki:Common.js/edit.js")
ta['pt-preferences']        = new Array('','My preferences');
}
ta['pt-watchlist']          = new Array('l','The list of pages you\'re monitoring for changes.');
else if (wgPageName == "Special:Watchlist") //watchlist scripts
ta['pt-mycontris']          = new Array('y','List of my contributions');
{
ta['pt-login']              = new Array('o','You are encouraged to log in, it is not mandatory however.');
    importScript("MediaWiki:Common.js/watchlist.js")
ta['pt-anonlogin']          = new Array('o','You are encouraged to log in, it is not mandatory however.');
}
ta['pt-logout']            = new Array('o','Log out');
if( wgNamespaceNumber == 6 ) {
ta['ca-talk']              = new Array('t','Discussion about the content page');
    importScript('MediaWiki:Common.js/file.js');
ta['ca-edit']              = new Array('e','You can edit this page. Please use the preview button before saving.');
}
ta['ca-addsection']        = new Array('+','Add a comment to this discussion.');
   
ta['ca-viewsource']        = new Array('e','This page is protected. You can view its source.');
/** For sysops and accountcreators *****************************************
ta['ca-history']            = new Array('h','Past versions of this page.');
  *
  ta['ca-protect']            = new Array('=','Protect this page');
  * Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]],
ta['ca-delete']            = new Array('d','Delete this page');
  *              and accountcreator-specific CSS at [[MediaWiki:Accountcreator.css]].
  ta['ca-undelete']          = new Array('d','Restore the edits done to this page before it was deleted');
  */
  ta['ca-move']              = new Array('m','Move this page');
if ( wgUserGroups ) {
  ta['ca-watch']              = new Array('w','Add this page to your watchlist');
  for ( var g = 0; g < wgUserGroups.length; ++g ) {
ta['ca-unwatch']            = new Array('w','Remove this page from your watchlist');
    if ( wgUserGroups[g] == "sysop" ) {
ta['search']               = new Array('f','Search this wiki');
      importStylesheet("MediaWiki:Sysop.css");
ta['p-logo']               = new Array('','Main Page');
       addOnloadHook( function() {
  ta['n-mainpage']            = new Array('z','Visit the Main Page');
        if ( !window.disableSysopJS ) {
ta['n-portal']              = new Array('','About the project, what you can do, where to find things');
          importScript("MediaWiki:Sysop.js");
ta['n-currentevents']       = new Array('','Find background information on current events');
         }
ta['n-recentchanges']       = new Array('r','The list of recent changes in the wiki.');
      } );
  ta['n-randompage']          = new Array('x','Load a random page');
    }
ta['n-help']                = new Array('','The place to find out.');
    else if ( wgUserGroups[g] == "accountcreator" ) {
ta['n-sitesupport']        = new Array('','Support us');
      importStylesheet("MediaWiki:Accountcreator.css");
ta['t-whatlinkshere']      = new Array('j','List of all wiki pages that link here');
     }
ta['t-recentchangeslinked'] = new Array('k','Recent changes in pages linked from this page');
  }
ta['feed-rss']              = new Array('','RSS feed for this page');
}
ta['feed-atom']            = new Array('','Atom feed for this page');
ta['t-contributions']       = new Array('','View the list of contributions of this user');
ta['t-emailuser']          = new Array('','Send a mail to this user');
ta['t-upload']              = new Array('u','Upload images or media files');
ta['t-specialpages']        = new Array('q','List of all special pages');
ta['ca-nstab-main']         = new Array('c','View the content page');
ta['ca-nstab-user']        = new Array('c','View the user page');
ta['ca-nstab-media']        = new Array('c','View the media page');
ta['ca-nstab-special']      = new Array('','This is a special page, you can\'t edit the page itself.');
ta['ca-nstab-wp']           = new Array('a','View the project page');
ta['ca-nstab-image']        = new Array('c','View the image page');
ta['ca-nstab-mediawiki']    = new Array('c','View the system message');
ta['ca-nstab-template']     = new Array('c','View the template');
ta['ca-nstab-help']        = new Array('c','View the help page');
ta['ca-nstab-category']    = new Array('c','View the category page');


/** Test if an element has a certain class ************************************
/* End import stuff *//* Scripts specific to Internet Explorer */
  *
  *  Description: Uses regular expressions and caching for better performance.
  *  Copied from [[wikipedia:MediaWiki:Common.js|MediaWiki:Common.js]]
  * Maintainers: [[wikipedia:User:Mike Dillon|User:Mike Dillon]], [[wikipedia:User:R. Koot|User:R. Koot]], [[wikipedia:User:SG|User:SG]]
  */
   
   
  var hasClass = (function () {
if (navigator.appName == "Microsoft Internet Explorer")
    var reCache = {};
{
    return function (element, className) {
    /** Internet Explorer bug fix **************************************************
        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
    *
    };
    *  Description: Fixes IE horizontal scrollbar bug
})();
    * Maintainers: [[User:Tom-]]?
 
    */
  /** Collapsible tables ********************************************************
  *
    var oldWidth;
  *  Description: Allows tables to be collapsed, showing only the header. See
    var docEl = document.documentElement;
  *              [[wikipedia:Wikipedia:NavFrame|Wikipedia:NavFrame]].
  Copied from [[wikipedia:MediaWiki:Common.js|MediaWiki:Common.js]]
    function fixIEScroll()
  Maintainers: [[wikipedia:User:R. Koot|User:R. Koot]]
    {
  *
        if (!oldWidth || docEl.clientWidth > oldWidth)
  */
            doFixIEScroll();
        else
            setTimeout(doFixIEScroll, 1);
        oldWidth = docEl.clientWidth;
    }
    function doFixIEScroll() {
        docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
    }
    document.attachEvent("onreadystatechange", fixIEScroll);
    document.attachEvent("onresize", fixIEScroll);
    // In print IE (7?) does not like line-height
    appendCSS( '@media print { sup, sub, p, .documentDescription { line-height: normal; }}');
    // IE overflow bug
    appendCSS('div.overflowbugx { overflow-x: scroll !important; overflow-y: hidden !important; } div.overflowbugy { overflow-y: scroll !important; overflow-x: hidden !important; }');
    // IE zoomfix
    //Use to fix right floating div/table inside tables.
    appendCSS('.iezoomfix div, .iezoomfix table { zoom: 1;}' );
    //Import scripts specific to Internet Explorer 6
    if (navigator.appVersion.substr(22, 1) == "6") {
        importScript("MediaWiki:Common.js/IE60Fixes.js")
    }
}
/* Load fixes for Windows font rendering */
if( navigator.platform.indexOf( "Win" ) != -1 ) {
  importStylesheet( 'MediaWiki:Common.css/WinFixes.css' );
}
/* Test if an element has a certain class **************************************
*
* Description: Uses regular expressions and caching for better performance.
* Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
*/
var hasClass = (function () {
    var reCache = {};
    return function (element, className) {
        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
    };
})();
   
/** Collapsible tables *********************************************************
*
*  Description: Allows tables to be collapsed, showing only the header. See
*              [[Wikipedia:NavFrame]].
Maintainers: [[User:R. Koot]]
*/
var autoCollapse = 2;
var collapseCaption = "hide";
var expandCaption = "show";
function collapseTable( tableIndex )
{
    var Button = document.getElementById( "collapseButton" + tableIndex );
    var Table = document.getElementById( "collapsibleTable" + tableIndex );
    if ( !Table || !Button ) {
        return false;
    }
    var Rows = Table.rows;
    if ( Button.firstChild.data == collapseCaption ) {
        for ( var i = 1; i < Rows.length; i++ ) {
            Rows[i].style.display = "none";
        }
        Button.firstChild.data = expandCaption;
    } else {
        for ( var i = 1; i < Rows.length; i++ ) {
            Rows[i].style.display = Rows[0].style.display;
        }
        Button.firstChild.data = collapseCaption;
    }
}
function createCollapseButtons()
{
    var tableIndex = 0;
    var NavigationBoxes = new Object();
    var Tables = document.getElementsByTagName( "table" );
    for ( var i = 0; i < Tables.length; i++ ) {
        if ( hasClass( Tables[i], "collapsible" ) ) {
            /* only add button and increment count if there is a header row to work with */
            var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0];
            if (!HeaderRow) continue;
            var Header = HeaderRow.getElementsByTagName( "th" )[0];
            if (!Header) continue;
   
            NavigationBoxes[ tableIndex ] = Tables[i];
            Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
            var Button    = document.createElement( "span" );
            var ButtonLink = document.createElement( "a" );
            var ButtonText = document.createTextNode( collapseCaption );
            Button.className = "collapseButton";  //Styles are declared in Common.css
            ButtonLink.style.color = Header.style.color;
            ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
            ButtonLink.setAttribute( "href", "#" );
            addHandler( ButtonLink,  "click", new Function( "evt", "collapseTable(" + tableIndex + " ); return killEvt( evt );") );
            ButtonLink.appendChild( ButtonText );
            Button.appendChild( document.createTextNode( "[" ) );
            Button.appendChild( ButtonLink );
            Button.appendChild( document.createTextNode( "]" ) );
            Header.insertBefore( Button, Header.childNodes[0] );
            tableIndex++;
        }
    }
    for ( var i = 0;  i < tableIndex; i++ ) {
        if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
            collapseTable( i );
        }
        else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) {
            var element = NavigationBoxes[i];
            while (element = element.parentNode) {
                if ( hasClass( element, "outercollapse" ) ) {
                    collapseTable ( i );
                    break;
                }
            }
        }
    }
}
addOnloadHook( createCollapseButtons );
   
   
var autoCollapse = 2;
var collapseCaption = "hide";
var expandCaption = "show";
   
   
function collapseTable( tableIndex )
/** Dynamic Navigation Bars (experimental) *************************************
  {
  *
    var Button = document.getElementById( "collapseButton" + tableIndex );
*  Description: See [[Wikipedia:NavFrame]].
    var Table = document.getElementById( "collapsibleTable" + tableIndex );
*  Maintainers: UNMAINTAINED
*/
   
   
    if ( !Table || !Button ) {
// set up the words in your language
        return false;
var NavigationBarHide = '[' + collapseCaption + ']';
    }
var NavigationBarShow = '[' + expandCaption + ']';
   
   
    var Rows = Table.getElementsByTagName( "tr" );  
// shows and hides content and picture (if available) of navigation bars
// Parameters:
//    indexNavigationBar: the index of navigation bar to be toggled
function toggleNavigationBar(indexNavigationBar)
{
    var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
    var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
   
   
    if ( Button.firstChild.data == collapseCaption ) {
    if (!NavFrame || !NavToggle) {
        for ( var i = 1; i < Rows.length; i++ ) {
        return false;
            Rows[i].style.display = "none";
    }
        }
        Button.firstChild.data = expandCaption;
    } else {
        for ( var i = 1; i < Rows.length; i++ ) {
            Rows[i].style.display = Rows[0].style.display;
        }
        Button.firstChild.data = collapseCaption;
    }
}
   
   
function createCollapseButtons()
    // if shown now
{
    if (NavToggle.firstChild.data == NavigationBarHide) {
    var tableIndex = 0;
        for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
    var NavigationBoxes = new Object();
            if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
    var Tables = document.getElementsByTagName( "table" );
                NavChild.style.display = 'none';
            }
        }
    NavToggle.firstChild.data = NavigationBarShow;
   
   
    for ( var i = 0; i < Tables.length; i++ ) {
    // if hidden now
        if ( hasClass( Tables[i], "collapsible" ) ) {
    } else if (NavToggle.firstChild.data == NavigationBarShow) {
            NavigationBoxes[ tableIndex ] = Tables[i];
        for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
            Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
            if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
                NavChild.style.display = 'block';
            }
        }
        NavToggle.firstChild.data = NavigationBarHide;
    }
}
   
   
            var Button     = document.createElement( "span" );
// adds show/hide-button to navigation bars
            var ButtonLink = document.createElement( "a" );
function createNavigationBarToggleButton()
            var ButtonText = document.createTextNode( collapseCaption );
{
    var indexNavigationBar = 0;
     // iterate over all < div >-elements
    var divs = document.getElementsByTagName("div");
    for (var i = 0; NavFrame = divs[i]; i++) {
        // if found a navigation bar
        if (hasClass(NavFrame, "NavFrame")) {
   
   
            Button.style.styleFloat = "right";
            indexNavigationBar++;
            Button.style.cssFloat = "right";
            var NavToggle = document.createElement("a");
            Button.style.fontWeight = "normal";
            NavToggle.className = 'NavToggle';
            Button.style.textAlign = "right";
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
            Button.style.width = "6em";
            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
   
   
             ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
            var isCollapsed = hasClass( NavFrame, "collapsed" );
            ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
            /*
            ButtonLink.appendChild( ButtonText );
             * Check if any children are already hidden. This loop is here for backwards compatibility:
            * the old way of making NavFrames start out collapsed was to manually add style="display:none"
            * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make
            * the content visible without JavaScript support), the new recommended way is to add the class
            * "collapsed" to the NavFrame itself, just like with collapsible tables.
            */
            for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
                if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
                    if ( NavChild.style.display == 'none' ) {
                        isCollapsed = true;
                    }
                }
            }
            if (isCollapsed) {
                for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
                    if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
                        NavChild.style.display = 'none';
                    }
                }
            }
            var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide);
            NavToggle.appendChild(NavToggleText);
   
   
            Button.appendChild( document.createTextNode( "[" ) );
            // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
            Button.appendChild( ButtonLink );
            for(var j=0; j < NavFrame.childNodes.length; j++) {
            Button.appendChild( document.createTextNode( "]" ) );
                if (hasClass(NavFrame.childNodes[j], "NavHead")) {
                    NavToggle.style.color = NavFrame.childNodes[j].style.color;
                    NavFrame.childNodes[j].appendChild(NavToggle);
                }
            }
            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
        }
    }
}
   
   
            var Header = Tables[i].getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
addOnloadHook( createNavigationBarToggleButton );
            /* only add button and increment count if there is a header row to work with */
}
            if (Header) {
                Header.insertBefore( Button, Header.childNodes[0] );
                tableIndex++;
            }
        }
    }
   
   
    for ( var i = 0;  i < tableIndex; i++ ) {
// Define ta for now. Bugzilla 23175
        if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
window.ta = [];
            collapseTable( i );
        }
    }
}
   
   
addOnloadHook( createCollapseButtons );
// </syntaxhighlight>

Revision as of 00:30, 7 December 2010

// <syntaxhighlight lang="javascript">

/* Begin import stuff - this is copied verbatim from Wikipedia until I look through all the stuff and see
   what we want; in the meantime browser error consoles probably won't be very pretty */
 
/* Import more specific scripts if necessary */
 
if (wgAction == "edit" || wgAction == "submit" || wgPageName == "Special:Upload") //scripts specific to editing pages
{
    importScript("MediaWiki:Common.js/edit.js")
}
else if (wgPageName == "Special:Watchlist") //watchlist scripts
{
    importScript("MediaWiki:Common.js/watchlist.js")
}
if( wgNamespaceNumber == 6 ) {
    importScript('MediaWiki:Common.js/file.js');
}
 
/** For sysops and accountcreators *****************************************
 *
 *  Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]],
 *               and accountcreator-specific CSS at [[MediaWiki:Accountcreator.css]].
 */
if ( wgUserGroups ) {
  for ( var g = 0; g < wgUserGroups.length; ++g ) {
    if ( wgUserGroups[g] == "sysop" ) {
      importStylesheet("MediaWiki:Sysop.css");
      addOnloadHook( function() {
        if ( !window.disableSysopJS ) {
          importScript("MediaWiki:Sysop.js");
        }
      } );
    } 
    else if ( wgUserGroups[g] == "accountcreator" ) {
      importStylesheet("MediaWiki:Accountcreator.css");
    }
  }
}

/* End import stuff *//* Scripts specific to Internet Explorer */
 
if (navigator.appName == "Microsoft Internet Explorer")
{
    /** Internet Explorer bug fix **************************************************
     *
     *  Description: Fixes IE horizontal scrollbar bug
     *  Maintainers: [[User:Tom-]]?
     */
 
    var oldWidth;
    var docEl = document.documentElement;
 
    function fixIEScroll()
    {
        if (!oldWidth || docEl.clientWidth > oldWidth)
            doFixIEScroll();
        else
            setTimeout(doFixIEScroll, 1);
 
        oldWidth = docEl.clientWidth;
    }
 
    function doFixIEScroll() {
        docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
    }
 
    document.attachEvent("onreadystatechange", fixIEScroll);
    document.attachEvent("onresize", fixIEScroll);
 
    // In print IE (7?) does not like line-height
    appendCSS( '@media print { sup, sub, p, .documentDescription { line-height: normal; }}');
 
    // IE overflow bug
    appendCSS('div.overflowbugx { overflow-x: scroll !important; overflow-y: hidden !important; } div.overflowbugy { overflow-y: scroll !important; overflow-x: hidden !important; }');
 
    // IE zoomfix
    //Use to fix right floating div/table inside tables.
    appendCSS('.iezoomfix div, .iezoomfix table { zoom: 1;}' );
 
    //Import scripts specific to Internet Explorer 6
    if (navigator.appVersion.substr(22, 1) == "6") {
        importScript("MediaWiki:Common.js/IE60Fixes.js")
    }
}
 
/* Load fixes for Windows font rendering */
if( navigator.platform.indexOf( "Win" ) != -1 ) {
  importStylesheet( 'MediaWiki:Common.css/WinFixes.css' );
}
 
/* Test if an element has a certain class **************************************
 *
 * Description: Uses regular expressions and caching for better performance.
 * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
 */
 
var hasClass = (function () {
    var reCache = {};
    return function (element, className) {
        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
    };
})();
 
 
/** Collapsible tables *********************************************************
 *
 *  Description: Allows tables to be collapsed, showing only the header. See
 *               [[Wikipedia:NavFrame]].
 *  Maintainers: [[User:R. Koot]]
 */
 
var autoCollapse = 2;
var collapseCaption = "hide";
var expandCaption = "show";
 
function collapseTable( tableIndex )
{
    var Button = document.getElementById( "collapseButton" + tableIndex );
    var Table = document.getElementById( "collapsibleTable" + tableIndex );
 
    if ( !Table || !Button ) {
        return false;
    }
 
    var Rows = Table.rows;
 
    if ( Button.firstChild.data == collapseCaption ) {
        for ( var i = 1; i < Rows.length; i++ ) {
            Rows[i].style.display = "none";
        }
        Button.firstChild.data = expandCaption;
    } else {
        for ( var i = 1; i < Rows.length; i++ ) {
            Rows[i].style.display = Rows[0].style.display;
        }
        Button.firstChild.data = collapseCaption;
    }
}
 
function createCollapseButtons()
{
    var tableIndex = 0;
    var NavigationBoxes = new Object();
    var Tables = document.getElementsByTagName( "table" );
 
    for ( var i = 0; i < Tables.length; i++ ) {
        if ( hasClass( Tables[i], "collapsible" ) ) {
 
            /* only add button and increment count if there is a header row to work with */
            var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0];
            if (!HeaderRow) continue;
            var Header = HeaderRow.getElementsByTagName( "th" )[0];
            if (!Header) continue;
 
            NavigationBoxes[ tableIndex ] = Tables[i];
            Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
 
            var Button     = document.createElement( "span" );
            var ButtonLink = document.createElement( "a" );
            var ButtonText = document.createTextNode( collapseCaption );
 
            Button.className = "collapseButton";  //Styles are declared in Common.css
 
            ButtonLink.style.color = Header.style.color;
            ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
            ButtonLink.setAttribute( "href", "#" );
            addHandler( ButtonLink,  "click", new Function( "evt", "collapseTable(" + tableIndex + " ); return killEvt( evt );") );
            ButtonLink.appendChild( ButtonText );
 
            Button.appendChild( document.createTextNode( "[" ) );
            Button.appendChild( ButtonLink );
            Button.appendChild( document.createTextNode( "]" ) );
 
            Header.insertBefore( Button, Header.childNodes[0] );
            tableIndex++;
        }
    }
 
    for ( var i = 0;  i < tableIndex; i++ ) {
        if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
            collapseTable( i );
        } 
        else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) {
            var element = NavigationBoxes[i];
            while (element = element.parentNode) {
                if ( hasClass( element, "outercollapse" ) ) {
                    collapseTable ( i );
                    break;
                }
            }
        }
    }
}
 
addOnloadHook( createCollapseButtons );
 
 
/** Dynamic Navigation Bars (experimental) *************************************
 *
 *  Description: See [[Wikipedia:NavFrame]].
 *  Maintainers: UNMAINTAINED
 */
 
// set up the words in your language
var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';
 
// shows and hides content and picture (if available) of navigation bars
// Parameters:
//     indexNavigationBar: the index of navigation bar to be toggled
function toggleNavigationBar(indexNavigationBar)
{
    var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
    var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
 
    if (!NavFrame || !NavToggle) {
        return false;
    }
 
    // if shown now
    if (NavToggle.firstChild.data == NavigationBarHide) {
        for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
            if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
                NavChild.style.display = 'none';
            }
        }
    NavToggle.firstChild.data = NavigationBarShow;
 
    // if hidden now
    } else if (NavToggle.firstChild.data == NavigationBarShow) {
        for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
            if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
                NavChild.style.display = 'block';
            }
        }
        NavToggle.firstChild.data = NavigationBarHide;
    }
}
 
// adds show/hide-button to navigation bars
function createNavigationBarToggleButton()
{
    var indexNavigationBar = 0;
    // iterate over all < div >-elements 
    var divs = document.getElementsByTagName("div");
    for (var i = 0; NavFrame = divs[i]; i++) {
        // if found a navigation bar
        if (hasClass(NavFrame, "NavFrame")) {
 
            indexNavigationBar++;
            var NavToggle = document.createElement("a");
            NavToggle.className = 'NavToggle';
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
 
            var isCollapsed = hasClass( NavFrame, "collapsed" );
            /*
             * Check if any children are already hidden.  This loop is here for backwards compatibility:
             * the old way of making NavFrames start out collapsed was to manually add style="display:none"
             * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make
             * the content visible without JavaScript support), the new recommended way is to add the class
             * "collapsed" to the NavFrame itself, just like with collapsible tables.
             */
            for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
                if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
                    if ( NavChild.style.display == 'none' ) {
                        isCollapsed = true;
                    }
                }
            }
            if (isCollapsed) {
                for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
                    if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
                        NavChild.style.display = 'none';
                    }
                }
            }
            var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide);
            NavToggle.appendChild(NavToggleText);
 
            // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
            for(var j=0; j < NavFrame.childNodes.length; j++) {
                if (hasClass(NavFrame.childNodes[j], "NavHead")) {
                    NavToggle.style.color = NavFrame.childNodes[j].style.color;
                    NavFrame.childNodes[j].appendChild(NavToggle);
                }
            }
            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
        }
    }
}
 
addOnloadHook( createNavigationBarToggleButton );
}
 
// Define ta for now. Bugzilla 23175
window.ta = [];
 
// </syntaxhighlight>