You are not currently logged in. Are you accessing the unsecure (http) portal? Click here to switch to the secure portal. |
Do you have permission to re-use this image? Just because scans appear on Wiktenauer does not mean that they are free to use. Wiktenauer is a 501(c)(3) nonprofit, and many of the scans we host are only licensed for nonprofit use. In other cases, the scans have no standard license and Wiktenauer has received special permission to host them (and can't grant that permission to anyone else). The license terms appear in the Copyright and License Terms box at the bottom of the page that sent you here. When in doubt, always check with the museum or library that owns a manuscript before publishing or otherwise reusing its scans. |
MediaWiki:Common.js
Revision as of 17:26, 2 June 2020 by Christian Trosclair (talk | contribs)
Note: After saving, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Clear the cache in Tools → Preferences
/*jshint forin:false, strict:false, onecase:true, laxbreak:true, browser:true, jquery:true */
mw.loader.using('mediawiki.util', function() {
/* Begin of mw.loader.using callback */
/*
* Make table headers hover at the top of the screen
*/
function UpdateTableHeaders() {
$("div.divTableWithFloatingHeader").each(function() {
var originalHeaderRow = $(".tableFloatingHeaderOriginal", this);
var floatingHeaderRow = $(".tableFloatingHeader", this);
var offset = $(this).offset();
var scrollTop = $(window).scrollTop();
if ((scrollTop > offset.top) && (scrollTop < offset.top + $(this).height())) {
floatingHeaderRow.css("visibility", "visible");
floatingHeaderRow.css("top", Math.min(scrollTop - offset.top, $(this).height() - floatingHeaderRow.height()) + "px");
// Copy cell widths from original header
$("th", floatingHeaderRow).each(function(index) {
var cellWidth = $("th", originalHeaderRow).eq(index).css('width');
$(this).css('width', cellWidth);
});
// Copy row width from whole table
floatingHeaderRow.css("width", $(this).css('width'));
}
else {
floatingHeaderRow.css("visibility", "hidden");
floatingHeaderRow.css("top", "0px");
}
});
}
$(document).ready(function() {
$("table.floated").each(function() {
$(this).wrap("<div class=\"divTableWithFloatingHeader\" style=\"position:relative\"></div>");
var originalHeaderRow = $("tr:first", this);
originalHeaderRow.before(originalHeaderRow.clone());
var clonedHeaderRow = $("tr:first", this);
clonedHeaderRow.addClass("tableFloatingHeader");
clonedHeaderRow.css("position", "absolute");
clonedHeaderRow.css("top", "0px");
clonedHeaderRow.css("left", $(this).css('margin-left'));
clonedHeaderRow.css("visibility", "hidden");
clonedHeaderRow.css("width", $(this).css('width'));
originalHeaderRow.addClass("tableFloatingHeaderOriginal");
});
UpdateTableHeaders();
$(window).scroll(UpdateTableHeaders);
$(window).resize(UpdateTableHeaders);
});
/**
* Redirect User:Name/skin.js and skin.css to the current skin's pages (unless the 'skin' page really exists)
* @source: http://www.mediawiki.org/wiki/Snippets/Redirect_skin.js
* @rev: 2
*/
if ( mw.config.get( 'wgArticleId' ) === 0 && mw.config.get( 'wgNamespaceNumber' ) == 2 ) {
var titleParts = mw.config.get( 'wgPageName' ).split( '/' );
// Make sure there was a part before and after the slash
// And that the latter is 'skin.js' or 'skin.css'
if ( titleParts.length == 2 ) {
var userSkinPage = titleParts.shift() + '/' + mw.config.get( 'skin' );
if ( titleParts.slice(-1) == 'skin.js' ) {
window.location.href = mw.util.wikiGetlink( userSkinPage + '.js' );
} else if ( titleParts.slice(-1) == 'skin.css' ) {
window.location.href = mw.util.wikiGetlink( userSkinPage + '.css' );
}
}
}
/** Map addPortletLink to mw.util
*/
window.addPortletLink = function() {
return mw.util.addPortletLink.apply( mw.util, arguments );
};
/** extract a URL parameter from the current URL **********
*
* @deprecated: Use mw.util.getParamValue with proper escaping
*/
window.getURLParamValue = function() {
return mw.util.getParamValue.apply( mw.util, arguments );
};
/** &withCSS= and &withJS= URL parameters *******
* Allow to try custom scripts from MediaWiki space without editing personal .css or .js files
*/
var extraCSS = mw.util.getParamValue("withCSS");
if ( extraCSS && extraCSS.match(/^MediaWiki:[^&<>=%]*\.css$/) ) {
mw.loader.load( '/wiki/index.php?title=' + extraCSS + '&action=raw&ctype=text/css', 'text/css');
}
var extraJS = mw.util.getParamValue("withJS");
if ( extraJS && extraJS.match(/^MediaWiki:[^&<>=%]*\.js$/) ) {
mw.loader.load( '/wiki/index.php?title=' + extraJS + '&action=raw&ctype=text/javascript');
}
/* Test if an element has a certain class
*
* @deprecated: Use $(element).hasClass() instead.
*/
window.hasClass = ( function() {
var reCache = {};
return function (element, className) {
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
};
})();
/* collapsible element for {treatise begin} */
(function($, mw) {
'use strict';
var slideDuration = (mw.config.get('skin') === 'vector') ? 150 : 0;
var launch = function() {
$('div.collapsibleheader').show();
$('div.collapsibletemplate.collapsed div.body').hide();
$('table.collapsible.collapsed > tbody > tr:not(:first-child)').toggleClass('hidden');
$('div.collapsibletemplate div.body');
function toggleTemplate($element) {
if ($element.is('tr')) {
$element
.parent().parent()
.toggleClass('collapsed');
$element.nextAll('tr')
.toggleClass('hidden');
// support old browsers without first-child support
$element.toggleClass('collapsibleCollapsedTH');
} else {
$element
.parent()
.toggleClass('expanded')
.toggleClass('collapsed')
.find('div.body')
.slideToggle(slideDuration);
}
}
var $headings = $('div.collapsibletemplate > div.collapsibleheader, table.collapsible > tbody > tr:first-child');
// support old browsers without first-child support
$('table.collapsible > tbody > tr:first-child th').addClass('collapsibleTH');
$headings.mousedown(function(e) {
var $t = $(e.target);
if ($t.is('a') || $t.parents('a').length !== 0) {
return true;
} else {
toggleTemplate($(this));
return false;
}
});
};
mw.hook( 'wikipage.content' ).add( launch );
}(jQuery, mediaWiki));
/** Collapsible tables *********************************************************
*
* Description: Allows tables to be collapsed, showing only the header. See [[Wikipedia:NavFrame]].
*/
var autoCollapse = 2;
var collapseCaption = "less";
var expandCaption = "more";
window.collapseTable = function( tableIndex ){
var Button = document.getElementById( "collapseButton" + tableIndex );
var Table = document.getElementById( "collapsibleTable" + tableIndex );
if ( !Table || !Button ) {
return false;
}
var Rows = Table.rows;
if ( Button.firstChild.data == collapseCaption ) {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = "none";
}
Button.firstChild.data = expandCaption;
} else {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = Rows[0].style.display;
}
Button.firstChild.data = collapseCaption;
}
}
function createCollapseButtons(){
var tableIndex = 0;
var NavigationBoxes = new Object();
var Tables = document.getElementsByTagName( "table" );
for ( var i = 0; i < Tables.length; i++ ) {
if ( hasClass( Tables[i], "collapsible" ) ) {
/* only add button and increment count if there is a header row to work with */
var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0];
if (!HeaderRow) continue;
var Header = HeaderRow.getElementsByTagName( "th" )[0];
if (!Header) continue;
NavigationBoxes[ tableIndex ] = Tables[i];
Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
var Button = document.createElement( "span" );
var ButtonLink = document.createElement( "a" );
var ButtonText = document.createTextNode( collapseCaption );
Button.className = "collapseButton"; //Styles are declared in Common.css
ButtonLink.style.color = Header.style.color;
ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
ButtonLink.setAttribute( "href", "#" );
addHandler( ButtonLink, "click", new Function( "evt", "collapseTable(" + tableIndex + " ); return killEvt( evt );") );
ButtonLink.appendChild( ButtonText );
Button.appendChild( document.createTextNode( "[" ) );
Button.appendChild( ButtonLink );
Button.appendChild( document.createTextNode( "]" ) );
Header.insertBefore( Button, Header.firstChild );
tableIndex++;
}
}
for ( var i = 0; i < tableIndex; i++ ) {
if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
collapseTable( i );
}
else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) {
var element = NavigationBoxes[i];
while (element = element.parentNode) {
if ( hasClass( element, "outercollapse" ) ) {
collapseTable ( i );
break;
}
}
}
}
}
$( createCollapseButtons );
/** Dynamic Navigation Bars (experimental) *************************************
*
* Description: See [[Wikipedia:NavFrame]].
* Maintainers: UNMAINTAINED
*/
// set up the words in your language
var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';
// shows and hides content and picture (if available) of navigation bars
// Parameters:
// indexNavigationBar: the index of navigation bar to be toggled
window.toggleNavigationBar = function(indexNavigationBar){
var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
if (!NavFrame || !NavToggle) {
return false;
}
// if shown now
if (NavToggle.firstChild.data == NavigationBarHide) {
for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
NavChild.style.display = 'none';
}
}
NavToggle.firstChild.data = NavigationBarShow;
// if hidden now
} else if (NavToggle.firstChild.data == NavigationBarShow) {
for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
NavChild.style.display = 'block';
}
}
NavToggle.firstChild.data = NavigationBarHide;
}
}
// adds show/hide-button to navigation bars
function createNavigationBarToggleButton(){
var indexNavigationBar = 0;
// iterate over all < div >-elements
var divs = document.getElementsByTagName("div");
for (var i = 0; NavFrame = divs[i]; i++) {
// if found a navigation bar
if (hasClass(NavFrame, "NavFrame")) {
indexNavigationBar++;
var NavToggle = document.createElement("a");
NavToggle.className = 'NavToggle';
NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
var isCollapsed = hasClass( NavFrame, "collapsed" );
/*
* Check if any children are already hidden. This loop is here for backwards compatibility:
* the old way of making NavFrames start out collapsed was to manually add style="display:none"
* to all the NavPic/NavContent elements. Since this was bad for accessibility (no way to make
* the content visible without JavaScript support), the new recommended way is to add the class
* "collapsed" to the NavFrame itself, just like with collapsible tables.
*/
for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
if ( NavChild.style.display == 'none' ) {
isCollapsed = true;
}
}
}
if (isCollapsed) {
for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
NavChild.style.display = 'none';
}
}
}
var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide);
NavToggle.appendChild(NavToggleText);
// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
for(var j=0; j < NavFrame.childNodes.length; j++) {
if (hasClass(NavFrame.childNodes[j], "NavHead")) {
NavToggle.style.color = NavFrame.childNodes[j].style.color;
NavFrame.childNodes[j].appendChild(NavToggle);
}
}
NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
}
}
}
$( createNavigationBarToggleButton );
/** Table sorting fixes ************************************************
*
* Description: Disables code in table sorting routine to set classes on even/odd rows
*/
ts_alternate_row_colors = false;
/** IPv6 AAAA connectivity testing
var __ipv6wwwtest_factor = 100;
var __ipv6wwwtest_done = 0;
if ((wgServer != "https://secure.wikimedia.org") && (Math.floor(Math.random()*__ipv6wwwtest_factor)==42)) {
importScript("MediaWiki:Common.js/IPv6.js");
}
**/
/** Magic editintros ****************************************************
*
* Description: Adds editintros on disambiguation pages and BLP pages.
*/
function addEditIntro( name ) {
$( '.editsection, #ca-edit' ).find( 'a' ).each( function( i, el ) {
el.href = $(this).attr("href") + '&editintro=' + name;
});
}
if (wgNamespaceNumber === 0) {
$(function(){
if (document.getElementById('disambigbox')) {
addEditIntro('Template:Disambig_editintro');
}
});
$(function(){
var cats = document.getElementById('mw-normal-catlinks');
if (!cats) {
return;
}
cats = cats.getElementsByTagName('a');
for (var i = 0; i < cats.length; i++) {
if (cats[i].title == 'Category:Living people' || cats[i].title == 'Category:Possibly living people') {
addEditIntro('Template:BLP_editintro');
break;
}
}
});
}
/* End of mw.loader.using callback */
} );
/* DO NOT ADD CODE BELOW THIS LINE */