Difference between revisions of "MediaWiki:Common.js"

From SVR Wiki
Jump to: navigation, search
m (Test)
(Navbar/navbox code)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
 
/* Any JavaScript here will be loaded for all users on every page load. */
 
/* Any JavaScript here will be loaded for all users on every page load. */
  
mw.loader.using( ['mediawiki.user', 'mediawiki.util', 'mediawiki.notify', 'jquery.client'] ).done( function () {
+
 
 +
/**
 +
* Keep code in MediaWiki:Common.js to a minimum as it is unconditionally
 +
* loaded for all users on every wiki page. If possible create a gadget that is
 +
* enabled by default instead of adding it here (since gadgets are fully
 +
* optimized ResourceLoader modules with possibility to add dependencies etc.)
 +
*
 +
* Since Common.js isn't a gadget, there is no place to declare its
 +
* dependencies, so we have to lazy load them with mw.loader.using on demand and
 +
* then execute the rest in the callback. In most cases these dependencies will
 +
* be loaded (or loading) already and the callback will not be delayed. In case a
 +
* dependency hasn't arrived yet it'll make sure those are loaded before this.
 +
*/
 +
 
 +
/* global mw, $ */
 +
/* jshint strict:false, browser:true */
 +
 
 +
mw.loader.using( ['mediawiki.util', 'mediawiki.notify', 'jquery.client'] ).done( function () {
 +
 
/* Begin of mw.loader.using callback */
 
/* Begin of mw.loader.using callback */
  
 
/**
 
/**
  * Collapsible tables
+
  * Dynamic Navigation Bars (experimental)
*
 
* Allows tables to be collapsed, showing only the header. See [[Wikipedia:NavFrame]].
 
 
  *
 
  *
  * @version 2.0.3 (2014-03-14)
+
  * Description: See [[Wikipedia:NavFrame]].
* @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
+
  * Maintainers: UNMAINTAINED
* @author [[User:R. Koot]]
 
  * @author [[User:Krinkle]]
 
* @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which
 
* is supported in MediaWiki core.
 
 
  */
 
  */
  
var autoCollapse = 2;
+
/* set up the words in your language */
var collapseCaption = 'hide';
+
var NavigationBarHide = '[' + collapseCaption + ']';
var expandCaption = 'show';
+
var NavigationBarShow = '[' + expandCaption + ']';
var tableIndex = 0;
+
var indexNavigationBar = 0;
  
function collapseTable( tableIndex ) {
+
/**
     var Button = document.getElementById( 'collapseButton' + tableIndex );
+
* Shows and hides content and picture (if available) of navigation bars
     var Table = document.getElementById( 'collapsibleTable' + tableIndex );
+
* Parameters:
 +
*    indexNavigationBar: the index of navigation bar to be toggled
 +
**/
 +
window.toggleNavigationBar = function ( indexNavigationBar, event ) {
 +
     var NavToggle = document.getElementById( 'NavToggle' + indexNavigationBar );
 +
     var NavFrame = document.getElementById( 'NavFrame' + indexNavigationBar );
 +
    var NavChild;
  
     if ( !Table || !Button ) {
+
     if ( !NavFrame || !NavToggle ) {
 
         return false;
 
         return false;
 
     }
 
     }
  
     var Rows = Table.rows;
+
     /* if shown now */
     var i;
+
    if ( NavToggle.firstChild.data === NavigationBarHide ) {
 +
        for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
 +
            if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {
 +
                NavChild.style.display = 'none';
 +
            }
 +
        }
 +
     NavToggle.firstChild.data = NavigationBarShow;
  
     if ( Button.firstChild.data === collapseCaption ) {
+
     /* if hidden now */
         for ( i = 1; i < Rows.length; i++ ) {
+
    } else if ( NavToggle.firstChild.data === NavigationBarShow ) {
             Rows[i].style.display = 'none';
+
         for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
 +
             if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {
 +
                NavChild.style.display = 'block';
 +
            }
 
         }
 
         }
         Button.firstChild.data = expandCaption;
+
         NavToggle.firstChild.data = NavigationBarHide;
    } else {
 
        for ( i = 1; i < Rows.length; i++ ) {
 
            Rows[i].style.display = Rows[0].style.display;
 
        }
 
        Button.firstChild.data = collapseCaption;
 
 
     }
 
     }
}
 
  
function createClickHandler( tableIndex ) {
+
     event.preventDefault();
     return function ( e ) {
+
};
        e.preventDefault();
 
        collapseTable( tableIndex );
 
    };
 
}
 
  
function createCollapseButtons( $content ) {
+
/* adds show/hide-button to navigation bars */
     var NavigationBoxes = {};
+
function createNavigationBarToggleButton($content) {
     var $Tables = $content.find( 'table' );
+
     var NavChild;
     var i;
+
    /* iterate over all < div >-elements */
 +
     var $divs = $content.find( 'div' );
 +
     $divs.each( function ( i, NavFrame ) {
 +
        /* if found a navigation bar */
 +
        if ( $( NavFrame ).hasClass( 'NavFrame' ) ) {
  
    $Tables.each( function( i, table ) {
+
            indexNavigationBar++;
        if ( $(table).hasClass( 'collapsible' ) ) {
+
            var NavToggle = document.createElement( 'a' );
 +
            NavToggle.className = 'NavToggle';
 +
            NavToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
 +
            NavToggle.setAttribute( 'href', '#' );
 +
            $( NavToggle ).on( 'click', $.proxy( window.toggleNavigationBar, window, indexNavigationBar ) );
  
             /* only add button and increment count if there is a header row to work with */
+
            var isCollapsed = $( NavFrame ).hasClass( 'collapsed' );
             var HeaderRow = table.getElementsByTagName( 'tr' )[0];
+
             /**
            if ( !HeaderRow ) {
+
            * Check if any children are already hidden.  This loop is here for backwards compatibility:
                 return;
+
            * 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 ( NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling ) {
 +
                if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {
 +
                    if ( NavChild.style.display === 'none' ) {
 +
                        isCollapsed = true;
 +
                    }
 +
                 }
 
             }
 
             }
             var Header = table.getElementsByTagName( 'th' )[0];
+
             if ( isCollapsed ) {
            if ( !Header ) {
+
                for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
                 return;
+
                    if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {
 +
                        NavChild.style.display = 'none';
 +
                    }
 +
                 }
 
             }
 
             }
 +
            var NavToggleText = document.createTextNode( isCollapsed ? NavigationBarShow : NavigationBarHide );
 +
            NavToggle.appendChild( NavToggleText );
  
             NavigationBoxes[ tableIndex ] = table;
+
             /* Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) */
            table.setAttribute( 'id', 'collapsibleTable' + tableIndex );
+
             for( var j = 0; j < NavFrame.childNodes.length; j++ ) {
 
+
                if ( $( NavFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {
            var Button    = document.createElement( 'span' );
+
                    NavToggle.style.color = NavFrame.childNodes[j].style.color;
            var ButtonLink = document.createElement( 'a' );
+
                    NavFrame.childNodes[j].appendChild( NavToggle );
            var ButtonText = document.createTextNode( collapseCaption );
 
            // Styles are declared in [[MediaWiki:Common.css]]
 
            Button.className = 'collapseButton';
 
 
 
            ButtonLink.style.color = Header.style.color;
 
            ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
 
            ButtonLink.setAttribute( 'href', '#' );
 
            $( ButtonLink ).on( 'click', createClickHandler( tableIndex ) );
 
            ButtonLink.appendChild( ButtonText );
 
 
 
            Button.appendChild( document.createTextNode( '[' ) );
 
            Button.appendChild( ButtonLink );
 
            Button.appendChild( document.createTextNode( ']' ) );
 
 
 
            Header.insertBefore( Button, Header.firstChild );
 
             tableIndex++;
 
        }
 
    } );
 
 
 
    for ( i = 0; i < tableIndex; i++ ) {
 
        if ( $( NavigationBoxes[i] ).hasClass( 'collapsed' ) ||
 
            ( tableIndex >= autoCollapse && $( NavigationBoxes[i] ).hasClass( 'autocollapse' ) )
 
        ) {
 
            collapseTable( i );
 
        }
 
        else if ( $( NavigationBoxes[i] ).hasClass ( 'innercollapse' ) ) {
 
            var element = NavigationBoxes[i];
 
            while ((element = element.parentNode)) {
 
                if ( $( element ).hasClass( 'outercollapse' ) ) {
 
                    collapseTable ( i );
 
                    break;
 
 
                 }
 
                 }
 
             }
 
             }
 +
            NavFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );
 
         }
 
         }
     }
+
     } );
 
}
 
}
  
mw.hook( 'wikipage.content' ).add( createCollapseButtons );
+
mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );
 +
 
 +
/* End of mw.loader.using callback */
 +
} );
 +
/* DO NOT ADD CODE BELOW THIS LINE */

Latest revision as of 22:12, 20 June 2016

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


/**
 * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally
 * loaded for all users on every wiki page. If possible create a gadget that is
 * enabled by default instead of adding it here (since gadgets are fully
 * optimized ResourceLoader modules with possibility to add dependencies etc.)
 *
 * Since Common.js isn't a gadget, there is no place to declare its
 * dependencies, so we have to lazy load them with mw.loader.using on demand and
 * then execute the rest in the callback. In most cases these dependencies will
 * be loaded (or loading) already and the callback will not be delayed. In case a
 * dependency hasn't arrived yet it'll make sure those are loaded before this.
 */

/* global mw, $ */
/* jshint strict:false, browser:true */

mw.loader.using( ['mediawiki.util', 'mediawiki.notify', 'jquery.client'] ).done( function () {
	
/* Begin of mw.loader.using callback */

/**
 * Dynamic Navigation Bars (experimental)
 *
 * Description: See [[Wikipedia:NavFrame]].
 * Maintainers: UNMAINTAINED
 */

/* set up the words in your language */
var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';
var indexNavigationBar = 0;

/**
 * Shows and hides content and picture (if available) of navigation bars
 * Parameters:
 *     indexNavigationBar: the index of navigation bar to be toggled
 **/
window.toggleNavigationBar = function ( indexNavigationBar, event ) {
    var NavToggle = document.getElementById( 'NavToggle' + indexNavigationBar );
    var NavFrame = document.getElementById( 'NavFrame' + indexNavigationBar );
    var NavChild;

    if ( !NavFrame || !NavToggle ) {
        return false;
    }

    /* if shown now */
    if ( NavToggle.firstChild.data === NavigationBarHide ) {
        for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
            if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {
                NavChild.style.display = 'none';
            }
        }
    NavToggle.firstChild.data = NavigationBarShow;

    /* if hidden now */
    } else if ( NavToggle.firstChild.data === NavigationBarShow ) {
        for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
            if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {
                NavChild.style.display = 'block';
            }
        }
        NavToggle.firstChild.data = NavigationBarHide;
    }

    event.preventDefault();
};

/* adds show/hide-button to navigation bars */
function createNavigationBarToggleButton($content) {
    var NavChild;
    /* iterate over all < div >-elements */
    var $divs = $content.find( 'div' );
    $divs.each( function ( i, NavFrame ) {
        /* if found a navigation bar */
        if ( $( NavFrame ).hasClass( 'NavFrame' ) ) {

            indexNavigationBar++;
            var NavToggle = document.createElement( 'a' );
            NavToggle.className = 'NavToggle';
            NavToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
            NavToggle.setAttribute( 'href', '#' );
            $( NavToggle ).on( 'click', $.proxy( window.toggleNavigationBar, window, indexNavigationBar ) );

            var isCollapsed = $( NavFrame ).hasClass( '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 ( NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling ) {
                if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {
                    if ( NavChild.style.display === 'none' ) {
                        isCollapsed = true;
                    }
                }
            }
            if ( isCollapsed ) {
                for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
                    if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( '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 ( $( NavFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {
                    NavToggle.style.color = NavFrame.childNodes[j].style.color;
                    NavFrame.childNodes[j].appendChild( NavToggle );
                }
            }
            NavFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );
        }
    } );
}

mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );

/* End of mw.loader.using callback */
} );
/* DO NOT ADD CODE BELOW THIS LINE */