{"version":3,"file":"embeddables.min.js","sources":["../node_modules/embedo/embedo.js","../src/embeddablemain.js"],"sourcesContent":["/**\n * @file embedo.js\n *\n * Embedo is third party content embed plugin with features having events and resizing.\n * It provides a layer above popular social media sites native embed snippets\n * making it easier to hook content without modifying much code.\n *\n * @author Shobhit Sharma <hi@shobh.it>\n * @license MIT\n */\n\n'use strict';\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    define(factory);\n  } else if (typeof module === 'object' && module.exports) {\n    module.exports = factory();\n  } else if (root) {\n    root.Embedo = window.Embedo = factory();\n  }\n})(this, function () {\n  /**\n   * @class Embedo Prototype\n   *\n   * @param {object} options Initialize options.\n   */\n  function Embedo(options) {\n    this.options = options || Embedo.defaults.OPTIONS;\n    this.requests = [];\n    this.events = [];\n\n    this.init(this.options);\n\n    return this;\n  }\n\n  /**\n   * @constant\n   * Embedo defaults\n   *\n   * @description Embedo defaults contains basic configuration and values required to build internal engine.\n   */\n  Object.defineProperty(Embedo, 'defaults', {\n    value: {\n      OPTIONS: {\n        facebook: null,\n        twitter: false,\n        instagram: false,\n        pinterest: false\n      },\n      SOURCES: {\n        facebook: {\n          GLOBAL: 'FB',\n          SDK: '//connect.facebook.net/${locale}/sdk.js',\n          oEmbed: '//graph.facebook.com/${version}/oembed_${type}',\n          REGEX: /(?:(?:http|https):\\/\\/)?(?:www.)?facebook.com\\/(?:(?:\\w)*#!\\/)?(?:pages\\/)?([\\w\\-]*)?/g,\n          PARAMS: {\n            version: 'v3.2',\n            cookie: true,\n            appId: null,\n            access_token: null\n          }\n        },\n        twitter: {\n          GLOBAL: 'twttr',\n          SDK: '//platform.twitter.com/widgets.js',\n          oEmbed: '//publish.twitter.com/oembed',\n          REGEX: /^http[s]*:\\/\\/[www.]*twitter(\\.[a-z]+).*/i,\n          PARAMS: {}\n        },\n        instagram: {\n          GLOBAL: 'instgrm',\n          SDK: '//www.instagram.com/embed.js',\n          oEmbed: '//graph.facebook.com/${version}/instagram_oembed',\n          REGEX: /(http|https)?:\\/\\/(www\\.)?instagram.com\\/p\\/[a-zA-Z0-9_\\/\\?\\-\\=]+/gi,\n          PARAMS: {\n            version: 'v8.0',\n            access_token: null\n          }\n        },\n        youtube: {\n          GLOBAL: null,\n          SDK: null,\n          oEmbed: '//www.youtube.com/embed/',\n          REGEX: /^(?:(?:https?:)?\\/\\/)?(?:www\\.)?(?:m\\.)?(?:youtu(?:be)?\\.com\\/(?:v\\/|embed\\/|watch(?:\\/|\\?v=))|youtu\\.be\\/)((?:\\w|-){11})(?:\\S+)?$/,\n          PARAMS: null\n        },\n        pinterest: {\n          GLOBAL: 'PinUtils',\n          SDK: '//assets.pinterest.com/js/pinit.js',\n          oEmbed: null,\n          REGEX: /(https?:\\/\\/(ww.)?)?pinterest(\\.[a-z]+).*/i,\n          PARAMS: {}\n        },\n        vimeo: {\n          GLOBAL: null,\n          SDK: null,\n          oEmbed: '//vimeo.com/api/oembed.json',\n          REGEX: /(http|https)?:\\/\\/(www\\.)?vimeo(\\.[a-z]+)\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^\\/]*)\\/videos\\/|)(\\d+)(?:|\\/\\?)/,\n          PARAMS: {}\n        },\n        github: {\n          GLOBAL: null,\n          SDK: null,\n          oEmbed: null,\n          REGEX: /(http|https):\\/\\/gist\\.github\\.com\\/(\\w+)\\/(\\w+)/,\n          PARAMS: {}\n        },\n        soundcloud: {\n          GLOBAL: null,\n          SDK: null,\n          oEmbed: '//soundcloud.com/oembed',\n          REGEX: /^(http|https):\\/\\/soundcloud\\.com\\/(\\w+)\\/.*$/,\n          PARAMS: {}\n        }\n      },\n      RESTRICTED: ['url', 'strict', 'height', 'width', 'centerize', 'jsonp']\n    },\n    writable: false,\n    enumerable: true,\n    configurable: false\n  });\n\n  // Application Logger\n  Object.defineProperty(Embedo, 'log', {\n    value: function log(type) {\n      if (!Embedo.debug) {\n        return;\n      }\n      if (typeof console !== 'undefined' && typeof console[type] !== 'undefined') {\n        console[type].apply(console, Array.prototype.slice.call(arguments, 1));\n      }\n    },\n    writable: false,\n    enumerable: true,\n    configurable: false\n  });\n\n  // Plugins Loader\n  Object.defineProperty(Embedo, 'plugins', {\n    value: function load(plugins) {\n      if (!plugins) {\n        return;\n      }\n      if (plugins instanceof Array) {\n        plugins.forEach(function (plugin) {\n          if (typeof plugin === 'function') {\n            plugin(Embedo);\n          }\n        });\n      } else if (plugins === 'fuction') {\n        plugins(Embedo);\n      }\n    },\n    writable: false,\n    enumerable: true,\n    configurable: false\n  });\n\n  /**\n   * Helper utlities\n   * @method utils\n   *\n   * @private\n   */\n  Object.defineProperty(Embedo, 'utils', {\n    value: Object.create({\n      /**\n       * @function uuid\n       */\n      uuid: function uuid() {\n        var primary = (Math.random() * 0x10000) | 0;\n        var secondary = (Math.random() * 0x10000) | 0;\n        primary = ('000' + primary.toString(36)).slice(-3);\n        secondary = ('000' + secondary.toString(36)).slice(-3);\n        return 'embedo_' + primary + secondary;\n      },\n\n      /**\n       * @function extend\n       * @returns {object}\n       */\n      extend: function extend(obj) {\n        obj = obj || {};\n        for (var i = 1; i < arguments.length; i++) {\n          if (!arguments[i]) {\n            continue;\n          }\n          for (var key in arguments[i]) {\n            if (arguments[i].hasOwnProperty(key)) {\n              obj[key] = arguments[i][key];\n            }\n          }\n        }\n        return obj;\n      },\n\n      /**\n       * @function merge\n       *\n       * @param {object} destination\n       * @param {object} source\n       * @param {array} preserve\n       * @returns\n       */\n      merge: function merge(destination, source, preserve) {\n        preserve = preserve || [];\n\n        for (var property in source) {\n          if (preserve.indexOf(property) === -1) {\n            destination[property] = source[property];\n          }\n        }\n\n        return destination;\n      },\n\n      /**\n       * @func sequencer\n       * Breaks down array into sequencer\n       *\n       * @param {Array} array\n       * @param {Number} size\n       * @returns\n       */\n      sequencer: function sequencer() {\n        var args = arguments;\n        return {\n          then: function (done) {\n            var counter = 0;\n            for (var i = 0; i < args.length; i++) {\n              args[i](callme);\n            }\n\n            function callme() {\n              counter++;\n              if (counter === args.length) {\n                done();\n              }\n            }\n          }\n        };\n      },\n\n      /**\n       * @func replacer\n       * Replaces ${entity} with object key/value pair\n       *\n       * @param {string} str\n       * @param {object} obj\n       */\n      replacer: function replacer(str, obj) {\n        if (!str || !obj) {\n          return;\n        }\n        if (obj) {\n          for (var key in obj) {\n            if (str) {\n              str = str.split('${' + key + '}').join(obj[key]);\n            }\n          }\n        }\n        return str;\n      },\n\n      /**\n       * @func observer\n       *\n       * Deferred Implementation for Object\n       */\n      observer: (function () {\n        function Deferred() {\n          this.resolved = [];\n          this.rejected = [];\n        }\n        Deferred.prototype = {\n          execute: function (list, args) {\n            var i = list.length;\n            args = Array.prototype.slice.call(args);\n            while (i--) {\n              list[i].apply(null, args);\n            }\n          },\n          resolve: function () {\n            this.execute(this.resolved, arguments);\n          },\n          reject: function () {\n            this.execute(this.rejected, arguments);\n          },\n          done: function (callback) {\n            this.resolved.push(callback);\n            return this;\n          },\n          fail: function (callback) {\n            this.rejected.push(callback);\n            return this;\n          }\n        };\n        return Deferred;\n      })(),\n\n      camelToSnake: function camelToSnake(str) {\n        return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n      },\n\n      /**\n       * @function validateURL\n       *\n       * @param {string} url\n       * @returns\n       */\n      validateURL: function validateURL(url) {\n        return /(http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?/.test(url);\n      },\n\n      /**\n       * @function generateElement\n       * Generates DOM element\n       *\n       * @param {string} source\n       * @param {object} attributes\n       * @param {string} html\n       * @returns HTMLElement\n       */\n      generateElement: function generateElement(type, attributes, html) {\n        var el = document.createElement(type);\n        Object.keys(attributes || {}).forEach(function (type) {\n          el.setAttribute(type, attributes[type]);\n        });\n        if (html) {\n          el.innerHTML = html;\n        }\n        return el;\n      },\n\n      /**\n       * @function generateEmbed\n       * Generates Embed Container\n       *\n       * @param {string} source\n       * @param {string} html\n       * @returns\n       */\n      generateEmbed: function generateEmbed(id, source, html) {\n        id = id || Embedo.utils.uuid();\n        var container = document.createElement('div');\n\n        container.setAttribute('id', id);\n        container.setAttribute('data-embedo-id', id);\n        container.setAttribute('data-embedo-source', source);\n\n        if (Embedo.utils.validateElement(html)) {\n          container.appendChild(html);\n        } else {\n          container.innerHTML = html || '';\n        }\n\n        return container;\n      },\n\n      /**\n       * @function generateScript\n       * Generates script tag element\n       *\n       * @param {string} source\n       * @returns HTMLElement\n       */\n      generateScript: function generateScript(source) {\n        var script = document.createElement('script');\n        script.type = 'text/javascript';\n        script.src = encodeURI(source);\n        script.setAttribute('async', '');\n        script.setAttribute('charset', 'utf-8');\n        return script;\n      },\n\n      /**\n       * @function validateElement\n       * Validates if passed argument is valid DOM element\n       *\n       * @param {object} obj\n       * @returns HTMLElement\n       */\n      validateElement: function validateElement(obj) {\n        return typeof HTMLElement === 'object'\n          ? obj instanceof window.HTMLElement\n          : obj &&\n              typeof obj === 'object' &&\n              obj !== null &&\n              obj.nodeType === 1 &&\n              typeof obj.nodeName === 'string';\n      },\n\n      /**\n       * @function sdkReady\n       * Checks when SDK global object is ready\n       *\n       * @param {string} type\n       * @param {function} callback\n       */\n      sdkReady: function sdkReady(type, callback) {\n        callback = callback || function () {};\n        if (!Embedo.defaults.SOURCES[type]) {\n          return callback(new Error('unsupported_sdk_type'));\n        }\n        var counter = 0;\n        (function check() {\n          counter++;\n          if (counter > 15) {\n            return callback(new Error(type + ':sdk_not_available'));\n          }\n          if (window[Embedo.defaults.SOURCES[type].GLOBAL]) {\n            return callback(null, window[Embedo.defaults.SOURCES[type].GLOBAL]);\n          }\n          setTimeout(check, 10 * counter);\n        })(type);\n      },\n\n      /**\n       * @function querystring\n       * Object to Query String\n       *\n       * @param {object} obj\n       * @returns {string}\n       */\n      querystring: function querystring(obj) {\n        var parts = [];\n\n        for (var i in obj) {\n          if (obj.hasOwnProperty(i)) {\n            parts.push(encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]));\n          }\n        }\n\n        return parts.join('&');\n      },\n\n      /**\n       * @function fetch\n       * JSONP XHR fetch\n       *\n       * @param {string} url\n       * @param {object} options\n       * @param {function} callback\n       */\n      fetch: function fetch(url, options, callback) {\n        if (typeof options === 'function') {\n          callback = options;\n          options = {};\n        }\n        options = options || {};\n        options.callback = options.callback || 'callback';\n        var target = document.head || document.getElementsByTagName('head')[0];\n        var script = document.createElement('script');\n        var jsonpCallback = 'jsonp_' + Embedo.utils.uuid();\n        url += (~url.indexOf('?') ? '&' : '?') + options.callback + '=' + encodeURIComponent(jsonpCallback);\n        url = url.replace('?&', '?');\n\n        window[jsonpCallback] = function (data) {\n          clear(jsonpCallback, script);\n          callback(null, data);\n        };\n\n        script.type = 'text/javascript';\n        script.defer = true;\n        script.charset = 'UTF-8';\n        script.onerror = function (err) {\n          clear(jsonpCallback, script);\n          return callback(err);\n        };\n        target.appendChild(script);\n        script.src = url;\n\n        function clear(jsonpCallback, script) {\n          try {\n            delete window[jsonpCallback];\n          } catch (e) {\n            window[jsonpCallback] = undefined;\n          }\n          if (script) {\n            target.removeChild(script);\n            script = undefined;\n          }\n        }\n      },\n\n      /**\n       * XHR HTTP Requests\n       *\n       * @param {string} url\n       * @param {object} options\n       * @param {Function} callback\n       */\n      ajax: function ajax(url, options, callback) {\n        if (typeof options === 'function') {\n          callback = options;\n          options = {};\n        }\n        callback = callback || function () {};\n        var xhr = new XMLHttpRequest();\n        xhr.onload = function () {\n          if (xhr.status >= 400) {\n            return callback(new Error(xhr.responseText || xhr.statusText));\n          }\n          try {\n            return callback(null, JSON.parse(xhr.responseText));\n          } catch (e) {\n            return callback(new Error('invalid_response'));\n          }\n        };\n        xhr.onerror = function (err) {\n          return callback(err);\n        };\n        xhr.open('GET', url);\n        xhr.send();\n      },\n\n      /**\n       * @function transform\n       * Cross Browser CSS Transformation\n       *\n       * @param {HTMLElement} element\n       * @param {string} props\n       */\n      transform: function transform(element, props) {\n        if (!Embedo.utils.validateElement(element)) {\n          return;\n        }\n        element.style.webkitTransform = props;\n        element.style.MozTransform = props;\n        element.style.msTransform = props;\n        element.style.OTransform = props;\n        element.style.transform = props;\n      },\n\n      /**\n       * @function compute\n       * Computes property value of HTMLElement\n       *\n       * @param {HTMLElement} el\n       * @param {string} prop\n       * @param {Boolean} stylesheet\n       * @returns {Number}\n       */\n      compute: function compute(el, prop, is_computed) {\n        if (!Embedo.utils.validateElement(el) || !prop) {\n          return;\n        }\n\n        var bounds = el.getBoundingClientRect();\n        var value = bounds[prop];\n\n        if (is_computed || !value) {\n          if (document.defaultView && document.defaultView.getComputedStyle) {\n            value = document.defaultView.getComputedStyle(el, '').getPropertyValue(prop);\n          } else if (el.currentStyle) {\n            prop = prop.replace(/\\-(\\w)/g, function (m, p) {\n              return p.toUpperCase();\n            });\n            value = el.currentStyle[prop];\n          }\n        }\n\n        if (typeof value === 'string' && !/^\\d+(\\.\\d+)?%$/.test(value)) {\n          value = value.replace(/[^\\d.-]/g, '');\n        }\n\n        return isNaN(Number(value)) ? value : Number(value);\n      },\n\n      /**\n       * @method convertToPx\n       * Calculates approximate pixel value for vw, vh or % values\n       *\n       * @implements relative_px\n       * @implements percent_px\n       */\n      convertToPx: function convertToPx(el, prop, value) {\n        if (!isNaN(Number(value))) {\n          return Number(value);\n        } else if (/^\\d+(\\.\\d+)?%$/.test(value)) {\n          return percent_px(el, prop, value);\n        } else if (value.match(/(vh|vw)/)) {\n          var dimension = value.replace(/[0-9]/g, '');\n          return relative_px(dimension, value);\n        }\n\n        // Converts vw or vh to PX\n        function relative_px(type, value) {\n          var w = window,\n            d = document,\n            e = d.documentElement,\n            g = d.body,\n            x = w.innerWidth || e.clientWidth || g.clientWidth,\n            y = w.innerHeight || e.clientHeight || g.clientHeight;\n\n          if (type === 'vw') {\n            return (x * parseFloat(value)) / 100;\n          } else if (type === 'vh') {\n            return (y * parseFloat(value)) / 100;\n          } else {\n            return undefined;\n          }\n        }\n\n        // Converts % to PX\n        function percent_px(el, prop, percent) {\n          var parent_width = Embedo.utils.compute(el.parentNode, prop, true);\n          percent = parseFloat(percent);\n          return parent_width * (percent / 100);\n        }\n      },\n\n      /**\n       * @function watcher\n       *\n       * @param {string} Identifer\n       * @param {Function} Function to Trigger\n       * @param {integer} timer\n       *\n       * @returns {Function}\n       */\n      watcher: function watcher(id, fn, timer) {\n        window.EMBEDO_WATCHER = window.EMBEDO_WATCHER || {};\n        window.EMBEDO_WATCHER[id] = window.EMBEDO_WATCHER[id] || {\n          id: id,\n          count: 0,\n          request: null\n        };\n\n        if (window.EMBEDO_WATCHER[id].count > 0 && window.EMBEDO_WATCHER[id].request) {\n          window.EMBEDO_WATCHER[id].count -= 1;\n          clearTimeout(window.EMBEDO_WATCHER[id].request);\n        }\n\n        window.EMBEDO_WATCHER[id].count += 1;\n        window.EMBEDO_WATCHER[id].request = setTimeout(function () {\n          window.EMBEDO_WATCHER[id].count -= 1;\n          if (window.EMBEDO_WATCHER[id].count === 0) {\n            fn.call();\n          }\n        }, timer);\n\n        return null;\n      },\n\n      /**\n       * @function dimensions\n       *\n       * @param {HTMLElement} el\n       * @param {string} width\n       * @param {string} height\n       *\n       * @returns {object{width,height}}\n       */\n      dimensions: function dimensions(el, width, height) {\n        var el_width = Embedo.utils.compute(el, 'width');\n        width = width ? width : el_width > 0 ? el_width : Embedo.utils.compute(el.parentNode, 'width');\n        height = height\n          ? height\n          : el_width > 0\n          ? el_width / 1.5\n          : Embedo.utils.compute(el.parentNode, 'height');\n        return {\n          width: width,\n          height: height\n        };\n      },\n\n      /**\n       * @function centerize\n       * Align an element center in relation to parent div\n       *\n       * @param {HTMLElement} parent_el\n       * @param {HTMLElement} child_el\n       * @param {object} options\n       * @returns\n       */\n      centerize: function centerize(parent_el, child_el, options) {\n        Embedo.log('info', 'centerize', parent_el, child_el, options);\n        if (!Embedo.utils.validateElement(parent_el) || !Embedo.utils.validateElement(child_el)) {\n          return;\n        }\n        options = options || {};\n\n        if (options.width) {\n          parent_el.style.width = options.width;\n          parent_el.style.maxWidth = options.width;\n          parent_el.style.marginLeft = 'auto';\n          parent_el.style.marginRight = 'auto';\n        }\n\n        if (options.height) {\n          parent_el.style.height = options.height;\n          parent_el.style.maxHeight = options.height;\n        }\n\n        child_el.style.display = '-moz-box';\n        child_el.style.display = '-ms-flexbox';\n        child_el.style.display = '-webkit-flex';\n        child_el.style.display = '-webkit-box';\n        child_el.style.display = 'flex';\n        child_el.style.textAlign = 'center';\n        child_el.style['justify-content'] = 'center';\n        child_el.style['align-items'] = 'center';\n        child_el.style.margin = '0 auto';\n      },\n\n      /**\n       * @function handleScriptValidation\n       *\n       * @param {string} url\n       */\n      handleScriptValidation: function handleScriptValidation(url) {\n        if (!url) {\n          return;\n        }\n        url = url.split('#')[0];\n        var scripts = document.getElementsByTagName('script');\n        for (var i = scripts.length; i--; ) {\n          if (scripts[i].src === url) {\n            return true;\n          }\n        }\n        return false;\n      }\n    }),\n    writable: false,\n    enumerable: true,\n    configurable: false\n  });\n\n  /**\n   * Embedo Event Listeners\n   * @private\n   *\n   * @implements on\n   * @implements off\n   * @implements emit\n   */\n  Object.defineProperties(Embedo.prototype, {\n    on: {\n      value: function (event, listener) {\n        if (typeof this.events[event] !== 'object') {\n          this.events[event] = [];\n        }\n        this.events[event].push(listener);\n      },\n      writable: false,\n      configurable: false\n    },\n    off: {\n      value: function (event, listener) {\n        var index;\n        if (typeof this.events[event] === 'object') {\n          index = this.events[event].indexOf(listener);\n          if (index > -1) {\n            this.events[event].splice(index, 1);\n          }\n        }\n      },\n      writable: false,\n      configurable: false\n    },\n    emit: {\n      value: function (event) {\n        var i,\n          listeners,\n          length,\n          args = [].slice.call(arguments, 1);\n        if (typeof this.events[event] === 'object') {\n          listeners = this.events[event].slice();\n          length = listeners.length;\n\n          for (i = 0; i < length; i++) {\n            listeners[i].apply(this, args);\n          }\n        }\n      },\n      writable: false,\n      configurable: false\n    },\n    once: {\n      value: function (event, listener) {\n        this.on(event, function g() {\n          this.off(event, g);\n          listener.apply(this, arguments);\n        });\n      },\n      writable: false,\n      configurable: false\n    }\n  });\n\n  /**\n   * @method init\n   * Primary Embedo initialization\n   *\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.init = function (options) {\n    Embedo.log('info', 'init', this.requests, options);\n\n    // Append enabled SDKs to DOM\n    Object.keys(Embedo.defaults.SOURCES).forEach(function (source) {\n      if (Embedo.defaults.SOURCES[source].SDK) {\n        appendSDK(source, options[source]);\n      }\n    });\n\n    this.domify();\n\n    /**\n     * @func appendSDK\n     * Injects SDK's to body\n     * @private\n     *\n     * @param {*} type\n     * @param {*} props\n     */\n    function appendSDK(type, props) {\n      if (!type || !props) {\n        return;\n      }\n      var sdk =\n        props.sdk ||\n        Embedo.utils.replacer(Embedo.defaults.SOURCES[type.toLowerCase()].SDK, {\n          locale: props.locale || window.navigator.language || 'en_US'\n        });\n\n      if (!Embedo.utils.handleScriptValidation(sdk)) {\n        if (props && typeof props === 'object') {\n          sdk += (type === 'facebook' ? '#' : '?') + Embedo.utils.querystring(props);\n        }\n        document.body.appendChild(Embedo.utils.generateScript(sdk));\n      }\n    }\n  };\n\n  /**\n   * @method domify\n   * Replaces \"data-embedo-*\" elements during initialization.\n   */\n  Embedo.prototype.domify = function domify() {\n    var embedos = document.querySelectorAll('[data-embedo-url]');\n    [].forEach.call(\n      embedos,\n      function (embedo_el) {\n        var options = Object.keys(embedo_el.dataset || {}).reduce(function (acc, cur) {\n          if (cur.indexOf('embedo') !== -1) {\n            var option = Embedo.utils.camelToSnake(cur).replace('embedo-', '');\n            acc[option] = embedo_el.dataset[cur];\n          }\n          return acc;\n        }, {});\n\n        this.render(embedo_el, options.url, options);\n      }.bind(this)\n    );\n  };\n\n  /**\n   * @method facebook\n   * Facebook embed prototype\n   *\n   * @param {number} id\n   * @param {HTMLElement} element\n   * @param {string} url\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.facebook = function facebook(id, element, url, options, callback) {\n    var type, fb_html_class;\n    var globalOptions = this.options.facebook || {};\n\n    if (/^([^\\/?].+\\/)?post|photo(s|\\.php)[\\/?].*$/gm.test(url)) {\n      type = url.match(/comment_id|reply_comment_id/) ? 'comment' : 'post';\n    } else if (/^([^\\/?].+\\/)?video(s|\\.php)[\\/?].*$/gm.test(url)) {\n      type = 'video';\n    }\n\n    if (type && type.match(/post|video/)) {\n      var embed_uri = Embedo.utils.replacer(Embedo.defaults.SOURCES.facebook.oEmbed, {\n        version: globalOptions.version || 'v8.0',\n        type: type\n      });\n      var query = Embedo.utils.merge(\n        {\n          url: encodeURI(url),\n          access_token: globalOptions.access_token,\n          omitscript: true\n        },\n        options,\n        Embedo.defaults.RESTRICTED\n      );\n\n      if ('width' in options || 'maxwidth' in options) {\n        query.maxwidth = options.maxwidth || options.width;\n      }\n\n      embed_uri += '?' + Embedo.utils.querystring(query);\n\n      Embedo.utils.fetch(embed_uri, function (error, content) {\n        if (error) {\n          Embedo.log('error', 'facebook', error);\n          return callback(error);\n        }\n        handleFacebookEmbed(content.html);\n      });\n    } else {\n      if (type === 'comment' || url.match(/comment_id|reply_comment_id/)) {\n        fb_html_class = 'fb-comment-embed';\n        options['data-numposts'] = options['data-numposts'] || 5;\n      } else if (url.match(/plugins\\/comments/)) {\n        fb_html_class = 'fb-comments';\n      } else {\n        fb_html_class = 'fb-page';\n        options['data-height'] = options['data-height'] || options.maxheight || options.height || 500;\n      }\n\n      var fb_html = Embedo.utils.generateElement(\n        'div',\n        Embedo.utils.merge(\n          {\n            class: fb_html_class,\n            'data-href': url,\n            'data-width': options['data-width'] || options.maxwidth || options.width || 350\n          },\n          options\n        )\n      );\n\n      fb_html.removeAttribute('width');\n      fb_html.removeAttribute('height');\n      handleFacebookEmbed(fb_html);\n    }\n\n    function handleFacebookEmbed(html) {\n      var container = Embedo.utils.generateEmbed(id, 'facebook', html);\n      element.appendChild(container);\n\n      facebookify(\n        element,\n        container,\n        {\n          id: id,\n          url: url,\n          strict: options.strict,\n          width: options.width,\n          height: options.height,\n          centerize: options.centerize\n        },\n        function (err, result) {\n          if (err) {\n            return callback(err);\n          }\n          callback(null, {\n            id: id,\n            el: element,\n            width: result.width,\n            height: result.height\n          });\n        }\n      );\n    }\n  };\n\n  /**\n   * Twitter embed prototype\n   * @method twitter\n   *\n   * @param {number} id\n   * @param {HTMLElement} element\n   * @param {string} url\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.twitter = function twitter(id, element, url, options, callback) {\n    var embed_uri = Embedo.defaults.SOURCES.twitter.oEmbed;\n    var query = Embedo.utils.merge(\n      {\n        url: encodeURI(url),\n        omit_script: 1\n      },\n      options,\n      Embedo.defaults.RESTRICTED\n    );\n\n    if ('width' in options || 'maxwidth' in options) {\n      query.maxwidth = options.maxwidth || options.width;\n    }\n\n    if ('height' in options || 'maxheight' in options) {\n      query.maxheight = options.maxheight || options.height;\n    }\n\n    embed_uri += '?' + Embedo.utils.querystring(query);\n\n    Embedo.utils.fetch(embed_uri, function (error, content) {\n      if (error) {\n        Embedo.log('error', 'twitter', error);\n        return callback(error);\n      }\n      var container = Embedo.utils.generateEmbed(id, 'twitter', content.html);\n      element.appendChild(container);\n\n      twitterify(\n        element,\n        container,\n        {\n          id: id,\n          url: url,\n          strict: options.strict,\n          width: options.width,\n          height: options.height,\n          centerize: options.centerize\n        },\n        function (err, result) {\n          if (err) {\n            return callback(err);\n          }\n          callback(null, {\n            id: id,\n            el: element,\n            width: result.width,\n            height: result.height\n          });\n        }\n      );\n    });\n  };\n\n  /**\n   * @method instagram\n   * Instagram embed prototype\n   *\n   * @param {number} id\n   * @param {HTMLElement} element\n   * @param {string} url\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.instagram = function (id, element, url, options, callback) {\n    var globalOptions = this.options.instagram || {};\n    var embed_uri = Embedo.utils.replacer(Embedo.defaults.SOURCES.instagram.oEmbed, {\n      version: globalOptions.version || 'v8.0'\n    });\n    var query = Embedo.utils.merge(\n      {\n        url: encodeURI(url),\n        access_token: globalOptions.access_token,\n        omitscript: true,\n        hidecaption: true\n      },\n      options,\n      Embedo.defaults.RESTRICTED\n    );\n\n    if ('width' in options || 'maxwidth' in options) {\n      options.width = options.maxwidth ? options.maxwidth : options.width;\n      if (options.width > 320) {\n        query.maxwidth = options.width;\n      }\n    }\n\n    embed_uri += '?' + Embedo.utils.querystring(query);\n\n    var method = options.jsonp ? 'jsonp' : 'ajax';\n\n    Embedo.utils[method](\n      embed_uri,\n      function (err, content) {\n        if (err) {\n          Embedo.log('error', 'instagram', err);\n          // If oembed or instagram embed script is unavailable.\n          if (options.jsonp === undefined || options.jsonp === null) {\n            var extracted_url = url.match(Embedo.defaults.SOURCES.instagram.REGEX);\n            url = extracted_url && extracted_url.length > 0 ? extracted_url[0].replace(/\\/$/, '') : url;\n            return this.iframe(id, element, url + '/embed/', options, callback);\n          }\n          return callback(err);\n        }\n\n        var container = Embedo.utils.generateEmbed(id, 'instagram', content.html);\n        element.appendChild(container);\n\n        instagramify(\n          element,\n          container,\n          {\n            id: id,\n            url: url,\n            strict: options.strict,\n            width: options.width,\n            height: options.height,\n            centerize: options.centerize\n          },\n          function (err, result) {\n            if (err) {\n              return callback(err);\n            }\n            callback(null, {\n              id: id,\n              el: element,\n              width: result.width,\n              height: result.height\n            });\n          }\n        );\n      }.bind(this)\n    );\n  };\n\n  /**\n   * @method youtube\n   * YouTube embed prototype\n   *\n   * @param {number} id\n   * @param {HTMLElement} element\n   * @param {string} url\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.youtube = function (id, element, url, options, callback) {\n    if (!getYTVideoID(url)) {\n      Embedo.log('error', 'youtube', 'Unable to detect Youtube video id.');\n      return callback('Unable to detect Youtube video id.');\n    }\n\n    var youtube_uri = Embedo.defaults.SOURCES.youtube.oEmbed + getYTVideoID(url);\n    youtube_uri +=\n      '?' +\n      Embedo.utils.querystring(\n        Embedo.utils.merge(\n          {\n            modestbranding: 1,\n            autohide: 1,\n            showinfo: 0\n          },\n          options,\n          Embedo.defaults.RESTRICTED\n        )\n      );\n\n    this.iframe(id, element, youtube_uri, options, callback);\n\n    /**\n     * @func getYTVideoID\n     * @private\n     *\n     * @param {string} url\n     * @returns {String|Boolean}\n     */\n    function getYTVideoID(url) {\n      var regexp = /(?:youtube\\.com\\/(?:[^\\/]+\\/.+\\/|(?:v|e(?:mbed)?)\\/|.*[?&]v=)|youtu\\.be\\/)([^\"&?\\/ ]{11})/i;\n      var match = url.match(regexp);\n      return match && match.length === 2 ? match[1] : false;\n    }\n  };\n\n  /**\n   * @method vimeo\n   * Vimeo embed prototype\n   *\n   * @param {number} id\n   * @param {HTMLElement} element\n   * @param {string} url\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.vimeo = function (id, element, url, options, callback) {\n    var size = Embedo.utils.dimensions(element, options.width, options.height);\n    var embed_options = Embedo.utils.merge(\n      {\n        url: url,\n        width: size.width,\n        height: size.height,\n        autohide: 1\n      },\n      options,\n      Embedo.defaults.RESTRICTED\n    );\n    var embed_uri = Embedo.defaults.SOURCES.vimeo.oEmbed + '?' + Embedo.utils.querystring(embed_options);\n\n    Embedo.utils.fetch(embed_uri, function (error, content) {\n      if (error) {\n        Embedo.log('error', 'vimeo', error);\n        return callback(error);\n      }\n      var container = Embedo.utils.generateEmbed(id, 'vimeo', content.html);\n      element.appendChild(container);\n\n      callback(null, {\n        id: id,\n        el: element,\n        width: size.width,\n        height: size.height\n      });\n    });\n  };\n\n  /**\n   * @method pinterest\n   * Pinterest Embed\n   *\n   * @param {number} id\n   * @param {HTMLElement} element\n   * @param {string} url\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.pinterest = function (id, element, url, options, callback) {\n    var size = Embedo.utils.dimensions(element, options.width, options.height);\n    var pin_size = size.width > 600 ? 'large' : size.width < 345 ? 'small' : 'medium';\n    var pin_el = Embedo.utils.generateElement(\n      'a',\n      Embedo.utils.merge(\n        {\n          href: url,\n          'data-pin-do': options['data-pin-do'] || 'embedPin',\n          'data-pin-lang': options['data-pin-lang'] || 'en',\n          'data-pin-width': pin_size\n        },\n        options\n      )\n    );\n    var container = Embedo.utils.generateEmbed(id, 'pinterest', pin_el);\n\n    element.appendChild(container);\n\n    pinterestify(\n      element,\n      container,\n      {\n        id: id,\n        url: url,\n        strict: options.strict,\n        width: options.width,\n        height: options.height,\n        centerize: options.centerize\n      },\n      function (err, result) {\n        if (err) {\n          Embedo.log('error', 'pinterest', err);\n          return callback(err);\n        }\n        callback(null, {\n          id: id,\n          el: element,\n          width: result.width,\n          height: result.height\n        });\n      }\n    );\n  };\n\n  /**\n   * @method github\n   * Embed github URLs (gist) to DOM\n   *\n   * @param {number} id\n   * @param {HTMLElement} element\n   * @param {string} url\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.github = function github(id, element, url, options, callback) {\n    var size = Embedo.utils.dimensions(element, options.width, options.height);\n    var iframe = Embedo.utils.generateElement(\n      'iframe',\n      Embedo.utils.merge(\n        {\n          width: size.width,\n          height: size.height\n        },\n        options,\n        Embedo.defaults.RESTRICTED\n      )\n    );\n    var container = Embedo.utils.generateEmbed(id, 'github', iframe);\n\n    element.appendChild(container);\n    iframe.contentWindow.document.open();\n    iframe.contentWindow.document.write(\n      '<body><style type=\"text/css\">body,html{margin:0;padding:0;border-radius:3px;}' +\n        '.gist .gist-file{margin:0 !important;padding:0;}</style>' +\n        '<script src=\"' +\n        url +\n        '\"></script>' +\n        '</body>'\n    );\n    iframe.contentWindow.document.close();\n    iframe.onerror = function (err) {\n      callback(err);\n    };\n    iframe.addEventListener('load', function (event) {\n      callback(null, {\n        id: id,\n        el: element,\n        event: event,\n        width: Embedo.utils.compute(container, 'width'),\n        height: Embedo.utils.compute(container, 'height')\n      });\n    });\n  };\n\n  /**\n   * @method soundcloud\n   * SoundCloud Embed Player (api-web) prototype\n   *\n   * @see https://developers.soundcloud.com/docs/oembed\n   * @param {number} id\n   * @param {HTMLElement} element\n   * @param {string} url\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.soundcloud = function (id, element, url, options, callback) {\n    if (options.hasOwnProperty('width') && options.width) {\n      options.maxwidth = options.maxwidth || options.width || '100%';\n    }\n    if (options.hasOwnProperty('height') && options.height) {\n      options.maxheight = options.maxheight || options.height;\n    }\n    var size = Embedo.utils.dimensions(element, options.maxwidth, options.maxheight);\n    var embed_options = Embedo.utils.merge(\n      {\n        url: encodeURI(url),\n        format: 'js' // Defaults JSONP\n      },\n      options,\n      Embedo.defaults.RESTRICTED\n    );\n    var embed_uri = Embedo.defaults.SOURCES.soundcloud.oEmbed + '?' + Embedo.utils.querystring(embed_options);\n\n    Embedo.utils.fetch(embed_uri, function (error, content) {\n      if (error) {\n        Embedo.log('error', 'soundcloud', error);\n        return callback(error);\n      }\n      var container = Embedo.utils.generateEmbed(id, 'soundcloud', content.html);\n      element.appendChild(container);\n\n      callback(null, {\n        id: id,\n        el: element,\n        width: size.width,\n        height: size.height\n      });\n    });\n  };\n\n  /**\n   * @method iframe\n   * Embed URLs to HTML5 frame prototype\n   *\n   * @param {number} id\n   * @param {HTMLElement} element\n   * @param {string} url\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.iframe = function (id, element, url, options, callback) {\n    var fragment = document.createDocumentFragment();\n    var size = Embedo.utils.dimensions(element, options.width, options.height);\n    var extension = (url.substr(url.lastIndexOf('.')) || '').replace('.', '').toLowerCase();\n    var mimes = {\n      csv: 'text/csv',\n      pdf: 'application/pdf',\n      gif: 'image/gif',\n      js: 'application/javascript',\n      json: 'application/json',\n      xhtml: 'application/xhtml+xml',\n      pps: 'application/vnd.ms-powerpoint',\n      ppsx: 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n      xml: 'application/xml',\n      ogg: 'video/ogg',\n      mp4: 'video/mp4',\n      webm: 'video/webm',\n      html: 'text/html'\n    };\n    var mimetype = mimes[extension] || mimes.html;\n    var has_video = extension.match(/(mp4|ogg|webm|ogv|ogm)/);\n    var el_type = has_video ? 'video' : options.tagName || 'embed';\n    var override = Embedo.utils.merge({}, options, Embedo.defaults.RESTRICTED);\n    var embed_el = Embedo.utils.generateElement(\n      el_type,\n      Embedo.utils.merge(\n        {\n          type: mimetype,\n          src: url,\n          width: size.width,\n          height: size.height\n        },\n        override\n      )\n    );\n\n    fragment.appendChild(Embedo.utils.generateEmbed(id, 'iframe', embed_el));\n    element.appendChild(fragment);\n\n    if (el_type === 'video') {\n      setTimeout(function () {\n        callback(null, {\n          id: id,\n          el: element,\n          width: Embedo.utils.compute(embed_el, 'width'),\n          height: Embedo.utils.compute(embed_el, 'height')\n        });\n      }, 250);\n    } else {\n      embed_el.onerror = function (err) {\n        callback(err);\n      };\n      embed_el.addEventListener('load', function (event) {\n        callback(null, {\n          id: id,\n          el: element,\n          event: event,\n          width: Embedo.utils.compute(embed_el, 'width'),\n          height: Embedo.utils.compute(embed_el, 'height')\n        });\n      });\n    }\n  };\n\n  /**\n   * @method render\n   * Renders an embedo instance\n   *\n   * @name load\n   * @param {HTMLElement} element\n   * @param {string} url\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.render = function (element, url, options, callback) {\n    Embedo.log('info', 'render', element, url, options);\n    options = options || {};\n    callback = callback || function () {};\n\n    if (!element || !Embedo.utils.validateElement(element)) {\n      Embedo.log('info', 'render', '`element` is either missing or invalid');\n      return this.emit('error', new Error('element_is_missing'));\n    }\n\n    if (typeof url !== 'string') {\n      return this.emit('error', new Error('invalid_url_string'));\n    }\n\n    if (!url || !Embedo.utils.validateURL(url)) {\n      Embedo.log('info', 'render', '`url` is either missing or invalid');\n      return this.emit('error', new Error('invalid_or_missing_url'));\n    }\n\n    var source = getURLSource(url);\n\n    if (!source) {\n      Embedo.log('info', 'render', new Error('Invalid or Unsupported URL'));\n      return this.emit('error', new Error('url_not_supported'));\n    }\n\n    if (!this[source]) {\n      Embedo.log('info', 'render', new Error('Requested source is not implemented or missing.'));\n      return this.emit('error', new Error('unrecognised_url'));\n    }\n\n    if ('width' in options && options.width) {\n      options.width = Embedo.utils.convertToPx(element, 'width', options.width);\n    }\n\n    if ('height' in options && options.height) {\n      options.height = Embedo.utils.convertToPx(element, 'height', options.height);\n    }\n\n    var id = Embedo.utils.uuid();\n    var request = {\n      id: id,\n      el: element,\n      source: source,\n      url: url,\n      attributes: options\n    };\n\n    this.requests.push(request);\n\n    this.emit('watch', 'load', request);\n\n    this[source](\n      id,\n      element,\n      url,\n      options,\n      function (err, data) {\n        if (err) {\n          this.emit('error', err);\n          return callback(err);\n        }\n        data.url = request.url;\n        data.source = request.source;\n        data.options = request.attributes;\n\n        this.emit('watch', 'loaded', data);\n        callback(null, data);\n      }.bind(this)\n    );\n\n    /**\n     * @function getURLSource\n     * Checks Source from URI\n     *\n     * @param {string} url\n     * @returns {string}\n     */\n    function getURLSource(url) {\n      var urlRegExp = /(http|https):\\/\\/(\\w+:{0,1}\\w*)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%!\\-\\/]))?/;\n      var sources = Object.keys(Embedo.defaults.SOURCES) || [];\n\n      if (!urlRegExp.test(url)) {\n        return null;\n      }\n\n      var matched_source = sources\n        .filter(function (source) {\n          if (Embedo.defaults.SOURCES[source] && url.match(Embedo.defaults.SOURCES[source].REGEX)) {\n            return source;\n          }\n        })\n        .filter(Boolean);\n\n      return matched_source && matched_source.length ? matched_source[0] : 'iframe';\n    }\n  };\n\n  /**\n   * @method load\n   * Loads single or multiple embedo instances\n   *\n   * @name load\n   * @param {HTMLElement} element\n   * @param {String|Array} urls\n   * @param {object} options Optional parameters.\n   * @return callback\n   */\n  Embedo.prototype.load = function (element, urls, options) {\n    Embedo.log('info', 'load', element, urls, options);\n    options = options || {};\n    var observer = new Embedo.utils.observer();\n\n    if (!element || !Embedo.utils.validateElement(element)) {\n      Embedo.log('info', 'load', '`element` is either missing or invalid');\n      this.emit('error', new Error('element_is_missing'));\n    } else {\n      if (urls instanceof Array) {\n        var reqs = {\n          failed: [],\n          finished: []\n        };\n        var jobs = urls.map(\n          function (url) {\n            return function (done) {\n              this.render(element, url, options, function (err, data) {\n                if (err) {\n                  reqs.failed.push(err);\n                  return done(err);\n                }\n                reqs.finished.push(data);\n                done(null, data);\n              });\n            }.bind(this);\n          }.bind(this)\n        );\n\n        Embedo.utils.sequencer.apply(this, jobs).then(function () {\n          if (reqs.failed.length > 0) {\n            return observer.reject(reqs.failed);\n          }\n          observer.resolve(reqs.finished);\n        });\n      } else if (typeof urls === 'string') {\n        this.render(element, urls, options, function (err, data) {\n          if (err) {\n            return observer.reject(err);\n          }\n          observer.resolve(data);\n        });\n      } else {\n        this.emit('error', new Error('invalid_url_string'));\n      }\n    }\n\n    return observer;\n  };\n\n  /**\n   * @method refresh\n   * Refresh single or all embedo instances\n   *\n   * @param {object} element\n   */\n  Embedo.prototype.refresh = function (element) {\n    Embedo.log('info', 'refresh', this.requests, element);\n    if (this.requests.length === 0) {\n      return;\n    }\n    this.requests.forEach(\n      function (request) {\n        if (!request.el) {\n          return;\n        }\n\n        if (request.source === 'iframe') {\n          return this.emit('refresh', request, {\n            width: Embedo.utils.compute(request.el, 'width'),\n            height: Embedo.utils.compute(request.el, 'height')\n          });\n        }\n\n        if (element) {\n          if (!Embedo.utils.validateElement(element)) {\n            return;\n          }\n          if (element === request.el) {\n            automagic(\n              request.el,\n              document.getElementById(request.id),\n              request.attributes,\n              function (err, data) {\n                if (data) {\n                  this.emit('refresh', request, data);\n                }\n              }.bind(this)\n            );\n          }\n        } else {\n          automagic(\n            request.el,\n            document.getElementById(request.id),\n            request.attributes,\n            function (err, data) {\n              if (data) {\n                this.emit('refresh', request, data);\n              }\n            }.bind(this)\n          );\n        }\n      }.bind(this)\n    );\n\n    return this;\n  };\n\n  /**\n   * @method destroy\n   * Destroy an/all instance(s) of embedo\n   *\n   * @param {object} element\n   */\n  Embedo.prototype.destroy = function (element) {\n    Embedo.log('warn', 'destroy', this.requests, element);\n    if (this.requests.length === 0) {\n      return;\n    }\n    var removed = [];\n\n    this.requests.forEach(\n      function (request) {\n        if (!request.el || !Embedo.utils.validateElement(request.el)) {\n          return;\n        }\n        if (element) {\n          if (!Embedo.utils.validateElement(element)) {\n            return;\n          }\n          if (element === request.el) {\n            if (document.getElementById(request.id)) {\n              document.getElementById(request.id).remove();\n            }\n            removed.push(request.id);\n            this.emit('destroy', request);\n          }\n        } else {\n          if (document.getElementById(request.id)) {\n            document.getElementById(request.id).remove();\n          }\n          removed.push(request.id);\n          this.emit('destroy', request);\n        }\n      }.bind(this)\n    );\n\n    this.requests = this.requests.filter(function (request) {\n      return removed.indexOf(request.id) < 0;\n    });\n\n    return this;\n  };\n\n  /**\n   * @function facebookify\n   * Parses Facebook SDK\n   *\n   * @param {HTMLElement} parentNode\n   * @param {HTMLElement} childNode\n   * @param {object} options\n   */\n  function facebookify(parentNode, childNode, options, callback) {\n    Embedo.utils.sdkReady('facebook', function (err) {\n      if (err) {\n        return callback(err);\n      }\n      window.FB.XFBML.parse(parentNode);\n      window.FB.Event.subscribe('xfbml.render', function () {\n        // First state will be `parsed` and then `rendered` to acknowledge embed.\n        if (childNode.firstChild) {\n          if (options.centerize !== false) {\n            Embedo.utils.centerize(parentNode, childNode, options);\n          }\n          if (childNode.firstChild.getAttribute('fb-xfbml-state') === 'rendered') {\n            automagic(parentNode, childNode, options, callback);\n          }\n        }\n      });\n    });\n  }\n\n  /**\n   * @function twitterify\n   * Parses Twitter SDK\n   *\n   * @param {HTMLElement} parentNode\n   * @param {HTMLElement} childNode\n   * @param {object} options\n   */\n  function twitterify(parentNode, childNode, options, callback) {\n    Embedo.utils.sdkReady('twitter', function (err) {\n      if (err) {\n        return callback(err);\n      }\n      window.twttr.widgets.load(childNode);\n      window.twttr.events.bind('rendered', function (event) {\n        if (\n          childNode.firstChild &&\n          childNode.firstChild.getAttribute('id') === event.target.getAttribute('id')\n        ) {\n          if (options.centerize !== false) {\n            Embedo.utils.centerize(parentNode, childNode, options);\n          }\n          automagic(parentNode, childNode, options, callback);\n        }\n      });\n    });\n  }\n\n  /**\n   * @function instagramify\n   * Parses Instagram SDK\n   *\n   * @param {HTMLElement} parentNode\n   * @param {HTMLElement} childNode\n   * @param {object} options\n   */\n  function instagramify(parentNode, childNode, options, callback) {\n    Embedo.utils.sdkReady('instagram', function (err) {\n      if (err) {\n        return callback(err);\n      }\n      if (!window.instgrm.Embeds || !window.instgrm.Embeds) {\n        return callback(new Error('instagram_sdk_missing'));\n      }\n\n      window.instgrm.Embeds.process(childNode);\n      var instagram_embed_timer = setInterval(handleInstagramRendered, 250);\n\n      function handleInstagramRendered() {\n        if (childNode.firstChild && childNode.firstChild.className.match(/instagram-media-rendered/)) {\n          clearInterval(instagram_embed_timer);\n          if (options.centerize !== false) {\n            Embedo.utils.centerize(parentNode, childNode, options);\n          }\n          return automagic(parentNode, childNode, options, callback);\n        }\n      }\n    });\n  }\n\n  /**\n   * @function pinterestify\n   * Parses Pinterest SDK\n   *\n   * @param {HTMLElement} parentNode\n   * @param {HTMLElement} childNode\n   * @param {object} options\n   */\n  function pinterestify(parentNode, childNode, options, callback) {\n    Embedo.utils.sdkReady('pinterest', function (err) {\n      if (err) {\n        return callback(err);\n      }\n      if (!window.PinUtils || !window.PinUtils || !childNode || !childNode.firstChild) {\n        return callback(new Error('pinterest_sdk_missing'));\n      }\n\n      setTimeout(function () {\n        if (!childNode.querySelector('[data-pin-href]')) {\n          window.PinUtils.build(childNode);\n        }\n\n        var pinterest_embed_timer_count = 0;\n        var pinterest_embed_timer = setInterval(function () {\n          pinterest_embed_timer_count += 1;\n          if (childNode.querySelector('[data-pin-href]')) {\n            clearInterval(pinterest_embed_timer);\n            if (options.centerize !== false) {\n              Embedo.utils.centerize(parentNode, childNode, options);\n            }\n            return automagic(parentNode, childNode, options, callback);\n          } else if (pinterest_embed_timer_count >= 20) {\n            clearInterval(pinterest_embed_timer);\n            return callback(new Error('pinterest_embed_failed'));\n          }\n        }, 250);\n      }, 750);\n    });\n  }\n\n  /**\n   * @function automagic\n   * Automagic - Scales and resizes embed container\n   *\n   * @param {HTMLElement} parentNode\n   * @param {HTMLElement} childNode\n   * @param {object} options\n   */\n  function automagic(parentNode, childNode, options, callback) {\n    Embedo.log('info', 'automagic', parentNode, childNode, options);\n    options = options || {};\n    callback = callback || function () {};\n\n    if (!Embedo.utils.validateElement(parentNode) || !Embedo.utils.validateElement(childNode)) {\n      return callback(new Error('HTMLElement does not exist in DOM.'));\n    }\n\n    Embedo.utils.watcher(\n      options.id || Embedo.utils.uuid(),\n      function () {\n        var parent = {\n          width: options.width || Embedo.utils.compute(parentNode, 'width'),\n          height: options.height || Embedo.utils.compute(parentNode, 'height')\n        };\n        var child = {\n          width: Embedo.utils.compute(childNode, 'width'),\n          height: Embedo.utils.compute(childNode, 'height')\n        };\n\n        if (options.strict) {\n          return callback(null, {\n            width: parent.width,\n            height: parent.height\n          });\n        }\n\n        // Odd case when requested height is beyond limit of third party\n        // Only apply when fixed width and heights are provided\n        if (options.width && options.height) {\n          var isOverflowing = child.width > parent.width || child.height > parent.height;\n\n          if (options.width) {\n            childNode.style.width = options.width + 'px';\n          }\n\n          if (options.height) {\n            childNode.style.height = options.height + 'px';\n          }\n\n          if (isOverflowing) {\n            var scale = Math.min(parent.width / child.width, parent.height / child.height);\n            Embedo.utils.transform(childNode, 'scale(' + scale + ')');\n          }\n        }\n\n        callback(null, {\n          width: parent.width,\n          height: parent.height\n        });\n      },\n      500\n    );\n  }\n\n  return Embedo;\n});\n","import Embedo from 'embedo';\nimport './scss/main.scss';\n\n$(document).on('ready pjax:scriptcomplete', function(){\n    $('oembed').each(\n        function(i,item) {\n            if($(this).find(\".svgcontainer\").length == 0) {\n                $(this).append(`\n                <div class=\"svgcontainer\">\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 26 26\">\n                        <polygon class=\"play-btn__svg\" points=\"9.33 6.69 9.33 19.39 19.3 13.04 9.33 6.69\"/>\n                        <path class=\"play-btn__svg\" d=\"M26,13A13,13,0,1,1,13,0,13,13,0,0,1,26,13ZM13,2.18A10.89,10.89,0,1,0,23.84,13.06,10.89,10.89,0,0,0,13,2.18Z\"/>\n                    </svg>\n                </div>`);\n            }\n        }\n    )\n\n    $('oembed').off('click.embeddable');\n    $('oembed').on('click.embeddable',  function() {\n        window.embedo = window.embedo || new Embedo({\n            facebook: true,\n            twitter: true,\n            instagram: true,\n            pinterest: true,\n            youtube: true,\n            vimeo: true,\n            github: true,\n            soundcloud: true,\n            googlemaps: true\n        });\n        \n        $(this).find(\".svgcontainer\").remove();\n        const url = $(this).attr('url');\n        window.embedo.load(this, url)\n        .done((result) => {\n            console.ls.log(result);\n        })\n        .fail((result) => {\n            console.ls.error(result);\n        })\n    });    \n});\n"],"names":["root","factory","this","Embedo","options","defaults","OPTIONS","requests","events","init","automagic","parentNode","childNode","callback","log","utils","validateElement","Error","watcher","id","uuid","parent","width","compute","height","child","strict","isOverflowing","style","scale","Math","min","transform","Object","defineProperty","value","facebook","twitter","instagram","pinterest","SOURCES","GLOBAL","SDK","oEmbed","REGEX","PARAMS","version","cookie","appId","access_token","youtube","vimeo","github","soundcloud","RESTRICTED","writable","enumerable","configurable","type","debug","console","apply","Array","prototype","slice","call","arguments","plugins","forEach","plugin","create","primary","random","secondary","toString","extend","obj","i","length","key","hasOwnProperty","merge","destination","source","preserve","property","indexOf","sequencer","args","then","done","counter","callme","replacer","str","split","join","observer","Deferred","resolved","rejected","execute","list","resolve","reject","push","fail","camelToSnake","replace","toLowerCase","validateURL","url","test","generateElement","attributes","html","el","document","createElement","keys","setAttribute","innerHTML","generateEmbed","container","appendChild","generateScript","script","src","encodeURI","HTMLElement","window","nodeType","nodeName","sdkReady","check","setTimeout","querystring","parts","encodeURIComponent","fetch","target","head","getElementsByTagName","jsonpCallback","clear","e","undefined","removeChild","data","defer","charset","onerror","err","ajax","xhr","XMLHttpRequest","onload","status","responseText","statusText","JSON","parse","open","send","element","props","webkitTransform","MozTransform","msTransform","OTransform","prop","is_computed","getBoundingClientRect","defaultView","getComputedStyle","getPropertyValue","currentStyle","m","p","toUpperCase","isNaN","Number","convertToPx","percent","parent_width","parseFloat","percent_px","match","w","d","documentElement","g","body","x","innerWidth","clientWidth","y","innerHeight","clientHeight","relative_px","fn","timer","EMBEDO_WATCHER","count","request","clearTimeout","dimensions","el_width","centerize","parent_el","child_el","maxWidth","marginLeft","marginRight","maxHeight","display","textAlign","margin","handleScriptValidation","scripts","defineProperties","on","event","listener","off","index","splice","emit","listeners","once","sdk","locale","navigator","language","appendSDK","domify","embedos","querySelectorAll","embedo_el","dataset","reduce","acc","cur","render","bind","fb_html_class","globalOptions","embed_uri","query","omitscript","maxwidth","error","content","handleFacebookEmbed","maxheight","fb_html","class","removeAttribute","FB","XFBML","Event","subscribe","firstChild","getAttribute","facebookify","result","omit_script","twttr","widgets","load","twitterify","hidecaption","method","jsonp","extracted_url","iframe","instgrm","Embeds","process","instagram_embed_timer","setInterval","handleInstagramRendered","className","clearInterval","instagramify","getYTVideoID","youtube_uri","modestbranding","autohide","showinfo","size","embed_options","pin_size","pin_el","href","PinUtils","querySelector","build","pinterest_embed_timer_count","pinterest_embed_timer","pinterestify","contentWindow","write","close","addEventListener","format","fragment","createDocumentFragment","extension","substr","lastIndexOf","mimes","csv","pdf","gif","js","json","xhtml","pps","ppsx","xml","ogg","mp4","webm","mimetype","el_type","tagName","override","embed_el","sources","matched_source","filter","Boolean","getURLSource","urls","reqs","failed","finished","jobs","map","refresh","getElementById","destroy","removed","remove","module","exports","$","each","item","find","append","embedo","googlemaps","attr","ls"],"mappings":"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"}