Difference between revisions of "MediaWiki:Common.js"

From Discord Dungeons Wiki
Jump to navigation Jump to search
 
Line 170: Line 170:
  
 
}());
 
}());
 
/*
 
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' );
 

Latest revision as of 16:08, 11 February 2020

/* 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 );

}());