MediaWiki:Common.js

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

/*Add preview to file upload*/

/*Workaround for bug*/

function fixLicenseSelector { licenses = document.getElementById("wpLicense"); if ( licenses && licenses.options[1].value == "subst:Nolicense/subst" ) { licenses.selectedIndex = 1; licenses.remove(0); if ( mw.config.get('wgAjaxLicensePreview') ) { licenses.onchange; } } }

if (mw.config.get('wgPageName') == 'Special:Upload') { $(document).ready(fixLicenseSelector); mw.loader.load( 'MediaWiki:UploadPreview.js' ); }

/* Test if an element has a certain class ************************************** * * Description: Uses regular expressions and caching for better performance. * Maintainers: User:Mike Dillon, User:R. Koot, User:SG */ var hasClass = (function {    var reCache = {};    return function (element, className) {        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);   }; });

/** Collapsible tables ********************************************************* * * Description: Allows tables to be collapsed, showing only the header. See *              NavFrame. * Maintainers: User:R. Koot */ var autoCollapse = 2; var collapseCaption = "hide"; var expandCaption = "show"; function collapseSetCookie( id, state ) { var date = new Date; date.setTime(date.getTime+(30*24*60*60*1000)); var expires = "; expires="+date.toGMTString; var c='collapse' + id + '='+state+expires+ '; path=/'; document.cookie = c; }

function collapseGetCookieCollapsed( id ) { return document.cookie.indexOf('collapse' + id + '=1')!=-1; }

function collapseGetCookieNotCollapsed( id ) { return document.cookie.indexOf('collapse' + id + '=0')!=-1; }

function collapseOnlyTable( id ) { var Button = document.getElementById( "collapseButton" + id ); var Table = document.getElementById( id ); 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; } }

function collapseTableUncollapse( id ) { var Button = document.getElementById( "collapseButton" + id ); var Table = document.getElementById( id ); if ( !Table || !Button ) { return false; }   var Rows = Table.rows; if ( Button.firstChild.data == expandCaption ) { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = Rows[0].style.display; }       Button.firstChild.data = collapseCaption; } }

function collapseToggleTable( id ) { var Button = document.getElementById( "collapseButton" + id ); var Table = document.getElementById( id ); 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; collapseSetCookie(id,1); } else { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = Rows[0].style.display; }       Button.firstChild.data = collapseCaption; collapseSetCookie(id,0); } }

function createCollapseButtons {   var tableIndex = 0; var NavigationBoxes = new Object; var Tables = document.getElementsByTagName( "table" ); var Button, ButtonLink, ButtonText, CreateLink, CreateButton;

for ( var i = 0; i < Tables.length; i++ ) { if ( ! hasClass( Tables[i], "collapsible" ) ) continue

/* 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]; id = Tables[i].getAttribute("id"); if ( id == null || id == "") { id = "collapsibleTable" + tableIndex; Tables[i].setAttribute( "id", id ); }

// If there's already a button only add the JS handlers so the user can // add buttons at any location. Button = $(Tables[i]).find('.collapseButton') if (window.debug) { console.log(Tables[i]) console.log(Button) }       if ( Button.length > 0 ) { CreateButton = false; ButtonLink = Button.find('a') if ( ButtonLink.length === 0 ) { ButtonLink = document.createElement( "a" ) ButtonText = document.createTextNode( collapseCaption ); CreateLink = true; }           else { ButtonLink = ButtonLink[0] CreateLink = false; }           Button = Button[0] }       else { Button    = document.createElement( "span" ); ButtonLink = document.createElement( "a" ); ButtonText = document.createTextNode( collapseCaption ); Button.className = "collapseButton"; //Styles are declared in Common.css CreateLink = true; CreateButton = true; }

ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute( "id", "collapseButton" + id ); ButtonLink.setAttribute( "href", "javascript:collapseToggleTable('" + id + "');" );

if ( CreateLink ) { ButtonLink.appendChild( ButtonText ); Button.appendChild( document.createTextNode( "[" ) ); Button.appendChild( ButtonLink ); Button.appendChild( document.createTextNode( "]" ) ); }

if ( CreateButton ) { Header.insertBefore( Button, Header.childNodes[0] ); }       tableIndex++; }

for ( var i = 0; i < tableIndex; i++ ) { id = NavigationBoxes[i].getAttribute( "id" ); if ( hasClass( NavigationBoxes[i], "remembercollapse" ) ) { if (collapseGetCookieCollapsed(id)) { collapseOnlyTable(id); }       }        if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) { if ( hasClass( NavigationBoxes[i], "remembercollapse" ) ) { if (!collapseGetCookieNotCollapsed(id)) { collapseOnlyTable(id); }           } else { collapseOnlyTable( id ); }       }    }

}

$( createCollapseButtons );

function collapsedCommentLinkClickHandler(e) { e = e || window.event; var eventSource = e.target || e.srcElement; // firstly, collapse all tables var Tables = document.getElementsByTagName( "table" ); for ( var i = 0; i < Tables.length; i++ ) { if ( hasClass( Tables[i], "collapsible" ) ) { collapseOnlyTable( Tables[i].id ); }       }

// now, see if we can find the table to which this anchor refers var anchorIndex = eventSource.href.indexOf('#'); if (anchorIndex != -1) { var anchorName = eventSource.href.substring(anchorIndex+1); var tableDiv = document.getElementById(anchorName); if (tableDiv) { // look for a collapsible table nested in this div, and expand it			var tables = tableDiv.getElementsByTagName("table"); for (var i = 0; i < tables.length; ++i) { if (hasClass(tables[i], "collapsible") ) { collapseTableUncollapse(tables[i].id); } 			}		}	}	}

function addOnclickEventsToCollapsedCommentLinks { var spans = document.getElementsByTagName("span"); for (var i = 0; i < spans.length; ++i) { if (spans[i].hasChildNodes && hasClass(spans[i], "collapsed_comment_link")) { // look for links amongst this element's daughter elements var daughters = spans[i].getElementsByTagName("a"); for (var j = 0; j < daughters.length; ++j) { // add an onclick handler to this anchor daughters[j].onclick = collapsedCommentLinkClickHandler; }		}	} }

$(document).ready(addOnclickEventsToCollapsedCommentLinks);

/* override for inserMyNames

if (!('insertMyNameOverride' in window)) window.insertMyNameOverride = false;

/* insertMyName replaces the contents of a span with the id myName with the name of the user viewing the page

function insertMyName { var nameSpan = document.getElementById("myName"); if (nameSpan && mw.config.get('wgUserName')) { nameSpan.innerHTML = mw.config.get('wgUserName') + (window.insertMyNameOverride ? 'fake name' : ''); } }

$(document).ready(insertMyName);

/* insertMyName2 uses class instead of id, allows more than one replacement per page

function insertMyName2 { if (!mw.config.get('wgUserName')) return; newtext = mw.config.get('wgUserName') + (window.insertMyNameOverride ? 'fake name' : ''); $('#bodyContent .myName').each( function {   this.innerHTML = newtext;  } ); }

$(document).ready(insertMyName2);

/* Dawkins's Weasel by Jeeves

var _tags_to_evolve = new Array; var _offspring_per_generation = 1000; var _point_mutation_chance = 0.03;

// Why can't javascript be C, blast it. var _A = "A".charCodeAt(0); var _Z = "Z".charCodeAt(0); var _a = "a".charCodeAt(0); var _z = "z".charCodeAt(0);

function init_tagged_string(tag) {	// fuck IE. Hard. In the arse. var content = tag.textContent != undefined ? tag.textContent : tag.innerText; // probably if we have more than 100 chars, it'll take too long to converge. if (content.length <= 100) {		if (!tag.needle) {			tag.needle = content; }		var mutant = ""; for (var i = 0; i < content.length; ++i) {			var rand = Math.floor(Math.random * 26); var c = content.charCodeAt(i); if (c >= _A && c <= _Z) {				c = _A + rand; }			else if (c >= _a && c <= _z) {				c = _a + rand; }			mutant = mutant + String.fromCharCode(c); }		if (tag.textContent != undefined) { tag.textContent = mutant; } else { tag.innerText = mutant; }

_tags_to_evolve.push(tag); }	}

function give_birth(tag) {	var needle = tag.needle; var haystack = tag.textContent != undefined ? tag.textContent : tag.innerText; var fittest = ""; var fittestDelta = tag.textContent != undefined ? tag.textContent.length + 1 : tag.innerText.length + 1; var kiddies = _offspring_per_generation; while (--kiddies >= 0) {		var kiddy = ""; var kiddyDelta = 0; for (var i = 0; i < haystack.length; ++i) {			var c = haystack.charCodeAt(i); var target = needle.charCodeAt(i); if (c >= _A && c <= _Z) {				var prob = Math.random; if (prob <= _point_mutation_chance) {					var rand = Math.floor(Math.random * 26); c = _A + rand; }				}			else if (c >= _a && c <= _z) {				var prob = Math.random; if (prob <= _point_mutation_chance) {					var rand = Math.floor(Math.random * 26); c = _a + rand; }				}			kiddy = kiddy + String.fromCharCode(c); if (c != target) {				++kiddyDelta; }			}

if (fittestDelta > kiddyDelta) {			fittestDelta = kiddyDelta; fittest = kiddy; }		}	if (tag.textContent != undefined) { tag.textContent = fittest; } else { tag.innerText = fittest; }	return fittestDelta; }

function shag_like_bunnies(tag) {	var delta = give_birth(tag); if (delta != 0) {		setTimeout(function {shag_like_bunnies(tag);}, 1000); } }

function start_string_to_evolve(span) {	init_tagged_string(span); setTimeout(function {shag_like_bunnies(span);}, 1000); }

function setOnclick(stuff,tag) {	stuff.onclick = function {start_string_to_evolve(tag);} }

function init_strings_to_evolve {	$("#bodyContent .evolve").each(function	{		startbutton = document.createElement("span");		startbutton.style.cursor = "pointer";		startbutton.innerHTML = "start";		startbutton.style.color = "blue";		setOnclick(startbutton, this);		this.parentNode.insertBefore(startbutton, this)		space = document.createElement("TEXT");		if (space.textContent != undefined)		{			space.textContent = " ";		} else		{			space.innerText = " ";		}		this.parentNode.insertBefore(space, this)	}) }

$(document).ready(init_strings_to_evolve);

//end Weasel

/* Allows customisation of the sidebar ***************



function ModifySidebar(action, section, name, link) { try { switch (section) { case "languages": var target = "p-lang"; break; case "toolbox": var target = "p-tb"; break; case "navigation": var target = "p-navigation"; break; default: var target = "p-" + section; break; }       if (action == "add") { var node = document.getElementById(target) .getElementsByTagName('div')[0] .getElementsByTagName('ul')[0]; var aNode = document.createElement('a'); var liNode = document.createElement('li'); aNode.appendChild(document.createTextNode(name)); aNode.setAttribute('href', link); liNode.appendChild(aNode); liNode.className='plainlinks'; node.appendChild(liNode); }       if (action == "remove") { var list = document.getElementById(target) .getElementsByTagName('div')[0] .getElementsByTagName('ul')[0]; var listelements = list.getElementsByTagName('li'); for (var i = 0; i < listelements.length; i++) { if (listelements[i].getElementsByTagName('a')[0].innerHTML == name ||                   listelements[i].getElementsByTagName('a')[0].href == link) { list.removeChild(listelements[i]); }           }        }    } catch(e) { // lets just ignore what's happened return; } }

/**************************************** * Template:a ****************************************/ $(document).on('ready', function {	var msgs = {		a: 'View stored copy at archive.is',		w: 'View stored copy at wayback machine',	}	// Unfortunatly adding a title attribute can't be done with wiki markup	$('div#content .archive_link > sup > a.external').each(function { $(this).attr('title', msgs[$(this).html]) }) }); $(document).on('ready', function {	var msgs = {		a: 'View stored copy at archive.is',		w: 'View stored copy at wayback machine',	}	// Unfortunatly adding a title attribute can't be done with wiki markup	$('div#content .archive_link > sup > a.external').each(function { $(this).attr('title', msgs[$(this).html]) }) });