MediaWiki:Common.js - GrandTerrier

MediaWiki:Common.js

Un article de GrandTerrier.

(Différences entre les versions)
Jump to: navigation, search
Version du 22 août ~ eost 2012 à 06:34 (modifier)
GdTerrier (Discuter | contributions)

← Différence précédente
Version actuelle (10 octobre ~ here 2017 à 11:35) (modifier) (undo)
GdTerrier (Discuter | contributions)

 
(21 intermediate revisions not shown.)
Ligne 1: Ligne 1:
-/**+/* Any JavaScript here will be loaded for all users on every page load. */
- * jQuery makeCollapsible+
- *+
- * This will enable collapsible-functionality on all passed elements.+
- * Will prevent binding twice to the same element.+
- * Initial state is expanded by default, this can be overriden by adding class+
- * "mw-collapsed" to the "mw-collapsible" element.+
- * Elements made collapsible have class "mw-made-collapsible".+
- * Except for tables and lists, the inner content is wrapped in "mw-collapsible-content".+
- *+
- * @author Krinkle <krinklemail@gmail.com>+
- *+
- * Dual license:+
- * @license CC-BY 3.0 <http://creativecommons.org/licenses/by/3.0>+
- * @license GPL2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>+
- */+
-( function ( $, mw ) {+
-$.fn.makeCollapsible = function () {+window.addEventListener('DOMContentLoaded', function() { try {
 + if (document.getElementById('toc').getElementsByTagName('ul')[0].style.display != 'none') { toggleToc(); }
 +} catch (exception) {} }, false);
- return this.each(function () { 
- var lpx = 'jquery.makeCollapsible> '; 
- 
- // Define reused variables and functions 
- var $toggle, 
- $that = $(this).addClass( 'mw-collapsible' ), // case: $( '#myAJAXelement' ).makeCollapsible() 
- that = this, 
- collapsetext = $(this).attr( 'data-collapsetext' ), 
- expandtext = $(this).attr( 'data-expandtext' ), 
- toggleElement = function ( $collapsible, action, $defaultToggle, instantHide ) { 
- var $collapsibleContent, $containers; 
- 
- // Validate parameters 
- if ( !$collapsible.jquery ) { // $collapsible must be an instance of jQuery 
- return; 
- } 
- if ( action !== 'expand' && action !== 'collapse' ) { 
- // action must be string with 'expand' or 'collapse' 
- return; 
- } 
- if ( $defaultToggle === undefined ) { 
- $defaultToggle = null; 
- } 
- if ( $defaultToggle !== null && !($defaultToggle instanceof $) ) { 
- // is optional (may be undefined), but if defined it must be an instance of jQuery. 
- // If it's not, abort right away. 
- // After this $defaultToggle is either null or a valid jQuery instance. 
- return; 
- } 
- 
- if ( action === 'collapse' ) { 
- 
- // Collapse the element 
- if ( $collapsible.is( 'table' ) ) { 
- // Hide all table rows of this table 
- // Slide doens't work with tables, but fade does as of jQuery 1.1.3 
- // http://stackoverflow.com/questions/467336#920480 
- $containers = $collapsible.find( '>tbody>tr' ); 
- if ( $defaultToggle ) { 
- // Exclude tablerow containing togglelink 
- $containers.not( $defaultToggle.closest( 'tr' ) ).stop(true, true).fadeOut(); 
- } else { 
- if ( instantHide ) { 
- $containers.hide(); 
- } else { 
- $containers.stop( true, true ).fadeOut(); 
- } 
- } 
- 
- } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) { 
- $containers = $collapsible.find( '> li' ); 
- if ( $defaultToggle ) { 
- // Exclude list-item containing togglelink 
- $containers.not( $defaultToggle.parent() ).stop( true, true ).slideUp(); 
- } else { 
- if ( instantHide ) { 
- $containers.hide(); 
- } else { 
- $containers.stop( true, true ).slideUp(); 
- } 
- } 
- 
- } else { // <div>, <p> etc. 
- $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' ); 
- 
- // If a collapsible-content is defined, collapse it 
- if ( $collapsibleContent.length ) { 
- if ( instantHide ) { 
- $collapsibleContent.hide(); 
- } else { 
- $collapsibleContent.slideUp(); 
- } 
- 
- // Otherwise assume this is a customcollapse with a remote toggle 
- // .. and there is no collapsible-content because the entire element should be toggled 
- } else { 
- if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) { 
- $collapsible.fadeOut(); 
- } else { 
- $collapsible.slideUp(); 
- } 
- } 
- } 
- 
- } else { 
- 
- // Expand the element 
- if ( $collapsible.is( 'table' ) ) { 
- $containers = $collapsible.find( '>tbody>tr' ); 
- if ( $defaultToggle ) { 
- // Exclude tablerow containing togglelink 
- $containers.not( $defaultToggle.parent().parent() ).stop(true, true).fadeIn(); 
- } else { 
- $containers.stop(true, true).fadeIn(); 
- } 
- 
- } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) { 
- $containers = $collapsible.find( '> li' ); 
- if ( $defaultToggle ) { 
- // Exclude list-item containing togglelink 
- $containers.not( $defaultToggle.parent() ).stop( true, true ).slideDown(); 
- } else { 
- $containers.stop( true, true ).slideDown(); 
- } 
- 
- } else { // <div>, <p> etc. 
- $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' ); 
- 
- // If a collapsible-content is defined, collapse it 
- if ( $collapsibleContent.length ) { 
- $collapsibleContent.slideDown(); 
- 
- // Otherwise assume this is a customcollapse with a remote toggle 
- // .. and there is no collapsible-content because the entire element should be toggled 
- } else { 
- if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) { 
- $collapsible.fadeIn(); 
- } else { 
- $collapsible.slideDown(); 
- } 
- } 
- } 
- } 
- }, 
- // Toggles collapsible and togglelink class and updates text label 
- toggleLinkDefault = function ( that, e ) { 
- var $that = $(that), 
- $collapsible = $that.closest( '.mw-collapsible.mw-made-collapsible' ).toggleClass( 'mw-collapsed' ); 
- e.preventDefault(); 
- e.stopPropagation(); 
- 
- // It's expanded right now 
- if ( !$that.hasClass( 'mw-collapsible-toggle-collapsed' ) ) { 
- // Change link to "Show" 
- $that.removeClass( 'mw-collapsible-toggle-expanded' ).addClass( 'mw-collapsible-toggle-collapsed' ); 
- if ( $that.find( '> a' ).length ) { 
- $that.find( '> a' ).text( expandtext ); 
- } else { 
- $that.text( expandtext ); 
- } 
- // Collapse element 
- toggleElement( $collapsible, 'collapse', $that ); 
- 
- // It's collapsed right now 
- } else { 
- // Change link to "Hide" 
- $that.removeClass( 'mw-collapsible-toggle-collapsed' ).addClass( 'mw-collapsible-toggle-expanded' ); 
- if ( $that.find( '> a' ).length ) { 
- $that.find( '> a' ).text( collapsetext ); 
- } else { 
- $that.text( collapsetext ); 
- } 
- // Expand element 
- toggleElement( $collapsible, 'expand', $that ); 
- } 
- return; 
- }, 
- // Toggles collapsible and togglelink class 
- toggleLinkPremade = function ( $that, e ) { 
- var $collapsible = $that.eq(0).closest( '.mw-collapsible.mw-made-collapsible' ).toggleClass( 'mw-collapsed' ); 
- if ( $(e.target).is( 'a' ) ) { 
- return true; 
- } 
- e.preventDefault(); 
- e.stopPropagation(); 
- 
- // It's expanded right now 
- if ( !$that.hasClass( 'mw-collapsible-toggle-collapsed' ) ) { 
- // Change toggle to collapsed 
- $that.removeClass( 'mw-collapsible-toggle-expanded' ).addClass( 'mw-collapsible-toggle-collapsed' ); 
- // Collapse element 
- toggleElement( $collapsible, 'collapse', $that ); 
- 
- // It's collapsed right now 
- } else { 
- // Change toggle to expanded 
- $that.removeClass( 'mw-collapsible-toggle-collapsed' ).addClass( 'mw-collapsible-toggle-expanded' ); 
- // Expand element 
- toggleElement( $collapsible, 'expand', $that ); 
- } 
- return; 
- }, 
- // Toggles customcollapsible 
- toggleLinkCustom = function ( $that, e, $collapsible ) { 
- // For the initial state call of customtogglers there is no event passed 
- if (e) { 
- e.preventDefault(); 
- e.stopPropagation(); 
- } 
- // Get current state and toggle to the opposite 
- var action = $collapsible.hasClass( 'mw-collapsed' ) ? 'expand' : 'collapse'; 
- $collapsible.toggleClass( 'mw-collapsed' ); 
- toggleElement( $collapsible, action, $that ); 
- 
- }; 
- 
- // Use custom text or default ? 
- if ( !collapsetext ) { 
- collapsetext = mw.msg( 'collapsible-collapse' ); 
- } 
- if ( !expandtext ) { 
- expandtext = mw.msg( 'collapsible-expand' ); 
- } 
- 
- // Create toggle link with a space around the brackets (&nbsp;[text]&nbsp;) 
- var $toggleLink = 
- $( '<a href="#"></a>' ) 
- .text( collapsetext ) 
- .wrap( '<span class="mw-collapsible-toggle"></span>' ) 
- .parent() 
- .prepend( '&nbsp;[' ) 
- .append( ']&nbsp;' ) 
- .bind( 'click.mw-collapse', function (e) { 
- toggleLinkDefault( this, e ); 
- } ); 
- 
- // Return if it has been enabled already. 
- if ( $that.hasClass( 'mw-made-collapsible' ) ) { 
- return; 
- } else { 
- $that.addClass( 'mw-made-collapsible' ); 
- } 
- 
- // Check if this element has a custom position for the toggle link 
- // (ie. outside the container or deeper inside the tree) 
- // Then: Locate the custom toggle link(s) and bind them 
- if ( ( $that.attr( 'id' ) || '' ).indexOf( 'mw-customcollapsible-' ) === 0 ) { 
- 
- var thatId = $that.attr( 'id' ), 
- $customTogglers = $( '.' + thatId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) ); 
- mw.log( lpx + 'Found custom collapsible: #' + thatId ); 
- 
- // Double check that there is actually a customtoggle link 
- if ( $customTogglers.length ) { 
- $customTogglers.bind( 'click.mw-collapse', function ( e ) { 
- toggleLinkCustom( $(this), e, $that ); 
- } ); 
- } else { 
- mw.log( lpx + '#' + thatId + ': Missing toggler!' ); 
- } 
- 
- // Initial state 
- if ( $that.hasClass( 'mw-collapsed' ) ) { 
- $that.removeClass( 'mw-collapsed' ); 
- toggleLinkCustom( $customTogglers, null, $that ); 
- } 
- 
- // If this is not a custom case, do the default: 
- // Wrap the contents add the toggle link 
- } else { 
- 
- // Elements are treated differently 
- if ( $that.is( 'table' ) ) { 
- // The toggle-link will be in one the the cells (td or th) of the first row 
- var $firstRowCells = $that.find( 'tr:first th, tr:first td' ); 
- $toggle = $firstRowCells.find( '> .mw-collapsible-toggle' ); 
- 
- // If theres no toggle link, add it to the last cell 
- if ( !$toggle.length ) { 
- $firstRowCells.eq(-1).prepend( $toggleLink ); 
- } else { 
- $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) { 
- toggleLinkPremade( $toggle, e ); 
- } ); 
- } 
- 
- } else if ( $that.is( 'ul' ) || $that.is( 'ol' ) ) { 
- // The toggle-link will be in the first list-item 
- var $firstItem = $that.find( 'li:first' ); 
- $toggle = $firstItem.find( '> .mw-collapsible-toggle' ); 
- 
- // If theres no toggle link, add it 
- if ( !$toggle.length ) { 
- // Make sure the numeral order doesn't get messed up, force the first (soon to be second) item 
- // to be "1". Except if the value-attribute is already used. 
- // If no value was set WebKit returns "", Mozilla returns '-1', others return null or undefined. 
- var firstval = $firstItem.attr( 'value' ); 
- if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) { 
- $firstItem.attr( 'value', '1' ); 
- } 
- $that.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() ); 
- } else { 
- $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) { 
- toggleLinkPremade( $toggle, e ); 
- } ); 
- } 
- 
- } else { // <div>, <p> etc. 
- 
- // The toggle-link will be the first child of the element 
- $toggle = $that.find( '> .mw-collapsible-toggle' ); 
- 
- // If a direct child .content-wrapper does not exists, create it 
- if ( !$that.find( '> .mw-collapsible-content' ).length ) { 
- $that.wrapInner( '<div class="mw-collapsible-content"></div>' ); 
- } 
- 
- // If theres no toggle link, add it 
- if ( !$toggle.length ) { 
- $that.prepend( $toggleLink ); 
- } else { 
- $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) { 
- toggleLinkPremade( $toggle, e ); 
- } ); 
- } 
- } 
- } 
- 
- // Initial state (only for those that are not custom) 
- if ( $that.hasClass( 'mw-collapsed' ) && ( $that.attr( 'id' ) || '').indexOf( 'mw-customcollapsible-' ) !== 0 ) { 
- $that.removeClass( 'mw-collapsed' ); 
- // The collapsible element could have multiple togglers 
- // To toggle the initial state only click one of them (ie. the first one, eq(0) ) 
- // Else it would go like: hide,show,hide,show for each toggle link. 
- toggleElement( $that, 'collapse', $toggleLink.eq(0), /* instantHide = */ true ); 
- $toggleLink.eq(0).click(); 
- } 
- } ); 
-}; 
- 
-}( jQuery, mediaWiki ) ); 
- 
- 
-/*End of mw-collapsible*/ 
- 
-/* Any JavaScript here will be loaded for all users on every page load. */ 
// for backwards compatibility // for backwards compatibility
var addLoadEvent = addOnloadHook; var addLoadEvent = addOnloadHook;

Version actuelle

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