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