/*
* Ext JS Library
* Copyright(c) 2006-2020 Sencha Inc.
* licensing@sencha.com
* http://www.sencha.com/license
*/
/**
* From code originally written by David Davis
*
* For HTML5 video to work, your server must
* send the right content type, for more info see:
* <http://developer.mozilla.org/En/HTML/Element/Video>
* @class Ext.ux.desktop.Video
*/
Ext.define('Ext.ux.desktop.Video', {
extend: 'Ext.panel.Panel',
alias: 'widget.video',
layout: 'fit',
autoplay: false,
controls: true,
bodyStyle: 'background-color:#000;color:#fff',
html: '',
/* eslint-disable max-len, indent */
tpl: [
'<video id="{id}-video" autoPlay="{autoplay}" controls="{controls}" poster="{poster}" start="{start}" loopstart="{loopstart}" loopend="{loopend}" autobuffer="{autobuffer}" loop="{loop}" style="width:100%;height:100%">',
'<tpl for="src">',
'<source src="{src}" type="{type}"/>',
'</tpl>',
'{html}',
'</video>'
],
/* eslint-enable max-len, indent */
initComponent: function() {
var me = this,
fallback, cfg, chrome;
if (me.fallbackHTML) {
fallback = me.fallbackHTML;
}
else {
fallback = "Your browser does not support HTML5 Video. ";
if (Ext.isChrome) {
fallback += 'Upgrade Chrome.';
}
else if (Ext.isGecko) {
fallback += 'Upgrade to Firefox 3.5 or newer.';
}
else {
chrome = '<a href="http://www.google.com/chrome">Chrome</a>';
fallback += 'Please try <a href="http://www.mozilla.com">Firefox</a>';
if (Ext.isIE) {
fallback += ', ' + chrome +
' or <a href="http://www.apple.com/safari/">Safari</a>.';
}
else {
fallback += ' or ' + chrome + '.';
}
}
}
me.fallbackHTML = fallback;
cfg = me.data =
Ext.copyTo(
{
tag: 'video',
html: fallback
},
me,
'id,poster,start,loopstart,loopend,playcount,autobuffer,loop'
);
// just having the params exist enables them
if (me.autoplay) {
cfg.autoplay = 1;
}
if (me.controls) {
cfg.controls = 1;
}
// handle multiple sources
if (Ext.isArray(me.src)) {
cfg.src = me.src;
}
else {
cfg.src = [{ src: me.src }];
}
me.callParent();
},
afterRender: function() {
var me = this,
el;
me.callParent();
me.video = me.body.getById(me.id + '-video');
el = me.video.dom;
me.supported = (el && el.tagName.toLowerCase() === 'video');
if (me.supported) {
me.video.on('error', me.onVideoError, me);
}
},
getFallback: function() {
return '<h1 style="background-color:#ff4f4f;padding: 10px;">' + this.fallbackHTML + '</h1>';
},
onVideoError: function() {
var me = this;
me.video.remove();
me.supported = false;
me.body.createChild(me.getFallback());
},
doDestroy: function() {
var me = this,
video = me.video,
videoDom;
video = me.video;
if (me.supported && video) {
videoDom = video.dom;
if (videoDom && videoDom.pause) {
videoDom.pause();
}
video.remove();
me.video = null;
}
me.callParent();
}
});