User:KamranMackey/common.js
< User:KamranMackey
Jump to navigation
Jump to search
Revision as of 02:01, 21 February 2015 by KamranMackey (talk | contribs) (Added a custom JS script to my user page.)
Note: After publishing, 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 / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */
/** Infobox collapsing script **/
$(".infoboxBlockImage img").each(function(){
width = parseInt($(this).attr("width"), 10);
if(width > 240){
$(this).attr("height","");
$(this).attr("width","240");
}
});
$(".infobox:not(.infoboxNoCollapse) td").each(function(){
if($(this).html().match(/{{{[^}]+}}}/)) $(this).parent("tr").hide()
});
$(".infobox:not(.infoboxNoCollapse) .infoboxSubsectionBreak, .infobox:not(.infoboxNoCollapse) tr.infoboxSectionHeader").each(function(){
flag = true;
next = $(this).next();
while(next && next != undefined && next.html() != undefined && !next.hasClass("infoboxSubsectionBreak") && !next.hasClass("infoboxSectionHeader")){
if(next.css("display") != "none") flag = false;
//console.info(next.html());
next = next.next();
}
//console.info(flag);
if(flag) $(this).hide();
});
/** Langbar **/
$(".langbarLink").children("a.new").parent(".langbarLink").hide();
/*
* Automatic slide creation in crafting grids.
*/
$(".CraftingGrid").each(function(){
maxFrames = 0;
$(this).find(".CraftingGridCell").each(function(){
frames = $(this).children("span:not(.ignore), div.GridTank:not(.ignore)").length;
if(frames > maxFrames){
maxFrames = frames;
}
// Initialize cell states
$(this).children("span:first-child:not(.ignore), div.GridTank:first-child:not(.ignore)").addClass("ActiveSlide");
});
if(maxFrames <= 1) return;
// Create crafting grid controls
$(this).append('<div class="CraftingGridControls" style="position:absolute; bottom:0; width:100%; text-align:center;"><input type="button" value="<" class="prevPage"><span class="pageNum">1</span>/<span class="pageCount">'+String(maxFrames)+'</span><input type="button" value=">" class="nextPage"></div>');
$(this).height($(this).height() + $(this).children(".CraftingGridControls").height());
// Implement controls
$(this).find(".nextPage").click(function(){
container = $(this).parents(".CraftingGrid");
container.find(".CraftingGridCell").each(function(){
if($(this).children(":not(.ignore)").length == 1){
$(this).removeClass(".CraftingGridCell");
return 0;
}
cur = $(this).find(".ActiveSlide");
next = cur.next("span:not(.ignore), div.GridTank:not(.ignore)");
if(next.length == 0){
next = cur.siblings("span:not(.ignore), div.GridTank:not(.ignore)").first();
}
cur.removeClass("ActiveSlide");
next.addClass("ActiveSlide");
});
pageNum = parseInt($(this).siblings("span.pageNum").html(),10) + 1;
if(pageNum > parseInt($(this).siblings("span.pageCount").html(),10)) pageNum = 1;
$(this).siblings("span.pageNum").html(pageNum);
});
$(this).find(".prevPage").click(function(){
container = $(this).parents(".CraftingGrid");
container.find(".CraftingGridCell").each(function(){
if($(this).children(":not(.ignore)").length == 1){
$(this).removeClass(".CraftingGridCell");
return 0;
}
cur = $(this).find(".ActiveSlide");
next = cur.prev("span:not(.ignore), div.GridTank:not(.ignore)");
if(next.length == 0){
next = cur.siblings("span:not(.ignore), div.GridTank:not(.ignore)").last();
}
cur.removeClass("ActiveSlide");
next.addClass("ActiveSlide");
});
pageNum = parseInt($(this).siblings("span.pageNum").html(),10) - 1;
if(pageNum == 0) pageNum = parseInt($(this).siblings("span.pageCount").html(),10);
$(this).siblings("span.pageNum").html(pageNum);
});
});
/*
* Script for flipping through galleries, intended to be used with crafting grids.
*/
$(".gallery > div, .gallery > span").addClass("page");
$(".gallery").append('<span class="controls"><input type="button" value="<" class="prevPage"><span class="pagenum"></span>/<span class="pagecount"></span><input type="button" value=">" class="nextPage"></span>');
$(".gallery > .page:first-child").addClass("active");
$(".gallery span.controls span.pagenum").html(1);
$(".gallery").each(function(){
$(this).find("span.pagecount").html($(this).children(".page").length);
});
$(".gallery span.controls input.prevPage").click(function(){
cur = $(this).parents(".gallery").children(".page.active");
next = cur.prev(".page");
if(next.length == 0){
next = cur.siblings(".page").last();
}
cur.removeClass("active");
next.addClass("active");
pageNum = parseInt($(this).siblings("span.pagenum").html(),10) - 1;
if(pageNum == 0) pageNum = parseInt($(this).siblings("span.pagecount").html(),10);
$(this).siblings("span.pagenum").html(pageNum);
});
$(".gallery span.controls input.nextPage").click(function(){
cur = $(this).parents(".gallery").children(".page.active");
next = cur.next(".page");
if(next.length == 0){
next = cur.siblings(".page").first();
}
cur.removeClass("active");
next.addClass("active");
pageNum = parseInt($(this).siblings("span.pagenum").html(),10) + 1;
if(pageNum > parseInt($(this).siblings("span.pagecount").html(),10)) pageNum = 1;
$(this).siblings("span.pagenum").html(pageNum);
});
/**
* Element animator (generic animation)
*
* Will cycle the active class on any child elements within an element with the animated class.
*/
// Remove from animated class if only one child
$('.animated').each(function(){
if($(this).children("span, div").length == 1){
$(this).removeClass("animated");
}
});
// Add the active class to all of the first child of .animated
$('.animated > span:first-child, .animated > div:first-child').addClass('active');
if ( $( '.animated' ).length ) {
setInterval( function(e) {
$( '.animated' ).each( function() {
var current = $( this ).find( '.active' ).removeClass( 'active' ), next = current.next();
if ( !current.next().length ) {
next = $( this ).children().eq( 0 );
}
next.addClass( 'active' );
} );
}, 2000 );
}
/**
* Pause grid templates with lots of cells in them (e.g. [[Template:Grid/Crafting Table]]) on mouseover
*
* This is so people have a chance to look at each image on the cell
* and click on pages they want to view.
*/
function pauseGrid( grid ) {
$( grid ).hover( function() {
$( this ).find( '.grid .animated' ).removeClass( 'animated' ).addClass( 'paused' );
}, function() {
$( this ).find( '.grid .paused' ).removeClass( 'paused' ).addClass( 'animated' );
} );
}
pauseGrid( '.grid-Crafting_Table' );
pauseGrid( '.grid-Furnace' );
pauseGrid( '.grid-Brewing_Stand' );
/* Any JavaScript here will be loaded for all users on every page load. */
$(document).ready( function() {
var pops = function( elems ) {
for (var i=0; i<elems.length; i++) {
if ( !(' '+elems[i].className+' ').match( / pops / ) ) continue;
var anchs = elems[i].getElementsByTagName('a');
for (var j=0; j<anchs.length; j++) anchs[j].target = '_blank';
}
};
var bc = document.getElementById('bodyContent');
var tags = ['span', 'div', 'table', 'td', 'th'];
for (var i=0; i<tags.length; i++) pops( bc.getElementsByTagName( tags[i] ) );
} );
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;
}
}
/** Collapsible tables *********************************************************
*
* Description: Allows tables to be collapsed, showing only the header. See
* http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
* Maintainers: [[en:User:R. Koot]]
*/
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($content) {
var tableIndex = 0;
var NavigationBoxes = new Object();
var Tables = $content[0].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 [[MediaWiki:Common.css]]
ButtonLink.style.color = Header.style.color;
ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
ButtonLink.setAttribute( 'href', "javascript:collapseTable(" + tableIndex + ");" );
Button.setAttribute( 'onClick', "collapseTable(" + tableIndex + ");" );
ButtonLink.appendChild( ButtonText );
Button.appendChild( document.createTextNode( '[' ) );
Button.appendChild( ButtonLink );
Button.appendChild( document.createTextNode( ']' ) );
Header.insertBefore( Button, Header.childNodes[0] );
Header.setAttribute( 'onClick', "collapseTable(" + tableIndex + ");" );
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;
}
}
}
}
}
mw.hook('wikipage.content').add(function ($content) {
(function () {
if (!$content.find('.load-page').length) {
console.log('Nothing to add hooks for!');
return;
}
console.log('Adding hooks!');
$content.on('click', '.load-page-button > a', function (e) {
e.preventDefault();
var $button = $(this).parent();
var $body = $button.closest('.load-page');
new mw.Api().get({
action: 'parse',
prop: 'text',
page: $body.data('page')
}).done(function (data) {
console.log('Loaded data!');
$body.html(data.parse.text['*']);
mw.hook('wikipage.content').fire($body);
}).fail(function (_, error) {
console.log('Failed to load data!');
});
console.log('Firing request to load data!');
});
}());
createCollapseButtons($content);
});
/** 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]]
*/
function hasClass(element, className) {
return new RegExp( "(?:\\s|^)" + className + "(?:\\s|$)" ).test(element.className);
}
/**
* Creates minecraft style tooltips
*
* Replaces normal tooltips. Supports [[mcw:formatting codes]] (except k),
* a description with line breaks ("/"), and character escaping with "\".
*/
( function() {
var $tooltip,
escapeChars = { '\\&': '&', '<': '<', '>': '>' },
escape = function( text ) {
// "\" must be escaped first
return text.replace( /\\\\/g, '\' )
.replace( /\\&|[<>]/g, function( char ) { return escapeChars[char]; } );
},
$win = $( window ), winWidth, winHeight, width, height;
$( '#mw-content-text' ).on( {
'mouseenter.minetip': function( e ) {
var $elem = $( this ), title = $elem.attr( 'data-minetip-title' );
// No title or title only contains formatting codes
if ( title === undefined || title && title.replace( /&([0-9a-fl-or])|\s+/g, '' ) === '' ) {
// Find deepest child title
var childElem = $elem[0], childTitle;
do {
if ( childElem.hasAttribute( 'title' ) ) {
childTitle = childElem.title;
}
childElem = childElem.firstChild;
} while( childElem && childElem.nodeType === 1 );
if ( childTitle === undefined ) {
return;
}
// Append child title as title may contain formatting codes
if ( !title ) {
title = '';
}
title += childTitle;
// Set the retrieved title as data for future use
$elem.attr( 'data-minetip-title', title );
}
if ( !$elem.data( 'minetip-ready' ) ) {
// Remove title attributes so the native tooltip doesn't get in the way
$elem.find( '[title]' ).addBack().removeAttr( 'title' );
$elem.data( 'minetip-ready', true );
}
if ( title === '' ) {
return;
}
// Apply normal escaping
title = escape( title );
var text = '<span class="minetip-title">' + title + '&r</span>';
var description = $elem.attr( 'data-minetip-text' );
if ( description ) {
// Apply normal escaping plus "/"
description = escape( description ).replace( /\\\//g, '/' );
text += '<span class="minetip-description">' + description.replace( /\//g, '<br>' ) + '&r</span>';
}
// Add classes for minecraft formatting codes
while ( /&[0-9a-fl-o]/.test( text ) ) {
text = text.replace( /&([0-9a-fl-o])(.*?)(&r|$)/g, '<span class="format-$1">$2</span>&r' );
}
// Remove reset formatting
text = text.replace( /&r/g, '' );
// Unescape "&" so HTML entities work
text = text.replace( /&/g, '&' );
$tooltip = $( '#minetip-tooltip' );
if ( !$tooltip.length ) {
$tooltip = $( '<div id="minetip-tooltip">' ).appendTo( 'body' );
}
$tooltip.html( text );
// Cache current window and tooltip size
winWidth = $win.width();
winHeight = $win.height();
width = $tooltip.outerWidth( true );
height = $tooltip.outerHeight( true );
// Trigger a mouse movement to position the tooltip
$elem.trigger( 'mousemove', e );
},
'mousemove.minetip': function( e, trigger ) {
if ( !$( '#minetip-tooltip' ).length ) {
$( this ).trigger( 'mouseenter' );
return;
}
// Get event data from remote trigger
e = trigger || e;
// Get mouse position and add default offsets
var top = e.clientY - 34,
left = e.clientX + 14;
// If going off the right of the screen, go to the left of the cursor
if ( left + width > winWidth ) {
left -= width + 36;
}
// If now going off to the left of the screen, resort to going above the cursor
if ( left < 0 ) {
left = 0;
top -= height - 22;
// Go below the cursor if too high
if ( top < 0 ) {
top += height + 47;
}
// Don't go off the top of the screen
} else if ( top < 0 ) {
top = 0;
// Don't go off the bottom of the screen
} else if ( top + height > winHeight ) {
top = winHeight - height;
}
// Apply the positions
$tooltip.css( { top: top, left: left } );
},
'mouseleave.minetip': function() {
if ( !$tooltip ) {
return;
}
$tooltip.remove();
}
}, '.minetip, .grid' );
}() );
$(".gridTankContainer").each(function(){
// Get tank info
var max = $( this ).data( 'tank-max' ) || 10000;
// Tile liquid image
$(this).find(".tankLiquidImageContainer.minetip .tankLiquidImage").each(function(){
var usage = $( this ).data( 'tank-usage' ) || 5000;
var imglink = $(this).find("img").hide().attr("src");
$(this).css({
backgroundImage: 'url(' + imglink + ')',
backgroundRepeat: 'repeat',
backgroundPosition: 'bottom',
height: usage / max * 100 + '%'
});
});
});
/**
* Special page reporting
*
* @athor cblair91
* @version 1.0
*/
(function ($, mw) {
function apiQuery() {
var pages = [
'BrokenRedirects',
'DoubleRedirects',
'Unusedcategories',
'Unusedimages',
'Wantedcategories',
'Wantedfiles',
'Wantedpages',
'Wantedtemplates'
],
i;
for (i = 0; i < pages.length; i++) {
(function (i) {
$.getJSON('/api.php?action=query&list=querypage&qppage=' + pages[i] + '&qplimit=100&format=json', function (data) {
$('#' + pages[i]).text(data.query.querypage.results.length);
});
}(i));
}
}
$(function () {
if (document.getElementsByClassName('specialMaintenance').length) {
apiQuery();
}
if (mw.config.get('wgCanonicalSpecialPageName') === 'Specialpages') {
$('#mw-content-text').before('<div id="spreport">' +
'<div><a href="/Special:BrokenRedirects" title="Special:BrokenRedirects" target="_blank">Broken redirects (<span id="BrokenRedirects"></span>)</a> • <a href="/Special:DoubleRedirects" title="Special:DoubleRedirects" target="_blank">Double redirects (<span id="DoubleRedirects"></span>)</a> • <a href="/Special:Unusedcategories" title="Special:Unusedcategories" target="_blank">Unused categories (<span id="Unusedcategories"></span>)</a> • <a href="/Special:Unusedimages" titl ="Unusedimages" target="_blank">Unused images (<span id="Unusedimages"></span>)</div>' +
'<div><a href="/Special:Wantedcategories" title="Special:Wantedcategories" target="_blank">Wanted categories (<span id="Wantedcategories"></span>)</a> • <a href="/Special:Wantedfiles" title="Special:Wantedfiles" target="_blank">Wanted files (<span id="Wantedfiles"></span>)</a> • <a href="/Special:Wantedpages" title="Special:Wantedpages" target="_blank">Wanted pages (<span id="Wantedpages"></span>)</a> • <a href="/Special:Wantedtemplates" titl ="Special:Wantedtemplates" target="_blank">Wanted templates (<span id="Wantedtemplates"></span>)</a></div>' +
'</div>');
apiQuery();
}
});
}(jQuery, mediaWiki));