From 7f868ecdf9de399db2689d195dc0524fa588f47c Mon Sep 17 00:00:00 2001 From: Omar Roth Date: Sat, 10 Nov 2018 11:08:03 -0600 Subject: Add unminimized sources and license information --- assets/js/videojs-share.js | 1649 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1649 insertions(+) create mode 100644 assets/js/videojs-share.js (limited to 'assets/js/videojs-share.js') diff --git a/assets/js/videojs-share.js b/assets/js/videojs-share.js new file mode 100644 index 00000000..3f8cdcf5 --- /dev/null +++ b/assets/js/videojs-share.js @@ -0,0 +1,1649 @@ +/** + * videojs-share + * @version 2.0.1 + * @copyright 2018 Mikhail Khazov + * @license MIT + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('video.js')) : + typeof define === 'function' && define.amd ? define(['video.js'], factory) : + (global.videojsShare = factory(global.videojs)); +}(this, (function (videojs$1) { 'use strict'; + +videojs$1 = 'default' in videojs$1 ? videojs$1['default'] : videojs$1; + +var version = "2.0.1"; + +var url = getUrl(); + +function getUrl() { + return window.location.href; +} + +function getRedirectUri() { + return url + '#close_window'; +} + +function getEmbedCode() { + return ''; +} + +function getSocials() { + return ['fbFeed', 'tw', 'reddit', 'gp', 'messenger', 'linkedin', 'vk', 'ok', 'mail', 'telegram', 'whatsapp', 'viber']; +} + +var defaults = { + mobileVerification: true, + title: 'Video', + url: url, + socials: getSocials(), + embedCode: getEmbedCode(), + redirectUri: getRedirectUri() +}; + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + + + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + + + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +var Button = videojs.getComponent('Button'); + +/** + * Share button. + */ + +var ShareButton = function (_Button) { + inherits(ShareButton, _Button); + + function ShareButton(player, options) { + classCallCheck(this, ShareButton); + + var _this = possibleConstructorReturn(this, _Button.call(this, player, options)); + + _this.addClass('vjs-menu-button'); + _this.addClass('vjs-share-control'); + _this.addClass('vjs-icon-share'); + _this.controlText(player.localize('Share')); + return _this; + } + + ShareButton.prototype.handleClick = function handleClick() { + this.player().getChild('ShareOverlay').open(); + }; + + return ShareButton; +}(Button); + +var ModalDialog = videojs.getComponent('ModalDialog'); + +/** + * Share modal. + */ + +var ShareModal = function (_ModalDialog) { + inherits(ShareModal, _ModalDialog); + + function ShareModal(player, options) { + classCallCheck(this, ShareModal); + + var _this = possibleConstructorReturn(this, _ModalDialog.call(this, player, options)); + + _this.playerClassName = 'vjs-videojs-share_open'; + return _this; + } + + ShareModal.prototype.open = function open() { + var player = this.player(); + + player.addClass(this.playerClassName); + _ModalDialog.prototype.open.call(this); + player.trigger('sharing:opened'); + }; + + ShareModal.prototype.close = function close() { + var player = this.player(); + + player.removeClass(this.playerClassName); + _ModalDialog.prototype.close.call(this); + player.trigger('sharing:closed'); + }; + + return ShareModal; +}(ModalDialog); + +var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + + +function unwrapExports (x) { + return x && x.__esModule ? x['default'] : x; +} + +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} + +function select(element) { + var selectedText; + + if (element.nodeName === 'SELECT') { + element.focus(); + + selectedText = element.value; + } + else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') { + var isReadOnly = element.hasAttribute('readonly'); + + if (!isReadOnly) { + element.setAttribute('readonly', ''); + } + + element.select(); + element.setSelectionRange(0, element.value.length); + + if (!isReadOnly) { + element.removeAttribute('readonly'); + } + + selectedText = element.value; + } + else { + if (element.hasAttribute('contenteditable')) { + element.focus(); + } + + var selection = window.getSelection(); + var range = document.createRange(); + + range.selectNodeContents(element); + selection.removeAllRanges(); + selection.addRange(range); + + selectedText = selection.toString(); + } + + return selectedText; +} + +var select_1 = select; + +var clipboardAction = createCommonjsModule(function (module, exports) { +(function (global, factory) { + if (typeof undefined === "function" && undefined.amd) { + undefined(['module', 'select'], factory); + } else { + factory(module, select_1); + } +})(commonjsGlobal, function (module, _select) { + 'use strict'; + + var _select2 = _interopRequireDefault(_select); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + var ClipboardAction = function () { + /** + * @param {Object} options + */ + function ClipboardAction(options) { + _classCallCheck(this, ClipboardAction); + + this.resolveOptions(options); + this.initSelection(); + } + + /** + * Defines base properties passed from constructor. + * @param {Object} options + */ + + + _createClass(ClipboardAction, [{ + key: 'resolveOptions', + value: function resolveOptions() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + this.action = options.action; + this.container = options.container; + this.emitter = options.emitter; + this.target = options.target; + this.text = options.text; + this.trigger = options.trigger; + + this.selectedText = ''; + } + }, { + key: 'initSelection', + value: function initSelection() { + if (this.text) { + this.selectFake(); + } else if (this.target) { + this.selectTarget(); + } + } + }, { + key: 'selectFake', + value: function selectFake() { + var _this = this; + + var isRTL = document.documentElement.getAttribute('dir') == 'rtl'; + + this.removeFake(); + + this.fakeHandlerCallback = function () { + return _this.removeFake(); + }; + this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true; + + this.fakeElem = document.createElement('textarea'); + // Prevent zooming on iOS + this.fakeElem.style.fontSize = '12pt'; + // Reset box model + this.fakeElem.style.border = '0'; + this.fakeElem.style.padding = '0'; + this.fakeElem.style.margin = '0'; + // Move element out of screen horizontally + this.fakeElem.style.position = 'absolute'; + this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px'; + // Move element to the same position vertically + var yPosition = window.pageYOffset || document.documentElement.scrollTop; + this.fakeElem.style.top = yPosition + 'px'; + + this.fakeElem.setAttribute('readonly', ''); + this.fakeElem.value = this.text; + + this.container.appendChild(this.fakeElem); + + this.selectedText = (0, _select2.default)(this.fakeElem); + this.copyText(); + } + }, { + key: 'removeFake', + value: function removeFake() { + if (this.fakeHandler) { + this.container.removeEventListener('click', this.fakeHandlerCallback); + this.fakeHandler = null; + this.fakeHandlerCallback = null; + } + + if (this.fakeElem) { + this.container.removeChild(this.fakeElem); + this.fakeElem = null; + } + } + }, { + key: 'selectTarget', + value: function selectTarget() { + this.selectedText = (0, _select2.default)(this.target); + this.copyText(); + } + }, { + key: 'copyText', + value: function copyText() { + var succeeded = void 0; + + try { + succeeded = document.execCommand(this.action); + } catch (err) { + succeeded = false; + } + + this.handleResult(succeeded); + } + }, { + key: 'handleResult', + value: function handleResult(succeeded) { + this.emitter.emit(succeeded ? 'success' : 'error', { + action: this.action, + text: this.selectedText, + trigger: this.trigger, + clearSelection: this.clearSelection.bind(this) + }); + } + }, { + key: 'clearSelection', + value: function clearSelection() { + if (this.trigger) { + this.trigger.focus(); + } + + window.getSelection().removeAllRanges(); + } + }, { + key: 'destroy', + value: function destroy() { + this.removeFake(); + } + }, { + key: 'action', + set: function set() { + var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy'; + + this._action = action; + + if (this._action !== 'copy' && this._action !== 'cut') { + throw new Error('Invalid "action" value, use either "copy" or "cut"'); + } + }, + get: function get() { + return this._action; + } + }, { + key: 'target', + set: function set(target) { + if (target !== undefined) { + if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) { + if (this.action === 'copy' && target.hasAttribute('disabled')) { + throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); + } + + if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) { + throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); + } + + this._target = target; + } else { + throw new Error('Invalid "target" value, use a valid Element'); + } + } + }, + get: function get() { + return this._target; + } + }]); + + return ClipboardAction; + }(); + + module.exports = ClipboardAction; +}); +}); + +function E () { + // Keep this empty so it's easier to inherit from + // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) +} + +E.prototype = { + on: function (name, callback, ctx) { + var e = this.e || (this.e = {}); + + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx: ctx + }); + + return this; + }, + + once: function (name, callback, ctx) { + var self = this; + function listener () { + self.off(name, listener); + callback.apply(ctx, arguments); + } + + listener._ = callback; + return this.on(name, listener, ctx); + }, + + emit: function (name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + + return this; + }, + + off: function (name, callback) { + var e = this.e || (this.e = {}); + var evts = e[name]; + var liveEvents = []; + + if (evts && callback) { + for (var i = 0, len = evts.length; i < len; i++) { + if (evts[i].fn !== callback && evts[i].fn._ !== callback) + liveEvents.push(evts[i]); + } + } + + // Remove event from queue to prevent memory leak + // Suggested by https://github.com/lazd + // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 + + (liveEvents.length) + ? e[name] = liveEvents + : delete e[name]; + + return this; + } +}; + +var index = E; + +var is = createCommonjsModule(function (module, exports) { +/** + * Check if argument is a HTML element. + * + * @param {Object} value + * @return {Boolean} + */ +exports.node = function(value) { + return value !== undefined + && value instanceof HTMLElement + && value.nodeType === 1; +}; + +/** + * Check if argument is a list of HTML elements. + * + * @param {Object} value + * @return {Boolean} + */ +exports.nodeList = function(value) { + var type = Object.prototype.toString.call(value); + + return value !== undefined + && (type === '[object NodeList]' || type === '[object HTMLCollection]') + && ('length' in value) + && (value.length === 0 || exports.node(value[0])); +}; + +/** + * Check if argument is a string. + * + * @param {Object} value + * @return {Boolean} + */ +exports.string = function(value) { + return typeof value === 'string' + || value instanceof String; +}; + +/** + * Check if argument is a function. + * + * @param {Object} value + * @return {Boolean} + */ +exports.fn = function(value) { + var type = Object.prototype.toString.call(value); + + return type === '[object Function]'; +}; +}); + +var DOCUMENT_NODE_TYPE = 9; + +/** + * A polyfill for Element.matches() + */ +if (typeof Element !== 'undefined' && !Element.prototype.matches) { + var proto = Element.prototype; + + proto.matches = proto.matchesSelector || + proto.mozMatchesSelector || + proto.msMatchesSelector || + proto.oMatchesSelector || + proto.webkitMatchesSelector; +} + +/** + * Finds the closest parent that matches a selector. + * + * @param {Element} element + * @param {String} selector + * @return {Function} + */ +function closest (element, selector) { + while (element && element.nodeType !== DOCUMENT_NODE_TYPE) { + if (typeof element.matches === 'function' && + element.matches(selector)) { + return element; + } + element = element.parentNode; + } +} + +var closest_1 = closest; + +/** + * Delegates event to a selector. + * + * @param {Element} element + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @param {Boolean} useCapture + * @return {Object} + */ +function _delegate(element, selector, type, callback, useCapture) { + var listenerFn = listener.apply(this, arguments); + + element.addEventListener(type, listenerFn, useCapture); + + return { + destroy: function() { + element.removeEventListener(type, listenerFn, useCapture); + } + } +} + +/** + * Delegates event to a selector. + * + * @param {Element|String|Array} [elements] + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @param {Boolean} useCapture + * @return {Object} + */ +function delegate(elements, selector, type, callback, useCapture) { + // Handle the regular Element usage + if (typeof elements.addEventListener === 'function') { + return _delegate.apply(null, arguments); + } + + // Handle Element-less usage, it defaults to global delegation + if (typeof type === 'function') { + // Use `document` as the first parameter, then apply arguments + // This is a short way to .unshift `arguments` without running into deoptimizations + return _delegate.bind(null, document).apply(null, arguments); + } + + // Handle Selector-based usage + if (typeof elements === 'string') { + elements = document.querySelectorAll(elements); + } + + // Handle Array-like based usage + return Array.prototype.map.call(elements, function (element) { + return _delegate(element, selector, type, callback, useCapture); + }); +} + +/** + * Finds closest match and invokes callback. + * + * @param {Element} element + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @return {Function} + */ +function listener(element, selector, type, callback) { + return function(e) { + e.delegateTarget = closest_1(e.target, selector); + + if (e.delegateTarget) { + callback.call(element, e); + } + } +} + +var delegate_1 = delegate; + +/** + * Validates all params and calls the right + * listener function based on its target type. + * + * @param {String|HTMLElement|HTMLCollection|NodeList} target + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listen(target, type, callback) { + if (!target && !type && !callback) { + throw new Error('Missing required arguments'); + } + + if (!is.string(type)) { + throw new TypeError('Second argument must be a String'); + } + + if (!is.fn(callback)) { + throw new TypeError('Third argument must be a Function'); + } + + if (is.node(target)) { + return listenNode(target, type, callback); + } + else if (is.nodeList(target)) { + return listenNodeList(target, type, callback); + } + else if (is.string(target)) { + return listenSelector(target, type, callback); + } + else { + throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList'); + } +} + +/** + * Adds an event listener to a HTML element + * and returns a remove listener function. + * + * @param {HTMLElement} node + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listenNode(node, type, callback) { + node.addEventListener(type, callback); + + return { + destroy: function() { + node.removeEventListener(type, callback); + } + } +} + +/** + * Add an event listener to a list of HTML elements + * and returns a remove listener function. + * + * @param {NodeList|HTMLCollection} nodeList + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listenNodeList(nodeList, type, callback) { + Array.prototype.forEach.call(nodeList, function(node) { + node.addEventListener(type, callback); + }); + + return { + destroy: function() { + Array.prototype.forEach.call(nodeList, function(node) { + node.removeEventListener(type, callback); + }); + } + } +} + +/** + * Add an event listener to a selector + * and returns a remove listener function. + * + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listenSelector(selector, type, callback) { + return delegate_1(document.body, selector, type, callback); +} + +var listen_1 = listen; + +var clipboard = createCommonjsModule(function (module, exports) { +(function (global, factory) { + if (typeof undefined === "function" && undefined.amd) { + undefined(['module', './clipboard-action', 'tiny-emitter', 'good-listener'], factory); + } else { + factory(module, clipboardAction, index, listen_1); + } +})(commonjsGlobal, function (module, _clipboardAction, _tinyEmitter, _goodListener) { + 'use strict'; + + var _clipboardAction2 = _interopRequireDefault(_clipboardAction); + + var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter); + + var _goodListener2 = _interopRequireDefault(_goodListener); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var Clipboard = function (_Emitter) { + _inherits(Clipboard, _Emitter); + + /** + * @param {String|HTMLElement|HTMLCollection|NodeList} trigger + * @param {Object} options + */ + function Clipboard(trigger, options) { + _classCallCheck(this, Clipboard); + + var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this)); + + _this.resolveOptions(options); + _this.listenClick(trigger); + return _this; + } + + /** + * Defines if attributes would be resolved using internal setter functions + * or custom functions that were passed in the constructor. + * @param {Object} options + */ + + + _createClass(Clipboard, [{ + key: 'resolveOptions', + value: function resolveOptions() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + this.action = typeof options.action === 'function' ? options.action : this.defaultAction; + this.target = typeof options.target === 'function' ? options.target : this.defaultTarget; + this.text = typeof options.text === 'function' ? options.text : this.defaultText; + this.container = _typeof(options.container) === 'object' ? options.container : document.body; + } + }, { + key: 'listenClick', + value: function listenClick(trigger) { + var _this2 = this; + + this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) { + return _this2.onClick(e); + }); + } + }, { + key: 'onClick', + value: function onClick(e) { + var trigger = e.delegateTarget || e.currentTarget; + + if (this.clipboardAction) { + this.clipboardAction = null; + } + + this.clipboardAction = new _clipboardAction2.default({ + action: this.action(trigger), + target: this.target(trigger), + text: this.text(trigger), + container: this.container, + trigger: trigger, + emitter: this + }); + } + }, { + key: 'defaultAction', + value: function defaultAction(trigger) { + return getAttributeValue('action', trigger); + } + }, { + key: 'defaultTarget', + value: function defaultTarget(trigger) { + var selector = getAttributeValue('target', trigger); + + if (selector) { + return document.querySelector(selector); + } + } + }, { + key: 'defaultText', + value: function defaultText(trigger) { + return getAttributeValue('text', trigger); + } + }, { + key: 'destroy', + value: function destroy() { + this.listener.destroy(); + + if (this.clipboardAction) { + this.clipboardAction.destroy(); + this.clipboardAction = null; + } + } + }], [{ + key: 'isSupported', + value: function isSupported() { + var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut']; + + var actions = typeof action === 'string' ? [action] : action; + var support = !!document.queryCommandSupported; + + actions.forEach(function (action) { + support = support && !!document.queryCommandSupported(action); + }); + + return support; + } + }]); + + return Clipboard; + }(_tinyEmitter2.default); + + /** + * Helper function to retrieve attribute value. + * @param {String} suffix + * @param {Element} element + */ + function getAttributeValue(suffix, element) { + var attribute = 'data-clipboard-' + suffix; + + if (!element.hasAttribute(attribute)) { + return; + } + + return element.getAttribute(attribute); + } + + module.exports = Clipboard; +}); +}); + +var Clipboard = unwrapExports(clipboard); + +var WIN_PARAMS = 'scrollbars=0, resizable=1, menubar=0, left=100, top=100, width=550, height=440, toolbar=0, status=0'; // eslint-disable-line import/prefer-default-export + +function encodeParams(obj) { + return Object.keys(obj).filter(function (k) { + return typeof obj[k] !== 'undefined' && obj[k] !== ''; + }).map(function (k) { + return encodeURIComponent(k) + '=' + encodeURIComponent(obj[k]); + }).join('&'); +} + +function fbFeed() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var fbAppId = options.fbAppId, + url = options.url, + redirectUri = options.redirectUri; + + + if (!fbAppId) { + throw new Error('fbAppId is not defined'); + } + + var params = encodeParams({ + app_id: fbAppId, + display: 'popup', + redirect_uri: redirectUri, + link: url + }); + + return window.open('https://www.facebook.com/dialog/feed?' + params, '_blank', WIN_PARAMS); +} + +function fbShare() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var fbAppId = options.fbAppId, + url = options.url, + hashtag = options.hashtag, + redirectUri = options.redirectUri; + + + if (!fbAppId) { + throw new Error('fbAppId is not defined'); + } + + var params = encodeParams({ + app_id: fbAppId, + display: 'popup', + redirect_uri: redirectUri, + href: url, + hashtag: hashtag + }); + + return window.open('https://www.facebook.com/dialog/share?' + params, '_blank', WIN_PARAMS); +} + +function fbButton() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var url = options.url; + + + if (!url) { + throw new Error('url is not defined'); + } + + var params = encodeParams({ + kid_directed_site: '0', + sdk: 'joey', + u: url, + display: 'popup', + ref: 'plugin', + src: 'share_button' + }); + + return window.open('https://www.facebook.com/sharer/sharer.php?' + params, '_blank', WIN_PARAMS); +} + +function gp() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var url = options.url; + + + var params = encodeParams({ url: url }); + + return window.open('https://plus.google.com/share?' + params, '_blank', WIN_PARAMS); +} + +function mail() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var url = options.url, + title = options.title, + description = options.description, + image = options.image; + + + var params = encodeParams({ + share_url: url, + title: title, + description: description, + imageurl: image + }); + + return window.open('http://connect.mail.ru/share?' + params, '_blank', WIN_PARAMS); +} + +function email() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var url = options.url, + title = options.title, + description = options.description; + + + var body = (title || '') + '\r\n' + (description || '') + '\r\n' + (url || ''); + var uri = 'mailto:?body=' + encodeURIComponent(body); + return window.location.assign(uri); +} + +function ok() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var url = options.url, + title = options.title; + + + var params = encodeParams({ + 'st.cmd': 'addShare', + 'st._surl': url, + title: title + }); + + return window.open('https://ok.ru/dk?' + params, '_blank', WIN_PARAMS); +} + +function telegram() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var url = options.url, + title = options.title; + + + var params = encodeParams({ + url: url, + text: title + }); + + return window.open('https://t.me/share/url?' + params, '_blank', WIN_PARAMS); +} + +function tw() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var title = options.title, + url = options.url, + _options$hashtags = options.hashtags, + hashtags = _options$hashtags === undefined ? [] : _options$hashtags; + + + var params = encodeParams({ + text: title, + url: url, + hashtags: hashtags.join(',') + }); + + return window.open('https://twitter.com/intent/tweet?' + params, '_blank', WIN_PARAMS); +} + +function reddit() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var url = options.url, + title = options.title; + + var params = encodeParams({ url: url, title: title }); + + return window.open('https://www.reddit.com/submit?' + params, '_blank', WIN_PARAMS); +} + +function pinterest() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var description = options.description, + url = options.url, + media = options.media; + + + var params = encodeParams({ url: url, description: description, media: media }); + + return window.open('https://pinterest.com/pin/create/button/?' + params, '_blank', WIN_PARAMS); +} + +function tumblr() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var url = options.url, + title = options.title, + caption = options.caption, + _options$tags = options.tags, + tags = _options$tags === undefined ? [] : _options$tags, + _options$posttype = options.posttype, + posttype = _options$posttype === undefined ? 'link' : _options$posttype; + + + var params = encodeParams({ + canonicalUrl: url, + title: title, + caption: caption, + tags: tags.join(','), + posttype: posttype + }); + + return window.open('https://www.tumblr.com/widgets/share/tool?' + params, '_blank', WIN_PARAMS); +} + +function isMobileSafari() { + return !!window.navigator.userAgent.match(/Version\/[\d.]+.*Safari/); +} + +function mobileShare(link) { + return isMobileSafari() ? window.open(link) : window.location.assign(link); +} + +function viber() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var url = options.url, + title = options.title; + + if (!url && !title) { + throw new Error('url and title not specified'); + } + + var params = encodeParams({ + text: [title, url].filter(function (item) { + return item; + }).join(' ') + }); + + return mobileShare('viber://forward?' + params); +} + +var VK_MAX_LENGTH = 80; + +function getUrl$1() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var url = options.url, + image = options.image, + isVkParse = options.isVkParse; + var description = options.description, + title = options.title; + + + if (description && description.length > VK_MAX_LENGTH) { + description = description.substr(0, VK_MAX_LENGTH) + '...'; + } + + if (title && title.length > VK_MAX_LENGTH) { + title = title.substr(0, VK_MAX_LENGTH) + '...'; + } + + var params = void 0; + if (isVkParse) { + params = encodeParams({ url: url }); + } else { + params = encodeParams({ + url: url, title: title, description: description, image: image, noparse: true + }); + } + + return 'https://vk.com/share.php?' + params; +} + +function share() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + return window.open(getUrl$1(options), '_blank', WIN_PARAMS); +} + +function whatsapp() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var phone = options.phone, + title = options.title, + url = options.url; + + + var params = encodeParams({ + text: [title, url].filter(function (item) { + return item; + }).join(' '), + phone: phone + }); + + return window.open('https://api.whatsapp.com/send?' + params, '_blank', WIN_PARAMS); +} + +function linkedin() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var title = options.title, + url = options.url, + description = options.description; + + + var params = encodeParams({ + title: title, + summary: description, + url: url + }); + + return window.open('https://www.linkedin.com/shareArticle?mini=true&' + params, '_blank', WIN_PARAMS); +} + +function messenger() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var fbAppId = options.fbAppId, + url = options.url; + + + if (!fbAppId) { + throw new Error('fbAppId is not defined'); + } + + var params = encodeParams({ + app_id: fbAppId, + link: url + }); + + return window.location.assign('fb-messenger://share?' + params); +} + +function line() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var title = options.title, + url = options.url; + + + if (!url) { + throw new Error('url is not defined'); + } + + var params = encodeURIComponent('' + url); + + if (title) { + params = '' + encodeURIComponent(title + ' ') + params; + } + + return window.open('https://line.me/R/msg/text/?' + params, '_blank', WIN_PARAMS); +} + + + + +var sharing = (Object.freeze || Object)({ + fbFeed: fbFeed, + fbShare: fbShare, + fbButton: fbButton, + gp: gp, + mail: mail, + email: email, + ok: ok, + telegram: telegram, + tw: tw, + reddit: reddit, + pinterest: pinterest, + tumblr: tumblr, + viber: viber, + getVkUrl: getUrl$1, + vk: share, + whatsapp: whatsapp, + linkedin: linkedin, + messenger: messenger, + line: line +}); + +/** + * @return {boolean} + */ +function isTouchDevice() { + return 'ontouchstart' in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; +} + +/** + * Checks if the player opened on iOS or Android device. + * + * @return {boolean} + */ +function isMobileDevice() { + return (/Android/.test(window.navigator.userAgent) || /iP(hone|ad|od)/i.test(window.navigator.userAgent) + ); +} + +var EXCLUDED_SOCIALS = ['whatsapp', 'viber', 'messenger']; + +/** + * Filters socials list depending on platform. + * + * @param {Array} socials + * List of socials to filter. + * @return {Array} + * Filtered list of socials. + */ +function filterSocials() { + var socials = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var mobileVerification = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + return mobileVerification ? isMobileDevice() ? socials : socials.filter(function (social) { + return !EXCLUDED_SOCIALS.includes(social); + }) : socials; +} + +var fbFeed$1 = "\n \n\n"; + +var tw$1 = "\n \n\n"; + +var reddit$1 = "\n \n\n"; + +var gp$1 = "\n \n\n"; + +var messenger$1 = "\n \n \n\n"; + +var linkedin$1 = "\n \n\n"; + +var vk = "\n \n\n"; + +var ok$1 = "\n \n\n"; + +var mail$1 = "\n \n\n"; + +var telegram$1 = "\n \n\n"; + +var whatsapp$1 = "\n \n\n"; + +var viber$1 = "\n \n\n"; + +var icons = { + fbFeed: fbFeed$1, + tw: tw$1, + reddit: reddit$1, + gp: gp$1, + messenger: messenger$1, + linkedin: linkedin$1, + vk: vk, + ok: ok$1, + mail: mail$1, + telegram: telegram$1, + whatsapp: whatsapp$1, + viber: viber$1 +}; + +var ShareModalContent = function () { + function ShareModalContent(player, options) { + classCallCheck(this, ShareModalContent); + + this.player = player; + + this.options = options; + this.socials = filterSocials(options.socials, options.mobileVerification); + + this.copyBtnTextClass = 'vjs-share__btn-text'; + this.socialBtnClass = 'vjs-share__social'; + + this._createContent(); + this._initToggle(); + this._initClipboard(); + this._initSharing(); + } + + ShareModalContent.prototype.getContent = function getContent() { + return this.content; + }; + + ShareModalContent.prototype._createContent = function _createContent() { + var copyBtn = '\n \n \n \n ' + this.player.localize('Copy') + '\n '; + var wrapper = document.createElement('div'); + + wrapper.innerHTML = '
\n \n\n
\n \n \n\n \n \n
\n\n
\n
\n ' + this._getSocialItems().join('') + '\n
\n
\n
'; + + this.content = wrapper.firstChild; + }; + + ShareModalContent.prototype._initClipboard = function _initClipboard() { + var _this = this; + + var clipboard = new Clipboard('.vjs-share__btn', { + target: function target(trigger) { + return trigger.previousElementSibling; + } + }); + + clipboard.on('success', function (e) { + var textContainer = e.trigger.querySelector('.' + _this.copyBtnTextClass); + var restore = function restore() { + textContainer.innerText = _this.player.localize('Copy'); + e.clearSelection(); + }; + + textContainer.innerText = _this.player.localize('Copied'); + + if (isTouchDevice()) { + setTimeout(restore, 1000); + } else { + textContainer.parentElement.addEventListener('mouseleave', function () { + setTimeout(restore, 300); + }); + } + }); + }; + + ShareModalContent.prototype._initSharing = function _initSharing() { + var _this2 = this; + + var btns = this.content.querySelectorAll('.' + this.socialBtnClass); + + Array.from(btns).forEach(function (btn) { + btn.addEventListener('click', function (e) { + var social = e.currentTarget.getAttribute('data-social'); + + if (typeof sharing[social] === 'function') { + sharing[social](_this2.socialOptions); + } + }); + }); + }; + + ShareModalContent.prototype._initToggle = function _initToggle() { + var iconsList = this.content.querySelector('.vjs-share__socials'); + + if (this.socials.length > 10 || window.innerWidth <= 180 && this.socials.length > 6) { + iconsList.style.height = 'calc((2em + 5px) * 2)'; + } else { + iconsList.classList.add('horizontal'); + } + }; + + ShareModalContent.prototype._getSocialItems = function _getSocialItems() { + var socialItems = []; + + this.socials.forEach(function (social) { + if (icons[social]) { + socialItems.push('\n \n '); + } + }); + + return socialItems; + }; + + createClass(ShareModalContent, [{ + key: 'socialOptions', + get: function get$$1() { + var _options = this.options, + url = _options.url, + title = _options.title, + description = _options.description, + image = _options.image, + fbAppId = _options.fbAppId, + isVkParse = _options.isVkParse, + redirectUri = _options.redirectUri; + + + return { + url: url, + title: title, + description: description, + image: image, + fbAppId: fbAppId, + isVkParse: isVkParse, + redirectUri: redirectUri + }; + } + }]); + return ShareModalContent; +}(); + +var Component = videojs.getComponent('Component'); + +/** + * Share overlay. + */ + +var ShareOverlay = function (_Component) { + inherits(ShareOverlay, _Component); + + function ShareOverlay(player, options) { + classCallCheck(this, ShareOverlay); + + var _this = possibleConstructorReturn(this, _Component.call(this, player, options)); + + _this.player = player; + _this.options = options; + return _this; + } + + ShareOverlay.prototype._createModal = function _createModal() { + var content = new ShareModalContent(this.player, this.options).getContent(); + + this.modal = new ShareModal(this.player, { + content: content, + temporary: true + }); + + this.el = this.modal.contentEl(); + + this.player.addChild(this.modal); + }; + + ShareOverlay.prototype.open = function open() { + this._createModal(); + this.modal.open(); + }; + + return ShareOverlay; +}(Component); + +var Plugin = videojs$1.getPlugin('plugin'); + +// Default options for the plugin. +/** + * An advanced Video.js plugin. For more information on the API + * + * See: https://blog.videojs.com/feature-spotlight-advanced-plugins/ + */ + +var Share = function (_Plugin) { + inherits(Share, _Plugin); + + /** + * Create a Share plugin instance. + * + * @param {Player} player + * A Video.js Player instance. + * + * @param {Object} [options] + * An optional options object. + * + * While not a core part of the Video.js plugin architecture, a + * second argument of options is a convenient way to accept inputs + * from your plugin's caller. + */ + function Share(player, options) { + classCallCheck(this, Share); + + var _this = possibleConstructorReturn(this, _Plugin.call(this, player)); + // the parent class will add player under this.player + + + _this.options = videojs$1.mergeOptions(defaults, options); + + _this.player.ready(function () { + _this.player.addClass('vjs-share'); + player.addClass('vjs-videojs-share'); + player.getChild('controlBar').addChild('ShareButton', options); + player.addChild('ShareOverlay', options); + }); + return _this; + } + + return Share; +}(Plugin); + +// Define default values for the plugin's `state` object here. + + +Share.defaultState = {}; + +// Include the version number. +Share.VERSION = version; + +// Register the plugin with video.js. +videojs$1.registerComponent('ShareButton', ShareButton); +videojs$1.registerComponent('ShareOverlay', ShareOverlay); +videojs$1.registerPlugin('share', Share); + +return Share; + +}))); -- cgit v1.2.3