{"version":3,"file":"ad-rotator.js","mappings":"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","sources":["webpack://rotator/webpack/universalModuleDefinition","webpack://rotator/webpack/runtime/chunk loaded","webpack://rotator/./src/helpers.ts","webpack://rotator/./src/ad-rotator.ts","webpack://rotator/webpack/bootstrap","webpack://rotator/webpack/runtime/define property getters","webpack://rotator/webpack/runtime/hasOwnProperty shorthand","webpack://rotator/webpack/runtime/jsonp chunk loading","webpack://rotator/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"rotator\"] = factory();\n\telse\n\t\troot[\"rotator\"] = factory();\n})(this, () => {\nreturn ","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * A no-operation Function\n * @param args\n * @returns\n */\nexport const NOOP = (...args: unknown[]): unknown => undefined;\n\n/**\n * A function to delay execution\n * @param {Number} ms Timeout in ms\n */\nexport const delay = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms));\n","import type { AdConfig, StickyConfig, AdUnit, EventManager, AdRotatorInstance } from './types';\nimport { NOOP, delay } from './helpers';\nimport './style.less';\n\n// init constants\nconst mobile = 'mobile';\nconst desktop = 'desktop';\n\n// Detected device ( 992 => min width to consider as desktop)\nconst device = window.screen.availWidth >= 992 ? desktop : mobile;\n// default Rotation Time\nconst interval = 5; // 5 seconds\n\nlet hasBlk: boolean; // flag to detect AdBlockers\n\n/**\n * DefaultConfig\n */\nconst getDefaultConfig = {\n target: 'all',\n timer: interval,\n random: true,\n newTab: false,\n fallbackMode: false,\n} as AdConfig;\n\nconst detectBlock = async () => {\n if (hasBlk !== undefined) {\n return hasBlk;\n }\n\n // test with baitElement\n const testDiv = document.createElement('div');\n testDiv.className = window.atob(\n 'YjNFbCBhZHMgYWQgYWRzYm94IGRvdWJsZWNsaWNrIGFkLXBsYWNlbWVudCBjYXJib24tYWRzIHByZWJpZCBhZC11bml0'\n );\n\n document.body.appendChild(testDiv);\n if (getComputedStyle(testDiv)['display'] == 'none') {\n return (hasBlk = true);\n }\n\n // fallback to pinging a real ad network\n try {\n await fetch(window.atob('aHR0cHM6Ly9wYWdlYWQyLmdvb2dsZXN5bmRpY2F0aW9uLmNvbS9wYWdlYWQvanMvYWRzYnlnb29nbGUuanM='), {\n method: 'HEAD',\n mode: 'no-cors',\n });\n } catch (e) {\n return (hasBlk = true);\n }\n\n hasBlk = false;\n};\n\nexport const stickyEl = (El: HTMLElement, stickyConf: StickyConfig): null | (() => void) => {\n if (!El || !(El instanceof HTMLElement) || !stickyConf || stickyConf.constructor !== Object) return null;\n\n const { beforeEl, afterEl, offsetTop, offsetBottom, position } = stickyConf;\n const isStickyPos = position === 'sticky' ? 1 : 0;\n\n let startPos = 0,\n endPos = 0;\n let ticking = false;\n\n const eventHandler = () => {\n if (!ticking) {\n const scrollPos = window.scrollY;\n if (beforeEl && beforeEl instanceof HTMLElement) {\n const props = beforeEl.getBoundingClientRect();\n startPos = scrollPos + props.top + props.height;\n }\n if (afterEl && afterEl instanceof HTMLElement) {\n endPos = scrollPos + afterEl.getBoundingClientRect().top;\n }\n\n window.requestAnimationFrame(() => {\n if (\n scrollPos > startPos &&\n !(endPos && scrollPos > endPos - El.clientHeight - (parseInt(offsetBottom as string, 10) || 0))\n ) {\n El.classList.add('stickyElx');\n El.style.position = isStickyPos ? 'sticky' : 'fixed';\n El.style.top = (parseInt(offsetTop as string, 10) || 0) + 'px';\n } else {\n if (!isStickyPos) {\n // fixed positioning\n El.style.top = '0';\n El.style.position = 'relative';\n }\n El.classList.remove('stickyElx');\n }\n ticking = false;\n });\n ticking = true;\n }\n };\n\n window.addEventListener('scroll', eventHandler);\n return eventHandler;\n};\n\n/**\n * Generates a random number by weight\n * @param units Array of AdUnits\n * @returns\n */\nconst randomNum = (units: AdUnit[]): number => {\n const totalWeight = units.reduce((acc, item) => acc + (item.weight || 1), 0);\n\n // generate an array that has a percentage of each item\n let runningTotal = 0;\n const cumulativeWeight = units.map((val) => {\n const relativeWeight = (val.weight || 1) / totalWeight;\n const cw = relativeWeight + runningTotal;\n runningTotal += relativeWeight;\n return cw;\n });\n\n // generate random number and compare it to the closest array value\n const r = Math.random();\n let closestIndex = 0;\n for (let i = 0, len = cumulativeWeight.length; i < len; i++) {\n if (r <= cumulativeWeight[i]) {\n closestIndex = i;\n break;\n }\n }\n\n return closestIndex;\n};\n\nconst rotateImage = async (\n El: HTMLElement,\n units: AdUnit[],\n conf: AdConfig,\n unitsClone: AdUnit[],\n prevItem: AdUnit = {} as AdUnit\n) => {\n let unit: AdUnit | undefined;\n if (conf.random) {\n // get random unit\n let index = unitsClone.length === 1 ? 0 : randomNum(unitsClone);\n while (unitsClone.length > 1 && prevItem.img === unitsClone[index].img) {\n // ensure randomness at the end of a complete rotation cycle\n index = randomNum(unitsClone);\n }\n unit = unitsClone[index];\n if (unitsClone.length !== 1) {\n unitsClone.splice(index, 1); // remove item from arr\n } else {\n unitsClone = JSON.parse(JSON.stringify(units));\n }\n } else {\n // sequential\n unit = unitsClone.shift();\n if (!unitsClone.length) unitsClone = JSON.parse(JSON.stringify(units)); // reset clone when array length is reached\n }\n\n // create link\n const link = document.createElement('a');\n link.href = (unit as AdUnit).url || '';\n link.setAttribute('rel', 'noopener nofollow noreferrer');\n conf.linkClass && link.classList.add(conf.linkClass);\n conf.newTab && link.setAttribute('target', '_blank');\n // add onclick handler\n link.addEventListener('click', (e) => {\n (conf.onClick || NOOP)(e, unit as AdUnit);\n });\n // create image\n const img = document.createElement('img');\n img.src = (unit as AdUnit).img;\n img.classList.add('fadeIn');\n conf.imgClass && img.classList.add(conf.imgClass);\n\n if ((unit as AdUnit).title) {\n // improve accessibility, SEO\n link.setAttribute('title', `${(unit as AdUnit).title}`);\n link.setAttribute('aria-label', `${(unit as AdUnit).title}`);\n img.setAttribute('alt', `${(unit as AdUnit).title}`);\n }\n\n // allow time to preload images\n await delay(900);\n // attach an image to the link\n link.appendChild(img);\n // clean Src element and remove all listeners\n El.innerHTML = '';\n // add the link to the El\n El.appendChild(link);\n\n // exec callback on every rotation\n (conf.cb || NOOP)(unit as AdUnit, El, conf);\n\n // unitsClone.length === units.length && console.log(' **** End of rotation cycle **** ');\n\n return {\n unitsClone,\n prevItem: unit,\n };\n};\n\nexport const rotator = (El: HTMLElement, units: AdUnit[] = [], options: AdConfig = {}): AdRotatorInstance => {\n let hasErr = false;\n const conf = { ...getDefaultConfig, ...options };\n if (\n !El ||\n !(El instanceof HTMLElement) ||\n !units ||\n !(units instanceof Array) ||\n !units.length ||\n !(units[0] instanceof Object) ||\n !units[0].url ||\n !units[0].img ||\n isNaN(conf.timer as number)\n ) {\n hasErr = true;\n console.error('Missing/malformed params - El, Units, Config', El, units, conf);\n }\n\n let inter: number | undefined; // reference to interval\n let ret; // reference to return value of `rotateImage`\n let prevItem: AdUnit | null = null;\n\n // sort by weight (naturally, highest weight first)\n units.sort((a, b) => +(b.weight || 1) - +(a.weight || 1));\n\n let unitsClone = JSON.parse(JSON.stringify(units)); // clone units\n\n // Manage events\n const eventManager: EventManager = {\n scrollEvRef: null,\n obs: null,\n init() {\n this.destroy();\n El.addEventListener('mouseenter', () => {\n out.pause();\n // on hover callback\n (conf.onHover || NOOP)(prevItem, El);\n });\n\n El.addEventListener('mouseleave', () => {\n out.resume();\n });\n // add observer\n this.obs = new IntersectionObserver(this.obsCb.bind(out), { threshold: 0.5 });\n this.obs.observe(El);\n // make sticky\n if (\n conf.sticky &&\n (conf.sticky as unknown as Record).constructor === Object &&\n (!(conf.sticky as unknown as Record).noMobile || device !== mobile)\n ) {\n this.scrollEvRef = stickyEl(El, conf.sticky as unknown as Record);\n }\n },\n destroy() {\n if (this.obs) this.obs.unobserve(El);\n const clone = El.cloneNode(true);\n (El.parentNode as HTMLElement).replaceChild(clone, El);\n El = clone as HTMLElement;\n // remove stickiness\n if (!conf.sticky) {\n window.removeEventListener('scroll', this.scrollEvRef as (this: Window, event: Event) => void);\n this.scrollEvRef = null;\n El.classList.remove('stickyElx');\n El.style.position === 'fixed' && (El.style.position = 'relative');\n }\n },\n obsCb(entries) {\n entries.forEach((entry) => {\n if ((entry.intersectionRatio as number) >= 0.5) {\n out.resume();\n } else {\n out.pause();\n }\n });\n },\n };\n\n // prepare output\n const out: AdRotatorInstance = {\n conf,\n pause() {\n if (inter) {\n clearInterval(inter);\n }\n },\n async start() {\n if (conf.fallbackMode) {\n await detectBlock();\n if (hasBlk === false) {\n hasErr = true; // Force Error to bypass exposed API if intended usage is only as a fallback\n }\n }\n\n if (hasErr) return;\n if ((conf.target === mobile && device !== mobile) || (conf.target === desktop && device !== desktop)) return;\n eventManager.init();\n ret = await rotateImage(El, units, conf, unitsClone);\n unitsClone = ret.unitsClone;\n prevItem = ret.prevItem as AdUnit;\n },\n resume() {\n if (hasErr) return;\n this.pause();\n // rotate only if multiple units are present\n if (units.length > 1) {\n const rotationTime = (conf.timer as number) >= 2 ? conf.timer : interval;\n inter = window.setInterval(async function () {\n ret = await rotateImage(El, units, conf, unitsClone, prevItem as AdUnit);\n unitsClone = ret.unitsClone;\n prevItem = ret.prevItem as AdUnit;\n }, (rotationTime as number) * 1e3 - 900);\n }\n },\n destroy() {\n if (hasErr) return;\n this.pause();\n while (El.firstChild) {\n El.firstChild.remove();\n }\n eventManager.destroy();\n },\n add(item: AdUnit) {\n if (hasErr) return;\n if (item && item instanceof Object && item.url && item.img) {\n units.push(item);\n }\n },\n remove(item: AdUnit) {\n if (hasErr) return;\n if (units.length <= 1) return this.pause();\n\n if (!item) units.pop();\n else units = units.filter((i) => i.img !== item.img);\n },\n };\n\n return out;\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0,\n\t296: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunkrotator\"] = this[\"webpackChunkrotator\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [296], () => (__webpack_require__(379)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["root","factory","exports","module","define","amd","this","deferred","NOOP","args","mobile","desktop","device","window","screen","availWidth","hasBlk","getDefaultConfig","target","timer","random","newTab","fallbackMode","randomNum","units","totalWeight","reduce","acc","item","weight","runningTotal","cumulativeWeight","map","val","relativeWeight","cw","r","Math","closestIndex","i","len","length","rotateImage","async","El","conf","unitsClone","prevItem","unit","index","img","splice","JSON","parse","stringify","shift","link","document","createElement","href","url","setAttribute","linkClass","classList","add","addEventListener","e","onClick","src","imgClass","title","Promise","resolve","setTimeout","appendChild","innerHTML","cb","rotator","options","hasErr","inter","ret","HTMLElement","Array","Object","isNaN","console","error","sort","a","b","eventManager","scrollEvRef","obs","init","destroy","out","pause","onHover","resume","IntersectionObserver","obsCb","bind","threshold","observe","sticky","constructor","noMobile","stickyConf","beforeEl","afterEl","offsetTop","offsetBottom","position","isStickyPos","startPos","endPos","ticking","eventHandler","scrollPos","scrollY","props","getBoundingClientRect","top","height","requestAnimationFrame","clientHeight","parseInt","style","remove","stickyEl","unobserve","clone","cloneNode","parentNode","replaceChild","removeEventListener","entries","forEach","entry","intersectionRatio","clearInterval","undefined","testDiv","className","atob","body","getComputedStyle","fetch","method","mode","detectBlock","rotationTime","setInterval","firstChild","push","filter","pop","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","keys","every","key","d","definition","o","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}