Difference between revisions of "MediaWiki:Common.js"

From LIMSWiki
Jump to navigationJump to search
(Updated collapsible table code.)
(Removed secondary script call.)
 
(15 intermediate revisions by 2 users 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. */
/*
Table sorting script  by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/.
Based on a script from http://www.kryogenix.org/code/browser/sorttable/.
Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html .


Copyright (c) 1997-2007 Stuart Langridge, Joost de Valk.
/* Return whether a particular class is used**************************************
* Description: Uses regular expressions and caching for better performance.
*/
var usesClass = (function () {
    var reCache = {};
    return function (element, className) {
        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
    };
})();


Version 1.5.7
/**
*/
* Collapsible tables; reimplemented with mw-collapsible
* Styling is also in place to avoid FOUC
*
* Allows tables to be collapsed, showing only the header. See [[Help:Collapsing]].
* @version 3.0.0 (2018-05-20)
* @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
* @author [[User:R. Koot]]
* @author [[User:Krinkle]]
* @author [[User:TheDJ]]
* @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which
* is supported in MediaWiki core. Shimmable since MediaWiki 1.32
*/
function makeCollapsibleMwCollapsible( $content ) {
var $tables = $content
.find( 'table.collapsible:not(.mw-collapsible)' )
.addClass( 'mw-collapsible' );


/* You can change these values */
$.each( $tables, function( index, table ) {
var image_path = "http://www.joostdevalk.nl/code/sortable-table/";
// mw.log.warn( 'This page is using the deprecated class collapsible. Please replace it with mw-collapsible.');
var image_up = "arrow-up.gif";
if( $( table ).hasClass( 'collapsed') ) {
var image_down = "arrow-down.gif";
$( table ).addClass( 'mw-collapsed' );
var image_none = "arrow-none.gif";
// mw.log.warn( 'This page is using the deprecated class collapsed. Please replace it with mw-collapsed.');
var europeandate = false;
}
var alternate_row_colors = true;
} );
if( $tables.length > 0 ) {
mw.loader.using( 'jquery.makeCollapsible' ).then( function() {
$tables.makeCollapsible();
} );
}
}
mw.hook( 'wikipage.content' ).add( makeCollapsibleMwCollapsible );


/* Don't change anything below this unless you know what you're doing */
/**
* Add support to mw-collapsible for autocollapse, innercollapse and outercollapse
*
* Maintainers: TheDJ
*/
function mwCollapsibleSetup( $collapsibleContent ) {
var $element,
$toggle,
autoCollapseThreshold = 2;
$.each( $collapsibleContent, function (index, element) {
$element = $( element );
if ( $element.hasClass( 'collapsible' ) ) {
$element.find('tr:first > th:first').prepend( $element.find('tr:first > * > .mw-collapsible-toggle'));
}
if ( $collapsibleContent.length >= autoCollapseThreshold && $element.hasClass( 'autocollapse' ) ) {
$element.data( 'mw-collapsible' ).collapse();
} else if ( $element.hasClass( 'innercollapse' ) ) {
if ( $element.parents( '.outercollapse' ).length > 0 ) {
$element.data( 'mw-collapsible' ).collapse();
}
}
// because of colored backgrounds, style the link in the text color
// to ensure accessible contrast
$toggle = $element.find( '.mw-collapsible-toggle' );
if ( $toggle.length ) {
// Make the toggle inherit text color
if( $toggle.parent()[0].style.color ) {
$toggle.find( 'a' ).css( 'color', 'inherit' );
}
}
} );
}


window.killEvt = function( evt ) {
mw.hook( 'wikipage.collapsibleContent' ).add( mwCollapsibleSetup );
evt = evt || window.event || window.Event; // W3C, IE, Netscape
 
if ( typeof ( evt.preventDefault ) != 'undefined' ) {
/**
evt.preventDefault(); // Don't follow the link
* Dynamic Navigation Bars (experimental)
evt.stopPropagation();
*
} else {
* Description: See [[Wikipedia:NavFrame]].
evt.cancelBubble = true; // IE
* Maintainers: UNMAINTAINED
}
*/
return false; // Don't follow the link (IE)
}
var collapseCaption = 'hide';
var expandCaption = 'show';


addEvent(window, "load", sortables_init);
// Set up the words in your language
var navigationBarHide = '[' + collapseCaption + ']';
var navigationBarShow = '[' + expandCaption + ']';


var SORT_COLUMN_INDEX;
/**
var thead = false;
* Shows and hides content and picture (if available) of navigation bars.
*
* @param {number} indexNavigationBar The index of navigation bar to be toggled
* @param {jQuery.Event} event Event object
*/
function toggleNavigationBar( indexNavigationBar, event ) {
var navToggle = document.getElementById( 'NavToggle' + indexNavigationBar );
var navFrame = document.getElementById( 'NavFrame' + indexNavigationBar );
var navChild;


function sortables_init() {
if ( !navFrame || !navToggle ) {
// Find all tables with class sortable and make them sortable
return false;
if (!document.getElementsByTagName) return;
tbls = document.getElementsByTagName("table");
for (ti=0;ti<tbls.length;ti++) {
thisTbl = tbls[ti];
if (((' '+thisTbl.className+' ').indexOf("sortable") != -1) && (thisTbl.id)) {
ts_makeSortable(thisTbl);
}
}
}
}


function ts_makeSortable(t) {
// If shown now
if (t.rows && t.rows.length > 0) {
if ( navToggle.firstChild.data === navigationBarHide ) {
if (t.tHead && t.tHead.rows.length > 0) {
for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {
var firstRow = t.tHead.rows[t.tHead.rows.length-1];
if ( $( navChild ).hasClass( 'NavContent' ) ) {
thead = true;
navChild.style.display = 'none';
} else {
}
var firstRow = t.rows[0];
}
}
}
navToggle.firstChild.data = navigationBarShow;
if (!firstRow) return;
// We have a first row: assume it's the header, and make its contents clickable links
// If hidden now
for (var i=0;i<firstRow.cells.length;i++) {
} else if ( navToggle.firstChild.data === navigationBarShow ) {
var cell = firstRow.cells[i];
for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {
var txt = ts_getInnerText(cell);
if ( $( navChild ).hasClass( 'NavContent' ) ) {
if (cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) {
navChild.style.display = 'block';
cell.innerHTML = '+txt+''<a href="#" class="sortheader" onclick="ts_resortTable(this, '+i+');return false;"><span class="sortarrow">&nbsp;&nbsp;<img src="'+ image_path + image_none + '" alt="&darr;"/></span></a>';
}
}
}
navToggle.firstChild.data = navigationBarHide;
}
}
if (alternate_row_colors) {
 
alternate(t);
event.preventDefault();
}
}
}


function ts_getInnerText(el) {
/**
if (typeof el == "string") return el;
* Adds show/hide-button to navigation bars.
if (typeof el == "undefined") { return el };
*
if (el.innerText) return el.innerText; //Not needed but it is faster
* @param {jQuery} $content
var str = "";
*/
function createNavigationBarToggleButton( $content ) {
var cs = el.childNodes;
var i, j, navChild, navToggle, navToggleText, isCollapsed,
var l = cs.length;
indexNavigationBar = 0;
for (var i = 0; i < l; i++) {
// Iterate over all < div >-elements
switch (cs[i].nodeType) {
var $divs = $content.find( 'div.NavFrame:not(.mw-collapsible)' );
case 1: //ELEMENT_NODE
$divs.each( function ( i, navFrame ) {
str += ts_getInnerText(cs[i]);
indexNavigationBar++;
break;
navToggle = document.createElement( 'a' );
case 3: //TEXT_NODE
navToggle.className = 'NavToggle';
str += cs[i].nodeValue;
navToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
break;
navToggle.setAttribute( 'href', '#' );
}
$( navToggle ).on( 'click', $.proxy( toggleNavigationBar, null, indexNavigationBar ) );
}
return str;
}


function ts_resortTable(lnk, clid) {
isCollapsed = $( navFrame ).hasClass( 'collapsed' );
var span;
/**
for (var ci=0;ci<lnk.childNodes.length;ci++) {
* Check if any children are already hidden.  This loop is here for backwards compatibility:
if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];
* 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
var spantext = ts_getInnerText(span);
* the content visible without JavaScript support), the new recommended way is to add the class
var td = lnk.parentNode;
* "collapsed" to the NavFrame itself, just like with collapsible tables.
var column = clid || td.cellIndex;
*/
var t = getParent(td,'TABLE');
for ( navChild = navFrame.firstChild; navChild !== null && !isCollapsed; navChild = navChild.nextSibling ) {
// Work out a type for the column
if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {
if (t.rows.length <= 1) return;
if ( navChild.style.display === 'none' ) {
var itm = "";
isCollapsed = true;
var i = 0;
}
while (itm == "" && i < t.tBodies[0].rows.length) {
}
var itm = ts_getInnerText(t.tBodies[0].rows[i].cells[column]);
itm = trim(itm);
if (itm.substr(0,4) == "<!--" || itm.length == 0) {
itm = "";
}
}
i++;
if ( isCollapsed ) {
}
for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {
if (itm == "") return;
if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {
sortfn = ts_sort_caseinsensitive;
navChild.style.display = 'none';
if (itm.match(/^\d\d[\/\.-][a-zA-z][a-zA-Z][a-zA-Z][\/\.-]\d\d\d\d$/)) sortfn = ts_sort_date;
}
if (itm.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d\d{2}?$/)) sortfn = ts_sort_date;
if (itm.match(/^-?[£$€Û¢´]\d/)) sortfn = ts_sort_numeric;
if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?$/)) sortfn = ts_sort_numeric;
SORT_COLUMN_INDEX = column;
var firstRow = new Array();
var newRows = new Array();
for (k=0;k<t.tBodies.length;k++) {
for (i=0;i<t.tBodies[k].rows[0].length;i++) {
firstRow[i] = t.tBodies[k].rows[0][i];
}
}
for (k=0;k<t.tBodies.length;k++) {
if (!thead) {
// Skip the first row
for (j=1;j<t.tBodies[k].rows.length;j++) {  
newRows[j-1] = t.tBodies[k].rows[j];
}
} else {
// Do NOT skip the first row
for (j=0;j<t.tBodies[k].rows.length;j++) {
newRows[j] = t.tBodies[k].rows[j];
}
}
}
}
}
navToggleText = document.createTextNode( isCollapsed ? navigationBarShow : navigationBarHide );
newRows.sort(sortfn);
navToggle.appendChild( navToggleText );
if (span.getAttribute("sortdir") == 'down') {
 
ARROW = '&nbsp;&nbsp;<img src="'+ image_path + image_down + '" alt="&darr;"/>';
// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
newRows.reverse();
for ( j = 0; j < navFrame.childNodes.length; j++ ) {
span.setAttribute('sortdir','up');
if ( $( navFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {
} else {
navToggle.style.color = navFrame.childNodes[j].style.color;
ARROW = '&nbsp;&nbsp;<img src="'+ image_path + image_up + '" alt="&uarr;"/>';
navFrame.childNodes[j].appendChild( navToggle );
span.setAttribute('sortdir','down');
}
    // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
    // don't do sortbottom rows
    for (i=0; i<newRows.length; i++) {  
if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) {
t.tBodies[0].appendChild(newRows[i]);
}
}
    // do sortbottom rows only
    for (i=0; i<newRows.length; i++) {
if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1))
t.tBodies[0].appendChild(newRows[i]);
}
// Delete any other arrows there may be showing
var allspans = document.getElementsByTagName("span");
for (var ci=0;ci<allspans.length;ci++) {
if (allspans[ci].className == 'sortarrow') {
if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
allspans[ci].innerHTML = '&nbsp;&nbsp;<img src="'+ image_path + image_none + '" alt="&darr;"/>';
}
}
}
}
}
navFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );
span.innerHTML = ARROW;
} );
alternate(t);
}
}


function getParent(el, pTagName) {
mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );
if (el == null) {
 
return null;
/* JavaScript for rounding borders
} else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) {
  Source: http://webdesign.html.it/articoli/leggi/528/more-nifty-corners */
return el;
} else {
return getParent(el.parentNode, pTagName);
}
}


function sort_date(date) {
function NiftyCheck(){
// y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
if(!document.getElementById || !document.createElement)
dt = "00000000";
    return(false);
if (date.length == 11) {
isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
mtstr = date.substr(3,3);
if(Array.prototype.push==null){Array.prototype.push=function(){
mtstr = mtstr.toLowerCase();
      this[this.length]=arguments[0]; return(this.length);}}
switch(mtstr) {
return(true);
case "jan": var mt = "01"; break;
case "feb": var mt = "02"; break;
case "mar": var mt = "03"; break;
case "apr": var mt = "04"; break;
case "may": var mt = "05"; break;
case "jun": var mt = "06"; break;
case "jul": var mt = "07"; break;
case "aug": var mt = "08"; break;
case "sep": var mt = "09"; break;
case "oct": var mt = "10"; break;
case "nov": var mt = "11"; break;
case "dec": var mt = "12"; break;
// default: var mt = "00";
}
dt = date.substr(7,4)+mt+date.substr(0,2);
return dt;
} else if (date.length == 10) {
if (europeandate == false) {
dt = date.substr(6,4)+date.substr(0,2)+date.substr(3,2);
return dt;
} else {
dt = date.substr(6,4)+date.substr(3,2)+date.substr(0,2);
return dt;
}
} else if (date.length == 8) {
yr = date.substr(6,2);
if (parseInt(yr) < 50) {
yr = '20'+yr;
} else {
yr = '19'+yr;
}
if (europeandate == true) {
dt = yr+date.substr(3,2)+date.substr(0,2);
return dt;
} else {
dt = yr+date.substr(0,2)+date.substr(3,2);
return dt;
}
}
return dt;
}
}


function ts_sort_date(a,b) {
function Rounded(selector, wich, bk, color, opt) {
dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
    var i, prefixt, prefixb, cn = "r", ecolor = "", edges = !1, eclass = "", b = !1, t = !1;
dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX]));
    if (color == "transparent") {
        cn = cn + "x";
if (dt1==dt2) {
        ecolor = bk;
return 0;
        bk = "transparent";
}
    } else if (opt && opt.indexOf("border") >= 0) {
if (dt1<dt2) {  
        var optar = opt.split(" ");
return -1;
        for (i = 0; i < optar.length; i++)
}
            if (optar[i].indexOf("#") >= 0)
return 1;
                ecolor = optar[i];
        if (ecolor == "")
            ecolor = "#666";
        cn += "e";
        edges = !0;
    } else if (opt && opt.indexOf("smooth") >= 0) {
        cn += "a";
        ecolor = Mix(bk, color);
    }
    if (opt && opt.indexOf("small") >= 0)
        cn += "s";
    prefixt = cn;
    prefixb = cn;
    if (wich.indexOf("all") >= 0) {
        t = !0;
        b = !0;
    } else if (wich.indexOf("top") >= 0)
        t = "true";
    else if (wich.indexOf("tl") >= 0) {
        t = "true";
        if (wich.indexOf("tr") < 0)
            prefixt += "l";
    } else if (wich.indexOf("tr") >= 0) {
        t = "true";
        prefixt += "r";
    }
    if (wich.indexOf("bottom") >= 0)
        b = !0;
    else if (wich.indexOf("bl") >= 0) {
        b = "true";
        if (wich.indexOf("br") < 0)
            prefixb += "l";
    } else if (wich.indexOf("br") >= 0) {
        b = "true";
        prefixb += "r";
    }
    var v = getElementsBySelector(selector);
    var l = v.length;
    for (i = 0; i < l; i++) {
        if (edges)
            AddBorder(v[i], ecolor);
        if (t)
            AddTop(v[i], bk, color, ecolor, prefixt);
        if (b)
            AddBottom(v[i], bk, color, ecolor, prefixb);
    }
}
}
function ts_sort_numeric(a,b) {
function AddBorder(el, bc) {
var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    var i;
aa = clean_num(aa);
    if (!el.passed) {
var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
        if (el.childNodes.length == 1 && el.childNodes[0].nodeType == 3) {
bb = clean_num(bb);
            var t = el.firstChild.nodeValue;
return compare_numeric(aa,bb);
            el.removeChild(el.lastChild);
            var d = CreateEl("span");
            d.style.display = "block";
            d.appendChild(document.createTextNode(t));
            el.appendChild(d);
        }
        for (i = 0; i < el.childNodes.length; i++) {
            if (el.childNodes[i].nodeType == 1) {
                el.childNodes[i].style.borderLeft = "1px solid " + bc;
                el.childNodes[i].style.borderRight = "1px solid " + bc;
            }
        }
    }
    el.passed = !0;
}
}
function compare_numeric(a,b) {
function AddTop(el, bk, color, bc, cn) {
var a = parseFloat(a);
    var i, lim = 4, d = CreateEl("b");
a = (isNaN(a) ? 0 : a);
    if (cn.indexOf("s") >= 0)
var b = parseFloat(b);
        lim = 2;
b = (isNaN(b) ? 0 : b);
    if (bc)
return a - b;
        d.className = "artop";
    else
        d.className = "rtop";
    d.style.backgroundColor = bk;
    for (i = 1; i <= lim; i++) {
        var x = CreateEl("b");
        x.className = cn + i;
        x.style.backgroundColor = color;
        if (bc)
            x.style.borderColor = bc;
        d.appendChild(x);
    }
    el.style.paddingTop = 0;
    el.insertBefore(d, el.firstChild);
}
}
function ts_sort_caseinsensitive(a,b) {
function AddBottom(el, bk, color, bc, cn) {
aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
    var i, lim = 4, d = CreateEl("b");
bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
    if (cn.indexOf("s") >= 0)
if (aa==bb) {
        lim = 2;
return 0;
    if (bc)
}
        d.className = "artop";
if (aa<bb) {
    else
return -1;
        d.className = "rtop";
}
    d.style.backgroundColor = bk;
return 1;
    for (i = lim; i > 0; i--) {
        var x = CreateEl("b");
        x.className = cn + i;
        x.style.backgroundColor = color;
        if (bc)
            x.style.borderColor = bc;
        d.appendChild(x);
    }
    el.style.paddingBottom = 0;
    el.appendChild(d);
}
}
function ts_sort_default(a,b) {
function CreateEl(x) {
aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    if (isXHTML)
bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
        return (document.createElementNS('http://www.w3.org/1999/xhtml', x));
if (aa==bb) {
    else
return 0;
        return (document.createElement(x));
}
if (aa<bb) {
return -1;
}
return 1;
}
}
function addEvent(elm, evType, fn, useCapture)
function getElementsBySelector(selector) {
// addEvent and removeEvent
    var i, selid = "", selclass = "", tag = selector, f, s = [], objlist = [];
// cross-browser event handling for IE5+, NS6 and Mozilla
    if (selector.indexOf(" ") > 0) {
// By Scott Andrew
        s = selector.split(" ");
{
        var fs = s[0].split("#");
if (elm.addEventListener){
        if (fs.length == 1)
elm.addEventListener(evType, fn, useCapture);
            return (objlist);
return true;
        f = document.getElementById(fs[1]);
} else if (elm.attachEvent){
        if (f)
var r = elm.attachEvent("on"+evType, fn);
            return (f.getElementsByTagName(s[1]));
return r;
        return (objlist);
} else {
    }
alert("Handler could not be removed");
    if (selector.indexOf("#") > 0) {
}
        s = selector.split("#");
}
        tag = s[0];
function clean_num(str) {
        selid = s[1];
str = str.replace(new RegExp(/[^-?0-9.]/g),"");
    }
return str;
    if (selid != "") {
}
        f = document.getElementById(selid);
function trim(s) {
        if (f)
return s.replace(/^\s+|\s+$/g, "");
            objlist.push(f);
}
        return (objlist);
function alternate(table) {
// Take object table and get all it's tbodies.
var tableBodies = table.getElementsByTagName("tbody");
// Loop through these tbodies
for (var i = 0; i < tableBodies.length; i++) {
// Take the tbody, and get all it's rows
var tableRows = tableBodies[i].getElementsByTagName("tr");
// Loop through these rows
// Start at 1 because we want to leave the heading row untouched
for (var j = 0; j < tableRows.length; j++) {
// Check if j is even, and apply classes for both possible results
if ( (j % 2) == ) {
if ( !(tableRows[j].className.indexOf('odd') == -1) ) {
tableRows[j].className = tableRows[j].className.replace('odd', 'even');
} else {
if ( tableRows[j].className.indexOf('even') == -1 ) {
tableRows[j].className += " even";
}
}
} else {
if ( !(tableRows[j].className.indexOf('even') == -1) ) {
tableRows[j].className = tableRows[j].className.replace('even', 'odd');
} else {
if ( tableRows[j].className.indexOf('odd') == -1 ) {
tableRows[j].className += " odd";
}
}
}
}
}
}
 
/* Return whether a particular class is used**************************************
* Description: Uses regular expressions and caching for better performance.
*/
var usesClass = (function () {
    var reCache = {};
    return function (element, className) {
        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
    };
})();
 
/** Collapsible tables code *****************************************************
*  Description: Allows tables to be collapsed, showing only the header
*  Author: User:Bigfoot Lover @ BionicWiki.com
*  Added: 24 September 2007
*/
 
/* Add a hook to make buttons, where need be, on every pageload */
addOnloadHook( createTableButtons );
 
/* Define global variables:
* autoShrink is the number of tables that must exist on the page for usage of "class=collapsible autocollapse"
* minimizeSymbol can be either a symbol such as a minus sign or a word such as hide or disappear
* maximizeSymbol can be either a symbol such as a plus sign or a word such as show or appear */
 
var autoShrink = 2;
var minimizeSymbol = "hide";
var maximizeSymbol = "show";
 
/* Define functions that do-the-work */
/* Function toggleTableView() toggles a specified table's view from minimized to maximized, or vice versa */
function toggleTableView( tableIndex, tableShrink )
{
    var Table = document.getElementById( "collapsibleTable" + tableIndex );
    /* If there is no collapsible tables on the page, no need to do any shrinking */
    if (!Table) {
      return false;
     }
     }
 
    if (selector.indexOf(".") > 0) {
    var Button = document.getElementById( "collapseButton" + tableIndex );
        s = selector.split(".");
    /* If no collapsible buttons, no need to do any shrinking */
        tag = s[0];
    if (!Button ) {
         selclass = s[1];
         return false;
     }
     }
 
     var v = document.getElementsByTagName(tag);
    /* Grab the rows of the specified table */
     if (selclass == "")
     var Rows = Table.getElementsByTagName( "tr" );  
         return (v);
 
    for (i = 0; i < v.length; i++) {
    /* Do the hiding/unhiding */
        if (v[i].className.indexOf(selclass) >= 0) {
     if ( Button.firstChild.data == minimizeSymbol || tableShrink == 1 ) {
             objlist.push(v[i]);
         /* if the button is set to minimize its contents,
        * then loop through the rows and mark them hidden */
        var count = 1;
        while (Rows.length > count) {
          if (Rows[count].parentNode.parentNode.id == ("collapsibleTable" + tableIndex))
          {
             Rows[count].style.display = "none";
          }
          count++;
         }
         }
        /* After marking, change the table to show the maximize symbol */
        Button.firstChild.data = maximizeSymbol;
    } else {
        /* if the button is set to maximize its contents,
        * then loop through the rows and mark them visible */   
        var count = 1;
        while (Rows.length > count) {
          if(Rows[count].parentNode.parentNode.id == ("collapsibleTable" + tableIndex))
          {
              Rows[count].style.display = Rows[0].style.display;
          }
          count++;
        }
        /* After marking, change the table to show the minimize symbol */
        Button.firstChild.data = minimizeSymbol;
     }
     }
    return (objlist);
}
}
 
function Mix(c1, c2) {
/* Funtion createTableButtons() creates the plus or minus symbol and alignment text
     var i, step1, step2, x, y, r = new Array(3);
* to be applied on collapsible tables */
     if (c1.length == 4)
function createTableButtons()
        step1 = 1;
{
     else
    /* Define local variables */
        step1 = 2;
     var tableIndex = 0;
     if (c2.length == 4)
    var NavBoxes = new Object();
         step2 = 1;
     var Tables = document.getElementsByTagName( "table" );
    else
 
         step2 = 2;
    /* Use two count variables to handle cases where continue is used */
    for (i = 0; i < 3; i++) {
    var loopcount = 0;
        x = parseInt(c1.substr(1 + step1 * i, step1), 16);
     var count = 0;  
        if (step1 == 1)
     while (Tables.length > loopcount) {
             x = 16 * x + x;
         /* For all collapsible table on the page, this code goes through
        y = parseInt(c2.substr(1 + step2 * i, step2), 16);
        * them and makes a button for each one individually */
        if (step2 == 1)
        count = loopcount;
             y = 16 * y + y;
        loopcount++;
        r[i] = Math.floor((x * 50 + y * 50) / 100);
         if ( usesClass( Tables[count], "collapsible" ) ) {
 
            /* Proceed only if a header row and header exist */
            var HeaderRow = Tables[count].getElementsByTagName( "tr" )[0];
            if (!HeaderRow) continue;
            var Header = HeaderRow.getElementsByTagName( "th" )[0];
            if (!Header) continue;
 
            /* Log where you are in the looping */
            NavBoxes[ tableIndex ] = Tables[count];
 
            /* Set the identifier of the table being edited in this iteration */
            Tables[count].setAttribute( "id", "collapsibleTable" + tableIndex );
 
            /* Create the button assuming it is a minimized table
            * to do the initial creation. */
            var Button = document.createElement( "span" );
            var ButtonLink = document.createElement( "a" );
             var ButtonText = document.createTextNode( maximizeSymbol );
 
            /* Define where the button floats and its font and size.
            * The width should be set to the max character count of
            * the mininizeSymbol and maximizeSymbol + 2. ie. min and max
            * are 3 letters each + 2 = 5em */
            Button.style.styleFloat = "right";
            Button.style.cssFloat = "right";
            Button.style.fontWeight = "normal";
            Button.style.textAlign = "right";
            Button.style.width = "5em";
 
            /* Set the link color and identifier */
            ButtonLink.style.color = Header.style.color;
            ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
 
            /* Set the destination of the button */
            ButtonLink.setAttribute( "href", "javascript:toggleTableView(" + tableIndex + ");" );
            ButtonLink.appendChild( ButtonText );
             Button.appendChild( document.createTextNode( "[" ) );
            Button.appendChild( ButtonLink );
            Button.appendChild( document.createTextNode( "]" ) );
 
            /* Load the next header and table for the next iteration */
            Header.insertBefore( Button, Header.childNodes[0] );
            tableIndex++;
        }
     }
     }
 
    return ("#" + r[0].toString(16) + r[1].toString(16) + r[2].toString(16));
     /* Earlier in this function, assumed all tables are minimized to do the initial creation.
}
    * Now, loop again through the tables and set those to maximized that need setting,
function doRoundEdges() {
    * and set the rows of those that don't as hidden */
     if (!NiftyCheck())
     loopcount = 0;
        return;
     while (tableIndex > loopcount) {
    Rounded("div#nifty", "all", "#FFF", "#D4DDFF", "smooth");
         /* If autocollapse or collapse is not invalid, maximize; otherwise, minimize */
}
         if (((autoShrink > tableIndex) && usesClass( NavBoxes[loopcount], "autocollapse" )) || !usesClass( NavBoxes[loopcount], "collapsed" ) ) {
jQuery(doRoundEdges);
          toggleTableView( loopcount, 0 );
function setStyleById(i, p, v) {
        }
    var n = document.getElementById(i);
        else {
     n.style[p] = v;
          toggleTableView( loopcount, 1 );
}
jQuery(performIE);
function performIE() {
     if (-1 != navigator.userAgent.indexOf("MSIE")) {
         var Divs = document.getElementsByTagName("div");
        var divCnt = 0;
        var divID = "";
         if (Divs.length > 0) {
            var CurrDiv = Divs[0];
            var s = "";
            while (Divs.length > divCnt) {
                s = eval("CurrDiv.style.ietop");
                if ((s != "") && (s != null)) {
                    divID = "mapDiv" + divCnt;
                    CurrDiv.setAttribute("id", divID);
                    setStyleById(divID, "top", CurrDiv.style.ietop);
                }
                divCnt++;
                CurrDiv = Divs[divCnt];
            }
         }
         }
        loopcount++;
     }
     }
}
}
 
/** Dynamic Navigation Bars (experimental) *************************************
/**
* Dynamic Navigation Bars (experimental)
  *
  *
  * Description: See [[Wikipedia:NavFrame]].
  * Description: See [[Wikipedia:NavFrame]].
  * Maintainers: UNMAINTAINED
  * Maintainers: UNMAINTAINED
  */
  */


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


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


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


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


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


// adds show/hide-button to navigation bars
    event.preventDefault();
function createNavigationBarToggleButton(){
};
     var indexNavigationBar = 0;
 
     // iterate over all < div >-elements  
/* adds show/hide-button to navigation bars */
     var divs = document.getElementsByTagName("div");
function createNavigationBarToggleButton( $content ) {
     for (var i = 0; NavFrame = divs[i]; i++) {
     var NavChild;
         // if found a navigation bar
     /* iterate over all < div >-elements */
         if (hasClass(NavFrame, "NavFrame")) {
     var $divs = $content.find( 'div' );
     $divs.each( function ( i, NavFrame ) {
         /* if found a navigation bar */
         if ( $( NavFrame ).hasClass( 'NavFrame' ) ) {


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


             var isCollapsed = hasClass( NavFrame, "collapsed" );
             var isCollapsed = $( NavFrame ).hasClass( 'collapsed' );
             /*
             /**
             * Check if any children are already hidden.  This loop is here for backwards compatibility:
             * 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"
             * the old way of making NavFrames start out collapsed was to manually add style="display:none"
Line 558: Line 486:
             * "collapsed" to the NavFrame itself, just like with collapsible tables.
             * "collapsed" to the NavFrame itself, just like with collapsible tables.
             */
             */
             for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
             for ( NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling ) {
                 if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
                 if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {
                     if ( NavChild.style.display == 'none' ) {
                     if ( NavChild.style.display === 'none' ) {
                         isCollapsed = true;
                         isCollapsed = true;
                     }
                     }
                 }
                 }
             }
             }
             if (isCollapsed) {
             if ( isCollapsed ) {
                 for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
                 for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
                     if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
                     if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {
                         NavChild.style.display = 'none';
                         NavChild.style.display = 'none';
                     }
                     }
                 }
                 }
             }
             }
             var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide);
             var NavToggleText = document.createTextNode( isCollapsed ? NavigationBarShow : NavigationBarHide );
             NavToggle.appendChild(NavToggleText);
             NavToggle.appendChild( NavToggleText );


             // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
             /* 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++) {
             for( var j = 0; j < NavFrame.childNodes.length; j++ ) {
                 if (hasClass(NavFrame.childNodes[j], "NavHead")) {
                 if ( $( NavFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {
                     NavToggle.style.color = NavFrame.childNodes[j].style.color;
                     NavToggle.style.color = NavFrame.childNodes[j].style.color;
                     NavFrame.childNodes[j].appendChild(NavToggle);
                     NavFrame.childNodes[j].appendChild( NavToggle );
                 }
                 }
             }
             }
             NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
             NavFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );
         }
         }
     }
     } );
}
}


$( createNavigationBarToggleButton );
mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );
 
/* Tweak to get CategoryTree extension to have trees expanded by default */
$( document ).ready(function() { $('.CategoryTreeToggle[data-ct-state="collapsed"]').click(); });

Latest revision as of 18:12, 3 August 2021

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

/* Return whether a particular class is used**************************************
 * Description: Uses regular expressions and caching for better performance.
 */
 
 var usesClass = (function () {
     var reCache = {};
     return function (element, className) {
         return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
     };
 })();

/**
 * Collapsible tables; reimplemented with mw-collapsible
 * Styling is also in place to avoid FOUC
 * 
 * Allows tables to be collapsed, showing only the header. See [[Help:Collapsing]].
 * @version 3.0.0 (2018-05-20)
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
 * @author [[User:R. Koot]]
 * @author [[User:Krinkle]]
 * @author [[User:TheDJ]]
 * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which
 * is supported in MediaWiki core. Shimmable since MediaWiki 1.32
 */
function makeCollapsibleMwCollapsible( $content ) {
	var $tables = $content
		.find( 'table.collapsible:not(.mw-collapsible)' )
		.addClass( 'mw-collapsible' );

	$.each( $tables, function( index, table ) {
		// mw.log.warn( 'This page is using the deprecated class collapsible. Please replace it with mw-collapsible.');
		if( $( table ).hasClass( 'collapsed') ) {
			$( table ).addClass( 'mw-collapsed' );
			// mw.log.warn( 'This page is using the deprecated class collapsed. Please replace it with mw-collapsed.');
		}
	} );
	if( $tables.length > 0 ) {
		mw.loader.using( 'jquery.makeCollapsible' ).then( function() {
			$tables.makeCollapsible();
		} );
	}
}
mw.hook( 'wikipage.content' ).add( makeCollapsibleMwCollapsible );

/**
 * Add support to mw-collapsible for autocollapse, innercollapse and outercollapse
 *
 * Maintainers: TheDJ
 */
function mwCollapsibleSetup( $collapsibleContent ) {
	var $element,
		$toggle,
		autoCollapseThreshold = 2;
	$.each( $collapsibleContent, function (index, element) {
		$element = $( element );
		if ( $element.hasClass( 'collapsible' ) ) {
			$element.find('tr:first > th:first').prepend( $element.find('tr:first > * > .mw-collapsible-toggle'));
		}
		if ( $collapsibleContent.length >= autoCollapseThreshold && $element.hasClass( 'autocollapse' ) ) {
			$element.data( 'mw-collapsible' ).collapse();
		} else if ( $element.hasClass( 'innercollapse' ) ) {
			if ( $element.parents( '.outercollapse' ).length > 0 ) {
				$element.data( 'mw-collapsible' ).collapse();
			}
		}
		// because of colored backgrounds, style the link in the text color
		// to ensure accessible contrast
		$toggle = $element.find( '.mw-collapsible-toggle' );
		if ( $toggle.length ) {
			// Make the toggle inherit text color
			if( $toggle.parent()[0].style.color ) {
				$toggle.find( 'a' ).css( 'color', 'inherit' );
			}
		}
	} );
}

mw.hook( 'wikipage.collapsibleContent' ).add( mwCollapsibleSetup );

/**
 * Dynamic Navigation Bars (experimental)
 *
 * Description: See [[Wikipedia:NavFrame]].
 * Maintainers: UNMAINTAINED
 */
 
var collapseCaption = 'hide';
var expandCaption = 'show';

// Set up the words in your language
var navigationBarHide = '[' + collapseCaption + ']';
var navigationBarShow = '[' + expandCaption + ']';

/**
 * Shows and hides content and picture (if available) of navigation bars.
 *
 * @param {number} indexNavigationBar The index of navigation bar to be toggled
 * @param {jQuery.Event} event Event object
 */
function toggleNavigationBar( 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.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.style.display = 'block';
			}
		}
		navToggle.firstChild.data = navigationBarHide;
	}

	event.preventDefault();
}

/**
 * Adds show/hide-button to navigation bars.
 *
 * @param {jQuery} $content
 */
function createNavigationBarToggleButton( $content ) {
	var i, j, navChild, navToggle, navToggleText, isCollapsed,
		indexNavigationBar = 0;
	// Iterate over all < div >-elements
	var $divs = $content.find( 'div.NavFrame:not(.mw-collapsible)' );
	$divs.each( function ( i, navFrame ) {
		indexNavigationBar++;
		navToggle = document.createElement( 'a' );
		navToggle.className = 'NavToggle';
		navToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
		navToggle.setAttribute( 'href', '#' );
		$( navToggle ).on( 'click', $.proxy( toggleNavigationBar, null, indexNavigationBar ) );

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

/* JavaScript for rounding borders
   Source: http://webdesign.html.it/articoli/leggi/528/more-nifty-corners */

function NiftyCheck(){
if(!document.getElementById || !document.createElement)
    return(false);
isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
if(Array.prototype.push==null){Array.prototype.push=function(){
      this[this.length]=arguments[0]; return(this.length);}}
return(true);
}

function Rounded(selector, wich, bk, color, opt) {
    var i, prefixt, prefixb, cn = "r", ecolor = "", edges = !1, eclass = "", b = !1, t = !1;
    if (color == "transparent") {
        cn = cn + "x";
        ecolor = bk;
        bk = "transparent";
    } else if (opt && opt.indexOf("border") >= 0) {
        var optar = opt.split(" ");
        for (i = 0; i < optar.length; i++)
            if (optar[i].indexOf("#") >= 0)
                ecolor = optar[i];
        if (ecolor == "")
            ecolor = "#666";
        cn += "e";
        edges = !0;
    } else if (opt && opt.indexOf("smooth") >= 0) {
        cn += "a";
        ecolor = Mix(bk, color);
    }
    if (opt && opt.indexOf("small") >= 0)
        cn += "s";
    prefixt = cn;
    prefixb = cn;
    if (wich.indexOf("all") >= 0) {
        t = !0;
        b = !0;
    } else if (wich.indexOf("top") >= 0)
        t = "true";
    else if (wich.indexOf("tl") >= 0) {
        t = "true";
        if (wich.indexOf("tr") < 0)
            prefixt += "l";
    } else if (wich.indexOf("tr") >= 0) {
        t = "true";
        prefixt += "r";
    }
    if (wich.indexOf("bottom") >= 0)
        b = !0;
    else if (wich.indexOf("bl") >= 0) {
        b = "true";
        if (wich.indexOf("br") < 0)
            prefixb += "l";
    } else if (wich.indexOf("br") >= 0) {
        b = "true";
        prefixb += "r";
    }
    var v = getElementsBySelector(selector);
    var l = v.length;
    for (i = 0; i < l; i++) {
        if (edges)
            AddBorder(v[i], ecolor);
        if (t)
            AddTop(v[i], bk, color, ecolor, prefixt);
        if (b)
            AddBottom(v[i], bk, color, ecolor, prefixb);
    }
}
function AddBorder(el, bc) {
    var i;
    if (!el.passed) {
        if (el.childNodes.length == 1 && el.childNodes[0].nodeType == 3) {
            var t = el.firstChild.nodeValue;
            el.removeChild(el.lastChild);
            var d = CreateEl("span");
            d.style.display = "block";
            d.appendChild(document.createTextNode(t));
            el.appendChild(d);
        }
        for (i = 0; i < el.childNodes.length; i++) {
            if (el.childNodes[i].nodeType == 1) {
                el.childNodes[i].style.borderLeft = "1px solid " + bc;
                el.childNodes[i].style.borderRight = "1px solid " + bc;
            }
        }
    }
    el.passed = !0;
}
function AddTop(el, bk, color, bc, cn) {
    var i, lim = 4, d = CreateEl("b");
    if (cn.indexOf("s") >= 0)
        lim = 2;
    if (bc)
        d.className = "artop";
    else
        d.className = "rtop";
    d.style.backgroundColor = bk;
    for (i = 1; i <= lim; i++) {
        var x = CreateEl("b");
        x.className = cn + i;
        x.style.backgroundColor = color;
        if (bc)
            x.style.borderColor = bc;
        d.appendChild(x);
    }
    el.style.paddingTop = 0;
    el.insertBefore(d, el.firstChild);
}
function AddBottom(el, bk, color, bc, cn) {
    var i, lim = 4, d = CreateEl("b");
    if (cn.indexOf("s") >= 0)
        lim = 2;
    if (bc)
        d.className = "artop";
    else
        d.className = "rtop";
    d.style.backgroundColor = bk;
    for (i = lim; i > 0; i--) {
        var x = CreateEl("b");
        x.className = cn + i;
        x.style.backgroundColor = color;
        if (bc)
            x.style.borderColor = bc;
        d.appendChild(x);
    }
    el.style.paddingBottom = 0;
    el.appendChild(d);
}
function CreateEl(x) {
    if (isXHTML)
        return (document.createElementNS('http://www.w3.org/1999/xhtml', x));
    else
        return (document.createElement(x));
}
function getElementsBySelector(selector) {
    var i, selid = "", selclass = "", tag = selector, f, s = [], objlist = [];
    if (selector.indexOf(" ") > 0) {
        s = selector.split(" ");
        var fs = s[0].split("#");
        if (fs.length == 1)
            return (objlist);
        f = document.getElementById(fs[1]);
        if (f)
            return (f.getElementsByTagName(s[1]));
        return (objlist);
    }
    if (selector.indexOf("#") > 0) {
        s = selector.split("#");
        tag = s[0];
        selid = s[1];
    }
    if (selid != "") {
        f = document.getElementById(selid);
        if (f)
            objlist.push(f);
        return (objlist);
    }
    if (selector.indexOf(".") > 0) {
        s = selector.split(".");
        tag = s[0];
        selclass = s[1];
    }
    var v = document.getElementsByTagName(tag);
    if (selclass == "")
        return (v);
    for (i = 0; i < v.length; i++) {
        if (v[i].className.indexOf(selclass) >= 0) {
            objlist.push(v[i]);
        }
    }
    return (objlist);
}
function Mix(c1, c2) {
    var i, step1, step2, x, y, r = new Array(3);
    if (c1.length == 4)
        step1 = 1;
    else
        step1 = 2;
    if (c2.length == 4)
        step2 = 1;
    else
        step2 = 2;
    for (i = 0; i < 3; i++) {
        x = parseInt(c1.substr(1 + step1 * i, step1), 16);
        if (step1 == 1)
            x = 16 * x + x;
        y = parseInt(c2.substr(1 + step2 * i, step2), 16);
        if (step2 == 1)
            y = 16 * y + y;
        r[i] = Math.floor((x * 50 + y * 50) / 100);
    }
    return ("#" + r[0].toString(16) + r[1].toString(16) + r[2].toString(16));
}
function doRoundEdges() {
    if (!NiftyCheck())
        return;
    Rounded("div#nifty", "all", "#FFF", "#D4DDFF", "smooth");
}
jQuery(doRoundEdges);
function setStyleById(i, p, v) {
    var n = document.getElementById(i);
    n.style[p] = v;
}
jQuery(performIE);
function performIE() {
    if (-1 != navigator.userAgent.indexOf("MSIE")) {
        var Divs = document.getElementsByTagName("div");
        var divCnt = 0;
        var divID = "";
        if (Divs.length > 0) {
            var CurrDiv = Divs[0];
            var s = "";
            while (Divs.length > divCnt) {
                s = eval("CurrDiv.style.ietop");
                if ((s != "") && (s != null)) {
                    divID = "mapDiv" + divCnt;
                    CurrDiv.setAttribute("id", divID);
                    setStyleById(divID, "top", CurrDiv.style.ietop);
                }
                divCnt++;
                CurrDiv = Divs[divCnt];
            }
        }
    }
}
 
/**
 * 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 );

/* Tweak to get CategoryTree extension to have trees expanded by default */
$( document ).ready(function() { $('.CategoryTreeToggle[data-ct-state="collapsed"]').click(); });