MediaWiki:Common.js - GrandTerrier

MediaWiki:Common.js

Un article de GrandTerrier.

Jump to: navigation, search

/* Any JavaScript here will be loaded for all users on every page load. */

window.addEventListener('DOMContentLoaded', function() { try {

 if (document.getElementById('toc').getElementsByTagName('ul')[0].style.display != 'none') { toggleToc(); }

} catch (exception) {} }, false);

// for backwards compatibility var addLoadEvent = addOnloadHook;

// Cookie set/get functions from W3C function setCookie(c_name, value, expiredays) {

 var exdate = new Date();
 exdate.setDate(exdate.getDate() + expiredays);
 document.cookie = c_name+ "=" +escape(value) +
 ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());

}

function getCookie(c_name) {

 if (document.cookie.length > 0) {
   c_start = document.cookie.indexOf(c_name + "=");
   if (c_start != -1) { 
     c_start = c_start + c_name.length + 1; 
     c_end = document.cookie.indexOf(";", c_start);
     if (c_end == -1) c_end = document.cookie.length;
     return unescape(document.cookie.substring(c_start, c_end));
   } 
 }
 return "";

}

// hasClass()

// Description: Uses regular expressions and caching for better performance.
// Maintainers: w:User:Mike Dillon, w:User:R. Koot, w: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);
   };
})();

/*

Dynamic Navigation

*/

/** Dynamic Navigation Bars (experimental) *************************************

 *
 *  Description: See http://en.wikipedia.org/wiki/Wikipedia:NavFrame
 */
var strHide = ' [ - ]';
var strShow = ' [ + ]';

function toggleNavigationBar(indexNavigationBar) {
  var NavToggle = document.getElementById('NavToggle' + indexNavigationBar);
  var NavFrame = document.getElementById('NavFrame' + indexNavigationBar);
  
  if (!NavFrame || !NavToggle) return false;
  
  for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
    if (NavChild.className == 'NavContent') {
      NavChild.style.display = (NavChild.style.display=='none') ? 'block' : 'none';
    }
  }
  NavToggle.firstChild.data = (NavToggle.firstChild.data==strShow) ? strHide : strShow;
}

function createNavigationBarToggleButton() {
  var indexNavigationBar = 0;
  for(var i=0; NavFrame = document.getElementsByTagName('div')[i]; i++) {
    if (NavFrame.className == 'NavFrame') {
      indexNavigationBar++;
      
      var NavToggle = document.createElement('a');
      NavToggle.className = 'NavToggle';
      NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
      NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
      var NavToggleText = document.createTextNode(strHide);
      NavToggle.appendChild(NavToggleText);
      
      // Find the NavHead and attach the toggle link
      for(var j=0; j < NavFrame.childNodes.length; j++) {
        if (NavFrame.childNodes[j].className == 'NavHead') {
          NavFrame.childNodes[j].appendChild(NavToggle);
        }
      }
      switch (NavFrame.getAttribute('id')) {
        case 'hide':
          NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
          toggleNavigationBar(indexNavigationBar);
          break;
        default:
          NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
      }
    }
  }
}

addLoadEvent(createNavigationBarToggleButton);

/** Collapsible tables *********************************************************

*
*  Description: Allows tables to be collapsed, showing only the header. See
*               http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
*  Maintainers: **MAINTAINERS**
*/

var autoCollapse = 2; var collapseCaption = '-'; var expandCaption = '+';

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 MediaWiki:Common.css

ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex ); ButtonLink.setAttribute( 'href', "javascript:collapseTable(" + tableIndex + ");" ); 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 ); } } }

addOnloadHook( createCollapseButtons );

/** 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); }; })();