Difference between revisions of "User:KamranMackey/common.js"

From Industrial-Craft-Wiki
Jump to navigation Jump to search
(Added a custom JS script to my user page.)
 
(Actually, scratch that. Blanked the page.)
Line 1: Line 1:
/* 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 = { '\\&': '&#38;', '<': '&#60;', '>': '&#62;' },
escape = function( text ) {
// "\" must be escaped first
return text.replace( /\\\\/g, '&#92;' )
.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, '&#47;' );
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( /&#38;/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> &bull; <a href="/Special:DoubleRedirects" title="Special:DoubleRedirects" target="_blank">Double redirects (<span id="DoubleRedirects"></span>)</a> &bull; <a href="/Special:Unusedcategories" title="Special:Unusedcategories" target="_blank">Unused categories (<span id="Unusedcategories"></span>)</a> &bull; <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> &bull; <a href="/Special:Wantedfiles" title="Special:Wantedfiles" target="_blank">Wanted files (<span id="Wantedfiles"></span>)</a> &bull; <a href="/Special:Wantedpages" title="Special:Wantedpages" target="_blank">Wanted pages (<span id="Wantedpages"></span>)</a> &bull; <a href="/Special:Wantedtemplates" titl ="Special:Wantedtemplates" target="_blank">Wanted templates (<span id="Wantedtemplates"></span>)</a></div>' +
            '</div>');
            apiQuery();
        }
    });
}(jQuery, mediaWiki));

Revision as of 02:04, 21 February 2015