{"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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"}