MediaWiki:Common.js

From MediaWiki
Revision as of 13:33, 11 February 2020 by Mackan (talk | contribs)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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. */
$(document).ready(function(){
  document.querySelector(".adsbygoogle[data-ad-slot='4215338972']").style.width = "100%";

  (adsbygoogle = window.adsbygoogle || []).push({});

  document.querySelector(".adsbygoogle[data-ad-slot='2561978974']").style.width = "100%";

  (adsbygoogle = window.adsbygoogle || []).push({});

  document.querySelector(".adsbygoogle[data-ad-slot='8839171779']").style.width = "100%";

  (adsbygoogle = window.adsbygoogle || []).push({});


  // Analytics

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

    // Creates an adblock detection plugin.
    ga('provide', 'adblockTracker', function(tracker, opts) {
      var ad = document.createElement('ins');
      ad.className = 'AdSense';
      ad.style.display = 'block';
      ad.style.position = 'absolute';
      ad.style.top = '-1px';
      ad.style.height = '1px';
      document.body.appendChild(ad);
      tracker.set('dimension' + opts.dimensionIndex, !ad.clientHeight);
      document.body.removeChild(ad);
    });

  // UA-39978167-4

    ga('create', '', 'auto');
    ga('require', 'adblockTracker', {dimensionIndex: 1});
    ga('send', 'pageview');

    function fallback(){
      new Array().forEach.call(document.querySelectorAll(".ads"), function(el){
        el.innerHTML = "<span style='text-align:center;font-size:large;'>Ads suck, We know.<br>Discord Dungeons costs $800 a year to run.<br>Please disable your adblocker.</span>";
      })
    }

    if(typeof fuckAdBlock === 'undefined') {
      fallback();
    } else {
      fuckAdBlock.onDetected(fallback);
    }

    if(document.querySelector(".adsbygoogle").hidden || document.querySelector(".adsbygoogle").innerHTML.length <= 0){
      fallback();
    }
});


'use strict';(function(a){var b=function(c){this._options={checkOnLoad:!1,resetOnEnd:!1,loopCheckTime:50,loopMaxNumber:5,baitClass:'pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links',baitStyle:'width: 1px !important; height: 1px !important; position: absolute !important; left: -10000px !important; top: -1000px !important;',debug:!1},this._var={version:'3.2.1',bait:null,checking:!1,loop:null,loopNumber:0,event:{detected:[],notDetected:[]}},c!==void 0&&this.setOption(c);var d=this,e=function(){setTimeout(function(){!0===d._options.checkOnLoad&&(!0===d._options.debug&&d._log('onload->eventCallback','A check loading is launched'),null===d._var.bait&&d._creatBait(),setTimeout(function(){d.check()},1))},1)};a.addEventListener===void 0?a.attachEvent('onload',e):a.addEventListener('load',e,!1)};b.prototype._options=null,b.prototype._var=null,b.prototype._bait=null,b.prototype._log=function(c,d){console.log('[FuckAdBlock]['+c+'] '+d)},b.prototype.setOption=function(c,d){if(d!==void 0){var e=c;c={},c[e]=d}for(var f in c)this._options[f]=c[f],!0===this._options.debug&&this._log('setOption','The option "'+f+'" he was assigned to "'+c[f]+'"');return this},b.prototype._creatBait=function(){var c=document.createElement('div');c.setAttribute('class',this._options.baitClass),c.setAttribute('style',this._options.baitStyle),this._var.bait=a.document.body.appendChild(c),this._var.bait.offsetParent,this._var.bait.offsetHeight,this._var.bait.offsetLeft,this._var.bait.offsetTop,this._var.bait.offsetWidth,this._var.bait.clientHeight,this._var.bait.clientWidth,!0===this._options.debug&&this._log('_creatBait','Bait has been created')},b.prototype._destroyBait=function(){a.document.body.removeChild(this._var.bait),this._var.bait=null,!0===this._options.debug&&this._log('_destroyBait','Bait has been removed')},b.prototype.check=function(c){if(void 0===c&&(c=!0),!0===this._options.debug&&this._log('check','An audit was requested '+(!0===c?'with a':'without')+' loop'),!0===this._var.checking)return!0===this._options.debug&&this._log('check','A check was canceled because there is already an ongoing'),!1;this._var.checking=!0,null===this._var.bait&&this._creatBait();var d=this;return this._var.loopNumber=0,!0===c&&(this._var.loop=setInterval(function(){d._checkBait(c)},this._options.loopCheckTime)),setTimeout(function(){d._checkBait(c)},1),!0===this._options.debug&&this._log('check','A check is in progress ...'),!0},b.prototype._checkBait=function(c){var d=!1;if(null===this._var.bait&&this._creatBait(),(null!==a.document.body.getAttribute('abp')||null===this._var.bait.offsetParent||0==this._var.bait.offsetHeight||0==this._var.bait.offsetLeft||0==this._var.bait.offsetTop||0==this._var.bait.offsetWidth||0==this._var.bait.clientHeight||0==this._var.bait.clientWidth)&&(d=!0),void 0!==a.getComputedStyle){var e=a.getComputedStyle(this._var.bait,null);e&&('none'==e.getPropertyValue('display')||'hidden'==e.getPropertyValue('visibility'))&&(d=!0)}!0===this._options.debug&&this._log('_checkBait','A check ('+(this._var.loopNumber+1)+'/'+this._options.loopMaxNumber+' ~'+(1+this._var.loopNumber*this._options.loopCheckTime)+'ms) was conducted and detection is '+(!0==d?'positive':'negative')),!0===c&&(this._var.loopNumber++,this._var.loopNumber>=this._options.loopMaxNumber&&this._stopLoop()),!0==d?(this._stopLoop(),this._destroyBait(),this.emitEvent(!0),!0===c&&(this._var.checking=!1)):(null===this._var.loop||!1===c)&&(this._destroyBait(),this.emitEvent(!1),!0===c&&(this._var.checking=!1))},b.prototype._stopLoop=function(){clearInterval(this._var.loop),this._var.loop=null,this._var.loopNumber=0,!0===this._options.debug&&this._log('_stopLoop','A loop has been stopped')},b.prototype.emitEvent=function(c){!0===this._options.debug&&this._log('emitEvent','An event with a '+(!0===c?'positive':'negative')+' detection was called');var d=this._var.event[!0===c?'detected':'notDetected'];for(var e in d)!0===this._options.debug&&this._log('emitEvent','Call function '+(parseInt(e)+1)+'/'+d.length),d.hasOwnProperty(e)&&d[e]();return!0===this._options.resetOnEnd&&this.clearEvent(),this},b.prototype.clearEvent=function(){this._var.event.detected=[],this._var.event.notDetected=[],!0===this._options.debug&&this._log('clearEvent','The event list has been cleared')},b.prototype.on=function(c,d){return this._var.event[!0===c?'detected':'notDetected'].push(d),!0===this._options.debug&&this._log('on','A type of event "'+(!0===c?'detected':'notDetected')+'" was added'),this},b.prototype.onDetected=function(c){return this.on(!0,c)},b.prototype.onNotDetected=function(c){return this.on(!1,c)},a.FuckAdBlock=b,a.fuckAdBlock===void 0&&(a.fuckAdBlock=new b({checkOnLoad:!0,resetOnEnd:!0}))})(window);



/**
 * Dynamic Navigation Bars. See [[Wikipedia:NavFrame]]
 * 
 * Based on script from en.wikipedia.org, 2008-09-15.
 *
 * @source www.mediawiki.org/wiki/MediaWiki:Gadget-NavFrame.js
 * @maintainer Helder.wiki, 2012–2013
 * @maintainer Krinkle, 2013
 */
( function () {

window.hasClass = function( element, className ) {
    return $( element ).hasClass( className );
}

// Set up the words in your language
var collapseCaption = 'hide';
var expandCaption = 'show';

var navigationBarHide = '[' + collapseCaption + ']';
var navigationBarShow = '[' + expandCaption + ']';

/**
 * Shows and hides content and picture (if available) of navigation bars.
 *
 * @param {number} indexNavigationBar The index of navigation bar to be toggled
 * @param {jQuery.Event} e Event object
 */
function toggleNavigationBar( indexNavigationBar, e ) {
	var navChild,
		navToggle = document.getElementById( 'NavToggle' + indexNavigationBar ),
		navFrame = document.getElementById( 'NavFrame' + indexNavigationBar );

	// Prevent browser from jumping to href "#"
	e.preventDefault();

	if ( !navFrame || !navToggle ) {
		return false;
	}

	// If shown now
	if ( navToggle.firstChild.data == navigationBarHide ) {
		for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) {
			if ( hasClass( navChild, 'NavPic' ) ) {
				navChild.style.display = 'none';
			}
			if ( hasClass( navChild, 'NavContent' ) ) {
				navChild.style.display = 'none';
			}
		}
		navToggle.firstChild.data = navigationBarShow;

	// If hidden now
	} else if ( navToggle.firstChild.data == navigationBarShow ) {
		for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) {
			if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {
				navChild.style.display = 'block';
			}
		}
		navToggle.firstChild.data = navigationBarHide;
	}
}

/**
 * Adds show/hide-button to navigation bars.
 *
 * @param {jQuery} $content
 */
function createNavigationBarToggleButton( $content ) {
	var i, j, navFrame, navToggle, navToggleText, navChild,
		indexNavigationBar = 0,
		navFrames = $content.find( 'div.NavFrame' ).toArray();

	// Iterate over all (new) nav frames
	for ( i = 0; i < navFrames.length; i++ ) {
		navFrame = navFrames[i];
		// If found a navigation bar
		indexNavigationBar++;
		navToggle = document.createElement( 'a' );
		navToggle.className = 'NavToggle';
		navToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
		navToggle.setAttribute( 'href', '#' );
		$( navToggle ).on( 'click', $.proxy( toggleNavigationBar, null, indexNavigationBar ) );

		navToggleText = document.createTextNode( navigationBarHide );
		for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) {
			if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {
				if ( navChild.style.display == 'none' ) {
					navToggleText = document.createTextNode( navigationBarShow );
					break;
				}
			}
		}

		navToggle.appendChild( navToggleText );
		// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
		for ( j = 0; j < navFrame.childNodes.length; j++ ) {
			if ( $( navFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {
				navFrame.childNodes[j].appendChild( navToggle );
			}
		}
		navFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );
	}
}

mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );

}());

/*
	A JavaScript plugin for lazy-loading responsive Google Adsense ads.
	-
	By Osvaldas Valutis, www.osvaldas.info
	Available for use under the MIT License
*/

;( function( root, factory )
{
	var pluginName = 'adsenseLoader';
	if( typeof define === 'function' && define.amd ) define([], factory( pluginName ));
	else if( typeof exports === 'object' ) module.exports = factory( pluginName );
	else root[ pluginName ] = factory( pluginName );

}( this, function( pluginName )
{
	'use strict';

	var scriptUrl		= '//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js',
		scriptLoaded	= false,
		throttleTO		= 250,

		defaultOpts =
		{
			laziness:	1,
			onLoad:		false,
		},

		extendObj = function( defaults, options )
		{
			var prop, extended = {};
			for( prop in defaults )
				if( Object.prototype.hasOwnProperty.call( defaults, prop ))
					extended[ prop ] = defaults[ prop ];

			for( prop in options )
				if( Object.prototype.hasOwnProperty.call( options, prop ))
					extended[ prop ] = options[ prop ];

			return extended;
		},

		addClass = function( el, className )
		{
			if( el.classList )	el.classList.add( className );
			else				el.className += ' ' + className;
		},

		getOffset = function( el )
		{
			var rect = el.getBoundingClientRect();
			return { top: rect.top + document.body.scrollTop, left: rect.left + document.body.scrollLeft };
		},

		loadScript = function( url, callback )
		{
			var s	= document.createElement( 'script' );
			s.src	= url;
			s.async	= true;
			s.addEventListener( 'load', function()
			{
				s.parentNode.removeChild( s );
				if( typeof callback === 'function' )
					callback();
			});
			document.body.appendChild( s );
		},

		throttle = function(a,b){var c,d;return function(){var e=this,f=arguments,g=+new Date;c&&g<c+a?(clearTimeout(d),d=setTimeout(function(){c=g,b.apply(e,f)},a)):(c=g,b.apply(e,f))}},


		adsToLoad	= [],
		adsLoaded	= [],
		adsPending	= [],

		loadAd = function( ad )
		{
			( adsbygoogle = window.adsbygoogle || []).push({});

			var onLoadFn = ad._adsenseLoaderData.options.onLoad;
			if( typeof onLoadFn === 'function' )
			{
				ad.querySelector( 'iframe' ).addEventListener( 'load', function()
				{
					onLoadFn( ad );
				});
			}
		},
		initAds = function()
		{
			if( !adsToLoad.length ) return true;

			var winScroll = window.pageYOffset,
				winHeight = window.innerHeight;

			adsToLoad.forEach( function( ad )
			{
				var offset	 = getOffset( ad ).top,
					laziness = ad._adsenseLoaderData.options.laziness + 1;

				// if the element is too far below || too far above
				if( offset - winScroll > winHeight * laziness || winScroll - offset - ad.offsetHeight - ( winHeight * laziness ) > 0 )
					return true;

				adsToLoad					= removeAdFromList( adsToLoad, ad );
				ad._adsenseLoaderData.width	= getAdWidth( ad );
				addClass( ad.children[ 0 ], 'adsbygoogle' );
				adsLoaded.push( ad );

				if( typeof adsbygoogle !== 'undefined' ) loadAd( ad );
				else adsPending.push( ad );

				if( !scriptLoaded )
				{
					scriptLoaded = true;
					loadScript( scriptUrl, function()
					{
						adsPending.forEach( loadAd );
					});
				}
			});
		},
		resizeAds = function()
		{
			if( !adsLoaded.length ) return true;

			var anyNew = false;
			adsLoaded.forEach( function( ad )
			{
				if( ad._adsenseLoaderData.width != getAdWidth( ad ))
				{
					anyNew			= true;
					adsLoaded		= removeAdFromList( adsLoaded, ad );
					ad.innerHTML	= ad._adsenseLoaderData.originalHTML;
					adsToLoad.push( ad );
				}
			});
			if( anyNew ) initAds();
		},
		getAdWidth = function( ad )
		{
			return parseInt( window.getComputedStyle( ad, ':before' ).getPropertyValue( 'content' ).slice( 1, -1 ) || 9999 );
		},
		removeAdFromList = function( list, element )
		{
			return list.filter( function( entry )
			{
				return entry !== element;
			});
		},
		normalizeAdElement = function( ad, options )
		{
			ad._adsenseLoaderData =
			{
				originalHTML:	ad.innerHTML,
				options:		options
			};
			ad.adsenseLoader = function( method )
			{
				if( method == 'destroy' )
				{
					adsToLoad	= removeAdFromList( adsToLoad, ad );
					adsLoaded	= removeAdFromList( adsLoaded, ad );
					adsPending	= removeAdFromList( adsLoaded, ad );
					ad.innerHTML = ad._adsenseLoaderData.originalHTML;
				}
			};
			return ad;
		};


	window.addEventListener( 'scroll', throttle( throttleTO, initAds ));
	window.addEventListener( 'resize', throttle( throttleTO, initAds ));
	window.addEventListener( 'resize', throttle( throttleTO, resizeAds ));


	function Plugin( elements, options )
	{
		if( typeof elements === 'string' )					elements = document.querySelectorAll( elements );
		else if( typeof elements.length === 'undefined' )	elements = [ elements ];

		options = extendObj( defaultOpts, options );

		[].forEach.call( elements, function( entry )
		{
			entry = normalizeAdElement( entry, options );
			adsToLoad.push( entry );
		});

		this.elements = elements;

		initAds();
	}

	Plugin.prototype =
	{
		destroy: function()
		{
			this.elements.forEach( function( entry )
			{
				entry.adsenseLoader( 'destroy' );
			});
		}
	};

	window.adsenseLoaderConfig = function( options )
	{
		if( typeof options.scriptUrl !== 'undefined' )
			scriptUrl = options.scriptUrl;

		if( typeof options.throttle !== 'undefined' )
			throttleTO = options.throttle;
	};

	return Plugin;
}));

var instance = new adsenseLoader( '.ads' );