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.)
 
(Deleted the tooltip code from my common JS since it's been moved over to the main JS.)
 
(14 intermediate revisions by the same user not shown)
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
/* Counts all your edits and saves them to a page ( http://en.wikipedia.org/wiki/User:Kanegasi/editcounter ) */
if (mw.config.get('wgTitle') === mw.config.get('wgUserName') && mw.config.get('wgNamespaceNumber') === 2) {
/* begin options */
   
   
/** Infobox collapsing script **/
/* end options */
$(".infoboxBlockImage img").each(function(){
    mw.loader.load('https://en.wikipedia.org/w/index.php?title=User:Kanegasi/editcounter.js&action=raw&ctype=text/javascript');
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));

Latest revision as of 06:03, 23 February 2015

/* Counts all your edits and saves them to a page ( http://en.wikipedia.org/wiki/User:Kanegasi/editcounter ) */
if (mw.config.get('wgTitle') === mw.config.get('wgUserName') && mw.config.get('wgNamespaceNumber') === 2) {
/* begin options */
 
/* end options */
    mw.loader.load('https://en.wikipedia.org/w/index.php?title=User:Kanegasi/editcounter.js&action=raw&ctype=text/javascript');
}