3 * http://www.mediaelementjs.com/
5 * Wrapper that mimics native HTML5 MediaElement (audio and video)
6 * using a variety of technologies (pure JavaScript, Flash, iframe)
8 * Copyright 2010-2017, John Dyer (http://j.hn/)
11 */(function e(t
,n
,r
){function s(o
,u
){if(!n
[o
]){if(!t
[o
]){var a
=typeof require
=="function"&&require
;if(!u
&&a
)return a(o
,!0);if(i
)return i(o
,!0);var f
=new Error("Cannot find module '"+o
+"'");throw f
.code
="MODULE_NOT_FOUND",f
}var l
=n
[o
]={exports
:{}};t
[o
][0].call(l
.exports
,function(e
){var n
=t
[o
][1][e
];return s(n
?n
:e
)},l
,l
.exports
,e
,t
,n
,r
)}return n
[o
].exports
}var i
=typeof require
=="function"&&require
;for(var o
=0;o
<r
.length
;o
++)s(r
[o
]);return s
})({1:[function(_dereq_
,module
,exports
){
18 load
: function load(settings
) {
20 if (typeof FB
!== 'undefined') {
21 FacebookApi
._createPlayer(settings
);
23 FacebookApi
.promise
= FacebookApi
.promise
|| mejs
.Utils
.loadScript('https://connect.facebook.net/' + settings
.options
.lang
+ '/sdk.js');
24 FacebookApi
.promise
.then(function () {
25 FB
.init(settings
.options
);
27 setTimeout(function () {
28 FacebookApi
._createPlayer(settings
);
34 _createPlayer
: function _createPlayer(settings
) {
35 window
['__ready__' + settings
.id
]();
38 var FacebookRenderer
= {
50 canPlayType
: function canPlayType(type
) {
51 return ~['video/facebook', 'video/x-facebook'].indexOf(type
.toLowerCase());
54 create
: function create(mediaElement
, options
, mediaFiles
) {
59 var hasStartedPlaying
= false,
65 autoplay
= mediaElement
.originalNode
.autoplay
;
68 fb
.id
= mediaElement
.id
+ '_' + options
.prefix
;
69 fb
.mediaElement
= mediaElement
;
71 if (mejs
.Features
.isiPhone
&& mediaElement
.originalNode
.getAttribute('poster')) {
72 poster
= mediaElement
.originalNode
.getAttribute('poster');
73 mediaElement
.originalNode
.removeAttribute('poster');
76 var props
= mejs
.html5media
.properties
,
77 assignGettersSetters
= function assignGettersSetters(propName
) {
79 var capName
= '' + propName
.substring(0, 1).toUpperCase() + propName
.substring(1);
81 fb
['get' + capName
] = function () {
83 if (fbPlayer
!== null) {
88 return fbPlayer
.getCurrentPosition();
90 return fbPlayer
.getDuration();
92 return fbPlayer
.getVolume();
98 return fbPlayer
.isMuted();
101 start
: function start() {
104 end
: function end() {
121 fb
['set' + capName
] = function (value
) {
123 if (fbPlayer
!== null) {
127 var url
= typeof value
=== 'string' ? value
: value
[0].src
;
130 fbContainer
.remove();
131 fbContainer
= document
.createElement('div');
132 fbContainer
.id
= fb
.id
;
133 fbContainer
.className
= 'fb-video';
134 fbContainer
.setAttribute('data-href', url
);
135 fbContainer
.setAttribute('data-allowfullscreen', 'true');
136 fbContainer
.setAttribute('data-controls', 'false');
138 mediaElement
.originalNode
.parentNode
.insertBefore(fbContainer
, mediaElement
.originalNode
);
139 mediaElement
.originalNode
.style
.display
= 'none';
142 lang
: fb
.options
.lang
,
153 fbPlayer
.seek(value
);
161 setTimeout(function () {
162 var event
= mejs
.Utils
.createEvent('volumechange', fb
);
163 mediaElement
.dispatchEvent(event
);
167 fbPlayer
.setVolume(value
);
168 setTimeout(function () {
169 var event
= mejs
.Utils
.createEvent('volumechange', fb
);
170 mediaElement
.dispatchEvent(event
);
174 var event
= mejs
.Utils
.createEvent('canplay', fb
);
175 mediaElement
.dispatchEvent(event
);
182 apiStack
.push({ type
: 'set', propName
: propName
, value
: value
});
187 for (var i
= 0, total
= props
.length
; i
< total
; i
++) {
188 assignGettersSetters(props
[i
]);
191 var methods
= mejs
.html5media
.methods
,
192 assignMethods
= function assignMethods(methodName
) {
193 fb
[methodName
] = function () {
194 if (fbPlayer
!== null) {
195 switch (methodName
) {
197 return fbPlayer
.play();
199 return fbPlayer
.pause();
204 apiStack
.push({ type
: 'call', methodName
: methodName
});
209 for (var _i
= 0, _total
= methods
.length
; _i
< _total
; _i
++) {
210 assignMethods(methods
[_i
]);
213 function assignEvents(events
) {
214 for (var _i2
= 0, _total2
= events
.length
; _i2
< _total2
; _i2
++) {
215 var event
= mejs
.Utils
.createEvent(events
[_i2
], fb
);
216 mediaElement
.dispatchEvent(event
);
220 window
['__ready__' + fb
.id
] = function () {
221 FB
.Event
.subscribe('xfbml.ready', function (msg
) {
222 if (msg
.type
=== 'video' && fb
.id
=== msg
.id
) {
223 mediaElement
.fbPlayer
= fbPlayer
= msg
.instance
;
225 var fbIframe
= document
.getElementById(fb
.id
),
226 width
= fbIframe
.offsetWidth
,
227 height
= fbIframe
.offsetHeight
,
228 events
= ['mouseover', 'mouseout'],
229 assignIframeEvents
= function assignIframeEvents(e
) {
230 var event
= mejs
.Utils
.createEvent(e
.type
, fb
);
231 mediaElement
.dispatchEvent(event
);
234 fb
.setSize(width
, height
);
235 if (!mediaElement
.originalNode
.muted
) {
243 for (var _i3
= 0, _total3
= events
.length
; _i3
< _total3
; _i3
++) {
244 fbIframe
.addEventListener(events
[_i3
], assignIframeEvents
);
247 fb
.eventHandler
= {};
249 var fbEvents
= ['startedPlaying', 'paused', 'finishedPlaying', 'startedBuffering', 'finishedBuffering'];
250 for (var _i4
= 0, _total4
= fbEvents
.length
; _i4
< _total4
; _i4
++) {
251 var event
= fbEvents
[_i4
],
252 handler
= fb
.eventHandler
[event
];
253 if (handler
!== undefined && handler
!== null && !mejs
.Utils
.isObjectEmpty(handler
) && typeof handler
.removeListener
=== 'function') {
254 handler
.removeListener(event
);
258 if (apiStack
.length
) {
259 for (var _i5
= 0, _total5
= apiStack
.length
; _i5
< _total5
; _i5
++) {
260 var stackItem
= apiStack
[_i5
];
262 if (stackItem
.type
=== 'set') {
263 var propName
= stackItem
.propName
,
264 capName
= '' + propName
.substring(0, 1).toUpperCase() + propName
.substring(1);
266 fb
['set' + capName
](stackItem
.value
);
267 } else if (stackItem
.type
=== 'call') {
268 fb
[stackItem
.methodName
]();
273 assignEvents(['rendererready', 'loadeddata', 'canplay', 'progress', 'loadedmetadata', 'timeupdate']);
277 fb
.eventHandler
.startedPlaying
= fbPlayer
.subscribe('startedPlaying', function () {
278 if (!hasStartedPlaying
) {
279 hasStartedPlaying
= true;
283 assignEvents(['play', 'playing', 'timeupdate']);
285 timer
= setInterval(function () {
286 fbPlayer
.getCurrentPosition();
287 assignEvents(['timeupdate']);
290 fb
.eventHandler
.paused
= fbPlayer
.subscribe('paused', function () {
293 assignEvents(['pause']);
295 fb
.eventHandler
.finishedPlaying
= fbPlayer
.subscribe('finishedPlaying', function () {
299 assignEvents(['ended']);
300 clearInterval(timer
);
303 fb
.eventHandler
.startedBuffering
= fbPlayer
.subscribe('startedBuffering', function () {
304 assignEvents(['progress', 'timeupdate']);
306 fb
.eventHandler
.finishedBuffering
= fbPlayer
.subscribe('finishedBuffering', function () {
307 assignEvents(['progress', 'timeupdate']);
313 src
= mediaFiles
[0].src
;
314 var fbContainer
= document
.createElement('div');
315 fbContainer
.id
= fb
.id
;
316 fbContainer
.className
= 'fb-video';
317 fbContainer
.setAttribute('data-href', src
);
318 fbContainer
.setAttribute('data-allowfullscreen', true);
319 fbContainer
.setAttribute('data-controls', !!mediaElement
.originalNode
.controls
);
320 mediaElement
.originalNode
.parentNode
.insertBefore(fbContainer
, mediaElement
.originalNode
);
321 mediaElement
.originalNode
.style
.display
= 'none';
324 options
: fb
.options
.facebook
,
328 fb
.hide = function () {
331 fbContainer
.style
.display
= 'none';
334 fb
.setSize = function (width
) {
335 if (fbPlayer
!== null && !isNaN(width
)) {
336 fbContainer
.style
.width
= width
;
339 fb
.show = function () {
341 fbContainer
.style
.display
= '';
345 fb
.destroy = function () {
347 mediaElement
.originalNode
.setAttribute('poster', poster
);
355 mejs
.Utils
.typeChecks
.push(function (url
) {
356 return ~url
.toLowerCase().indexOf('//www.facebook') ? 'video/x-facebook' : null;
359 mejs
.Renderers
.add(FacebookRenderer
);