: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
}, { progressBar: prog });
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
* @param elFinder.commands.quicklook
mime = 'application/pdf',
if ((fm.UA.Safari && fm.OS === 'mac' && !fm.UA.iOS) || fm.UA.IE || fm.UA.Firefox) {
jQuery.each(navigator.plugins, function(i, plugins) {
jQuery.each(plugins, function(i, plugin) {
if (plugin.type === mime) {
ql.flags.pdfNative = active;
if (typeof ql.options.pdfToolbar !== 'undefined' && !ql.options.pdfToolbar) {
preview.on(ql.evUpdate, function(e) {
if (active && file.mime === mime && ql.dispInlineRegex.test(file.mime)) {
e.stopImmediatePropagation();
opDfd = fm.openUrl(file.hash, false, function(url) {
ql.cover.addClass('elfinder-quicklook-coverbg');
jQuery('<object class="elfinder-quicklook-preview-pdf" data="'+url+urlhash+'" type="application/pdf" ></object>')
.on('error', function(e) {
ql.update(void(0), fm.cwd());
ql.update(void(0), file);
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
* @param elFinder.commands.quicklook
mime = 'application/x-shockwave-flash',
jQuery.each(navigator.plugins, function(i, plugins) {
jQuery.each(plugins, function(i, plugin) {
if (plugin.type === mime) {
active && preview.on(ql.evUpdate, function(e) {
if (file.mime === mime && ql.dispInlineRegex.test(file.mime)) {
e.stopImmediatePropagation();
opDfd = fm.openUrl(file.hash, false, function(url) {
node = jQuery('<embed class="elfinder-quicklook-preview-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" src="'+url+'" quality="high" type="application/x-shockwave-flash" wmode="transparent" />')
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
* HTML5 audio preview plugin
* @param elFinder.commands.quicklook
controlsList = typeof ql.options.mediaControlsList === 'string' && ql.options.mediaControlsList? ' controlsList="' + fm.escape(ql.options.mediaControlsList) + '"' : '',
navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? '50px' : '');
getNode = function(src, hash) {
return jQuery('<audio class="elfinder-quicklook-preview-audio ui-front" controls' + controlsList + ' preload="auto" autobuffer><source src="'+src+'" ></source></audio>')
.on('change', function(e) {
// Firefox fire change event on seek or volume change
.on('error', function(e) {
node && node.data('hash') === hash && reset();
amrToWavUrl = function(hash) {
var dfd = jQuery.Deferred(),
loader = jQuery.Deferred().done(function() {
opDfd = fm.getContents(hash, 'arraybuffer', { progressBar: prog }).done(function(data) {
var buffer = AMR.toWAV(new Uint8Array(data));
dfd.resolve(URL.createObjectURL(new Blob([buffer], { type: 'audio/x-wav' })));
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
if (window.TextEncoder && window.URL && URL.createObjectURL && typeof AMR === 'undefined') {
AMR = window.AMR? window.AMR : false;
// restore previous window.AMR
loader[AMR? 'resolve':'reject']();
loader[AMR? 'resolve':'reject']();
play = function(player) {
var hash = node.data('hash'),
autoplay && (playPromise = player.play());
// uses "playPromise['catch']" instead "playPromise.catch" to support Old IE
if (playPromise && playPromise['catch']) {
playPromise['catch'](function(e) {
node && node.data('hash') === hash && reset();
if (node && node.parent().length) {
url = node.children('source').attr('src');
win.off('viewchange.audio');
if (url.match(/^blob:/)) {
URL.revokeObjectURL(url);
preview.on(ql.evUpdate, function(e) {
if (mimes[file.mime] && ql.dispInlineRegex.test(file.mime) && ((html5 = ql.support.audio[type]) || (type === 'amr'))) {
autoplay = ql.autoPlay();
if (fm.options.cdns.amr && type === 'amr' && AMR !== false) {
e.stopImmediatePropagation();
loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
node = getNode('', curHash);
amrToWavUrl(file.hash).done(function(url) {
if (curHash === file.hash) {
node.children('source').attr('src', url);
win.on('viewchange.audio', setNavi);
URL.revokeObjectURL(url);
URL.revokeObjectURL(url);
e.stopImmediatePropagation();
loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>').appendTo(ql.info.find('.elfinder-quicklook-info'));
prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
opDfd = fm.openUrl(curHash, false, function(url) {
node = getNode(url, curHash);
win.on('viewchange.audio', setNavi);
}, { progressBar: prog });
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
* HTML5 video preview plugin
* @param elFinder.commands.quicklook
'video/quicktime' : 'mp4',
'application/ogg' : 'ogg',
'video/x-matroska': 'mkv',
'application/vnd.apple.mpegurl' : 'm3u8',
'application/x-mpegurl' : 'm3u8',
'application/dash+xml' : 'mpd',
'video/x-msvideo' : 'avi'
cHls, cDash, pDash, cFlv, cVideojs, autoplay, tm, loading, prog,
controlsList = typeof ql.options.mediaControlsList === 'string' && ql.options.mediaControlsList? ' controlsList="' + fm.escape(ql.options.mediaControlsList) + '"' : '',
if (win.hasClass('elfinder-quicklook-fullscreen')) {
preview.css('height', '-webkit-calc(100% - 50px)');
preview.css('height', '');
navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? '50px' : '');
render = function(file, opts) {
var errTm = function(e) {
tm = setTimeout(function() {
node = jQuery('<video class="elfinder-quicklook-preview-video" controls' + controlsList + ' preload="auto" autobuffer playsinline>'
.on('change', function(e) {
// Firefox fire change event on seek or volume change
.on('timeupdate progress', errTm)
.on('canplay', function() {
.data('hash', file.hash);
// can not handling error event with jQuery `on` event handler
node[0].addEventListener('error', function(e) {
if (opts.src && fm.convAbsUrl(opts.src) === fm.convAbsUrl(e.target.src)) {
node.append('<source src="'+opts.src+'" type="'+file.mime+'"></source><source src="'+opts.src+'"></source>');
win.on('viewchange.video', setNavi);
loadHls = function(file) {
opDfd = fm.openUrl(file.hash, false, function(url) {
hls.attachMedia(node[0]);
hls.on(cHls.Events.MANIFEST_PARSED, function() {
}, { progressBar: prog });
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
loadDash = function(file) {
opDfd = fm.openUrl(file.hash, false, function(url) {
pDash = window.dashjs.MediaPlayer().create();
debug = pDash.getDebug();
debug.setLogLevel(dashjs.Debug.LOG_LEVEL_FATAL);
} else if (debug.setLogToBrowserConsole) {
debug.setLogToBrowserConsole(false);
pDash.initialize(node[0], url, autoplay);
pDash.on('error', function(e) {
}, { progressBar: prog });
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
loadFlv = function(file) {
if (!cFlv.isSupported()) {
opDfd = fm.openUrl(file.hash, false, function(url) {
var player = cFlv.createPlayer({
player.on(cFlv.Events.ERROR, function() {
player.attachMediaElement(node[0]);
}, { progressBar: prog });
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
loadVideojs = function(file) {
opDfd = fm.openUrl(file.hash, false, function(url) {
}, { progressBar: prog });
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
play = function(player) {
var hash = node.data('hash'),
autoplay && (playPromise = player.play());
// uses "playPromise['catch']" instead "playPromise.catch" to support Old IE
if (playPromise && playPromise['catch']) {
playPromise['catch'](function(e) {
node && node.data('hash') === hash && reset(true);
reset = function(showInfo) {
if (node && node.parent().length) {
win.off('viewchange.video');