(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?module.exports=factory():typeof define==='function'&&define.amd?define(factory):(global=global||self,global.LazyLoad=factory());}(this,(function(){'use strict';function _extends(){_extends=Object.assign||function(target){for(var i=1;i1;var defaultSettings={elements_selector:".lazy",container:isBot||runningOnBrowser?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"loading",class_loaded:"loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:true,unobserve_entered:false,cancel_on_exit:true,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:false};var getExtendedSettings=function getExtendedSettings(customSettings){return _extends({},defaultSettings,customSettings);};var createInstance=function createInstance(classObj,options){var event;var eventString="LazyLoad::Initialized";var instance=new classObj(options);try{event=new CustomEvent(eventString,{detail:{instance:instance}});}catch(err){event=document.createEvent("CustomEvent");event.initCustomEvent(eventString,false,false,{instance:instance});} window.dispatchEvent(event);};var autoInitialize=function autoInitialize(classObj,options){if(!options){return;} if(!options.length){createInstance(classObj,options);}else{for(var i=0,optionsItem;optionsItem=options[i];i+=1){createInstance(classObj,optionsItem);}}};var statusLoading="loading";var statusLoaded="loaded";var statusApplied="applied";var statusEntered="entered";var statusError="error";var statusNative="native";var dataPrefix="data-";var statusDataName="ll-status";var getData=function getData(element,attribute){return element.getAttribute(dataPrefix+attribute);};var setData=function setData(element,attribute,value){var attrName=dataPrefix+attribute;if(value===null){element.removeAttribute(attrName);return;} element.setAttribute(attrName,value);};var getStatus=function getStatus(element){return getData(element,statusDataName);};var setStatus=function setStatus(element,status){return setData(element,statusDataName,status);};var resetStatus=function resetStatus(element){return setStatus(element,null);};var hasEmptyStatus=function hasEmptyStatus(element){return getStatus(element)===null;};var hasStatusLoading=function hasStatusLoading(element){return getStatus(element)===statusLoading;};var hasStatusError=function hasStatusError(element){return getStatus(element)===statusError;};var hasStatusNative=function hasStatusNative(element){return getStatus(element)===statusNative;};var statusesAfterLoading=[statusLoading,statusLoaded,statusApplied,statusError];var hadStartedLoading=function hadStartedLoading(element){return statusesAfterLoading.indexOf(getStatus(element))>=0;};var safeCallback=function safeCallback(callback,arg1,arg2,arg3){if(!callback){return;} if(arg3!==undefined){callback(arg1,arg2,arg3);return;} if(arg2!==undefined){callback(arg1,arg2);return;} callback(arg1);};var addClass=function addClass(element,className){if(supportsClassList){element.classList.add(className);return;} element.className+=(element.className?" ":"")+className;};var removeClass=function removeClass(element,className){if(supportsClassList){element.classList.remove(className);return;} element.className=element.className.replace(new RegExp("(^|\\s+)"+className+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"");};var addTempImage=function addTempImage(element){element.llTempImage=document.createElement("IMG");};var deleteTempImage=function deleteTempImage(element){delete element.llTempImage;};var getTempImage=function getTempImage(element){return element.llTempImage;};var unobserve=function unobserve(element,instance){if(!instance)return;var observer=instance._observer;if(!observer)return;observer.unobserve(element);};var resetObserver=function resetObserver(observer){observer.disconnect();};var unobserveEntered=function unobserveEntered(element,settings,instance){if(settings.unobserve_entered)unobserve(element,instance);};var updateLoadingCount=function updateLoadingCount(instance,delta){if(!instance)return;instance.loadingCount+=delta;};var decreaseToLoadCount=function decreaseToLoadCount(instance){if(!instance)return;instance.toLoadCount-=1;};var setToLoadCount=function setToLoadCount(instance,value){if(!instance)return;instance.toLoadCount=value;};var isSomethingLoading=function isSomethingLoading(instance){return instance.loadingCount>0;};var haveElementsToLoad=function haveElementsToLoad(instance){return instance.toLoadCount>0;};var getSourceTags=function getSourceTags(parentTag){var sourceTags=[];for(var i=0,childTag;childTag=parentTag.children[i];i+=1){if(childTag.tagName==="SOURCE"){sourceTags.push(childTag);}} return sourceTags;};var setAttributeIfValue=function setAttributeIfValue(element,attrName,value){if(!value){return;} element.setAttribute(attrName,value);};var resetAttribute=function resetAttribute(element,attrName){element.removeAttribute(attrName);};var hasOriginalAttributes=function hasOriginalAttributes(element){return!!element.llOriginalAttrs;};var saveOriginalImageAttributes=function saveOriginalImageAttributes(element){if(hasOriginalAttributes(element)){return;} var originalAttributes={};originalAttributes["src"]=element.getAttribute("src");originalAttributes["srcset"]=element.getAttribute("srcset");originalAttributes["sizes"]=element.getAttribute("sizes");element.llOriginalAttrs=originalAttributes;};var restoreOriginalImageAttributes=function restoreOriginalImageAttributes(element){if(!hasOriginalAttributes(element)){return;} var originalAttributes=element.llOriginalAttrs;setAttributeIfValue(element,"src",originalAttributes["src"]);setAttributeIfValue(element,"srcset",originalAttributes["srcset"]);setAttributeIfValue(element,"sizes",originalAttributes["sizes"]);};var setImageAttributes=function setImageAttributes(element,settings){setAttributeIfValue(element,"sizes",getData(element,settings.data_sizes));setAttributeIfValue(element,"srcset",getData(element,settings.data_srcset));setAttributeIfValue(element,"src",getData(element,settings.data_src));};var resetImageAttributes=function resetImageAttributes(element){resetAttribute(element,"src");resetAttribute(element,"srcset");resetAttribute(element,"sizes");};var forEachPictureSource=function forEachPictureSource(element,fn){var parent=element.parentNode;if(!parent||parent.tagName!=="PICTURE"){return;} var sourceTags=getSourceTags(parent);sourceTags.forEach(fn);};var forEachVideoSource=function forEachVideoSource(element,fn){var sourceTags=getSourceTags(element);sourceTags.forEach(fn);};var restoreOriginalAttributesImg=function restoreOriginalAttributesImg(element){forEachPictureSource(element,function(sourceTag){restoreOriginalImageAttributes(sourceTag);});restoreOriginalImageAttributes(element);};var setSourcesImg=function setSourcesImg(element,settings){forEachPictureSource(element,function(sourceTag){saveOriginalImageAttributes(sourceTag);setImageAttributes(sourceTag,settings);});saveOriginalImageAttributes(element);setImageAttributes(element,settings);};var resetSourcesImg=function resetSourcesImg(element){forEachPictureSource(element,function(sourceTag){resetImageAttributes(sourceTag);});resetImageAttributes(element);};var setSourcesIframe=function setSourcesIframe(element,settings){setAttributeIfValue(element,"src",getData(element,settings.data_src));};var setSourcesVideo=function setSourcesVideo(element,settings){forEachVideoSource(element,function(sourceTag){setAttributeIfValue(sourceTag,"src",getData(sourceTag,settings.data_src));});setAttributeIfValue(element,"poster",getData(element,settings.data_poster));setAttributeIfValue(element,"src",getData(element,settings.data_src));element.load();};var setSourcesFunctions={IMG:setSourcesImg,IFRAME:setSourcesIframe,VIDEO:setSourcesVideo};var setBackground=function setBackground(element,settings,instance){var bg1xValue=getData(element,settings.data_bg);var bgHiDpiValue=getData(element,settings.data_bg_hidpi);var bgDataValue=isHiDpi&&bgHiDpiValue?bgHiDpiValue:bg1xValue;if(!bgDataValue)return;element.style.backgroundImage="url(\"".concat(bgDataValue,"\")");getTempImage(element).setAttribute("src",bgDataValue);manageLoading(element,settings,instance);};var setMultiBackground=function setMultiBackground(element,settings,instance){var bg1xValue=getData(element,settings.data_bg_multi);var bgHiDpiValue=getData(element,settings.data_bg_multi_hidpi);var bgDataValue=isHiDpi&&bgHiDpiValue?bgHiDpiValue:bg1xValue;if(!bgDataValue){return;} element.style.backgroundImage=bgDataValue;manageApplied(element,settings,instance);};var setSources=function setSources(element,settings){var setSourcesFunction=setSourcesFunctions[element.tagName];if(!setSourcesFunction){return;} setSourcesFunction(element,settings);};var manageApplied=function manageApplied(element,settings,instance){addClass(element,settings.class_applied);setStatus(element,statusApplied);if(settings.unobserve_completed){unobserve(element,settings);} safeCallback(settings.callback_applied,element,instance);};var manageLoading=function manageLoading(element,settings,instance){updateLoadingCount(instance,+1);addClass(element,settings.class_loading);setStatus(element,statusLoading);safeCallback(settings.callback_loading,element,instance);};var elementsWithLoadEvent=["IMG","IFRAME","VIDEO"];var hasLoadEvent=function hasLoadEvent(element){return elementsWithLoadEvent.indexOf(element.tagName)>-1;};var checkFinish=function checkFinish(settings,instance){if(instance&&!isSomethingLoading(instance)&&!haveElementsToLoad(instance)){safeCallback(settings.callback_finish,instance);}};var addEventListener=function addEventListener(element,eventName,handler){element.addEventListener(eventName,handler);element.llEvLisnrs[eventName]=handler;};var removeEventListener=function removeEventListener(element,eventName,handler){element.removeEventListener(eventName,handler);};var hasEventListeners=function hasEventListeners(element){return!!element.llEvLisnrs;};var addEventListeners=function addEventListeners(element,loadHandler,errorHandler){if(!hasEventListeners(element))element.llEvLisnrs={};var loadEventName=element.tagName==="VIDEO"?"loadeddata":"load";addEventListener(element,loadEventName,loadHandler);addEventListener(element,"error",errorHandler);};var removeEventListeners=function removeEventListeners(element){if(!hasEventListeners(element)){return;} var eventListeners=element.llEvLisnrs;for(var eventName in eventListeners){var handler=eventListeners[eventName];removeEventListener(element,eventName,handler);} delete element.llEvLisnrs;};var doneHandler=function doneHandler(element,settings,instance){deleteTempImage(element);updateLoadingCount(instance,-1);decreaseToLoadCount(instance);removeClass(element,settings.class_loading);if(settings.unobserve_completed){unobserve(element,instance);}};var loadHandler=function loadHandler(event,element,settings,instance){var goingNative=hasStatusNative(element);doneHandler(element,settings,instance);addClass(element,settings.class_loaded);setStatus(element,statusLoaded);safeCallback(settings.callback_loaded,element,instance);if(!goingNative)checkFinish(settings,instance);};var errorHandler=function errorHandler(event,element,settings,instance){var goingNative=hasStatusNative(element);doneHandler(element,settings,instance);addClass(element,settings.class_error);setStatus(element,statusError);safeCallback(settings.callback_error,element,instance);if(!goingNative)checkFinish(settings,instance);};var addOneShotEventListeners=function addOneShotEventListeners(element,settings,instance){var elementToListenTo=getTempImage(element)||element;if(hasEventListeners(elementToListenTo)){return;} var _loadHandler=function _loadHandler(event){loadHandler(event,element,settings,instance);removeEventListeners(elementToListenTo);};var _errorHandler=function _errorHandler(event){errorHandler(event,element,settings,instance);removeEventListeners(elementToListenTo);};addEventListeners(elementToListenTo,_loadHandler,_errorHandler);};var loadBackground=function loadBackground(element,settings,instance){addTempImage(element);addOneShotEventListeners(element,settings,instance);setBackground(element,settings,instance);setMultiBackground(element,settings,instance);};var loadRegular=function loadRegular(element,settings,instance){addOneShotEventListeners(element,settings,instance);setSources(element,settings);manageLoading(element,settings,instance);};var load=function load(element,settings,instance){if(hasLoadEvent(element)){loadRegular(element,settings,instance);}else{loadBackground(element,settings,instance);}};var loadNative=function loadNative(element,settings,instance){addOneShotEventListeners(element,settings,instance);setSources(element,settings);setStatus(element,statusNative);};var cancelLoading=function cancelLoading(element,entry,settings,instance){if(!settings.cancel_on_exit)return;if(!hasStatusLoading(element))return;if(element.tagName!=="IMG")return;removeEventListeners(element);resetSourcesImg(element);restoreOriginalAttributesImg(element);removeClass(element,settings.class_loading);updateLoadingCount(instance,-1);resetStatus(element);safeCallback(settings.callback_cancel,element,entry,instance);};var onEnter=function onEnter(element,entry,settings,instance){setStatus(element,statusEntered);addClass(element,settings.class_entered);removeClass(element,settings.class_exited);unobserveEntered(element,settings,instance);safeCallback(settings.callback_enter,element,entry,instance);if(hadStartedLoading(element))return;load(element,settings,instance);};var onExit=function onExit(element,entry,settings,instance){if(hasEmptyStatus(element))return;addClass(element,settings.class_exited);cancelLoading(element,entry,settings,instance);safeCallback(settings.callback_exit,element,entry,instance);};var tagsWithNativeLazy=["IMG","IFRAME"];var shouldUseNative=function shouldUseNative(settings){return settings.use_native&&"loading"in HTMLImageElement.prototype;};var loadAllNative=function loadAllNative(elements,settings,instance){elements.forEach(function(element){if(tagsWithNativeLazy.indexOf(element.tagName)===-1){return;} element.setAttribute("loading","lazy");loadNative(element,settings,instance);});setToLoadCount(instance,0);};var isIntersecting=function isIntersecting(entry){return entry.isIntersecting||entry.intersectionRatio>0;};var getObserverSettings=function getObserverSettings(settings){return{root:settings.container===document?null:settings.container,rootMargin:settings.thresholds||settings.threshold+"px"};};var intersectionHandler=function intersectionHandler(entries,settings,instance){entries.forEach(function(entry){return isIntersecting(entry)?onEnter(entry.target,entry,settings,instance):onExit(entry.target,entry,settings,instance);});};var observeElements=function observeElements(observer,elements){elements.forEach(function(element){observer.observe(element);});};var updateObserver=function updateObserver(observer,elementsToObserve){resetObserver(observer);observeElements(observer,elementsToObserve);};var setObserver=function setObserver(settings,instance){if(!supportsIntersectionObserver||shouldUseNative(settings)){return;} instance._observer=new IntersectionObserver(function(entries){intersectionHandler(entries,settings,instance);},getObserverSettings(settings));};var toArray=function toArray(nodeSet){return Array.prototype.slice.call(nodeSet);};var queryElements=function queryElements(settings){return settings.container.querySelectorAll(settings.elements_selector);};var excludeManagedElements=function excludeManagedElements(elements){return toArray(elements).filter(hasEmptyStatus);};var hasError=function hasError(element){return hasStatusError(element);};var filterErrorElements=function filterErrorElements(elements){return toArray(elements).filter(hasError);};var getElementsToLoad=function getElementsToLoad(elements,settings){return excludeManagedElements(elements||queryElements(settings));};var retryLazyLoad=function retryLazyLoad(settings,instance){var errorElements=filterErrorElements(queryElements(settings));errorElements.forEach(function(element){removeClass(element,settings.class_error);resetStatus(element);});instance.update();};var setOnlineCheck=function setOnlineCheck(settings,instance){if(!runningOnBrowser){return;} window.addEventListener("online",function(){retryLazyLoad(settings,instance);});};var LazyLoad=function LazyLoad(customSettings,elements){var settings=getExtendedSettings(customSettings);this._settings=settings;this.loadingCount=0;setObserver(settings,this);setOnlineCheck(settings,this);this.update(elements);};LazyLoad.prototype={update:function update(givenNodeset){var settings=this._settings;var elementsToLoad=getElementsToLoad(givenNodeset,settings);setToLoadCount(this,elementsToLoad.length);if(isBot||!supportsIntersectionObserver){this.loadAll(elementsToLoad);return;} if(shouldUseNative(settings)){loadAllNative(elementsToLoad,settings,this);return;} updateObserver(this._observer,elementsToLoad);},destroy:function destroy(){if(this._observer){this._observer.disconnect();} queryElements(this._settings).forEach(function(element){delete element.llOriginalAttrs;});delete this._observer;delete this._settings;delete this.loadingCount;delete this.toLoadCount;},loadAll:function loadAll(elements){var _this=this;var settings=this._settings;var elementsToLoad=getElementsToLoad(elements,settings);elementsToLoad.forEach(function(element){unobserve(element,_this);load(element,settings,_this);});}};LazyLoad.load=function(element,customSettings){var settings=getExtendedSettings(customSettings);load(element,settings);};LazyLoad.resetStatus=function(element){resetStatus(element);};if(runningOnBrowser){autoInitialize(LazyLoad,window.lazyLoadOptions);} return LazyLoad;})));