{"version":3,"sources":["main.js","jquery.lazy.js"],"names":["languageFail","console","log","languageSuccess","location","reload","processRequestForm","data","responseJSON","window","undefined","$","jQuery","Zepto","lazyInstanceId","windowLoaded","_executeLazy","instance","config","items","events","namespace","_awaitingAfterLoad","_actualWidth","_actualHeight","_isRetinaDisplay","_afterLoad","_load","_error","_img","_src","_srcset","_sizes","_backgroundImage","_initialize","delay","callback","timeout","lastExecute","devicePixelRatio","_prepareItems","setTimeout","_lazyLoadItems","combined","e","throttle","event","type","all","ignoreThrottle","elapsed","Date","run","call","clearTimeout","enableThrottle","a","additionalItems","push","apply","g","filter","this","loadedName","f","forcedItems","i","length","item","appendScroll","on","defaultImage","placeholder","imageBase","srcsetAttribute","loaderAttribute","forcedTags","_f","l","element","tag","_getElementTagName","handledName","attr","attribute","name","elementImageBase","imageBaseAttribute","_getCorrectedSrcSet","css","allItems","forced","elements","loadTriggered","_isInLoadableArea","customLoader","visibleOnly","is","_handleItem","autoDestroy","destroy","errorCallback","_triggerCallback","_reduceAwaiting","noop","srcAttribute","sizesAttribute","retinaAttribute","removeAttribute","elementRetina","loadCallback","removeAttr","off","one","response","trigger","imageObj","Image","hide","effect","effectTime","remove","imageSrc","complete","elementBound","getBoundingClientRect","direction","scrollDirection","threshold","vertical","height","top","bottom","horizontal","width","left","right","tagName","toLowerCase","srcset","entries","split","trim","args","slice","arguments","bind","LazyPlugin","settings","_instance","_config","extend","_events","_namespace","entryName","value","addItems","getItems","update","useThrottle","force","loadAll","chainable","fn","Lazy","lazy","names","loader","isFunction","isArray","prototype","c","beforeLoad","afterLoad","onError","onFinishedAll","document","ready","change","submit","action","post","SearchText","find","val","Language","addClass","removeClass","downloadWord","wrapperDiv","each","s","div1","div2","link1","assetTitle","id","img","append","hr","text","link2","html","preventDefault"],"mappings":"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","file":"cecerts.min.js","sourcesContent":["$(document).ready(function () {\r\n\r\n $(\".languageDDForm select\").change(function () {\r\n $(\".languageDDForm\").submit();\r\n });\r\n\r\n $(\".search-form\").submit(function (e) {\r\n //console.log($(this).val());\r\n var action = $(this).attr('action');\r\n //console.log(action);\r\n\r\n $.post(action, { SearchText: $(this).find('input').val(), Language: $(this).find('input').data('language') }, function (data) {\r\n if (data.length > 0) {\r\n $('.no-results-found').addClass('d-none');\r\n $('.assets-area').removeClass('d-none');\r\n var downloadWord = $('.assets-area').data('downloadword');\r\n var wrapperDiv = $('
').addClass('row');\r\n $.each(data, function (s, item) {\r\n var div1 = $('
').addClass('col-12 col-md-3 col-lg-2 d-md-flex align-items-stretch mb-2');\r\n var div2 = $('
').addClass('d-flex flex-column justify-content-between p-2 bg-light border text-center');\r\n var link1 = $('').attr('title', item.assetTitle).attr('href', '/d/' + item.id);\r\n var img = $('').addClass('border').addClass('lazy').attr('src', 'https://acco-images.s3.amazonaws.com/rbh/logos/ll-acco-1.png').attr('data-src', 'https://media.accobrandspartner.com/sections/mediaBankPreview.aspx?width=300&height=300&id=' + item.id).attr('alt', item.assetTitle);\r\n link1.append(img);\r\n div2.append(link1);\r\n var hr = $('
').text(item.assetTitle);\r\n div2.append(hr);\r\n var link2 = $('').attr('title', item.assetTitle).attr('href', '/d/' + item.id).addClass('btn btn-sm btn-block btn-primary').text(downloadWord);\r\n div2.append(link2);\r\n div1.append(div2);\r\n wrapperDiv.append(div1);\r\n });\r\n\r\n $('.assets-area').html('').append(wrapperDiv);\r\n $('.assets-area img.lazy').Lazy();\r\n //$('.lazy').lazy({\r\n // bind: \"event\",\r\n // delay: 0\r\n //});\r\n\r\n } else {\r\n $('.no-results-found').removeClass('d-none');\r\n $('.assets-area').addClass('d-none');\r\n }\r\n $('.reset-link').addClass('text-primary').removeClass('disabled');\r\n //console.log(data);\r\n }, \"json\");\r\n e.preventDefault;\r\n return false;\r\n });\r\n\r\n $(\".search-form\").submit(function (e) {\r\n return false;\r\n });\r\n\r\n $('img.lazy').Lazy();\r\n\r\n});\r\n\r\nfunction languageFail() {\r\n console.log(\"languageFail\");\r\n}\r\n\r\nfunction languageSuccess() {\r\n location.reload();\r\n}\r\n\r\nfunction processRequestForm(data) {\r\n //console.log(data);\r\n console.log(data.responseJSON);\r\n //if (data.responseJSON !== null && data.responseJSON) {\r\n // $('.loading-area').hide();\r\n // $('.full-data-request-thanks').fadeIn();\r\n //} else {\r\n // $('.main-form-area').show();\r\n // $('.loading-area').hide();\r\n // $('.weThinkYouAreABot').fadeIn();\r\n //}\r\n}\r\n","/*!\n * jQuery & Zepto Lazy - v1.7.10\n * http://jquery.eisbehr.de/lazy/\n *\n * Copyright 2012 - 2018, Daniel 'Eisbehr' Kern\n *\n * Dual licensed under the MIT and GPL-2.0 licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl-2.0.html\n *\n * $(\"img.lazy\").lazy();\n */\n\n;(function(window, undefined) {\n \"use strict\";\n\n // noinspection JSUnresolvedVariable\n /**\n * library instance - here and not in construct to be shorter in minimization\n * @return void\n */\n var $ = window.jQuery || window.Zepto,\n\n /**\n * unique plugin instance id counter\n * @type {number}\n */\n lazyInstanceId = 0,\n\n /**\n * helper to register window load for jQuery 3\n * @type {boolean}\n */ \n windowLoaded = false;\n\n /**\n * make lazy available to jquery - and make it a bit more case-insensitive :)\n * @access public\n * @type {function}\n * @param {object} settings\n * @return {LazyPlugin}\n */\n $.fn.Lazy = $.fn.lazy = function(settings) {\n return new LazyPlugin(this, settings);\n };\n\n /**\n * helper to add plugins to lazy prototype configuration\n * @access public\n * @type {function}\n * @param {string|Array} names\n * @param {string|Array|function} [elements]\n * @param {function} loader\n * @return void\n */\n $.Lazy = $.lazy = function(names, elements, loader) {\n // make second parameter optional\n if ($.isFunction(elements)) {\n loader = elements;\n elements = [];\n }\n\n // exit here if parameter is not a callable function\n if (!$.isFunction(loader)) {\n return;\n }\n\n // make parameters an array of names to be sure\n names = $.isArray(names) ? names : [names];\n elements = $.isArray(elements) ? elements : [elements];\n\n var config = LazyPlugin.prototype.config,\n forced = config._f || (config._f = {});\n\n // add the loader plugin for every name\n for (var i = 0, l = names.length; i < l; i++) {\n if (config[names[i]] === undefined || $.isFunction(config[names[i]])) {\n config[names[i]] = loader;\n }\n }\n\n // add forced elements loader\n for (var c = 0, a = elements.length; c < a; c++) {\n forced[elements[c]] = names[0];\n }\n };\n\n /**\n * contains all logic and the whole element handling\n * is packed in a private function outside class to reduce memory usage, because it will not be created on every plugin instance\n * @access private\n * @type {function}\n * @param {LazyPlugin} instance\n * @param {object} config\n * @param {object|Array} items\n * @param {object} events\n * @param {string} namespace\n * @return void\n */\n function _executeLazy(instance, config, items, events, namespace) {\n /**\n * a helper to trigger the 'onFinishedAll' callback after all other events\n * @access private\n * @type {number}\n */\n var _awaitingAfterLoad = 0,\n\n /**\n * visible content width\n * @access private\n * @type {number}\n */\n _actualWidth = -1,\n\n /**\n * visible content height\n * @access private\n * @type {number}\n */\n _actualHeight = -1,\n\n /**\n * determine possibly detected high pixel density\n * @access private\n * @type {boolean}\n */\n _isRetinaDisplay = false, \n\n /**\n * dictionary entry for better minimization\n * @access private\n * @type {string}\n */\n _afterLoad = 'afterLoad',\n\n /**\n * dictionary entry for better minimization\n * @access private\n * @type {string}\n */\n _load = 'load',\n\n /**\n * dictionary entry for better minimization\n * @access private\n * @type {string}\n */\n _error = 'error',\n\n /**\n * dictionary entry for better minimization\n * @access private\n * @type {string}\n */\n _img = 'img',\n\n /**\n * dictionary entry for better minimization\n * @access private\n * @type {string}\n */\n _src = 'src',\n\n /**\n * dictionary entry for better minimization\n * @access private\n * @type {string}\n */\n _srcset = 'srcset',\n\n /**\n * dictionary entry for better minimization\n * @access private\n * @type {string}\n */\n _sizes = 'sizes',\n\n /**\n * dictionary entry for better minimization\n * @access private\n * @type {string}\n */\n _backgroundImage = 'background-image';\n\n /**\n * initialize plugin\n * bind loading to events or set delay time to load all items at once\n * @access private\n * @return void\n */\n function _initialize() {\n // detect actual device pixel ratio\n // noinspection JSUnresolvedVariable\n _isRetinaDisplay = window.devicePixelRatio > 1;\n\n // prepare all initial items\n items = _prepareItems(items);\n\n // if delay time is set load all items at once after delay time\n if (config.delay >= 0) {\n setTimeout(function() {\n _lazyLoadItems(true);\n }, config.delay);\n }\n\n // if no delay is set or combine usage is active bind events\n if (config.delay < 0 || config.combined) {\n // create unique event function\n events.e = _throttle(config.throttle, function(event) {\n // reset detected window size on resize event\n if (event.type === 'resize') {\n _actualWidth = _actualHeight = -1;\n }\n\n // execute 'lazy magic'\n _lazyLoadItems(event.all);\n });\n\n // create function to add new items to instance\n events.a = function(additionalItems) {\n additionalItems = _prepareItems(additionalItems);\n items.push.apply(items, additionalItems);\n };\n\n // create function to get all instance items left\n events.g = function() {\n // filter loaded items before return in case internal filter was not running until now\n return (items = $(items).filter(function() {\n return !$(this).data(config.loadedName);\n }));\n };\n\n // create function to force loading elements\n events.f = function(forcedItems) {\n for (var i = 0; i < forcedItems.length; i++) {\n // only handle item if available in current instance\n // use a compare function, because Zepto can't handle object parameter for filter\n // var item = items.filter(forcedItems[i]);\n /* jshint loopfunc: true */\n var item = items.filter(function() {\n return this === forcedItems[i];\n });\n\n if (item.length) {\n _lazyLoadItems(false, item); \n }\n }\n };\n\n // load initial items\n _lazyLoadItems();\n\n // bind lazy load functions to scroll and resize event\n // noinspection JSUnresolvedVariable\n $(config.appendScroll).on('scroll.' + namespace + ' resize.' + namespace, events.e);\n }\n }\n\n /**\n * prepare items before handle them\n * @access private\n * @param {Array|object|jQuery} items\n * @return {Array|object|jQuery}\n */\n function _prepareItems(items) {\n // fetch used configurations before loops\n var defaultImage = config.defaultImage,\n placeholder = config.placeholder,\n imageBase = config.imageBase,\n srcsetAttribute = config.srcsetAttribute,\n loaderAttribute = config.loaderAttribute,\n forcedTags = config._f || {};\n\n // filter items and only add those who not handled yet and got needed attributes available\n items = $(items).filter(function() {\n var element = $(this),\n tag = _getElementTagName(this);\n\n return !element.data(config.handledName) && \n (element.attr(config.attribute) || element.attr(srcsetAttribute) || element.attr(loaderAttribute) || forcedTags[tag] !== undefined);\n })\n\n // append plugin instance to all elements\n .data('plugin_' + config.name, instance);\n\n for (var i = 0, l = items.length; i < l; i++) {\n var element = $(items[i]),\n tag = _getElementTagName(items[i]),\n elementImageBase = element.attr(config.imageBaseAttribute) || imageBase;\n\n // generate and update source set if an image base is set\n if (tag === _img && elementImageBase && element.attr(srcsetAttribute)) {\n element.attr(srcsetAttribute, _getCorrectedSrcSet(element.attr(srcsetAttribute), elementImageBase));\n }\n\n // add loader to forced element types\n if (forcedTags[tag] !== undefined && !element.attr(loaderAttribute)) {\n element.attr(loaderAttribute, forcedTags[tag]);\n }\n\n // set default image on every element without source\n if (tag === _img && defaultImage && !element.attr(_src)) {\n element.attr(_src, defaultImage);\n }\n\n // set placeholder on every element without background image\n else if (tag !== _img && placeholder && (!element.css(_backgroundImage) || element.css(_backgroundImage) === 'none')) {\n element.css(_backgroundImage, \"url('\" + placeholder + \"')\");\n }\n }\n\n return items;\n }\n\n /**\n * the 'lazy magic' - check all items\n * @access private\n * @param {boolean} [allItems]\n * @param {object} [forced]\n * @return void\n */\n function _lazyLoadItems(allItems, forced) {\n // skip if no items where left\n if (!items.length) {\n // destroy instance if option is enabled\n if (config.autoDestroy) {\n // noinspection JSUnresolvedFunction\n instance.destroy();\n }\n\n return;\n }\n\n var elements = forced || items,\n loadTriggered = false,\n imageBase = config.imageBase || '',\n srcsetAttribute = config.srcsetAttribute,\n handledName = config.handledName;\n\n // loop all available items\n for (var i = 0; i < elements.length; i++) {\n // item is at least in loadable area\n if (allItems || forced || _isInLoadableArea(elements[i])) {\n var element = $(elements[i]),\n tag = _getElementTagName(elements[i]),\n attribute = element.attr(config.attribute),\n elementImageBase = element.attr(config.imageBaseAttribute) || imageBase,\n customLoader = element.attr(config.loaderAttribute);\n\n // is not already handled \n if (!element.data(handledName) &&\n // and is visible or visibility doesn't matter\n (!config.visibleOnly || element.is(':visible')) && (\n // and image source or source set attribute is available\n (attribute || element.attr(srcsetAttribute)) && (\n // and is image tag where attribute is not equal source or source set\n (tag === _img && (elementImageBase + attribute !== element.attr(_src) || element.attr(srcsetAttribute) !== element.attr(_srcset))) ||\n // or is non image tag where attribute is not equal background\n (tag !== _img && elementImageBase + attribute !== element.css(_backgroundImage))\n ) ||\n // or custom loader is available\n customLoader))\n {\n // mark element always as handled as this point to prevent double handling\n loadTriggered = true;\n element.data(handledName, true);\n\n // load item\n _handleItem(element, tag, elementImageBase, customLoader);\n }\n }\n }\n\n // when something was loaded remove them from remaining items\n if (loadTriggered) {\n items = $(items).filter(function() {\n return !$(this).data(handledName);\n });\n }\n }\n\n /**\n * load the given element the lazy way\n * @access private\n * @param {object} element\n * @param {string} tag\n * @param {string} imageBase\n * @param {function} [customLoader]\n * @return void\n */\n function _handleItem(element, tag, imageBase, customLoader) {\n // increment count of items waiting for after load\n ++_awaitingAfterLoad;\n\n // extended error callback for correct 'onFinishedAll' handling\n var errorCallback = function() {\n _triggerCallback('onError', element);\n _reduceAwaiting();\n\n // prevent further callback calls\n errorCallback = $.noop;\n };\n\n // trigger function before loading image\n _triggerCallback('beforeLoad', element);\n\n // fetch all double used data here for better code minimization\n var srcAttribute = config.attribute,\n srcsetAttribute = config.srcsetAttribute,\n sizesAttribute = config.sizesAttribute,\n retinaAttribute = config.retinaAttribute,\n removeAttribute = config.removeAttribute,\n loadedName = config.loadedName,\n elementRetina = element.attr(retinaAttribute);\n\n // handle custom loader\n if (customLoader) {\n // on load callback\n var loadCallback = function() {\n // remove attribute from element\n if (removeAttribute) {\n element.removeAttr(config.loaderAttribute);\n }\n\n // mark element as loaded\n element.data(loadedName, true);\n\n // call after load event\n _triggerCallback(_afterLoad, element);\n\n // remove item from waiting queue and possibly trigger finished event\n // it's needed to be asynchronous to run after filter was in _lazyLoadItems\n setTimeout(_reduceAwaiting, 1);\n\n // prevent further callback calls\n loadCallback = $.noop;\n };\n\n // bind error event to trigger callback and reduce waiting amount\n element.off(_error).one(_error, errorCallback)\n\n // bind after load callback to element\n .one(_load, loadCallback);\n\n // trigger custom loader and handle response\n if (!_triggerCallback(customLoader, element, function(response) {\n if(response) {\n element.off(_load);\n loadCallback();\n }\n else {\n element.off(_error);\n errorCallback();\n }\n })) {\n element.trigger(_error);\n }\n }\n\n // handle images\n else {\n // create image object\n var imageObj = $(new Image());\n\n // bind error event to trigger callback and reduce waiting amount\n imageObj.one(_error, errorCallback)\n\n // bind after load callback to image\n .one(_load, function() {\n // remove element from view\n element.hide();\n\n // set image back to element\n // do it as single 'attr' calls, to be sure 'src' is set after 'srcset'\n if (tag === _img) {\n element.attr(_sizes, imageObj.attr(_sizes))\n .attr(_srcset, imageObj.attr(_srcset))\n .attr(_src, imageObj.attr(_src));\n }\n else {\n element.css(_backgroundImage, \"url('\" + imageObj.attr(_src) + \"')\");\n }\n\n // bring it back with some effect!\n element[config.effect](config.effectTime);\n\n // remove attribute from element\n if (removeAttribute) {\n element.removeAttr(srcAttribute + ' ' + srcsetAttribute + ' ' + retinaAttribute + ' ' + config.imageBaseAttribute);\n\n // only remove 'sizes' attribute, if it was a custom one\n if (sizesAttribute !== _sizes) {\n element.removeAttr(sizesAttribute);\n }\n }\n\n // mark element as loaded\n element.data(loadedName, true);\n\n // call after load event\n _triggerCallback(_afterLoad, element);\n\n // cleanup image object\n imageObj.remove();\n\n // remove item from waiting queue and possibly trigger finished event\n _reduceAwaiting();\n });\n\n // set sources\n // do it as single 'attr' calls, to be sure 'src' is set after 'srcset'\n var imageSrc = (_isRetinaDisplay && elementRetina ? elementRetina : element.attr(srcAttribute)) || '';\n imageObj.attr(_sizes, element.attr(sizesAttribute))\n .attr(_srcset, element.attr(srcsetAttribute))\n .attr(_src, imageSrc ? imageBase + imageSrc : null);\n\n // call after load even on cached image\n imageObj.complete && imageObj.trigger(_load); // jshint ignore : line\n }\n }\n\n /**\n * check if the given element is inside the current viewport or threshold\n * @access private\n * @param {object} element\n * @return {boolean}\n */\n function _isInLoadableArea(element) {\n var elementBound = element.getBoundingClientRect(),\n direction = config.scrollDirection,\n threshold = config.threshold,\n vertical = // check if element is in loadable area from top\n ((_getActualHeight() + threshold) > elementBound.top) &&\n // check if element is even in loadable are from bottom\n (-threshold < elementBound.bottom),\n horizontal = // check if element is in loadable area from left\n ((_getActualWidth() + threshold) > elementBound.left) &&\n // check if element is even in loadable area from right\n (-threshold < elementBound.right);\n\n if (direction === 'vertical') {\n return vertical;\n }\n else if (direction === 'horizontal') {\n return horizontal;\n }\n\n return vertical && horizontal;\n }\n\n /**\n * receive the current viewed width of the browser\n * @access private\n * @return {number}\n */\n function _getActualWidth() {\n return _actualWidth >= 0 ? _actualWidth : (_actualWidth = $(window).width());\n }\n\n /**\n * receive the current viewed height of the browser\n * @access private\n * @return {number}\n */\n function _getActualHeight() {\n return _actualHeight >= 0 ? _actualHeight : (_actualHeight = $(window).height());\n }\n\n /**\n * get lowercase tag name of an element\n * @access private\n * @param {object} element\n * @returns {string}\n */\n function _getElementTagName(element) {\n return element.tagName.toLowerCase();\n }\n\n /**\n * prepend image base to all srcset entries\n * @access private\n * @param {string} srcset\n * @param {string} imageBase\n * @returns {string}\n */\n function _getCorrectedSrcSet(srcset, imageBase) {\n if (imageBase) {\n // trim, remove unnecessary spaces and split entries\n var entries = srcset.split(',');\n srcset = '';\n\n for (var i = 0, l = entries.length; i < l; i++) {\n srcset += imageBase + entries[i].trim() + (i !== l - 1 ? ',' : '');\n }\n }\n\n return srcset;\n }\n\n /**\n * helper function to throttle down event triggering\n * @access private\n * @param {number} delay\n * @param {function} callback\n * @return {function}\n */\n function _throttle(delay, callback) {\n var timeout,\n lastExecute = 0;\n\n return function(event, ignoreThrottle) {\n var elapsed = +new Date() - lastExecute;\n\n function run() {\n lastExecute = +new Date();\n // noinspection JSUnresolvedFunction\n callback.call(instance, event);\n }\n\n timeout && clearTimeout(timeout); // jshint ignore : line\n\n if (elapsed > delay || !config.enableThrottle || ignoreThrottle) {\n run();\n }\n else {\n timeout = setTimeout(run, delay - elapsed);\n }\n };\n }\n\n /**\n * reduce count of awaiting elements to 'afterLoad' event and fire 'onFinishedAll' if reached zero\n * @access private\n * @return void\n */\n function _reduceAwaiting() {\n --_awaitingAfterLoad;\n\n // if no items were left trigger finished event\n if (!items.length && !_awaitingAfterLoad) {\n _triggerCallback('onFinishedAll');\n }\n }\n\n /**\n * single implementation to handle callbacks, pass element and set 'this' to current instance\n * @access private\n * @param {string|function} callback\n * @param {object} [element]\n * @param {*} [args]\n * @return {boolean}\n */\n function _triggerCallback(callback, element, args) {\n if ((callback = config[callback])) {\n // jQuery's internal '$(arguments).slice(1)' are causing problems at least on old iPads\n // below is shorthand of 'Array.prototype.slice.call(arguments, 1)'\n callback.apply(instance, [].slice.call(arguments, 1));\n return true;\n }\n\n return false;\n }\n\n // if event driven or window is already loaded don't wait for page loading\n if (config.bind === 'event' || windowLoaded) {\n _initialize();\n }\n\n // otherwise load initial items and start lazy after page load\n else {\n // noinspection JSUnresolvedVariable\n $(window).on(_load + '.' + namespace, _initialize);\n } \n }\n\n /**\n * lazy plugin class constructor\n * @constructor\n * @access private\n * @param {object} elements\n * @param {object} settings\n * @return {object|LazyPlugin}\n */\n function LazyPlugin(elements, settings) {\n /**\n * this lazy plugin instance\n * @access private\n * @type {object|LazyPlugin|LazyPlugin.prototype}\n */\n var _instance = this,\n\n /**\n * this lazy plugin instance configuration\n * @access private\n * @type {object}\n */\n _config = $.extend({}, _instance.config, settings),\n\n /**\n * instance generated event executed on container scroll or resize\n * packed in an object to be referenceable and short named because properties will not be minified\n * @access private\n * @type {object}\n */\n _events = {},\n\n /**\n * unique namespace for instance related events\n * @access private\n * @type {string}\n */\n _namespace = _config.name + '-' + (++lazyInstanceId);\n\n // noinspection JSUndefinedPropertyAssignment\n /**\n * wrapper to get or set an entry from plugin instance configuration\n * much smaller on minify as direct access\n * @access public\n * @type {function}\n * @param {string} entryName\n * @param {*} [value]\n * @return {LazyPlugin|*}\n */\n _instance.config = function(entryName, value) {\n if (value === undefined) {\n return _config[entryName];\n }\n\n _config[entryName] = value;\n return _instance;\n };\n\n // noinspection JSUndefinedPropertyAssignment\n /**\n * add additional items to current instance\n * @access public\n * @param {Array|object|string} items\n * @return {LazyPlugin}\n */\n _instance.addItems = function(items) {\n _events.a && _events.a($.type(items) === 'string' ? $(items) : items); // jshint ignore : line\n return _instance;\n };\n\n // noinspection JSUndefinedPropertyAssignment\n /**\n * get all left items of this instance\n * @access public\n * @returns {object}\n */\n _instance.getItems = function() {\n return _events.g ? _events.g() : {};\n };\n\n // noinspection JSUndefinedPropertyAssignment\n /**\n * force lazy to load all items in loadable area right now\n * by default without throttle\n * @access public\n * @type {function}\n * @param {boolean} [useThrottle]\n * @return {LazyPlugin}\n */\n _instance.update = function(useThrottle) {\n _events.e && _events.e({}, !useThrottle); // jshint ignore : line\n return _instance;\n };\n\n // noinspection JSUndefinedPropertyAssignment\n /**\n * force element(s) to load directly, ignoring the viewport\n * @access public\n * @param {Array|object|string} items\n * @return {LazyPlugin}\n */\n _instance.force = function(items) {\n _events.f && _events.f($.type(items) === 'string' ? $(items) : items); // jshint ignore : line\n return _instance;\n };\n\n // noinspection JSUndefinedPropertyAssignment\n /**\n * force lazy to load all available items right now\n * this call ignores throttling\n * @access public\n * @type {function}\n * @return {LazyPlugin}\n */\n _instance.loadAll = function() {\n _events.e && _events.e({all: true}, true); // jshint ignore : line\n return _instance;\n };\n\n // noinspection JSUndefinedPropertyAssignment\n /**\n * destroy this plugin instance\n * @access public\n * @type {function}\n * @return undefined\n */\n _instance.destroy = function() {\n // unbind instance generated events\n // noinspection JSUnresolvedFunction, JSUnresolvedVariable\n $(_config.appendScroll).off('.' + _namespace, _events.e);\n // noinspection JSUnresolvedVariable\n $(window).off('.' + _namespace);\n\n // clear events\n _events = {};\n\n return undefined;\n };\n\n // start using lazy and return all elements to be chainable or instance for further use\n // noinspection JSUnresolvedVariable\n _executeLazy(_instance, _config, elements, _events, _namespace);\n return _config.chainable ? elements : _instance;\n }\n\n /**\n * settings and configuration data\n * @access public\n * @type {object|*}\n */\n LazyPlugin.prototype.config = {\n // general\n name : 'lazy',\n chainable : true,\n autoDestroy : true,\n bind : 'load',\n threshold : 500,\n visibleOnly : false,\n appendScroll : window,\n scrollDirection : 'both',\n imageBase : null,\n defaultImage : 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',\n placeholder : null,\n delay : -1,\n combined : false,\n\n // attributes\n attribute : 'data-src',\n srcsetAttribute : 'data-srcset',\n sizesAttribute : 'data-sizes',\n retinaAttribute : 'data-retina',\n loaderAttribute : 'data-loader',\n imageBaseAttribute : 'data-imagebase',\n removeAttribute : true,\n handledName : 'handled',\n loadedName : 'loaded',\n\n // effect\n effect : 'show',\n effectTime : 0,\n\n // throttle\n enableThrottle : true,\n throttle : 250,\n\n // callbacks\n beforeLoad : undefined,\n afterLoad : undefined,\n onError : undefined,\n onFinishedAll : undefined\n };\n\n // register window load event globally to prevent not loading elements\n // since jQuery 3.X ready state is fully async and may be executed after 'load' \n $(window).on('load', function() {\n windowLoaded = true;\n });\n})(window);"]}