8525620dbb1ea11293b1e4fb55d91df32f86d7d7
[lhc/web/www.git] / www / plugins-dist / medias / lib / mejs / renderers / facebook.js
1 /*!
2 * MediaElement.js
3 * http://www.mediaelementjs.com/
4 *
5 * Wrapper that mimics native HTML5 MediaElement (audio and video)
6 * using a variety of technologies (pure JavaScript, Flash, iframe)
7 *
8 * Copyright 2010-2017, John Dyer (http://j.hn/)
9 * License: MIT
10 *
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){
12 'use strict';
13
14 var FacebookApi = {
15
16 promise: null,
17
18 load: function load(settings) {
19
20 if (typeof FB !== 'undefined') {
21 FacebookApi._createPlayer(settings);
22 } else {
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);
26
27 setTimeout(function () {
28 FacebookApi._createPlayer(settings);
29 }, 50);
30 });
31 }
32 },
33
34 _createPlayer: function _createPlayer(settings) {
35 window['__ready__' + settings.id]();
36 }
37 };
38 var FacebookRenderer = {
39 name: 'facebook',
40 options: {
41 prefix: 'facebook',
42 facebook: {
43 appId: '',
44 xfbml: true,
45 version: 'v2.10',
46 lang: 'en_US'
47 }
48 },
49
50 canPlayType: function canPlayType(type) {
51 return ~['video/facebook', 'video/x-facebook'].indexOf(type.toLowerCase());
52 },
53
54 create: function create(mediaElement, options, mediaFiles) {
55 var apiStack = [],
56 fb = {},
57 readyState = 4;
58
59 var hasStartedPlaying = false,
60 paused = true,
61 ended = false,
62 fbPlayer = null,
63 src = '',
64 poster = '',
65 autoplay = mediaElement.originalNode.autoplay;
66
67 fb.options = options;
68 fb.id = mediaElement.id + '_' + options.prefix;
69 fb.mediaElement = mediaElement;
70
71 if (mejs.Features.isiPhone && mediaElement.originalNode.getAttribute('poster')) {
72 poster = mediaElement.originalNode.getAttribute('poster');
73 mediaElement.originalNode.removeAttribute('poster');
74 }
75
76 var props = mejs.html5media.properties,
77 assignGettersSetters = function assignGettersSetters(propName) {
78
79 var capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
80
81 fb['get' + capName] = function () {
82
83 if (fbPlayer !== null) {
84 var value = null;
85
86 switch (propName) {
87 case 'currentTime':
88 return fbPlayer.getCurrentPosition();
89 case 'duration':
90 return fbPlayer.getDuration();
91 case 'volume':
92 return fbPlayer.getVolume();
93 case 'paused':
94 return paused;
95 case 'ended':
96 return ended;
97 case 'muted':
98 return fbPlayer.isMuted();
99 case 'buffered':
100 return {
101 start: function start() {
102 return 0;
103 },
104 end: function end() {
105 return 0;
106 },
107 length: 1
108 };
109 case 'src':
110 return src;
111 case 'readyState':
112 return readyState;
113 }
114
115 return value;
116 } else {
117 return null;
118 }
119 };
120
121 fb['set' + capName] = function (value) {
122
123 if (fbPlayer !== null) {
124
125 switch (propName) {
126 case 'src':
127 var url = typeof value === 'string' ? value : value[0].src;
128 src = url;
129
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');
137
138 mediaElement.originalNode.parentNode.insertBefore(fbContainer, mediaElement.originalNode);
139 mediaElement.originalNode.style.display = 'none';
140
141 FacebookApi.load({
142 lang: fb.options.lang,
143 id: fb.id
144 });
145
146 FB.XFBML.parse();
147
148 if (autoplay) {
149 fbPlayer.play();
150 }
151 break;
152 case 'currentTime':
153 fbPlayer.seek(value);
154 break;
155 case 'muted':
156 if (value) {
157 fbPlayer.mute();
158 } else {
159 fbPlayer.unmute();
160 }
161 setTimeout(function () {
162 var event = mejs.Utils.createEvent('volumechange', fb);
163 mediaElement.dispatchEvent(event);
164 }, 50);
165 break;
166 case 'volume':
167 fbPlayer.setVolume(value);
168 setTimeout(function () {
169 var event = mejs.Utils.createEvent('volumechange', fb);
170 mediaElement.dispatchEvent(event);
171 }, 50);
172 break;
173 case 'readyState':
174 var event = mejs.Utils.createEvent('canplay', fb);
175 mediaElement.dispatchEvent(event);
176 break;
177 default:
178
179 break;
180 }
181 } else {
182 apiStack.push({ type: 'set', propName: propName, value: value });
183 }
184 };
185 };
186
187 for (var i = 0, total = props.length; i < total; i++) {
188 assignGettersSetters(props[i]);
189 }
190
191 var methods = mejs.html5media.methods,
192 assignMethods = function assignMethods(methodName) {
193 fb[methodName] = function () {
194 if (fbPlayer !== null) {
195 switch (methodName) {
196 case 'play':
197 return fbPlayer.play();
198 case 'pause':
199 return fbPlayer.pause();
200 case 'load':
201 return null;
202 }
203 } else {
204 apiStack.push({ type: 'call', methodName: methodName });
205 }
206 };
207 };
208
209 for (var _i = 0, _total = methods.length; _i < _total; _i++) {
210 assignMethods(methods[_i]);
211 }
212
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);
217 }
218 }
219
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;
224
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);
232 };
233
234 fb.setSize(width, height);
235 if (!mediaElement.originalNode.muted) {
236 fbPlayer.unmute();
237 }
238
239 if (autoplay) {
240 fbPlayer.play();
241 }
242
243 for (var _i3 = 0, _total3 = events.length; _i3 < _total3; _i3++) {
244 fbIframe.addEventListener(events[_i3], assignIframeEvents);
245 }
246
247 fb.eventHandler = {};
248
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);
255 }
256 }
257
258 if (apiStack.length) {
259 for (var _i5 = 0, _total5 = apiStack.length; _i5 < _total5; _i5++) {
260 var stackItem = apiStack[_i5];
261
262 if (stackItem.type === 'set') {
263 var propName = stackItem.propName,
264 capName = '' + propName.substring(0, 1).toUpperCase() + propName.substring(1);
265
266 fb['set' + capName](stackItem.value);
267 } else if (stackItem.type === 'call') {
268 fb[stackItem.methodName]();
269 }
270 }
271 }
272
273 assignEvents(['rendererready', 'loadeddata', 'canplay', 'progress', 'loadedmetadata', 'timeupdate']);
274
275 var timer = void 0;
276
277 fb.eventHandler.startedPlaying = fbPlayer.subscribe('startedPlaying', function () {
278 if (!hasStartedPlaying) {
279 hasStartedPlaying = true;
280 }
281 paused = false;
282 ended = false;
283 assignEvents(['play', 'playing', 'timeupdate']);
284
285 timer = setInterval(function () {
286 fbPlayer.getCurrentPosition();
287 assignEvents(['timeupdate']);
288 }, 250);
289 });
290 fb.eventHandler.paused = fbPlayer.subscribe('paused', function () {
291 paused = true;
292 ended = false;
293 assignEvents(['pause']);
294 });
295 fb.eventHandler.finishedPlaying = fbPlayer.subscribe('finishedPlaying', function () {
296 paused = true;
297 ended = true;
298
299 assignEvents(['ended']);
300 clearInterval(timer);
301 timer = null;
302 });
303 fb.eventHandler.startedBuffering = fbPlayer.subscribe('startedBuffering', function () {
304 assignEvents(['progress', 'timeupdate']);
305 });
306 fb.eventHandler.finishedBuffering = fbPlayer.subscribe('finishedBuffering', function () {
307 assignEvents(['progress', 'timeupdate']);
308 });
309 }
310 });
311 };
312
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';
322
323 FacebookApi.load({
324 options: fb.options.facebook,
325 id: fb.id
326 });
327
328 fb.hide = function () {
329 fb.pause();
330 if (fbPlayer) {
331 fbContainer.style.display = 'none';
332 }
333 };
334 fb.setSize = function (width) {
335 if (fbPlayer !== null && !isNaN(width)) {
336 fbContainer.style.width = width;
337 }
338 };
339 fb.show = function () {
340 if (fbPlayer) {
341 fbContainer.style.display = '';
342 }
343 };
344
345 fb.destroy = function () {
346 if (poster) {
347 mediaElement.originalNode.setAttribute('poster', poster);
348 }
349 };
350
351 return fb;
352 }
353 };
354
355 mejs.Utils.typeChecks.push(function (url) {
356 return ~url.toLowerCase().indexOf('//www.facebook') ? 'video/x-facebook' : null;
357 });
358
359 mejs.Renderers.add(FacebookRenderer);
360
361 },{}]},{},[1]);