MediaWiki:Common.js

From MediaWiki
Revision as of 13:33, 11 February 2020 by Mackan (talk | contribs)
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. */
$(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' );