: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
save : function(textarea, instance) {
instance && instance.save();
focus : function(textarea, instance) {
instance && instance.focus();
resize : function(textarea, instance, e, data) {
// fit height to base node on dialog resize
instance && textarea._setHeight();
iconImg : 'img/editor-icons.png 0 -32',
title: 'Zoho Office API',
link: 'https://www.zoho.com/officeapi/'
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.oasis.opendocument.text',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.oasis.opendocument.spreadsheet',
'application/vnd.sun.xml.calc',
'text/tab-separated-values',
'application/vnd.ms-powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
'application/vnd.oasis.opendocument.presentation',
'application/vnd.sun.xml.impress'
html : '<iframe style="width:100%;max-height:100%;border:none;"></iframe>',
// setup on elFinder bootup
setup : function(opts, fm) {
if (fm.UA.Mobile || fm.UA.ltIE8) {
// Prepare on before show dialog
prepare : function(base, dialogOpts, file) {
var elfNode = base.editor.fm.getUI();
jQuery(base).height(elfNode.height());
dialogOpts.width = Math.max(dialogOpts.width || 0, elfNode.width() * 0.8);
// Initialization of editing node (this: this editors HTML node)
init : function(id, file, dum, fm) {
ifm = jQuery(this).hide(),
uiToast = fm.getUI('toast'),
spnr = jQuery('<div class="elfinder-edit-spinner elfinder-edit-zohoeditor"></div>')
.html('<span class="elfinder-spinner-text">' + fm.i18n('nowLoading') + '</span><span class="elfinder-spinner"></span>')
jQuery.each(fm.customData, function(key, val) {
data += '&' + encodeURIComponent(key) + '=' + encodeURIComponent(val);
jQuery(ta).data('xhr', fm.request({
name: ta.editor.confObj.info.cmdCheck,
'args[target]': file.hash,
// trigger event 'editEditorPrepare'
ta.editor.trigger('Prepare', {
ifm.attr('src', data.zohourl).show().css(opts.css);
uiToast.appendTo(ta.closest('.ui-dialog'));
msg: fm.i18n(data.warning),
uiToast.children().length === 1 && uiToast.appendTo(fm.getUI());
data.error && fm.error(data.error);
ta.elfinderdialog('destroy');
}).fail(function(error) {
error && fm.error(error);
ta.elfinderdialog('destroy');
getContent : function() {},
beforeclose : iframeClose,
xhr = jQuery(ta).data('xhr');
if (xhr.state() === 'pending') {
// Zip Archive with FlySystem
iconImg : 'img/toolbar.png 0 -416',
edit : function(file, editor) {
dfrd = jQuery.Deferred();
notify : {type : 'netmount', cnt : 1, hideCnt : true}
if (data.added && data.added.length) {
if (data.added[0].phash) {
if (pdir = fm.file(data.added[0].phash)) {
fm.change({ changed: [ pdir ] });
fm.one('netmountdone', function() {
fm.exec('open', data.added[0].hash);
fm.one('opendone', function() {
data.toast && fm.toast(data.toast);
mimes : ['application/zip'],
// Simple Text (basic textarea editor)
load : function(textarea) {
// trigger event 'editEditorPrepare'
this.trigger('Prepare', {
textarea.setSelectionRange && textarea.setSelectionRange(0, 0);
jQuery(textarea).trigger('focus').show();
// File converter with online-convert.com
iconImg : 'img/editor-icons.png 0 -144',
cmdCheck : 'OnlineConvert',
title: 'ONLINE-CONVERT.COM',
link: 'https://online-convert.com'
html : '<div style="width:100%;max-height:100%;"></div>',
// setup on elFinder bootup
setup : function(opts, fm) {
var mOpts = opts.extraOptions.onlineConvert || {maxSize:100,showLink:true};
this.info.maxSize = mOpts.maxSize * 1048576;
this.set = Object.assign({
url : 'https://%s.online-convert.com%s?external_url=',
Archive: {'7Z':{}, 'BZ2':{ext:'bz'}, 'GZ':{}, 'ZIP':{}},
Audio: {'MP3':{}, 'OGG':{ext:'oga'}, 'WAV':{}, 'WMA':{}, 'AAC':{}, 'AIFF':{ext:'aif'}, 'FLAC':{}, 'M4A':{}, 'MMF':{}, 'OPUS':{ext:'oga'}},
Document: {'DOC':{}, 'DOCX':{}, 'HTML':{}, 'ODT':{}, 'PDF':{}, 'PPT':{}, 'PPTX':{}, 'RTF':{}, 'SWF':{}, 'TXT':{}},
eBook: {'AZW3':{ext:'azw'}, 'ePub':{}, 'FB2':{ext:'xml'}, 'LIT':{}, 'LRF':{}, 'MOBI':{}, 'PDB':{}, 'PDF':{},'PDF-eBook':{ext:'pdf'}, 'TCR':{}},
Hash: {'Adler32':{}, 'Apache-htpasswd':{}, 'Blowfish':{}, 'CRC32':{}, 'CRC32B':{}, 'Gost':{}, 'Haval128':{},'MD4':{}, 'MD5':{}, 'RIPEMD128':{}, 'RIPEMD160':{}, 'SHA1':{}, 'SHA256':{}, 'SHA384':{}, 'SHA512':{}, 'Snefru':{}, 'Std-DES':{}, 'Tiger128':{}, 'Tiger128-calculator':{}, 'Tiger128-converter':{}, 'Tiger160':{}, 'Tiger192':{}, 'Whirlpool':{}},
Image: {'BMP':{}, 'EPS':{ext:'ai'}, 'GIF':{}, 'EXR':{}, 'ICO':{}, 'JPG':{}, 'PNG':{}, 'SVG':{}, 'TGA':{}, 'TIFF':{ext:'tif'}, 'WBMP':{}, 'WebP':{}},
Video: {'3G2':{}, '3GP':{}, 'AVI':{}, 'FLV':{}, 'HLS':{ext:'m3u8'}, 'MKV':{}, 'MOV':{}, 'MP4':{}, 'MPEG-1':{ext:'mpeg'}, 'MPEG-2':{ext:'mpeg'}, 'OGG':{ext:'ogv'}, 'OGV':{}, 'WebM':{}, 'WMV':{}, 'Android':{link:'/convert-video-for-%s',ext:'mp4'}, 'Blackberry':{link:'/convert-video-for-%s',ext:'mp4'}, 'DPG':{link:'/convert-video-for-%s',ext:'avi'}, 'iPad':{link:'/convert-video-for-%s',ext:'mp4'}, 'iPhone':{link:'/convert-video-for-%s',ext:'mp4'}, 'iPod':{link:'/convert-video-for-%s',ext:'mp4'}, 'Nintendo-3DS':{link:'/convert-video-for-%s',ext:'avi'}, 'Nintendo-DS':{link:'/convert-video-for-%s',ext:'avi'}, 'PS3':{link:'/convert-video-for-%s',ext:'mp4'}, 'Wii':{link:'/convert-video-for-%s',ext:'avi'}, 'Xbox':{link:'/convert-video-for-%s',ext:'wmv'}}
link : '<div class="elfinder-edit-onlineconvert-link"><a href="https://www.online-convert.com" target="_blank"><span class="elfinder-button-icon"></span>ONLINE-CONVERT.COM</a></div>',
useTabs : (jQuery.fn.tabs && !fm.UA.iOS)? true : false // Can't work on iOS, I don't know why.
// Prepare on before show dialog
prepare : function(base, dialogOpts, file) {
var elfNode = base.editor.fm.getUI();
jQuery(base).height(elfNode.height());
dialogOpts.width = Math.max(dialogOpts.width || 0, elfNode.width() * 0.8);
// Initialization of editing node (this: this editors HTML node)
init : function(id, file, dum, fm) {
confObj = ta.editor.confObj,
uiToast = fm.getUI('toast'),
allowZip = fm.uploadMimeCheck('application/zip', file.phash),
selfUrl = jQuery('base').length? document.location.href.replace(/#.*$/, '') : '',
getExt = function(cat, con) {
if (set.conv[cat] && (c = set.conv[cat][con])) {
return (c.ext || con).toLowerCase();
return con.toLowerCase();
setOptions = function(cat, done) {
if (typeof confObj.api === 'undefined') {
dfdInit = jQuery.Deferred().resolve({api: confObj.api});
dfdInit.done(function(data) {
type = '?category=' + cat;
if (!confObj.conversions) {
confObj.conversions = {};
if (!confObj.conversions[cat]) {
dfd = jQuery.getJSON('https://api2.online-convert.com/conversions' + type);
dfd = jQuery.Deferred().resolve(confObj.conversions[cat]);
confObj.conversions[cat] = d;
jQuery.each(d, function(i, o) {
btns[set.useTabs? 'children' : 'find']('.onlineconvert-category-' + o.category).children('.onlineconvert-' + o.target).trigger('makeoption', o);
var btns = jQuery('<div></div>').on('click', 'button', function() {
opts = b.data('opts') || null,
cat = b.closest('.onlineconvert-category').data('cname'),
if (confObj.api === true) {
}).on('change', function(e) {
var t = jQuery(e.target),
b = t.closest('.elfinder-edit-onlineconvert-button').children('button:first'),
o = b.data('opts') || {},
v = p.data('type') === 'boolean'? t.is(':checked') : t.val();
if (p.data('type') === 'integer') {
var reg = new RegExp(p.data('pattern'));
requestAnimationFrame(function() {
fm.error('"' + fm.escape(v) + '" is not match to "/' + fm.escape(p.data('pattern')) + '/"');
o[t.parent().data('optkey')] = v;
delete o[p.data('optkey')];
ul = jQuery('<ul></ul>'),
var f = jQuery('<p></p>').data('optkey', n).data('type', o.type),
f.attr('title', fm.i18n(o.description));
f.data('pattern', o.pattern);
f.append(jQuery('<span></span>').text(fm.i18n(n) + ' : '));
if (o.type === 'boolean') {
if (o['default'] || (nozip = (n === 'allow_multiple_outputs' && !allowZip))) {
btn = this.children('button:first');
opts = btn.data('opts') || {};
f.append(jQuery('<input type="checkbox" value="true"'+checked+disabled+'/>'));
elm = jQuery('<select></select>').append(jQuery('<option value=""></option>').text('Select...'));
jQuery.each(o['enum'], function(i, v) {
elm.append(jQuery('<option value="'+v+'"></option>').text(v));
f.append(jQuery('<input type="text" value=""/>'));
makeOption = function(o) {
b = jQuery('<span class="elfinder-button-icon elfinder-button-icon-preference"></span>').on('click', function() {
f = jQuery('<div class="elfinder-edit-onlinconvert-options"></div>').hide();
jQuery.each(o.options, function(k, v) {
k !== 'download_password' && f.append(oform.call(elm, k, v));
confObj.ext2mime = Object.assign(fm.arrayFlip(fm.mimeTypes), ext2mime);
jQuery.each(set.conv, function(t, c) {
var cname = t.toLowerCase(),
id = 'elfinder-edit-onlineconvert-' + cname + ts,
type = jQuery('<div id="' + id + '" class="onlineconvert-category onlineconvert-category-'+cname+'"></div>').data('cname', t),
jQuery.each(c, function(n, o) {
var nl = n.toLowerCase(),
if (!confObj.ext2mime[ext]) {
if (cname === 'audio' || cname === 'image' || cname === 'video') {
confObj.ext2mime[ext] = cname + '/x-' + nl;
confObj.ext2mime[ext] = 'application/octet-stream';
if (fm.uploadMimeCheck(confObj.ext2mime[ext], file.phash)) {
type.append(jQuery('<div class="elfinder-edit-onlineconvert-button onlineconvert-'+nl+'"></div>').on('makeoption', function(e, data) {
if (!elm.children('.elfinder-button-icon-preference').length) {
makeOption.call(elm, data);
}).append(jQuery('<button></button>').text(n).data('conv', n)));
if (type.children().length) {
ul.append(jQuery('<li></li>').append(jQuery('<a></a>').attr('href', selfUrl + '#' + id).text(t)));
beforeActivate: function(e, ui) {
setOptions(ui.newPanel.data('cname'));
jQuery.each(set.conv, function(t) {
var tl = t.toLowerCase();
btns.append(jQuery('<fieldset class="onlineconvert-fieldset-' + tl + '"></fieldset>').append(jQuery('<legend></legend>').text(t)).append(btns.children('.onlineconvert-category-' + tl)));
(set.showLink? jQuery(set.link) : null)
spnr = jQuery('<div class="elfinder-edit-spinner elfinder-edit-onlineconvert"></div>')
.html('<span class="elfinder-spinner-text">' + fm.i18n('nowLoading') + '</span><span class="elfinder-spinner"></span>')
.appendTo(select.parent()),
prog = jQuery('<div class="elfinder-quicklook-info-progress"></div>').appendTo(spnr),
return jQuery.Deferred().resolve(_url);
return fm.forExternalUrl(file.hash, { progressBar: prog }).done(function(url) {
}).fail(function(error) {
error && fm.error(error);
ta.elfinderdialog('destroy');
jQuery(ta).data('dfrd', url().done(function(url) {
setStatus({info: 'Start conversion request.'});
'args[category]' : opts.category.toLowerCase(),
'args[convert]' : opts.convert.toLowerCase(),
'args[options]' : JSON.stringify(opts.options),