User:KamranMackey/common.js

From Industrial-Craft-Wiki
< User:KamranMackey
Revision as of 02:01, 21 February 2015 by KamranMackey (talk | contribs) (Added a custom JS script to my user page.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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 = { '\\&': '&#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));