MediaWiki:Common.js

From Gigantic Wiki
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. */
/* Based on Terraria Wiki's Common.js on Feb 2024 */


// load various utilities from the commons wiki, including l10nFactory and isEditorActive
/*mw.loader.getScript( 'https://commons.wiki.gg/index.php?title=MediaWiki:Common-base.js&action=raw&ctype=text/javascript' ).then(function(){*/
$(function(){

////////////////////////////////////////////////////////////////////////////////

/**
 * content width toggle
 */
$(function(){
	$body = $('body');
	$('<div id="nav-content-size-toggle"><span></span></div>')
	.prependTo($('#mw-head'))
	.on('click', function(){
		$body.toggleClass('content-size-expanded');
		$(window).trigger('resize');
	});
});

////////////////////////////////////////////////////////////////////////////////

/**
 * sidebar nav menu toggle for mobile view
 */
$(function(){
	$('<div class="menu-toggle"/>').insertBefore($('#p-logo')).on("click", function(event){
		event.stopPropagation();
		$(this).toggleClass('expanded');
	});
});

////////////////////////////////////////////////////////////////////////////////
/**
 * mobile floating fix
 */
$(function(){
	var $contentBox = $('#mw-content-text .mw-parser-output');
	var $elements = $contentBox.children();
	var handle = function(){
		var fullWidth = $contentBox.width();
		if(!fullWidth){
			return;
		}
		var offset = $contentBox.offset().left;
		$elements.removeClass('mobile-floating-fix mobile-fullwidth');

		if(fullWidth > 720){
			return;
		}

		var maxLeft = 0;
		for(var i=$elements.length; i>0; i--){
			var $el = $($elements[i-1]);
			if($el.css('float') == 'right'){
				var left = $el.offset().left;
				if(left - offset < 300 || (maxLeft && left < maxLeft + 12) ){
					$el.addClass('mobile-floating-fix');
					maxLeft = Math.max(maxLeft, left + $el.outerWidth());
					continue;
				}
			}
			maxLeft = 0;
		}
		
		var threshold = Math.min(90, fullWidth*0.25);
		$('#mw-content-text .infobox, #mw-content-text .portable-infobox').each(function(){
			var $el = $(this);
			if(fullWidth - $el.outerWidth() <  threshold){
				$el.addClass('mobile-fullwidth');
			}
		});
	};
	handle();
	$(window).on('resize', mw.util.debounce( handle, 200) );
});

////////////////////////////////////////////////////////////////////////////////

/**
 * for other templates
 */
$(function(){
	/* Select links to new tabs for [[Template:Ilnt]] and [[Template:Elnt]] */
	$('.linkNewTab a').attr('target','_blank');

	/* mode tabs switch for [[Template:Npc infobox]] and [[Template:Npc infobox/tablestart]] and so on */
	/* TODO: adapt for Aurion/Devaedra, and maybe for upgrade trees */
	$('.modesbox .modetabs .tab').on('click', function(){
		var $this = $(this);
		if($this.hasClass('current')){
			return;
		}
		$this.parent().children().removeClass('current');
		$this.addClass('current');
		$this.closest('.modesbox').removeClass('c-expert c-master c-normal').addClass($this.hasClass('normal')?'c-normal':($this.hasClass('expert')?'c-expert':'c-master'));
	});

	/* [[Template:Spoiler]] */
	$('.spoiler-content').on('click', function(){
		$(this).toggleClass('show');
	});

	/* [[Template:ToggleBox]] */
	$('.trw-togglehandle').on('click', function(){
		$(this).closest('.trw-toggleable').toggleClass(['toggled', 'not-toggled']);
	});
});

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

/**
 * Main page layout helper
 */
$(function() {
	/* Main page responsive breakpoints. */
	// Since the width of the content box may vary, we can not use media query.
	// These values are ported from legacy hydra skin.
	var $btn = $('#box-wikiheader #box-wikiheader-toggle-link');
	if(!$btn.length) {
		return;
	}
	var $content = $('#content');
	var $header = $('#box-wikiheader');

	function initiate_collapsible() {
		var $width = $content.width();
		// $offset is (fullwidth - content width) under hydra skin.
		// Therefore ($width - $offset) is the width of content box.
		var $offset = $width > 980 ? 250 : ($width > 500 ? 42: 12);

		//header
		$header.toggleClass('collapsable', $width < 1300);
		$header.toggleClass('collapsed', $width < 730);

		//row breaks of flexboxes
		$content
			.toggleClass('box-row-l', ($width <= 3500-$offset) && ($width >= 2400-$offset) )
			.toggleClass('box-row-m', ($width <= 2399-$offset) && ($width >= 1670-$offset) )
			.toggleClass('box-row-s', ($width <= 1669-$offset) );
			
		$('#content-cell-2-wide').toggleClass('width-1', ($width <=  540-$offset) );
	}

	initiate_collapsible();
	$(window).on('resize', mw.util.debounce( initiate_collapsible, 200) );


	$btn.on('click', function(){
		$header.toggleClass('collapsed');
	});
});

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*end of mw.loader.getScript().then callback*/ });