MediaWiki:Wikia.js

/** * BEGIN Script configurations

$(window).extend(true, window, {	// -	// AjaxRC	// -	ajaxPages: new Array( "Special:WikiActivity", "Special:WikiActivity/watchlist", "Special:WikiActivity/feeds", "Special:WikiActivity/images", "Special:MultipleActivity", "Special:SocialActivity", "Special:RecentChanges", "Special:RecentChangesLinked", "Special:Log", "Special:Contributions", "Special:NewFiles", "Special:ListFiles", "Special:Videos", "Special:NewPages", "Blog:Recent_posts" ),	ajaxRefresh:           30000,	AjaxRCRefreshText:      'Auto-refresh',    AjaxRCRefreshHoverText: 'Automatically refresh the page over time',    ajaxIndicator: 'https://vignette.wikia.nocookie.net/deathbattlefanon/images/d/de/Ajax-loader.gif/revision/latest?cb=20200828094018',    //     // ImprovedTabbers    //     ImprovedTabbers: {    	HideHeaderTitle:     true,    	HideContentTitle:    true,    	HumanReadableAnchor: true,    	SynchroInfoboxes:    true,    	SynchroTabbers:      false    },    // -    // MassCategorization    // -    MassCategorization: {    	delay: 2500    },	// -	// MassEdit	// -	MassEditConfig: {		interval: 2500	},	// -	// AjaxBatch(Un)Delete	// -	batchDeleteDelay:   2500,	batchUndeleteDelay: 2500,	// -	// DiscussionsActivity	// -	rdaRefreshInterval: 120000,	// 	// WikiActivity	// 	rwaOptions: {	    limit:             150,	    namespaces:        [0, 1, 2, 3, 4, 5, 6, 7, 110, 111, 500, 501, 828, 829], autoInit:         true, themeName:        "main", showBotEdits:     false, loadModule:       true, customRendering:  {}, headerLink:       false, // Do not set to true in sitewide (ToU violation) refresh:          true, refreshDelay:     (5  * 60 * 1000), timeout:          (10 * 1000) } });

/** * END Script configurations

/** * BEGIN Functions

// - // Test if an element has a certain class. // Increases general performance. // Taken from Wikipedia's Common.js // -

var hasClass = (function {   var reCache = {};    return function(element, className) {        return (reCache[className] ? reCache[className]: (reCache[className] =        	new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className); };});

// - // Collapsible tables; allows tables to be collapsed, showing only the header. // See NavFrame. Taken from Wikipedia's Common.js. // - var autoCollapse = 2; var collapseCaption = "hide"; var expandCaption = "show"; 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.style.styleFloat = "right"; Button.style.cssFloat = "right"; Button.style.fontWeight = "normal"; Button.style.textAlign = "right"; Button.style.width = "6em"; 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); }   } } createCollapseButtons;

// - // Dynamic Navigation Bars // Description: See NavFrame. // Taken from Wikipedia's Common.js. // -

// 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

function toggleNavigationBar(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, 'NavPic')) { NavChild.style.display = 'none'; }        if (hasClass(NavChild, 'NavContent')) { 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, 'NavPic')) { NavChild.style.display = 'block'; }        if (hasClass(NavChild, 'NavContent')) { NavChild.style.display = 'block'; }    } NavToggle.firstChild.data = NavigationBarHide; } }

// adds show/hide-button to navigation bars

function createNavigationBarToggleButton { var indexNavigationBar = 0; // iterate over all -elements var divs = document.getElementsByTagName("div"); for(        var i = 0;          i < divs.length;          i++     ) { NavFrame = divs[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 NavToggleText = document.createTextNode(NavigationBarHide); for (             var NavChild = NavFrame.firstChild;              NavChild !== null;              NavChild = NavChild.nextSibling             ) { if (hasClass(NavChild, 'NavPic') || hasClass(NavChild, 'NavContent')) { if (NavChild.style.display == 'none') { NavToggleText = document.createTextNode(NavigationBarShow); break; }            }         }

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")) { NavFrame.childNodes[j].appendChild(NavToggle); }        }         NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar); } } }

createNavigationBarToggleButton;

// ************************************************** // Experimental JavaScript countdown timer (Splarka) // Version 0.0.3 // ************************************************** // // Usage example: // //  Only January 01 2007 00:00:00 PST until New years. // //  JavaScript disabled. function updatetimer(i) { var now = new Date; var then = timers[i].eventdate; var diff = count = Math.floor((then.getTime - now.getTime) / 1000); // catch bad date strings if(isNaN(diff)) { timers[i].firstChild.nodeValue = '** ' + timers[i].eventdate + ' **' ; return; } // determine plus/minus if(diff < 0) { diff = -diff; var tpm = 'T plus '; } else { var tpm = 'T minus '; } // calculate the diff var left = (diff % 60) + ' seconds'; diff = Math.floor(diff / 60); if(diff > 0) left = (diff % 60) + ' minutes ' + left; diff = Math.floor(diff / 60); if(diff > 0) left = (diff % 24) + ' hours ' + left; diff = Math.floor(diff / 24); if(diff > 0) left = diff + ' days ' + left; timers[i].firstChild.nodeValue = tpm + left; // a setInterval is more efficient, but calling setTimeout // makes errors break the script rather than infinitely recurse timeouts[i] = setTimeout('updatetimer('+i+')', 1000); } function checktimers { //hide 'nocountdown' and show 'countdown' var nocountdowns = getElementsByClassName(document, 'span', 'nocountdown'); for(var i in nocountdowns) nocountdowns[i].style.display = 'none'; var countdowns = getElementsByClassName(document, 'span', 'countdown'); for(var i in countdowns) countdowns[i].style.display = 'inline'; //set up global objects timers and timeouts. timers = getElementsByClassName(document, 'span', 'countdowndate'); //global timeouts = new Array; // generic holder for the timeouts, global if(timers.length === 0) return; for(var i in timers) { timers[i].eventdate = new Date(timers[i].firstChild.nodeValue); updatetimer(i); //start it up  } }

checktimers;

// --- // Makes display the username of the vistor // Requires copying of Template:Username // --- $(function UserNameReplace {   if (typeof(disableUsernameReplace) !== 'undefined' && disableUsernameReplace || wgUserName === null) return;   $(".Username").text(wgUserName); });

// --- // Allows CSS to target pages with a specific template. // Made by KockaAdmiralac upon request. // $('body').attr('data-topic', $('#mw-content-text .article-topic').attr('data-topic'));

// --- // Sorts content on Special:WhatLinksHere alphabetically // --

!function($) { if (wgCanonicalSpecialPageName !== 'Whatlinkshere') return; var sorted_list, $list = $('#mw-whatlinkshere-list'); sorted_list       = $list.children('li').sort(function (a, b) {        	return ( $(a).find('a:first').attr('title') > $(b).find('a:first').attr('title') ) ? 1: -1;   	});    $list.children('li').remove; $list.append(sorted_list); }(jQuery);

// - // Adds links to Special:WhatLinksHere to edit pages linked on it. // By OneTwoThreeFall // -

if (mw.config.get('wgCanonicalSpecialPageName') === 'Whatlinkshere') { $('#mw-whatlinkshere-list > li').each(function (ignore, element) {       var link = new mw.Uri($(element).children('a').attr('href'));        link.extend({action: 'edit'});        $(element).find('.mw-whatlinkshere-tools > a:last-child')            .after(' | ', $('').attr('href', link.toString).text('edit'));    }); }

// --- // Allows more in-depth resizing of images // ---

$(".image-resize").each(function {   var a   = $(this).children(".image-resize-new").text.split("_"),        img = $(this).find("img");    if (!isNaN(Number(a[1])) && !isNaN(Number(a[1]))) {        img.attr({ width: a[0], height: a[1] });   } });

// -- // Bureaucrat certainity messages // --

var BuroWarning = "Do you truly want to promote this user to bureaucrat?" +    			  " This is irreversible through conventional means!"; !function { if (wgCanonicalSpecialPageName !== 'Userrights') return;

$('#mw-content-text').on('change', '#wpGroup-bureaucrat', function {   if (!!$('#wpGroup-bureaucrat').attr('checked') && !confirm(String(BuroWarning)))          $('#wpGroup-bureaucrat').attr('checked', null);  }); };

/** * END Functions