: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
showInfo && ql.info.show();
preview.on(ql.evUpdate, function(e) {
mime = file.mime.toLowerCase(),
stock, playPromise, opDfd;
if (mimes[mime] && ql.dispInlineRegex.test(file.mime) /*&& (((type === 'm3u8' || (type === 'mpd' && !fm.UA.iOS) || type === 'flv') && !fm.UA.ltIE10) || ql.support.video[type])*/) {
autoplay = ql.autoPlay();
loading = jQuery('<div class="elfinder-quicklook-info-data"><span class="elfinder-spinner-text">'+fm.i18n('nowLoading')+'</span><span class="elfinder-spinner"></span></div>');
prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(loading);
if (ql.support.video[type] && (type !== 'm3u8' || fm.UA.Safari)) {
e.stopImmediatePropagation();
loading.appendTo(ql.info.find('.elfinder-quicklook-info'));
opDfd = fm.openUrl(file.hash, false, function(url) {
render(file, { src: url });
}, { progressBar: prog });
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
if (cHls !== false && fm.options.cdns.hls && type === 'm3u8') {
e.stopImmediatePropagation();
loading.appendTo(ql.info.find('.elfinder-quicklook-info'));
cHls = res || window.Hls || false;
} else if (cDash !== false && fm.options.cdns.dash && type === 'mpd') {
e.stopImmediatePropagation();
loading.appendTo(ql.info.find('.elfinder-quicklook-info'));
[ fm.options.cdns.dash ],
// dashjs require window.dashjs in global scope
cDash = window.dashjs? true : false;
} else if (cFlv !== false && fm.options.cdns.flv && type === 'flv') {
e.stopImmediatePropagation();
loading.appendTo(ql.info.find('.elfinder-quicklook-info'));
cFlv = res || window.flvjs || false;
} else if (fm.options.cdns.videojs) {
e.stopImmediatePropagation();
loading.appendTo(ql.info.find('.elfinder-quicklook-info'));
[ fm.options.cdns.videojs + '/video.min.js' ],
cVideojs = res || window.videojs || false;
cVideojs && loadVideojs(file);
).loadCss([fm.options.cdns.videojs + '/video-js.min.css']);
* Audio/video preview plugin using browser plugins
* @param elFinder.commands.quicklook
var preview = ql.preview,
jQuery.each(navigator.plugins, function(i, plugins) {
jQuery.each(plugins, function(i, plugin) {
(plugin.type.indexOf('audio/') === 0 || plugin.type.indexOf('video/') === 0) && mimes.push(plugin.type);
mimes = ql.fm.arrayFlip(mimes);
preview.on(ql.evUpdate, function(e) {
video, opDfd, loading, prog,
navi.css('bottom', win.hasClass('elfinder-quicklook-fullscreen')? '50px' : '');
if (mimes[file.mime] && ql.dispInlineRegex.test(file.mime)) {
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 = ql.fm.openUrl(file.hash, false, function(url) {
(video = mime.indexOf('video/') === 0) && ql.hideinfo();
node = jQuery('<embed src="'+url+'" type="'+mime+'" class="elfinder-quicklook-preview-'+(video ? 'video' : 'audio')+'"/>')
win.on('viewchange.embed', setNavi);
}, { progressBar: prog });
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
}).one('change', function() {
if (node && node.parent().length) {
win.off('viewchange.embed');
* Archive(zip|gzip|tar|bz2) preview plugin using https://github.com/imaya/zlib.js
* @param elFinder.commands.quicklook
mimes = fm.arrayFlip(['application/zip', 'application/x-gzip', 'application/x-tar', 'application/x-bzip2']),
sizeMax = fm.returnBytes(ql.options.unzipMaxSize || 0),
Zlib = (fm.options.cdns.zlibUnzip && fm.options.cdns.zlibGunzip)? true : false,
bzip2 = fm.options.cdns.bzip2? true : false;
if (window.Worker && window.Uint8Array && window.DataView) {
preview.on(ql.evUpdate, function(e) {
isTar = (file.mime === 'application/x-tar'),
isBzip2 = (file.mime === 'application/x-bzip2'),
isZlib = (file.mime === 'application/zip' || file.mime === 'application/x-gzip');
if (mimes[file.mime] && (!sizeMax || file.size <= sizeMax) && (
var jqxhr, wk, loading, prog, url,
jqxhr = fm.getContents(file.hash, 'arraybuffer', { progressBar: prog })
wk.onmessage = function(res) {
if (!res.data || res.data.error) {
new Error(res.data && res.data.error? res.data.error : '');
makeList(res.data.files);
if (file.mime === 'application/x-tar') {
scripts: [fm.getWorkerUrl('quicklook.unzip.js')],
data: { type: 'tar', bin: data }
} else if (file.mime === 'application/zip') {
scripts: [fm.options.cdns.zlibUnzip, fm.getWorkerUrl('quicklook.unzip.js')],
data: { type: 'zip', bin: data }
} else if (file.mime === 'application/x-gzip') {
scripts: [fm.options.cdns.zlibGunzip, fm.getWorkerUrl('quicklook.unzip.js')],
data: { type: 'gzip', bin: data }
} else if (file.mime === 'application/x-bzip2') {
scripts: [fm.options.cdns.bzip2, fm.getWorkerUrl('quicklook.unzip.js')],
data: { type: 'bzip2', bin: data }
makeList = function(filenames) {
var header, list, doc, tsize = 0;
if (filenames && filenames.length) {
filenames = jQuery.map(filenames, function(str) {
return fm.decodeRawString(str);
list = fm.escape(filenames.join("\n").replace(/\{formatSize\((\d+)\)\}/g, function(m, s) {
header = '<strong>'+fm.escape(file.mime)+'</strong> ('+fm.formatSize(file.size)+' / '+fm.formatSize(tsize)+')'+'<hr/>';
doc = jQuery('<div class="elfinder-quicklook-preview-archive-wrapper">'+header+'<pre class="elfinder-quicklook-preview-text">'+list+'</pre></div>')
.on('touchstart', function(e) {
if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
e.originalEvent._preventSwipeX = true;
// this is our file - stop event propagation
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);
// stop loading on change file if not loaded yet
preview.one('change', function() {
jqxhr.state() === 'pending' && jqxhr.reject();
* RAR Archive preview plugin using https://github.com/43081j/rar.js
* @param elFinder.commands.quicklook
mimes = fm.arrayFlip(['application/x-rar']),
preview.on(ql.evUpdate, function(e) {
if (mimes[file.mime] && fm.options.cdns.rar && RAR !== false) {
var loading, prog, url, archive, abort,
getList = function(url) {
xhrHeaders: fm.customHeaders,
// An error occurred (not a rar, read error, etc)
err && fm.debug('error', err);
jQuery.each(archive.entries, function() {
filenames.push(this.path + (this.size? ' (' + fm.formatSize(this.size) + ')' : ''));
filenames = jQuery.map(filenames, function(str) {
return fm.decodeRawString(str);
header = '<strong>'+fm.escape(file.mime)+'</strong> ('+fm.formatSize(file.size)+')'+'<hr/>';
doc = jQuery('<div class="elfinder-quicklook-preview-archive-wrapper">'+header+'<pre class="elfinder-quicklook-preview-text">'+fm.escape(filenames.join("\n"))+'</pre></div>')
.on('touchstart', function(e) {
if (jQuery(this)['scroll' + (fm.direction === 'ltr'? 'Right' : 'Left')]() > 5) {
e.originalEvent._preventSwipeX = true;
// this is our file - stop event propagation
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);
// stop loading on change file if not loaded yet
preview.one('change', function() {
archive && (archive.abort = true);
opDfd = fm.openUrl(file.hash, 'sameorigin', function(url) {
_RAR = window.RarArchive;
delete window.RarArchive;
require(['rar'], function(RarArchive) {
if (RAR = window.RarArchive) {
window.RarArchive = _RAR;
delete window.RarArchive;
}, { progressBar: prog, temporary: true });
// stop loading on change file if not loaded yet
preview.one('change', function() {
opDfd && opDfd.state && opDfd.state() === 'pending' && opDfd.reject();
* CAD-Files and 3D-Models online viewer on sharecad.org
* @param elFinder.commands.quicklook
mimes = fm.arrayFlip(ql.options.sharecadMimes || []),
if (ql.options.sharecadMimes.length) {
title: 'ShareCAD.org CAD and 3D-Models viewer',
link: 'https://sharecad.org/DWGOnlinePlugin'
preview.on(ql.evUpdate, function(e) {
if (mimes[file.mime.toLowerCase()] && fm.option('onetimeUrl', file.hash)) {
e.stopImmediatePropagation();
jQuery('<div class="elfinder-quicklook-info-data"><button class="elfinder-info-button">'+fm.i18n('getLink')+'</button></div>').appendTo(ql.info.find('.elfinder-quicklook-info'))
.on('click', function() {
self.html('<span class="elfinder-spinner">');
data : {cmd : 'url', target : file.hash},
var rfile = fm.file(file.hash);
file.url = rfile.url = data.url || '';
if (file.url !== '' && file.url != '1') {
preview.one('change', function() {
node.off('load').remove();
}).addClass('elfinder-overflow-auto');
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);