{"version":3,"file":"lazyframe.min.js","sources":["../src/lazyframe.js"],"sourcesContent":["import './scss/lazyframe.scss'\n\nconst Lazyframe = () => {\n\n let settings;\n\n const elements = [];\n\n const defaults = {\n vendor: undefined,\n id: undefined,\n src: undefined,\n thumbnail: undefined,\n title: undefined,\n initialized: false,\n y: undefined,\n debounce: 250,\n lazyload: true,\n autoplay: true,\n initinview: false,\n onLoad: (l) => {},\n onAppend: (l) => {},\n onThumbnailLoad: (img) => {}\n };\n\n const constants = {\n regex: {\n youtube_nocookie: /(?:youtube-nocookie\\.com\\/\\S*(?:(?:\\/e(?:mbed))?\\/|watch\\?(?:\\S*?&?v\\=)))([a-zA-Z0-9_-]{6,11})/,\n youtube: /(?:youtube\\.com\\/\\S*(?:(?:\\/e(?:mbed))?\\/|watch\\?(?:\\S*?&?v\\=))|youtu\\.be\\/)([a-zA-Z0-9_-]{6,11})/,\n vimeo: /vimeo\\.com\\/(?:video\\/)?([0-9]*)(?:\\?|)/,\n },\n condition: {\n youtube: (m) => (m && m[1].length == 11 ? m[1] : false),\n youtube_nocookie: (m) => (m && m[1].length == 11 ? m[1] : false),\n vimeo: (m) =>\n (m && m[1].length === 9) || m[1].length === 8 ? m[1] : false,\n },\n src: {\n youtube: (s) =>\n `https://www.youtube.com/embed/${s.id}/?autoplay=${\n s.autoplay ? \"1\" : \"0\"\n }&${s.query}`,\n youtube_nocookie: (s) =>\n `https://www.youtube-nocookie.com/embed/${s.id}/?autoplay=${\n s.autoplay ? \"1\" : \"0\"\n }&${s.query}`,\n vimeo: (s) =>\n `https://player.vimeo.com/video/${s.id}/?autoplay=${\n s.autoplay ? \"1\" : \"0\"\n }&${s.query}`,\n },\n endpoint: (s) => `https://noembed.com/embed?url=${s.src}`,\n response: {\n title: (r) => r.title,\n thumbnail: (r) => r.thumbnail_url,\n },\n };\n\n function init(elements, ...args) {\n settings = Object.assign({}, defaults, args[0]);\n\n if (typeof elements === 'string') {\n\n const selector = document.querySelectorAll(elements);\n for (let i = 0; i < selector.length; i++) {\n loop(selector[i]);\n }\n } else if (typeof elements.length === 'undefined'){\n loop(elements);\n } else {\n for (let i = 0; i < elements.length; i++) {\n loop(elements[i]);\n }\n }\n\n if (settings.lazyload) {\n scroll();\n }\n\n }\n\n function loop(el) {\n\n if(el instanceof HTMLElement === false ||\n el.classList.contains('lazyframe--loaded')) return;\n\n const lazyframe = {\n el: el,\n settings: setup(el),\n };\n\n lazyframe.el.addEventListener('click', () => {\n lazyframe.el.appendChild(lazyframe.iframe);\n\n const iframe = el.querySelectorAll('iframe');\n lazyframe.settings.onAppend.call(this, iframe[0]);\n });\n\n if (settings.lazyload) {\n build(lazyframe);\n } else {\n api(lazyframe, !!lazyframe.settings.thumbnail);\n }\n\n }\n\n function setup(el) {\n\n const attr = Array.prototype.slice.apply(el.attributes)\n .filter(att => att.value !== '')\n .reduce((obj, curr) => {\n let name = curr.name.indexOf('data-') === 0 ? curr.name.split('data-')[1] : curr.name;\n obj[name] = curr.value;\n return obj;\n }, {});\n\n const options = Object.assign({},\n settings,\n attr,\n {\n y: el.offsetTop,\n originalSrc: attr.src,\n query: getQuery(attr.src)\n }\n );\n\n if (options.vendor) {\n const match = options.src.match(constants.regex[options.vendor]);\n options.id = constants.condition[options.vendor](match);\n }\n\n return options;\n\n }\n\n function getQuery(src) {\n const query = src.split('?');\n return query[1] ? query[1] : null\n }\n\n function useApi(settings) {\n if (!settings.vendor) return false;\n return !settings.title || !settings.thumbnail;\n }\n\n function api(lazyframe) {\n\n if (useApi(lazyframe.settings)) {\n send(lazyframe, (err, data) => {\n if (err) return;\n\n const response = data[0];\n const _l = data[1];\n\n if (!_l.settings.title) {\n _l.settings.title = constants.response.title(response);\n }\n if (!_l.settings.thumbnail) {\n const url = constants.response.thumbnail(response);\n _l.settings.thumbnail = url;\n lazyframe.settings.onThumbnailLoad.call(this, url);\n }\n build(_l, true);\n\n });\n\n }else{\n build(lazyframe, true);\n }\n\n }\n\n function send(lazyframe, cb) {\n\n const endpoint = constants.endpoint(lazyframe.settings);\n const request = new XMLHttpRequest();\n\n request.open('GET', endpoint, true);\n\n request.onload = function() {\n if (request.status >= 200 && request.status < 400) {\n const data = JSON.parse(request.responseText);\n cb(null, [data, lazyframe]);\n } else {\n cb(true);\n }\n };\n\n request.onerror = function() {\n cb(true);\n };\n\n request.send();\n\n }\n\n function scroll() {\n\n const height = window.innerHeight;\n let count = elements.length;\n const initElement = (el, i) => {\n el.settings.initialized = true;\n el.el.classList.add('lazyframe--loaded');\n count--;\n api(el);\n\n if (el.settings.initinview) {\n el.el.click();\n }\n\n el.settings.onLoad.call(this, el);\n }\n\n elements\n .filter(el => el.settings.y < height)\n .forEach(initElement);\n\n const onScroll = debounce(() => {\n\n up = lastY < window.pageYOffset;\n lastY = window.pageYOffset;\n\n if (up) {\n elements\n .filter(el => el.settings.y < (height + lastY) && el.settings.initialized === false)\n .forEach(initElement);\n }\n\n if (count === 0) {\n window.removeEventListener('scroll', onScroll, false);\n }\n\n }, settings.debounce);\n\n let lastY = 0;\n let up = false;\n\n window.addEventListener('scroll', onScroll, false);\n\n function debounce(func, wait, immediate) {\n let timeout;\n return function() {\n let context = this, args = arguments;\n let later = function() {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n let callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n };\n\n }\n\n function build(lazyframe, loadImage) {\n\n lazyframe.iframe = getIframe(lazyframe.settings);\n\n if (lazyframe.settings.thumbnail && loadImage) {\n lazyframe.el.style.backgroundImage = `url(${lazyframe.settings.thumbnail})`;\n }\n\n if (lazyframe.settings.title && lazyframe.el.children.length === 0) {\n const docfrag = document.createDocumentFragment(),\n titleNode = document.createElement('span');\n\n titleNode.className = 'lazyframe__title';\n titleNode.innerHTML = lazyframe.settings.title;\n docfrag.appendChild(titleNode);\n\n lazyframe.el.appendChild(docfrag);\n }\n\n if (!settings.lazyload) {\n lazyframe.el.classList.add('lazyframe--loaded');\n lazyframe.settings.onLoad.call(this, lazyframe);\n elements.push(lazyframe);\n }\n\n if (!lazyframe.settings.initialized) {\n elements.push(lazyframe);\n }\n\n }\n\n function getIframe(settings) {\n\n const docfrag = document.createDocumentFragment();\n const iframeNode = document.createElement('iframe');\n\n if (settings.vendor) {\n settings.src = constants.src[settings.vendor](settings);\n }\n\n iframeNode.setAttribute('id', `lazyframe-${settings.id}`);\n iframeNode.setAttribute('src', settings.src);\n iframeNode.setAttribute('frameborder', 0);\n iframeNode.setAttribute('allowfullscreen', '');\n \n if (settings.autoplay) {\n iframeNode.allow = 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture';\n }\n\n docfrag.appendChild(iframeNode);\n return docfrag;\n\n }\n\n return init;\n\n}\n\nconst lf = Lazyframe();\n\nexport default lf;\n"],"names":["settings","elements","defaults","vendor","undefined","id","src","thumbnail","title","initialized","y","debounce","lazyload","autoplay","initinview","onLoad","l","onAppend","onThumbnailLoad","img","constants","regex","youtube_nocookie","youtube","vimeo","condition","m","length","s","query","endpoint","response","r","thumbnail_url","loop","el","HTMLElement","classList","contains","lazyframe","setup","addEventListener","appendChild","iframe","querySelectorAll","call","_this","build","api","attr","Array","prototype","slice","apply","attributes","filter","att","value","reduce","obj","curr","name","indexOf","split","options","_extends","offsetTop","originalSrc","match","useApi","cb","request","XMLHttpRequest","open","onload","status","data","JSON","parse","responseText","onerror","send","err","_l","url","_this2","scroll","height","window","innerHeight","count","initElement","i","add","click","_this3","forEach","func","wait","immediate","timeout","onScroll","up","lastY","pageYOffset","removeEventListener","context","this","args","arguments","later","callNow","clearTimeout","setTimeout","loadImage","docfrag","document","createDocumentFragment","iframeNode","createElement","setAttribute","allow","getIframe","style","backgroundImage","children","titleNode","className","innerHTML","push","selector","Lazyframe"],"mappings":"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"}