(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["Clappr"] = factory(); else root["Clappr"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "<%=baseUrl%>/"; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { // Copyright 2014 Globo.com Player authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _componentsPlayer = __webpack_require__(1); var _componentsPlayer2 = _interopRequireDefault(_componentsPlayer); var _baseUtils = __webpack_require__(2); var _baseUtils2 = _interopRequireDefault(_baseUtils); var _baseEvents = __webpack_require__(5); var _baseEvents2 = _interopRequireDefault(_baseEvents); var _basePlayback = __webpack_require__(96); var _basePlayback2 = _interopRequireDefault(_basePlayback); var _baseContainer_plugin = __webpack_require__(126); var _baseContainer_plugin2 = _interopRequireDefault(_baseContainer_plugin); var _baseCore_plugin = __webpack_require__(156); var _baseCore_plugin2 = _interopRequireDefault(_baseCore_plugin); var _baseUi_core_plugin = __webpack_require__(141); var _baseUi_core_plugin2 = _interopRequireDefault(_baseUi_core_plugin); var _baseUi_container_plugin = __webpack_require__(121); var _baseUi_container_plugin2 = _interopRequireDefault(_baseUi_container_plugin); var _baseBase_object = __webpack_require__(4); var _baseBase_object2 = _interopRequireDefault(_baseBase_object); var _baseUi_object = __webpack_require__(18); var _baseUi_object2 = _interopRequireDefault(_baseUi_object); var _componentsBrowser = __webpack_require__(3); var _componentsBrowser2 = _interopRequireDefault(_componentsBrowser); var _componentsContainer = __webpack_require__(34); var _componentsContainer2 = _interopRequireDefault(_componentsContainer); var _componentsCore = __webpack_require__(13); var _componentsCore2 = _interopRequireDefault(_componentsCore); var _componentsMediator = __webpack_require__(64); var _componentsMediator2 = _interopRequireDefault(_componentsMediator); var _componentsMedia_control = __webpack_require__(58); var _componentsMedia_control2 = _interopRequireDefault(_componentsMedia_control); var _componentsPlayer_info = __webpack_require__(65); var _componentsPlayer_info2 = _interopRequireDefault(_componentsPlayer_info); var _playbacksBase_flash_playback = __webpack_require__(101); var _playbacksBase_flash_playback2 = _interopRequireDefault(_playbacksBase_flash_playback); var _playbacksFlash = __webpack_require__(99); var _playbacksFlash2 = _interopRequireDefault(_playbacksFlash); var _playbacksHls = __webpack_require__(108); var _playbacksHls2 = _interopRequireDefault(_playbacksHls); var _playbacksHtml5_audio = __webpack_require__(106); var _playbacksHtml5_audio2 = _interopRequireDefault(_playbacksHtml5_audio); var _playbacksHtml5_video = __webpack_require__(93); var _playbacksHtml5_video2 = _interopRequireDefault(_playbacksHtml5_video); var _playbacksHtml_img = __webpack_require__(112); var _playbacksHtml_img2 = _interopRequireDefault(_playbacksHtml_img); var _pluginsPoster = __webpack_require__(131); var _pluginsPoster2 = _interopRequireDefault(_pluginsPoster); var _pluginsLog = __webpack_require__(6); var _pluginsLog2 = _interopRequireDefault(_pluginsLog); var version = ("0.2.12"); exports['default'] = { Player: _componentsPlayer2['default'], Mediator: _componentsMediator2['default'], Events: _baseEvents2['default'], Browser: _componentsBrowser2['default'], PlayerInfo: _componentsPlayer_info2['default'], MediaControl: _componentsMedia_control2['default'], ContainerPlugin: _baseContainer_plugin2['default'], UIContainerPlugin: _baseUi_container_plugin2['default'], CorePlugin: _baseCore_plugin2['default'], UICorePlugin: _baseUi_core_plugin2['default'], Playback: _basePlayback2['default'], Container: _componentsContainer2['default'], Core: _componentsCore2['default'], BaseObject: _baseBase_object2['default'], UIObject: _baseUi_object2['default'], Utils: _baseUtils2['default'], BaseFlashPlayback: _playbacksBase_flash_playback2['default'], Flash: _playbacksFlash2['default'], HLS: _playbacksHls2['default'], HTML5Audio: _playbacksHtml5_audio2['default'], HTML5Video: _playbacksHtml5_video2['default'], HTMLImg: _playbacksHtml_img2['default'], Poster: _pluginsPoster2['default'], Log: _pluginsLog2['default'], version: version }; module.exports = exports['default']; /***/ }, /* 1 */ /***/ function(module, exports, __webpack_require__) { // Copyright 2014 Globo.com Player authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); 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 _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } 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 _baseUtils = __webpack_require__(2); var _baseBase_object = __webpack_require__(4); var _baseBase_object2 = _interopRequireDefault(_baseBase_object); var _baseEvents = __webpack_require__(5); var _baseEvents2 = _interopRequireDefault(_baseEvents); var _componentsCore_factory = __webpack_require__(11); var _componentsCore_factory2 = _interopRequireDefault(_componentsCore_factory); var _componentsLoader = __webpack_require__(72); var _componentsLoader2 = _interopRequireDefault(_componentsLoader); var _componentsPlayer_info = __webpack_require__(65); var _componentsPlayer_info2 = _interopRequireDefault(_componentsPlayer_info); var _lodashAssign = __webpack_require__(21); var _lodashAssign2 = _interopRequireDefault(_lodashAssign); var _lodashFind = __webpack_require__(38); var _lodashFind2 = _interopRequireDefault(_lodashFind); var baseUrl = (0, _baseUtils.currentScriptUrl)().replace(/\/[^\/]+$/, ""); /** * @class Player * @constructor * @extends BaseObject * @module components * @example * ### Using the Player * * Add the following script on your HTML: * ```html *
* * * ``` * Now, create the player: * ```html * * * * * ``` */ var Player = (function (_BaseObject) { _inherits(Player, _BaseObject); /** * ## Player's constructor * * You might pass the options object to build the player. * ```javascript * var options = {source: "http://example.com/video.mp4", param1: "val1"}; * var player = new Clappr.Player(options); * ``` * * @method constructor * @param {Object} options Data * options to build a player instance * @param {Number} [options.width] * player's width **default**: `640` * @param {Number} [options.height] * player's height **default**: `360` * @param {Boolean} [options.autoPlay] * automatically play after page load **default**: `false` * @param {Boolean} [options.loop] * automatically replay after it ends **default**: `false` * @param {Boolean} [options.chromeless] * player acts in chromeless mode **default**: `false` * @param {Boolean} [options.muted] * start the video muted **default**: `false` * @param {Boolean} [options.persistConfig] * persist player's settings (volume) through the same domain **default**: `true` * @param {String} [options.preload] * video will be preloaded according to `preload` attribute options **default**: `'metadata'` * @param {Number} [options.maxBufferLength] * the default behavior for the **HLS playback** is to keep buffering indefinitely, even on VoD. This replicates the behavior for progressive download, which continues buffering when pausing the video, thus making the video available for playback even on slow networks. To change this behavior use `maxBufferLength` where **value is in seconds**. * @param {String} [options.gaAccount] * enable Google Analytics events dispatch **(play/pause/stop/buffering/etc)** by adding your `gaAccount` * @param {String} [options.gaTrackerName] * besides `gaAccount` you can optionally, pass your favorite trackerName as `gaTrackerName` * @param {Object} [options.mediacontrol] * customize control bar colors, example: `mediacontrol: {seekbar: "#E113D3", buttons: "#66B2FF"}` * @param {Boolean} [options.hideMediaControl] * control media control auto hide **default**: `true` * @param {Boolean} [options.hideVolumeBar] * when embedded with width less than 320, volume bar will hide. You can force this behavior for all sizes by adding `true` **default**: `false` * @param {String} [options.watermark] * put `watermark: 'http://url/img.png'` on your embed parameters to automatically add watermark on your video. You can customize corner position by defining position parameter. Positions can be `bottom-left`, `bottom-right`, `top-left` and `top-right`. * @param {String} [options.poster] * define a poster by adding its address `poster: 'http://url/img.png'`. It will appear after video embed, disappear on play and go back when user stops the video. */ function Player(options) { _classCallCheck(this, Player); _get(Object.getPrototypeOf(Player.prototype), 'constructor', this).call(this, options); window.p = this; var defaultOptions = { playerId: (0, _baseUtils.uniqueId)(""), persistConfig: true, width: 640, height: 360, baseUrl: baseUrl }; this.options = (0, _lodashAssign2['default'])(defaultOptions, options); this.options.sources = this.normalizeSources(options); this.loader = new _componentsLoader2['default'](this.options.plugins || {}, this.options.playerId); this.coreFactory = new _componentsCore_factory2['default'](this, this.loader); this.playerInfo = _componentsPlayer_info2['default'].getInstance(this.options.playerId); this.playerInfo.currentSize = { width: options.width, height: options.height }; this.playerInfo.options = this.options; if (this.options.parentId) { this.setParentId(this.options.parentId); } } /** * Specify a `parentId` to the player. * @method setParentId * @param {String} parentId the element parent id. */ _createClass(Player, [{ key: 'setParentId', value: function setParentId(parentId) { var el = document.querySelector(parentId); if (el) { this.attachTo(el); } } /** * You can use this method to attach the player to a given element. You don't need to do this when you specify it during the player instantiation passing the `parentId` param. * @method attachTo * @param {Object} element a given element. */ }, { key: 'attachTo', value: function attachTo(element) { this.options.parentElement = element; this.core = this.coreFactory.create(); this.addEventListeners(); } }, { key: 'addEventListeners', value: function addEventListeners() { this.listenTo(this.core.mediaControl, _baseEvents2['default'].MEDIACONTROL_CONTAINERCHANGED, this.containerChanged); var container = this.core.mediaControl.container; if (!!container) { this.listenTo(container, _baseEvents2['default'].CONTAINER_PLAY, this.onPlay); this.listenTo(container, _baseEvents2['default'].CONTAINER_PAUSE, this.onPause); this.listenTo(container, _baseEvents2['default'].CONTAINER_STOP, this.onStop); this.listenTo(container, _baseEvents2['default'].CONTAINER_ENDED, this.onEnded); this.listenTo(container, _baseEvents2['default'].CONTAINER_SEEK, this.onSeek); this.listenTo(container, _baseEvents2['default'].CONTAINER_ERROR, this.onError); this.listenTo(container, _baseEvents2['default'].CONTAINER_TIMEUPDATE, this.onTimeUpdate); } } }, { key: 'containerChanged', value: function containerChanged() { this.stopListening(); this.addEventListeners(); } }, { key: 'onPlay', value: function onPlay() { this.trigger(_baseEvents2['default'].PLAYER_PLAY); } }, { key: 'onPause', value: function onPause() { this.trigger(_baseEvents2['default'].PLAYER_PAUSE); } }, { key: 'onStop', value: function onStop() { this.trigger(_baseEvents2['default'].PLAYER_STOP, this.getCurrentTime()); } }, { key: 'onEnded', value: function onEnded() { this.trigger(_baseEvents2['default'].PLAYER_ENDED); } }, { key: 'onSeek', value: function onSeek(percent) { this.trigger(_baseEvents2['default'].PLAYER_SEEK, percent); } }, { key: 'onTimeUpdate', value: function onTimeUpdate(position, duration) { this.trigger(_baseEvents2['default'].PLAYER_TIMEUPDATE, position, duration); } }, { key: 'onError', value: function onError(error) { this.trigger(_baseEvents2['default'].PLAYER_ERROR, error); } }, { key: 'is', value: function is(value, type) { return value.constructor === type; } }, { key: 'normalizeSources', value: function normalizeSources(options) { var sources = options.sources || (options.source !== undefined ? [options.source.toString()] : []); return sources.length === 0 ? ['no.op'] : sources; } /** * resizes the current player canvas. * @method resize * @param {Object} size should be a literal object with `height` and `width`. * @example * ```javascript * player.resize({height: 360, width: 640}) * ``` */ }, { key: 'resize', value: function resize(size) { this.core.resize(size); } /** * loads a new source. * @method load * @param {Object} sources source or sources of video. * @param {Object} mimeType a mime type, example: `'application/vnd.apple.mpegurl'` * */ }, { key: 'load', value: function load(sources, mimeType) { this.core.load(sources, mimeType); } /** * destroys the current player and removes it from the DOM. * @method destroy */ }, { key: 'destroy', value: function destroy() { this.core.destroy(); } /** * plays the current video (`source`). * @method play */ }, { key: 'play', value: function play() { this.core.mediaControl.container.play(); } /** * pauses the current video (`source`). * @method pause */ }, { key: 'pause', value: function pause() { this.core.mediaControl.container.pause(); } /** * stops the current video (`source`). * @method stop */ }, { key: 'stop', value: function stop() { this.core.mediaControl.container.stop(); } /** * seeks the current video (`source`). For example, `player.seek(50)` will seek to the middle of the current video. * @method seek * @param {Number} time should be a number between 0 and 100. */ }, { key: 'seek', value: function seek(time) { this.core.mediaControl.container.setCurrentTime(time); } /** * Set the volume for the current video (`source`). * @method setVolume * @param {Number} time should be a number between 0 and 100, 0 being mute and 100 the max volume. */ }, { key: 'setVolume', value: function setVolume(volume) { this.core.mediaControl.container.setVolume(volume); } /** * mutes the current video (`source`). * @method mute */ }, { key: 'mute', value: function mute() { this.core.mediaControl.container.setVolume(0); } /** * unmutes the current video (`source`). * @method unmute */ }, { key: 'unmute', value: function unmute() { this.core.mediaControl.container.setVolume(100); } /** * checks if the player is playing. * @method isPlaying * @return {Boolean} `true` if the current source is playing, otherwise `false` */ }, { key: 'isPlaying', value: function isPlaying() { return this.core.mediaControl.container.isPlaying(); } /** * get a plugin by its name. * @method getPlugin * @param {String} name of the plugin. * @return {Object} the plugin instance * @example * ```javascript * var poster = player.getPlugin('poster'); * poster.hidePlayButton(); * ``` */ }, { key: 'getPlugin', value: function getPlugin(name) { var plugins = this.core.plugins.concat(this.core.mediaControl.container.plugins); return (0, _lodashFind2['default'])(plugins, function (plugin) { return plugin.name === name; }); } /** * the current time in seconds. * @method getCurrentTime * @return {Number} current time (in seconds) of the current source */ }, { key: 'getCurrentTime', value: function getCurrentTime() { return this.core.mediaControl.container.getCurrentTime(); } /** * the duration time in seconds. * @method getDuration * @return {Number} duration time (in seconds) of the current source */ }, { key: 'getDuration', value: function getDuration() { return this.core.mediaControl.container.getDuration(); } }]); return Player; })(_baseBase_object2['default']); exports['default'] = Player; module.exports = exports['default']; /***/ }, /* 2 */ /***/ function(module, exports, __webpack_require__) { // Copyright 2014 Globo.com Player authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 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; }; })(); exports.extend = extend; exports.formatTime = formatTime; exports.seekStringToSeconds = seekStringToSeconds; exports.uniqueId = uniqueId; exports.isNumber = isNumber; exports.currentScriptUrl = currentScriptUrl; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var _componentsBrowser = __webpack_require__(3); var _componentsBrowser2 = _interopRequireDefault(_componentsBrowser); var assign = function assign(obj, source) { if (source) { for (var prop in source) { var propDescriptor = Object.getOwnPropertyDescriptor(source, prop); if (propDescriptor) { Object.defineProperty(obj, prop, propDescriptor); } else { obj[prop] = source[prop]; } } } return obj; }; function extend(parent, properties) { var constructor = function constructor() { parent.prototype.constructor.apply(this, arguments); if (properties.constructor) { properties.constructor.apply(this, arguments); } }; constructor.prototype = Object.create(parent.prototype); assign(constructor.prototype, properties); return constructor; } function formatTime(time) { if (!isFinite(time)) { return "--:--"; } time = time * 1000; time = parseInt(time / 1000); var seconds = time % 60; time = parseInt(time / 60); var minutes = time % 60; time = parseInt(time / 60); var hours = time % 24; var days = parseInt(time / 24); var out = ""; if (days && days > 0) { out += days + ":"; if (hours < 1) out += "00:"; } if (hours && hours > 0) out += ("0" + hours).slice(-2) + ":"; out += ("0" + minutes).slice(-2) + ":"; out += ("0" + seconds).slice(-2); return out.trim(); } var Fullscreen = { isFullscreen: function isFullscreen() { return document.webkitFullscreenElement || document.webkitIsFullScreen || document.mozFullScreen || !!document.msFullscreenElement; }, requestFullscreen: function requestFullscreen(el) { if (el.requestFullscreen) { el.requestFullscreen(); } else if (el.webkitRequestFullscreen) { el.webkitRequestFullscreen(); } else if (el.mozRequestFullScreen) { el.mozRequestFullScreen(); } else if (el.msRequestFullscreen) { el.msRequestFullscreen(); } else if (el.querySelector && el.querySelector("video") && el.querySelector("video").webkitEnterFullScreen) { el.querySelector("video").webkitEnterFullScreen(); } }, cancelFullscreen: function cancelFullscreen() { if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.webkitCancelFullScreen) { document.webkitCancelFullScreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } } }; exports.Fullscreen = Fullscreen; var Config = (function () { function Config() { _classCallCheck(this, Config); } _createClass(Config, null, [{ key: "_defaultConfig", value: function _defaultConfig() { return { volume: { value: 100, parse: parseInt } }; } }, { key: "_defaultValueFor", value: function _defaultValueFor(key) { try { return this._defaultConfig()[key]['parse'](this._defaultConfig()[key]['value']); } catch (e) { return undefined; } } }, { key: "_create_keyspace", value: function _create_keyspace(key) { return 'clappr.' + document.domain + '.' + key; } }, { key: "restore", value: function restore(key) { if (_componentsBrowser2["default"].hasLocalstorage && localStorage[this._create_keyspace(key)]) { return this._defaultConfig()[key]['parse'](localStorage[this._create_keyspace(key)]); } return this._defaultValueFor(key); } }, { key: "persist", value: function persist(key, value) { if (_componentsBrowser2["default"].hasLocalstorage) { try { localStorage[this._create_keyspace(key)] = value; return true; } catch (e) { return false; } } } }]); return Config; })(); exports.Config = Config; function seekStringToSeconds(url) { var parts = url.match(/t=([0-9]*)(&|\/|$)/); if (parts && parts.length > 0) { return parseInt(parts[1], 10); } else { var seconds = 0; var factor = { 'h': 3600, 'm': 60, 's': 1 }; parts = url.match(/[0-9]+[hms]+/g) || []; parts.forEach(function (el) { if (el) { var suffix = el[el.length - 1]; var time = parseInt(el.slice(0, el.length - 1), 10); seconds += time * factor[suffix]; } }); return seconds; } } var idsCounter = {}; function uniqueId(prefix) { idsCounter[prefix] || (idsCounter[prefix] = 0); var id = ++idsCounter[prefix]; return prefix + id; } function isNumber(value) { return value - parseFloat(value) + 1 >= 0; } function currentScriptUrl() { var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1].src; } var requestAnimationFrame = (window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function (fn) { window.setTimeout(fn, 1000 / 60); }).bind(window); exports.requestAnimationFrame = requestAnimationFrame; var cancelAnimationFrame = (window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.clearTimeout).bind(window); exports.cancelAnimationFrame = cancelAnimationFrame; exports["default"] = { Config: Config, Fullscreen: Fullscreen, extend: extend, formatTime: formatTime, seekStringToSeconds: seekStringToSeconds, uniqueId: uniqueId, currentScriptUrl: currentScriptUrl, isNumber: isNumber, requestAnimationFrame: requestAnimationFrame, cancelAnimationFrame: cancelAnimationFrame }; /***/ }, /* 3 */ /***/ function(module, exports) { // Copyright 2014 Globo.com Player authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var Browser = {}; var hasLocalstorage = function hasLocalstorage() { try { localStorage.setItem('clappr', 'clappr'); localStorage.removeItem('clappr'); return true; } catch (e) { return false; } }; var hasFlash = function hasFlash() { try { var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); return !!fo; } catch (e) { return !!(navigator.mimeTypes && navigator.mimeTypes['application/x-shockwave-flash'] !== undefined && navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin); } }; var getBrowserInfo = function getBrowserInfo() { var ua = navigator.userAgent; var parts = ua.match(/\b(playstation 4|nx|opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; var extra; if (/trident/i.test(parts[1])) { extra = /\brv[ :]+(\d+)/g.exec(ua) || []; return { name: 'IE', version: parseInt(extra[1] || '') }; } else if (parts[1] === 'Chrome') { extra = ua.match(/\bOPR\/(\d+)/); if (extra != null) { return { name: 'Opera', version: parseInt(extra[1]) }; } } parts = parts[2] ? [parts[1], parts[2]] : [navigator.appName, navigator.appVersion, '-?']; if (extra = ua.match(/version\/(\d+)/i)) { parts.splice(1, 1, extra[1]); } return { name: parts[0], version: parseInt(parts[1]) }; }; var browserInfo = getBrowserInfo(); Browser.isSafari = !!navigator.userAgent.match(/safari/i) && navigator.userAgent.indexOf('Chrome') === -1; Browser.isChrome = !!navigator.userAgent.match(/chrome/i); Browser.isFirefox = !!navigator.userAgent.match(/firefox/i); Browser.isLegacyIE = !!window.ActiveXObject; Browser.isIE = Browser.isLegacyIE || !!navigator.userAgent.match(/trident.*rv:1\d/i); Browser.isIE11 = !!navigator.userAgent.match(/trident.*rv:11/i); Browser.isMobile = !!/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone|IEMobile|Opera Mini/i.test(navigator.userAgent); Browser.isiOs = !!/iPad|iPhone|iPod/i.test(navigator.userAgent); Browser.isWin8App = !!/MSAppHost/i.test(navigator.userAgent); Browser.isWiiU = !!/WiiU/i.test(navigator.userAgent); Browser.isPS4 = !!/PlayStation 4/i.test(navigator.userAgent); Browser.hasLocalstorage = hasLocalstorage(); Browser.hasFlash = hasFlash(); Browser.name = browserInfo.name; Browser.version = browserInfo.version; exports['default'] = Browser; module.exports = exports['default']; /***/ }, /* 4 */ /***/ function(module, exports, __webpack_require__) { // Copyright 2014 Globo.com Player authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x2 = parent; _x3 = property; _x4 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } 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 _utils = __webpack_require__(2); var _events = __webpack_require__(5); var _events2 = _interopRequireDefault(_events); /** * @class BaseObject * @constructor * @extends Events * @module base */ var BaseObject = (function (_Events) { _inherits(BaseObject, _Events); /** * @method constructor * @param {Object} options */ function BaseObject() { var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; _classCallCheck(this, BaseObject); _get(Object.getPrototypeOf(BaseObject.prototype), 'constructor', this).call(this, options); this.uniqueId = (0, _utils.uniqueId)('o'); } /** * a unique id prefixed with `'o'`, `o1, o232` * * @property uniqueId * @type String */ return BaseObject; })(_events2['default']); exports['default'] = BaseObject; module.exports = exports['default']; /***/ }, /* 5 */ /***/ function(module, exports, __webpack_require__) { // Copyright 2014 Globo.com Player authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); 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 _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var _pluginsLog = __webpack_require__(6); var _pluginsLog2 = _interopRequireDefault(_pluginsLog); var _utils = __webpack_require__(2); var _lodashOnce = __webpack_require__(9); var _lodashOnce2 = _interopRequireDefault(_lodashOnce); var slice = Array.prototype.slice; /** * @class Events * @constructor * @module base */ var Events = (function () { function Events() { _classCallCheck(this, Events); } _createClass(Events, [{ key: 'on', /** * listen to an event indefinitely, if you want to stop you need to call `off` * @method on * @param {String} name * @param {Function} callback * @param {Object} context */ value: function on(name, callback, context) { if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this; this._events || (this._events = {}); var events = this._events[name] || (this._events[name] = []); events.push({ callback: callback, context: context, ctx: context || this }); return this; } /** * listen to an event only once * @method once * @param {String} name * @param {Function} callback * @param {Object} context */ }, { key: 'once', value: function once(name, callback, context) { if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this; var self = this; var once = (0, _lodashOnce2['default'])(function () { self.off(name, once); callback.apply(this, arguments); }); once._callback = callback; return this.on(name, once, context); } /** * stop listening to an event * @method off * @param {String} name * @param {Function} callback * @param {Object} context */ }, { key: 'off', value: function off(name, callback, context) { var retain, ev, events, names, i, l, j, k; if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this; if (!name && !callback && !context) { this._events = void 0; return this; } names = name ? [name] : Object.keys(this._events); for (i = 0, l = names.length; i < l; i++) { name = names[i]; events = this._events[name]; if (events) { this._events[name] = retain = []; if (callback || context) { for (j = 0, k = events.length; j < k; j++) { ev = events[j]; if (callback && callback !== ev.callback && callback !== ev.callback._callback || context && context !== ev.context) { retain.push(ev); } } } if (!retain.length) delete this._events[name]; } } return this; } /** * triggers an event given its `name` * @method trigger * @param {String} name */ }, { key: 'trigger', value: function trigger(name) { try { var klass = this.name || this.constructor.name; _pluginsLog2['default'].debug.apply(_pluginsLog2['default'], [klass].concat(Array.prototype.slice.call(arguments))); if (!this._events) return this; var args = slice.call(arguments, 1); if (!eventsApi(this, 'trigger', name, args)) return this; var events = this._events[name]; var allEvents = this._events.all; if (events) triggerEvents(events, args); if (allEvents) triggerEvents(allEvents, arguments); } catch (exception) { _pluginsLog2['default'].error.apply(_pluginsLog2['default'], [klass, 'error on event', name, 'trigger', '-', exception]); } return this; } /** * stop listening an event for a given object * @method stopListening * @param {Object} obj * @param {String} name * @param {Function} callback */ }, { key: 'stopListening', value: function stopListening(obj, name, callback) { var listeningTo = this._listeningTo; if (!listeningTo) return this; var remove = !name && !callback; if (!callback && typeof name === 'object') callback = this; if (obj) (listeningTo = {})[obj._listenId] = obj; for (var id in listeningTo) { obj = listeningTo[id]; obj.off(name, callback, this); if (remove || Object.keys(obj._events).length === 0) delete this._listeningTo[id]; } return this; } }]); return Events; })(); exports['default'] = Events; var eventSplitter = /\s+/; var eventsApi = function eventsApi(obj, action, name, rest) { if (!name) return true; // Handle event maps. if (typeof name === 'object') { for (var key in name) { obj[action].apply(obj, [key, name[key]].concat(rest)); } return false; } // Handle space separated event names. if (eventSplitter.test(name)) { var names = name.split(eventSplitter); for (var i = 0, l = names.length; i < l; i++) { obj[action].apply(obj, [names[i]].concat(rest)); } return false; } return true; }; var triggerEvents = function triggerEvents(events, args) { var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2]; switch (args.length) { case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx);return; case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1);return; case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2);return; case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3);return; default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);return; } }; /** * listen to an event indefinitely for a given `obj` * @method listenTo * @param {Object} obj * @param {String} name * @param {Function} callback * @param {Object} context * @example * ```javascript * this.listenTo(this.core.playback, Events.PLAYBACK_PAUSE, this.callback) * ``` */ /** * listen to an event once for a given `obj` * @method listenToOnce * @param {Object} obj * @param {String} name * @param {Function} callback * @param {Object} context * @example * ```javascript * this.listenToOnce(this.core.playback, Events.PLAYBACK_PAUSE, this.callback) * ``` */ var listenMethods = { listenTo: 'on', listenToOnce: 'once' }; Object.keys(listenMethods).forEach(function (method) { Events.prototype[method] = function (obj, name, callback) { var listeningTo = this._listeningTo || (this._listeningTo = {}); var id = obj._listenId || (obj._listenId = (0, _utils.uniqueId)('l')); listeningTo[id] = obj; if (!callback && typeof name === 'object') callback = this; obj[listenMethods[method]](name, callback, this); return this; }; }); // PLAYER EVENTS /** * Fired when player risezes * * @event PLAYER_RESIZE * @param {Object} currentSize an object with the current size */ Events.PLAYER_RESIZE = 'resize'; /** * Fired when player starts to play * * @event PLAYER_PLAY */ Events.PLAYER_PLAY = 'play'; /** * Fired when player pauses * * @event PLAYER_PAUSE */ Events.PLAYER_PAUSE = 'pause'; /** * Fired when player stops * * @event PLAYER_STOP */ Events.PLAYER_STOP = 'stop'; /** * Fired when player ends the video * * @event PLAYER_ENDED */ Events.PLAYER_ENDED = 'ended'; /** * Fired when player ends the video * * @event PLAYER_SEEK * @param {Number} percent a percentagem of seek */ Events.PLAYER_SEEK = 'seek'; /** * Fired when player receives an error * * @event PLAYER_ERROR * @param {Object} error the error */ Events.PLAYER_ERROR = 'error'; /** * Fired when player updates its execution * * @event PLAYER_ERROR * @param {Number} postion the current position (in seconds) * @param {Number} duration the total duration (in seconds) */ Events.PLAYER_TIMEUPDATE = 'timeupdate'; // Playback Events Events.PLAYBACK_PROGRESS = 'playback:progress'; Events.PLAYBACK_TIMEUPDATE = 'playback:timeupdate'; Events.PLAYBACK_READY = 'playback:ready'; Events.PLAYBACK_BUFFERING = 'playback:buffering'; Events.PLAYBACK_BUFFERFULL = 'playback:bufferfull'; Events.PLAYBACK_SETTINGSUPDATE = 'playback:settingsupdate'; Events.PLAYBACK_LOADEDMETADATA = 'playback:loadedmetadata'; Events.PLAYBACK_HIGHDEFINITIONUPDATE = 'playback:highdefinitionupdate'; Events.PLAYBACK_BITRATE = 'playback:bitrate'; Events.PLAYBACK_PLAYBACKSTATE = 'playback:playbackstate'; Events.PLAYBACK_DVR = 'playback:dvr'; Events.PLAYBACK_MEDIACONTROL_DISABLE = 'playback:mediacontrol:disable'; Events.PLAYBACK_MEDIACONTROL_ENABLE = 'playback:mediacontrol:enable'; Events.PLAYBACK_ENDED = 'playback:ended'; Events.PLAYBACK_PLAY = 'playback:play'; Events.PLAYBACK_PAUSE = 'playback:pause'; Events.PLAYBACK_ERROR = 'playback:error'; Events.PLAYBACK_STATS_ADD = 'playback:stats:add'; Events.PLAYBACK_FRAGMENT_LOADED = 'playback:fragment:loaded'; // Container Events Events.CONTAINER_PLAYBACKSTATE = 'container:playbackstate'; Events.CONTAINER_PLAYBACKDVRSTATECHANGED = 'container:dvr'; Events.CONTAINER_BITRATE = 'container:bitrate'; Events.CONTAINER_STATS_REPORT = 'container:stats:report'; Events.CONTAINER_DESTROYED = 'container:destroyed'; Events.CONTAINER_READY = 'container:ready'; Events.CONTAINER_ERROR = 'container:error'; Events.CONTAINER_LOADEDMETADATA = 'container:loadedmetadata'; Events.CONTAINER_TIMEUPDATE = 'container:timeupdate'; Events.CONTAINER_PROGRESS = 'container:progress'; Events.CONTAINER_PLAY = 'container:play'; Events.CONTAINER_STOP = 'container:stop'; Events.CONTAINER_PAUSE = 'container:pause'; Events.CONTAINER_ENDED = 'container:ended'; Events.CONTAINER_CLICK = 'container:click'; Events.CONTAINER_DBLCLICK = 'container:dblclick'; Events.CONTAINER_MOUSE_ENTER = 'container:mouseenter'; Events.CONTAINER_MOUSE_LEAVE = 'container:mouseleave'; Events.CONTAINER_SEEK = 'container:seek'; Events.CONTAINER_VOLUME = 'container:volume'; Events.CONTAINER_FULLSCREEN = 'container:fullscreen'; Events.CONTAINER_STATE_BUFFERING = 'container:state:buffering'; Events.CONTAINER_STATE_BUFFERFULL = 'container:state:bufferfull'; Events.CONTAINER_SETTINGSUPDATE = 'container:settingsupdate'; Events.CONTAINER_HIGHDEFINITIONUPDATE = 'container:highdefinitionupdate'; Events.CONTAINER_MEDIACONTROL_DISABLE = 'container:mediacontrol:disable'; Events.CONTAINER_MEDIACONTROL_ENABLE = 'container:mediacontrol:enable'; Events.CONTAINER_STATS_ADD = 'container:stats:add'; // MediaControl Events Events.MEDIACONTROL_RENDERED = 'mediacontrol:rendered'; Events.MEDIACONTROL_FULLSCREEN = 'mediacontrol:fullscreen'; Events.MEDIACONTROL_SHOW = 'mediacontrol:show'; Events.MEDIACONTROL_HIDE = 'mediacontrol:hide'; Events.MEDIACONTROL_MOUSEMOVE_SEEKBAR = 'mediacontrol:mousemove:seekbar'; Events.MEDIACONTROL_MOUSELEAVE_SEEKBAR = 'mediacontrol:mouseleave:seekbar'; Events.MEDIACONTROL_PLAYING = 'mediacontrol:playing'; Events.MEDIACONTROL_NOTPLAYING = 'mediacontrol:notplaying'; Events.MEDIACONTROL_CONTAINERCHANGED = 'mediacontrol:containerchanged'; module.exports = exports['default']; /***/ }, /* 6 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; module.exports = __webpack_require__(7); /***/ }, /* 7 */ /***/ function(module, exports, __webpack_require__) { // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); 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 _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var _baseKibo = __webpack_require__(8); var _baseKibo2 = _interopRequireDefault(_baseKibo); var BOLD = 'font-weight: bold; font-size: 13px;'; var INFO = 'color: #006600;' + BOLD; var DEBUG = 'color: #0000ff;' + BOLD; var WARN = 'color: #ff8000;' + BOLD; var ERROR = 'color: #ff0000;' + BOLD; var LEVEL_DEBUG = 0; var LEVEL_INFO = 1; var LEVEL_WARN = 2; var LEVEL_ERROR = 3; var LEVEL_DISABLED = 4; var COLORS = [DEBUG, INFO, WARN, ERROR, ERROR]; var DESCRIPTIONS = ['debug', 'info', 'warn', 'error', 'disabled']; var Log = (function () { function Log() { var _this = this; var level = arguments.length <= 0 || arguments[0] === undefined ? LEVEL_INFO : arguments[0]; var offLevel = arguments.length <= 1 || arguments[1] === undefined ? LEVEL_DISABLED : arguments[1]; _classCallCheck(this, Log); this.kibo = new _baseKibo2['default'](); this.kibo.down(['ctrl shift d'], function () { return _this.onOff(); }); this.BLACKLIST = ['timeupdate', 'playback:timeupdate', 'playback:progress', 'container:hover', 'container:timeupdate', 'container:progress']; this.level = level; this.offLevel = offLevel; } _createClass(Log, [{ key: 'debug', value: function debug(klass) { this.log(klass, LEVEL_DEBUG, Array.prototype.slice.call(arguments, 1)); } }, { key: 'info', value: function info(klass) { this.log(klass, LEVEL_INFO, Array.prototype.slice.call(arguments, 1)); } }, { key: 'warn', value: function warn(klass) { this.log(klass, LEVEL_WARN, Array.prototype.slice.call(arguments, 1)); } }, { key: 'error', value: function error(klass) { this.log(klass, LEVEL_ERROR, Array.prototype.slice.call(arguments, 1)); } }, { key: 'onOff', value: function onOff() { if (this.level === this.offLevel) { this.level = this.previousLevel; } else { this.previousLevel = this.level; this.level = this.offLevel; } // handle instances where console.log is unavailable if (window.console && window.console.log) { console.log("%c[Clappr.Log] set log level to " + DESCRIPTIONS[this.level], WARN); } } }, { key: 'level', value: function level(newLevel) { this.level = newLevel; } }, { key: 'log', value: function log(klass, level, message) { if (this.BLACKLIST.indexOf(message[0]) >= 0) return; if (level < this.level) return; if (!message) { message = klass; klass = null; } var klassDescription = ""; var color = COLORS[level]; if (klass) { klassDescription = "[" + klass + "]"; } if (window.console && window.console.log) { console.log.apply(console, ["%c[" + DESCRIPTIONS[level] + "]" + klassDescription, color].concat(message)); } } }]); return Log; })(); exports['default'] = Log; Log.LEVEL_DEBUG = LEVEL_DEBUG; Log.LEVEL_INFO = LEVEL_INFO; Log.LEVEL_WARN = LEVEL_WARN; Log.LEVEL_ERROR = LEVEL_ERROR; Log.getInstance = function () { if (this._instance === undefined) { this._instance = new this(); this._instance.previousLevel = this._instance.level; this._instance.level = this._instance.offLevel; } return this._instance; }; Log.setLevel = function (level) { this.getInstance().level = level; }; Log.debug = function (klass) { this.getInstance().debug.apply(this.getInstance(), arguments); }; Log.info = function (klass) { this.getInstance().info.apply(this.getInstance(), arguments); }; Log.warn = function (klass) { this.getInstance().warn.apply(this.getInstance(), arguments); }; Log.error = function (klass) { this.getInstance().error.apply(this.getInstance(), arguments); }; module.exports = exports['default']; /***/ }, /* 8 */ /***/ function(module, exports) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var Kibo = function Kibo(element) { this.element = element || window.document; this.initialize(); }; Kibo.KEY_NAMES_BY_CODE = { 8: 'backspace', 9: 'tab', 13: 'enter', 16: 'shift', 17: 'ctrl', 18: 'alt', 20: 'caps_lock', 27: 'esc', 32: 'space', 37: 'left', 38: 'up', 39: 'right', 40: 'down', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', 54: '6', 55: '7', 56: '8', 57: '9', 65: 'a', 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', 87: 'w', 88: 'x', 89: 'y', 90: 'z', 112: 'f1', 113: 'f2', 114: 'f3', 115: 'f4', 116: 'f5', 117: 'f6', 118: 'f7', 119: 'f8', 120: 'f9', 121: 'f10', 122: 'f11', 123: 'f12' }; Kibo.KEY_CODES_BY_NAME = {}; (function () { for (var key in Kibo.KEY_NAMES_BY_CODE) if (Object.prototype.hasOwnProperty.call(Kibo.KEY_NAMES_BY_CODE, key)) Kibo.KEY_CODES_BY_NAME[Kibo.KEY_NAMES_BY_CODE[key]] = +key; })(); Kibo.MODIFIERS = ['shift', 'ctrl', 'alt']; Kibo.registerEvent = (function () { if (document.addEventListener) { return function (element, eventName, func) { element.addEventListener(eventName, func, false); }; } else if (document.attachEvent) { return function (element, eventName, func) { element.attachEvent('on' + eventName, func); }; } })(); Kibo.unregisterEvent = (function () { if (document.removeEventListener) { return function (element, eventName, func) { element.removeEventListener(eventName, func, false); }; } else if (document.detachEvent) { return function (element, eventName, func) { element.detachEvent('on' + eventName, func); }; } })(); Kibo.stringContains = function (string, substring) { return string.indexOf(substring) !== -1; }; Kibo.neatString = function (string) { return string.replace(/^\s+|\s+$/g, '').replace(/\s+/g, ' '); }; Kibo.capitalize = function (string) { return string.toLowerCase().replace(/^./, function (match) { return match.toUpperCase(); }); }; Kibo.isString = function (what) { return Kibo.stringContains(Object.prototype.toString.call(what), 'String'); }; Kibo.arrayIncludes = (function () { if (Array.prototype.indexOf) { return function (haystack, needle) { return haystack.indexOf(needle) !== -1; }; } else { return function (haystack, needle) { for (var i = 0; i < haystack.length; i++) if (haystack[i] === needle) return true; return false; }; } })(); Kibo.extractModifiers = function (keyCombination) { var modifiers, i; modifiers = []; for (i = 0; i < Kibo.MODIFIERS.length; i++) if (Kibo.stringContains(keyCombination, Kibo.MODIFIERS[i])) modifiers.push(Kibo.MODIFIERS[i]); return modifiers; }; Kibo.extractKey = function (keyCombination) { var keys, i; keys = Kibo.neatString(keyCombination).split(' '); for (i = 0; i < keys.length; i++) if (!Kibo.arrayIncludes(Kibo.MODIFIERS, keys[i])) return keys[i]; }; Kibo.modifiersAndKey = function (keyCombination) { var result, key; if (Kibo.stringContains(keyCombination, 'any')) { return Kibo.neatString(keyCombination).split(' ').slice(0, 2).join(' '); } result = Kibo.extractModifiers(keyCombination); key = Kibo.extractKey(keyCombination); if (key && !Kibo.arrayIncludes(Kibo.MODIFIERS, key)) result.push(key); return result.join(' '); }; Kibo.keyName = function (keyCode) { return Kibo.KEY_NAMES_BY_CODE[keyCode + '']; }; Kibo.keyCode = function (keyName) { return +Kibo.KEY_CODES_BY_NAME[keyName]; }; Kibo.prototype.initialize = function () { var i, that = this; this.lastKeyCode = -1; this.lastModifiers = {}; for (i = 0; i < Kibo.MODIFIERS.length; i++) this.lastModifiers[Kibo.MODIFIERS[i]] = false; this.keysDown = { any: [] }; this.keysUp = { any: [] }; this.downHandler = this.handler('down'); this.upHandler = this.handler('up'); Kibo.registerEvent(this.element, 'keydown', this.downHandler); Kibo.registerEvent(this.element, 'keyup', this.upHandler); Kibo.registerEvent(window, 'unload', function unloader() { Kibo.unregisterEvent(that.element, 'keydown', that.downHandler); Kibo.unregisterEvent(that.element, 'keyup', that.upHandler); Kibo.unregisterEvent(window, 'unload', unloader); }); }; Kibo.prototype.handler = function (upOrDown) { var that = this; return function (e) { var i, registeredKeys, lastModifiersAndKey; e = e || window.event; that.lastKeyCode = e.keyCode; for (i = 0; i < Kibo.MODIFIERS.length; i++) that.lastModifiers[Kibo.MODIFIERS[i]] = e[Kibo.MODIFIERS[i] + 'Key']; if (Kibo.arrayIncludes(Kibo.MODIFIERS, Kibo.keyName(that.lastKeyCode))) that.lastModifiers[Kibo.keyName(that.lastKeyCode)] = true; registeredKeys = that['keys' + Kibo.capitalize(upOrDown)]; for (i = 0; i < registeredKeys.any.length; i++) if (registeredKeys.any[i](e) === false && e.preventDefault) e.preventDefault(); lastModifiersAndKey = that.lastModifiersAndKey(); if (registeredKeys[lastModifiersAndKey]) for (i = 0; i < registeredKeys[lastModifiersAndKey].length; i++) if (registeredKeys[lastModifiersAndKey][i](e) === false && e.preventDefault) e.preventDefault(); }; }; Kibo.prototype.registerKeys = function (upOrDown, newKeys, func) { var i, keys, registeredKeys = this['keys' + Kibo.capitalize(upOrDown)]; if (Kibo.isString(newKeys)) newKeys = [newKeys]; for (i = 0; i < newKeys.length; i++) { keys = newKeys[i]; keys = Kibo.modifiersAndKey(keys + ''); if (registeredKeys[keys]) registeredKeys[keys].push(func);else registeredKeys[keys] = [func]; } return this; }; Kibo.prototype.unregisterKeys = function (upOrDown, newKeys, func) { var i, j, keys, registeredKeys = this['keys' + Kibo.capitalize(upOrDown)]; if (Kibo.isString(newKeys)) newKeys = [newKeys]; for (i = 0; i < newKeys.length; i++) { keys = newKeys[i]; keys = Kibo.modifiersAndKey(keys + ''); if (func === null) delete registeredKeys[keys];else { if (registeredKeys[keys]) { for (j = 0; j < registeredKeys[keys].length; j++) { if (String(registeredKeys[keys][j]) === String(func)) { registeredKeys[keys].splice(j, 1); break; } } } } } return this; }; Kibo.prototype.off = function (keys) { return this.unregisterKeys('down', keys, null); }; Kibo.prototype.delegate = function (upOrDown, keys, func) { return func !== null || func !== undefined ? this.registerKeys(upOrDown, keys, func) : this.unregisterKeys(upOrDown, keys, func); }; Kibo.prototype.down = function (keys, func) { return this.delegate('down', keys, func); }; Kibo.prototype.up = function (keys, func) { return this.delegate('up', keys, func); }; Kibo.prototype.lastKey = function (modifier) { if (!modifier) return Kibo.keyName(this.lastKeyCode); return this.lastModifiers[modifier]; }; Kibo.prototype.lastModifiersAndKey = function () { var result, i; result = []; for (i = 0; i < Kibo.MODIFIERS.length; i++) if (this.lastKey(Kibo.MODIFIERS[i])) result.push(Kibo.MODIFIERS[i]); if (!Kibo.arrayIncludes(result, this.lastKey())) result.push(this.lastKey()); return result.join(' '); }; exports['default'] = Kibo; module.exports = exports['default']; /***/ }, /* 9 */ /***/ function(module, exports, __webpack_require__) { /** * lodash 3.0.0 (Custom Build)