').append(constr, reset)),
(quality? $(row).append($(label).text(fm.i18n('quality')), quality, $('
')) : $()),
(isJpeg? $(row).append($(label).text(fm.i18n('8pxgrid')).addClass('elfinder-resize-grid8'), grid8px) : $()),
$(row).append($(label).text(fm.i18n('scale')), uiprop),
$(row).append(preset)
);
if (api2) {
uicrop.append(
$(row).append($(label).text('X'), pointX),
$(row).append($(label).text('Y')).append(pointY),
$(row).append($(label).text(fm.i18n('width')), offsetX),
$(row).append($(label).text(fm.i18n('height')), offsetY, $('
').append(constrc, reset.clone(true))),
(quality? $(row).append($(label).text(fm.i18n('quality')), quality.clone(true), $('
')) : $()),
(isJpeg? $(row).append($(label).text(fm.i18n('8pxgrid')).addClass('elfinder-resize-grid8')) : $()),
$(row).append(presetc)
);
uirotate.append(
$(row).addClass('elfinder-resize-degree').append(
$(label).text(fm.i18n('rotate')),
degree,
$('
').text(fm.i18n('degree')),
$('
').append(uideg270, uideg90)[ctrgrup]()
),
$(row).css('height', '20px').append(uidegslider),
((quality)? $(row)[losslessRotate < 1? 'show' : 'hide']().addClass('elfinder-resize-quality').append(
$(label).text(fm.i18n('quality')),
quality.clone(true),
$('
')) : $()
),
$(row).append($(label).text(fm.i18n('bgcolor')), bg, picker, reseter),
$(row).css('height', '20px').append(pallet)
);
uideg270.on('click', function() {
rdegree = rdegree - 90;
rotate.update(rdegree);
});
uideg90.on('click', function(){
rdegree = rdegree + 90;
rotate.update(rdegree);
});
}
dialog.append(uitype).on('resize', function(e){
e.stopPropagation();
});
if (api2) {
control.append(/*$(row), */uiresize, uicrop.hide(), uirotate.hide());
} else {
control.append(/*$(row), */uiresize);
}
rhandle.append('
',
'
',
'
',
'
',
'
',
'
',
'
');
preview.append(spinner).append(rhandle.hide()).append(img.hide());
if (api2) {
rhandlec.css('position', 'absolute')
.append('
',
'
',
'
',
'
',
'
',
'
',
'
',
'
',
'
',
'
',
'
',
'
');
preview.append(basec.css('position', 'absolute').hide().append(imgc, rhandlec.append(coverc)));
preview.append(imgr.hide());
}
preview.css('overflow', 'hidden');
dialog.append(preview, control);
buttons[fm.i18n('btnApply')] = save;
if (useSaveAs) {
buttons[fm.i18n('btnSaveAs')] = function() { setTimeout(saveAs, 10); };
}
buttons[fm.i18n('btnCancel')] = function() { dialog.elfinderdialog('close'); };
dialog.find('input,button').addClass('elfinder-tabstop');
base = fm.dialog(dialog, {
title : fm.escape(file.name),
width : dialogWidth,
resizable : false,
buttons : buttons,
open : function() {
var substituteImg = (fm.option('substituteImg', file.hash) && file.size > options.dimSubImgSize)? true : false,
hasSize = (file.width && file.height)? true : false;
dialog.parent().css('overflow', 'hidden');
dMinBtn = base.find('.ui-dialog-titlebar .elfinder-titlebar-minimize').hide();
fm.bind('resize', dinit);
img.attr('src', src);
imgc.attr('src', src);
imgr.attr('src', src);
if (api2) {
imgr.on('mousedown touchstart', rotate.start)
.on('touchend', rotate.stop);
$(document).on('mouseup', rotate.stop);
}
if (hasSize && !substituteImg) {
return init();
}
if (file.size > (options.getDimThreshold || 0)) {
dimreq = fm.request({
data : {cmd : 'dim', target : file.hash, substitute : (substituteImg? 400 : '')},
preventDefault : true
})
.done(function(data) {
if (data.dim) {
var dim = data.dim.split('x');
file.width = dim[0];
file.height = dim[1];
setdim(dim);
if (data.url) {
img.attr('src', data.url);
imgc.attr('src', data.url);
imgr.attr('src', data.url);
}
return init();
}
});
} else if (hasSize) {
return init();
}
},
close : function() {
if (api2) {
imgr.off('mousedown touchstart', rotate.start)
.off('touchend', rotate.stop);
$(document).off('mouseup', rotate.stop);
}
fm.unbind('resize', dinit);
$(this).elfinderdialog('destroy');
},
resize : function(e, data) {
if (data && data.minimize === 'off') {
dinit();
}
}
}).attr('id', id).closest('.ui-dialog').addClass(dlcls + ' ' + clsediting);
// for IE < 9 dialog mising at open second+ time.
if (fm.UA.ltIE8) {
$('.elfinder-dialog').css('filter', '');
}
coverc.css({ 'opacity': 0.2, 'background-color': '#fff', 'position': 'absolute'}),
rhandlec.css('cursor', 'move');
rhandlec.find('.elfinder-resize-handle-point').css({
'background-color' : '#fff',
'opacity': 0.5,
'border-color':'#000'
});
if (! api2) {
uitype.find('.api2').remove();
}
control.find('input,select').prop('disabled', true);
control.find('input.elfinder-resize-quality')
.next('span').addClass('elfinder-resize-jpgsize').attr('title', fm.i18n('roughFileSize'));
},
id, dialog
;
if (!files.length || files[0].mime.indexOf('image/') === -1) {
return dfrd.reject();
}
id = 'resize-'+fm.namespace+'-'+files[0].hash;
dialog = fmnode.find('#'+id);
if (dialog.length) {
dialog.elfinderdialog('toTop');
return dfrd.resolve();
}
open(files[0], id);
return dfrd;
};
};
(function ($) {
var findProperty = function (styleObject, styleArgs) {
var i = 0 ;
for( i in styleArgs) {
if (typeof styleObject[styleArgs[i]] != 'undefined')
return styleArgs[i];
}
styleObject[styleArgs[i]] = '';
return styleArgs[i];
};
$.cssHooks.rotate = {
get: function(elem, computed, extra) {
return $(elem).rotate();
},
set: function(elem, value) {
$(elem).rotate(value);
return value;
}
};
$.cssHooks.transform = {
get: function(elem, computed, extra) {
var name = findProperty( elem.style ,
['WebkitTransform', 'MozTransform', 'OTransform' , 'msTransform' , 'transform'] );
return elem.style[name];
},
set: function(elem, value) {
var name = findProperty( elem.style ,
['WebkitTransform', 'MozTransform', 'OTransform' , 'msTransform' , 'transform'] );
elem.style[name] = value;
return value;
}
};
$.fn.rotate = function(val) {
var r;
if (typeof val == 'undefined') {
if (!!window.opera) {
r = this.css('transform').match(/rotate\((.*?)\)/);
return ( r && r[1])?
Math.round(parseFloat(r[1]) * 180 / Math.PI) : 0;
} else {
r = this.css('transform').match(/rotate\((.*?)\)/);
return ( r && r[1])? parseInt(r[1]) : 0;
}
}
this.css('transform',
this.css('transform').replace(/none|rotate\(.*?\)/, '') + 'rotate(' + parseInt(val) + 'deg)');
return this;
};
$.fx.step.rotate = function(fx) {
if ( fx.state == 0 ) {
fx.start = $(fx.elem).rotate();
fx.now = fx.start;
}
$(fx.elem).rotate(fx.now);
};
if (typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined") { // IE & IE<9
var GetAbsoluteXY = function(element) {
var pnode = element;
var x = pnode.offsetLeft;
var y = pnode.offsetTop;
while ( pnode.offsetParent ) {
pnode = pnode.offsetParent;
if (pnode != document.body && pnode.currentStyle['position'] != 'static') {
break;
}
if (pnode != document.body && pnode != document.documentElement) {
x -= pnode.scrollLeft;
y -= pnode.scrollTop;
}
x += pnode.offsetLeft;
y += pnode.offsetTop;
}
return { x: x, y: y };
};
var StaticToAbsolute = function (element) {
if ( element.currentStyle['position'] != 'static') {
return ;
}
var xy = GetAbsoluteXY(element);
element.style.position = 'absolute' ;
element.style.left = xy.x + 'px';
element.style.top = xy.y + 'px';
};
var IETransform = function(element,transform){
var r;
var m11 = 1;
var m12 = 1;
var m21 = 1;
var m22 = 1;
if (typeof element.style['msTransform'] != 'undefined'){
return true;
}
StaticToAbsolute(element);
r = transform.match(/rotate\((.*?)\)/);
var rotate = ( r && r[1]) ? parseInt(r[1]) : 0;
rotate = rotate % 360;
if (rotate < 0) rotate = 360 + rotate;
var radian= rotate * Math.PI / 180;
var cosX =Math.cos(radian);
var sinY =Math.sin(radian);
m11 *= cosX;
m12 *= -sinY;
m21 *= sinY;
m22 *= cosX;
element.style.filter = (element.style.filter || '').replace(/progid:DXImageTransform\.Microsoft\.Matrix\([^)]*\)/, "" ) +
("progid:DXImageTransform.Microsoft.Matrix(" +
"M11=" + m11 +
",M12=" + m12 +
",M21=" + m21 +
",M22=" + m22 +
",FilterType='bilinear',sizingMethod='auto expand')")
;
var ow = parseInt(element.style.width || element.width || 0 );
var oh = parseInt(element.style.height || element.height || 0 );
radian = rotate * Math.PI / 180;
var absCosX =Math.abs(Math.cos(radian));
var absSinY =Math.abs(Math.sin(radian));
var dx = (ow - (ow * absCosX + oh * absSinY)) / 2;
var dy = (oh - (ow * absSinY + oh * absCosX)) / 2;
element.style.marginLeft = Math.floor(dx) + "px";
element.style.marginTop = Math.floor(dy) + "px";
return(true);
};
var transform_set = $.cssHooks.transform.set;
$.cssHooks.transform.set = function(elem, value) {
transform_set.apply(this, [elem, value] );
IETransform(elem,value);
return value;
};
}
})(jQuery);
/*
* File: /js/commands/restore.js
*/
/**
* @class elFinder command "restore"
* Restore items from the trash
*
* @author Naoki Sawada
**/
(elFinder.prototype.commands.restore = function() {
"use strict";
var self = this,
fm = this.fm,
fakeCnt = 0,
getFilesRecursively = function(files) {
var dfd = $.Deferred(),
dirs = [],
results = [],
reqs = [],
phashes = [],
getFile;
dfd._xhrReject = function() {
$.each(reqs, function() {
this && this.reject && this.reject();
});
getFile && getFile._xhrReject();
};
$.each(files, function(i, f) {
f.mime === 'directory'? dirs.push(f) : results.push(f);
});
if (dirs.length) {
$.each(dirs, function(i, d) {
reqs.push(fm.request({
data : {cmd : 'open', target : d.hash},
preventDefault : true,
asNotOpen : true
}));
phashes[i] = d.hash;
});
$.when.apply($, reqs).fail(function() {
dfd.reject();
}).done(function() {
var items = [];
$.each(arguments, function(i, r) {
var files;
if (r.files) {
if (r.files.length) {
items = items.concat(r.files);
} else {
items.push({
hash: 'fakefile_' + (fakeCnt++),
phash: phashes[i],
mime: 'fakefile',
name: 'fakefile',
ts: 0
});
}
}
});
fm.cache(items);
getFile = getFilesRecursively(items).done(function(res) {
results = results.concat(res);
dfd.resolve(results);
});
});
} else {
dfd.resolve(results);
}
return dfd;
},
restore = function(dfrd, files, targets, ops) {
var rHashes = {},
others = [],
found = false,
dirs = [],
opts = ops || {},
id = +new Date(),
tm, getFile;
fm.lockfiles({files : targets});
dirs = $.map(files, function(f) {
return f.mime === 'directory'? f.hash : null;
});
dfrd.done(function() {
dirs && fm.exec('rm', dirs, {forceRm : true, quiet : true});
}).always(function() {
fm.unlockfiles({files : targets});
});
tm = setTimeout(function() {
fm.notify({type : 'search', id : id, cnt : 1, hideCnt : true, cancel : function() {
getFile && getFile._xhrReject();
dfrd.reject();
}});
}, fm.notifyDelay);
fakeCnt = 0;
getFile = getFilesRecursively(files).always(function() {
tm && clearTimeout(tm);
fm.notify({type : 'search', id: id, cnt : -1, hideCnt : true});
}).fail(function() {
dfrd.reject('errRestore', 'errFileNotFound');
}).done(function(res) {
var errFolderNotfound = ['errRestore', 'errFolderNotFound'],
dirTop = '';
if (res.length) {
$.each(res, function(i, f) {
var phash = f.phash,
pfile,
srcRoot, tPath;
while(phash) {
if (srcRoot = fm.trashes[phash]) {
if (! rHashes[srcRoot]) {
if (found) {
// Keep items of other trash
others.push(f.hash);
return null; // continue $.each
}
rHashes[srcRoot] = {};
found = true;
}
tPath = fm.path(f.hash).substr(fm.path(phash).length).replace(/\\/g, '/');
tPath = tPath.replace(/\/[^\/]+?$/, '');
if (tPath === '') {
tPath = '/';
}
if (!rHashes[srcRoot][tPath]) {
rHashes[srcRoot][tPath] = [];
}
if (f.mime === 'fakefile') {
fm.updateCache({removed:[f.hash]});
} else {
rHashes[srcRoot][tPath].push(f.hash);
}
if (!dirTop || dirTop.length > tPath.length) {
dirTop = tPath;
}
break;
}
// Go up one level for next check
pfile = fm.file(phash);
if (!pfile) {
phash = false;
// Detection method for search results
$.each(fm.trashes, function(ph) {
var file = fm.file(ph),
filePath = fm.path(ph);
if ((!file.volumeid || f.hash.indexOf(file.volumeid) === 0) && fm.path(f.hash).indexOf(filePath) === 0) {
phash = ph;
return false;
}
});
} else {
phash = pfile.phash;
}
}
});
if (found) {
$.each(rHashes, function(src, dsts) {
var dirs = Object.keys(dsts),
cnt = dirs.length;
fm.request({
data : {cmd : 'mkdir', target : src, dirs : dirs},
notify : {type : 'chkdir', cnt : cnt},
preventFail : true
}).fail(function(error) {
dfrd.reject(error);
fm.unlockfiles({files : targets});
}).done(function(data) {
var cmdPaste, hashes;
if (hashes = data.hashes) {
cmdPaste = fm.getCommand('paste');
if (cmdPaste) {
// wait until file cache made
fm.one('mkdirdone', function() {
var hasErr = false;
$.each(dsts, function(dir, files) {
if (hashes[dir]) {
if (files.length) {
if (fm.file(hashes[dir])) {
fm.clipboard(files, true);
cmdPaste.exec([ hashes[dir] ], {_cmd : 'restore', noToast : (opts.noToast || dir !== dirTop)})
.done(function(data) {
if (data && (data.error || data.warning)) {
hasErr = true;
}
})
.fail(function() {
hasErr = true;
})
.always(function() {
if (--cnt < 1) {
dfrd[hasErr? 'reject' : 'resolve']();
if (others.length) {
// Restore items of other trash
self.exec(others);
}
}
});
} else {
dfrd.reject(errFolderNotfound);
}
} else {
if (--cnt < 1) {
dfrd.resolve();
if (others.length) {
// Restore items of other trash
self.exec(others);
}
}
}
}
});
});
} else {
dfrd.reject(['errRestore', 'errCmdNoSupport', '(paste)']);
}
} else {
dfrd.reject(errFolderNotfound);
}
});
});
} else {
dfrd.reject(errFolderNotfound);
}
} else {
dfrd.reject('errFileNotFound');
dirs && fm.exec('rm', dirs, {forceRm : true, quiet : true});
}
});
};
this.linkedCmds = ['copy', 'paste', 'mkdir', 'rm'];
this.updateOnSelect = false;
//this.shortcuts = [{
// pattern : 'ctrl+z'
//}];
this.getstate = function(sel, e) {
sel = sel || fm.selected();
return sel.length && $.grep(sel, function(h) {var f = fm.file(h); return f && ! f.locked && ! fm.isRoot(f)? true : false; }).length == sel.length
? 0 : -1;
};
this.exec = function(hashes, opts) {
var dfrd = $.Deferred()
.fail(function(error) {
error && fm.error(error);
}),
files = self.files(hashes);
if (! files.length) {
return dfrd.reject();
}
$.each(files, function(i, file) {
if (fm.isRoot(file)) {
return !dfrd.reject(['errRestore', file.name]);
}
if (file.locked) {
return !dfrd.reject(['errLocked', file.name]);
}
});
if (dfrd.state() === 'pending') {
restore(dfrd, files, hashes, opts);
}
return dfrd;
};
}).prototype = { forceLoad : true }; // this is required command
/*
* File: /js/commands/rm.js
*/
/**
* @class elFinder command "rm"
* Delete files
*
* @author Dmitry (dio) Levashov
* @author Naoki Sawada
**/
elFinder.prototype.commands.rm = function() {
"use strict";
var self = this,
fm = this.fm,
tpl = '
',
confirm = function(dfrd, targets, files, tHash, addTexts) {
var cnt = targets.length,
cwd = fm.cwd().hash,
descs = [],
spinner = '
' + fm.i18n('calc'),
dialog, text, tmb, size, f, fname;
if (cnt > 1) {
size = 0;
$.each(files, function(h, f) {
if (f.size && f.size != 'unknown' && f.mime !== 'directory') {
var s = parseInt(f.size);
if (s >= 0 && size >= 0) {
size += s;
}
} else {
size = 'unknown';
return false;
}
});
getSize = (size === 'unknown');
descs.push(fm.i18n('size')+': '+(getSize? spinner : fm.formatSize(size)));
text = [$(tpl.replace('{class}', 'elfinder-cwd-icon-group').replace('{title}', '
' + fm.i18n('items')+ ': ' + cnt + '').replace('{desc}', descs.join('
')))];
} else {
f = files[0];
tmb = fm.tmb(f);
getSize = (f.mime === 'directory');
descs.push(fm.i18n('size')+': '+(getSize? spinner : fm.formatSize(f.size)));
descs.push(fm.i18n('modify')+': '+fm.formatDate(f));
fname = fm.escape(f.i18 || f.name).replace(/([_.])/g, '$1');
text = [$(tpl.replace('{class}', fm.mime2class(f.mime)).replace('{title}', '
' + fname + '').replace('{desc}', descs.join('
')))];
}
if (addTexts) {
text = text.concat(addTexts);
}
text.push(tHash? 'confirmTrash' : 'confirmRm');
dialog = fm.confirm({
title : self.title,
text : text,
accept : {
label : 'btnRm',
callback : function() {
if (tHash) {
toTrash(dfrd, targets, tHash);
} else {
remove(dfrd, targets);
}
}
},
cancel : {
label : 'btnCancel',
callback : function() {
fm.unlockfiles({files : targets});
if (targets.length === 1 && fm.file(targets[0]).phash !== cwd) {
fm.select({selected : targets});
} else {
fm.selectfiles({files : targets});
}
dfrd.reject();
}
}
});
// load thumbnail
if (tmb) {
$('
![]()
')
.on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); })
.attr('src', tmb.url);
}
if (getSize) {
getSize = fm.getSize($.map(files, function(f) { return f.mime === 'directory'? f.hash : null; })).done(function(data) {
dialog.find('span.elfinder-info-spinner').parent().html(fm.i18n('size')+': '+data.formated);
}).fail(function() {
dialog.find('span.elfinder-info-spinner').parent().html(fm.i18n('size')+': '+fm.i18n('unknown'));
}).always(function() {
getSize = false;
});
}
},
toTrash = function(dfrd, targets, tHash) {
var dsts = {},
itemCnt = targets.length,
maxCnt = self.options.toTrashMaxItems,
checkDirs = [],
reqDfd = $.Deferred(),
req, dirs, cnt;
if (itemCnt > maxCnt) {
confirm(dfrd, targets, self.files(targets), null, [fm.i18n('tooManyToTrash')]);
return;
}
// Directory preparation preparation and directory enumeration
$.each(targets, function(i, h) {
var file = fm.file(h),
path = fm.path(h).replace(/\\/g, '/'),
m = path.match(/^[^\/]+?(\/(?:[^\/]+?\/)*)[^\/]+?$/);
if (file) {
if (m) {
m[1] = m[1].replace(/(^\/.*?)\/?$/, '$1');
if (! dsts[m[1]]) {
dsts[m[1]] = [];
}
dsts[m[1]].push(h);
}
if (file.mime === 'directory') {
checkDirs.push(h);
}
}
});
// Check directory information
if (checkDirs.length) {
req = fm.request({
data : {cmd : 'size', targets : checkDirs},
notify : {type: 'readdir', cnt: 1, hideCnt: true},
preventDefault : true
}).done(function(data) {
var cnt = 0;
data.fileCnt && (cnt += parseInt(data.fileCnt));
data.dirCnt && (cnt += parseInt(data.dirCnt));
reqDfd[cnt > maxCnt ? 'reject' : 'resolve']();
}).fail(function() {
reqDfd.reject();
});
setTimeout(function() {
var xhr = (req && req.xhr)? req.xhr : null;
if (xhr && xhr.state() == 'pending') {
req.syncOnFail(false);
req.reject();
reqDfd.reject();
}
}, self.options.infoCheckWait * 1000);
} else {
reqDfd.resolve();
}
// Directory creation and paste command execution
reqDfd.done(function() {
dirs = Object.keys(dsts);
cnt = dirs.length;
if (cnt) {
fm.request({
data : {cmd : 'mkdir', target : tHash, dirs : dirs},
notify : {type : 'chkdir', cnt : cnt},
preventFail : true
})
.fail(function(error) {
dfrd.reject(error);
fm.unlockfiles({files : targets});
})
.done(function(data) {
var margeRes = function(data, phash, reqData) {
var undo, prevUndo, redo, prevRedo;
$.each(data, function(k, v) {
if (Array.isArray(v)) {
if (res[k]) {
res[k] = res[k].concat(v);
} else {
res[k] = v;
}
}
});
if (data.sync) {
res.sync = 1;
}
if (data.added && data.added.length) {
undo = function() {
var targets = [],
restore = fm.getCommand('restore'),
dirs = $.map(data.added, function(f) { return f.mime === 'directory'? f.hash : null; });
$.each(data.added, function(i, f) {
if ($.inArray(f.phash, dirs) === -1) {
targets.push(f.hash);
}
});
return restore.exec(targets, {noToast: true});
};
redo = function() {
return fm.request({
data : reqData,
notify : {type : 'redo', cnt : targets.length}
});
};
if (res.undo) {
prevUndo = res.undo;
res.undo = function() {
undo();
prevUndo();
};
} else {
res.undo = undo;
}
if (res.redo) {
prevRedo = res.redo;
res.redo = function() {
redo();
prevRedo();
};
} else {
res.redo = redo;
}
}
},
err = ['errTrash'],
res = {},
hasNtf = function() {
return fm.ui.notify.children('.elfinder-notify-trash').length;
},
hashes, tm, prg, prgSt;
if (hashes = data.hashes) {
prg = 1 / cnt * 100;
prgSt = cnt === 1? 100 : 5;
tm = setTimeout(function() {
fm.notify({type : 'trash', cnt : 1, hideCnt : true, progress : prgSt});
}, fm.notifyDelay);
$.each(dsts, function(dir, files) {
var reqData;
if (hashes[dir]) {
reqData = {cmd : 'paste', dst : hashes[dir], targets : files, cut : 1};
fm.request({
data : reqData,
preventDefault : true
})
.fail(function(error) {
if (error) {
err = err.concat(error);
}
})
.done(function(data) {
var phash = fm.file(files[0]).phash;
data = fm.normalize(data);
fm.updateCache(data);
margeRes(data, phash, reqData);
if (data.warning) {
err = err.concat(data.warning);
delete data.warning;
}
// fire some event to update cache/ui
data.removed && data.removed.length && fm.remove(data);
data.added && data.added.length && fm.add(data);
data.changed && data.changed.length && fm.change(data);
// fire event with command name
fm.trigger('paste', data);
// fire event with command name + 'done'
fm.trigger('pastedone');
// force update content
data.sync && fm.sync();
})
.always(function() {
var hashes, addTexts, end = 2;
if (hasNtf()) {
fm.notify({type : 'trash', cnt : 0, hideCnt : true, progress : prg});
} else {
prgSt+= prg;
}
if (--cnt < 1) {
tm && clearTimeout(tm);
hasNtf() && fm.notify({type : 'trash', cnt : -1});
fm.unlockfiles({files : targets});
if (Object.keys(res).length) {
if (err.length > 1) {
if (res.removed || res.removed.length) {
hashes = $.grep(targets, function(h) {
return $.inArray(h, res.removed) === -1? true : false;
});
}
if (hashes.length) {
if (err > end) {
end = (fm.messages[err[end-1]] || '').indexOf('$') === -1? end : end + 1;
}
self.exec(hashes, { addTexts: err.slice(0, end), forceRm: true });
} else {
fm.error(err);
}
}
res._noSound = true;
if (res.undo && res.redo) {
res.undo = {
cmd : 'trash',
callback : res.undo,
};
res.redo = {
cmd : 'trash',
callback : res.redo
};
}
dfrd.resolve(res);
} else {
dfrd.reject(err);
}
}
});
}
});
} else {
dfrd.reject('errFolderNotFound');
fm.unlockfiles({files : targets});
}
});
} else {
dfrd.reject(['error', 'The folder hierarchy to be deleting can not be determined.']);
fm.unlockfiles({files : targets});
}
}).fail(function() {
confirm(dfrd, targets, self.files(targets), null, [fm.i18n('tooManyToTrash')]);
});
},
remove = function(dfrd, targets, quiet) {
var notify = quiet? {} : {type : 'rm', cnt : targets.length};
fm.request({
data : {cmd : 'rm', targets : targets},
notify : notify,
preventFail : true
})
.fail(function(error) {
dfrd.reject(error);
})
.done(function(data) {
if (data.error || data.warning) {
data.sync = true;
}
dfrd.resolve(data);
})
.always(function() {
fm.unlockfiles({files : targets});
});
},
getTHash = function(targets) {
var thash = null,
root1st;
if (targets && targets.length) {
if (targets.length > 1 && fm.searchStatus.state === 2) {
root1st = fm.file(fm.root(targets[0])).volumeid;
if (!$.grep(targets, function(h) { return h.indexOf(root1st) !== 0? true : false ; }).length) {
thash = fm.option('trashHash', targets[0]);
}
} else {
thash = fm.option('trashHash', targets[0]);
}
}
return thash;
},
getSize = false;
this.syncTitleOnChange = true;
this.updateOnSelect = false;
this.shortcuts = [{
pattern : 'delete ctrl+backspace shift+delete'
}];
this.handlers = {
'select' : function(e) {
var targets = e.data && e.data.selected && e.data.selected.length? e.data.selected : null;
self.update(void(0), (targets? getTHash(targets) : fm.option('trashHash'))? 'trash' : 'rm');
}
};
this.value = 'rm';
this.init = function() {
self.change(function() {
var targets;
delete self.extra;
self.title = fm.i18n('cmd' + self.value);
self.className = self.value;
self.button && self.button.children('span.elfinder-button-icon')[self.value === 'trash'? 'addClass' : 'removeClass']('elfinder-button-icon-trash');
if (self.value === 'trash') {
self.extra = {
icon: 'rm',
node: $('
')
.attr({title: fm.i18n('cmdrm')})
.on('ready', function(e, data) {
targets = data.targets;
})
.on('click touchstart', function(e){
if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) {
return;
}
e.stopPropagation();
e.preventDefault();
fm.getUI().trigger('click'); // to close the context menu immediately
fm.exec('rm', targets, {_userAction: true, forceRm : true});
})
};
}
});
};
this.getstate = function(select) {
var sel = this.hashes(select);
return sel.length && $.grep(sel, function(h) { var f = fm.file(h); return f && ! f.locked && ! fm.isRoot(f)? true : false; }).length == sel.length
? 0 : -1;
};
this.exec = function(hashes, cOpts) {
var opts = cOpts || {},
dfrd = $.Deferred()
.always(function() {
if (getSize && getSize.state && getSize.state() === 'pending') {
getSize.reject();
}
})
.fail(function(error) {
error && fm.error(error);
}).done(function(data) {
!opts.quiet && !data._noSound && data.removed && data.removed.length && fm.trigger('playsound', {soundFile : 'rm.wav'});
}),
files = self.files(hashes),
cnt = files.length,
tHash = null,
addTexts = opts.addTexts? opts.addTexts : null,
forceRm = opts.forceRm,
quiet = opts.quiet,
targets;
if (! cnt) {
return dfrd.reject();
}
$.each(files, function(i, file) {
if (fm.isRoot(file)) {
return !dfrd.reject(['errRm', file.name, 'errPerm']);
}
if (file.locked) {
return !dfrd.reject(['errLocked', file.name]);
}
});
if (dfrd.state() === 'pending') {
targets = self.hashes(hashes);
cnt = files.length;
if (forceRm || (self.event && self.event.originalEvent && self.event.originalEvent.shiftKey)) {
tHash = '';
self.title = fm.i18n('cmdrm');
}
if (tHash === null) {
tHash = getTHash(targets);
}
fm.lockfiles({files : targets});
if (tHash && self.options.quickTrash) {
toTrash(dfrd, targets, tHash);
} else {
if (quiet) {
remove(dfrd, targets, quiet);
} else {
confirm(dfrd, targets, files, tHash, addTexts);
}
}
}
return dfrd;
};
};
/*
* File: /js/commands/search.js
*/
/**
* @class elFinder command "search"
* Find files
*
* @author Dmitry (dio) Levashov
**/
elFinder.prototype.commands.search = function() {
"use strict";
this.title = 'Find files';
this.options = {ui : 'searchbutton'};
this.alwaysEnabled = true;
this.updateOnSelect = false;
/**
* Return command status.
* Search does not support old api.
*
* @return Number
**/
this.getstate = function() {
return 0;
};
/**
* Send search request to backend.
*
* @param String search string
* @return $.Deferred
**/
this.exec = function(q, target, mime) {
var fm = this.fm,
reqDef = [],
onlyMimes = fm.options.onlyMimes,
phash, targetVolids = [];
if (typeof q == 'string' && q) {
if (typeof target == 'object') {
mime = target.mime || '';
target = target.target || '';
}
target = target? target : '';
if (mime) {
mime = $.trim(mime).replace(',', ' ').split(' ');
if (onlyMimes.length) {
mime = $.map(mime, function(m){
m = $.trim(m);
return m && ($.inArray(m, onlyMimes) !== -1
|| $.grep(onlyMimes, function(om) { return m.indexOf(om) === 0? true : false; }).length
)? m : null;
});
}
} else {
mime = [].concat(onlyMimes);
}
fm.trigger('searchstart', {query : q, target : target, mimes : mime});
if (! onlyMimes.length || mime.length) {
if (target === '' && fm.api >= 2.1) {
$.each(fm.roots, function(id, hash) {
reqDef.push(fm.request({
data : {cmd : 'search', q : q, target : hash, mimes : mime},
notify : {type : 'search', cnt : 1, hideCnt : (reqDef.length? false : true)},
cancel : true,
preventDone : true
}));
});
} else {
reqDef.push(fm.request({
data : {cmd : 'search', q : q, target : target, mimes : mime},
notify : {type : 'search', cnt : 1, hideCnt : true},
cancel : true,
preventDone : true
}));
if (target !== '' && fm.api >= 2.1 && Object.keys(fm.leafRoots).length) {
$.each(fm.leafRoots, function(hash, roots) {
phash = hash;
while(phash) {
if (target === phash) {
$.each(roots, function() {
var f = fm.file(this);
f && f.volumeid && targetVolids.push(f.volumeid);
reqDef.push(fm.request({
data : {cmd : 'search', q : q, target : this, mimes : mime},
notify : {type : 'search', cnt : 1, hideCnt : false},
cancel : true,
preventDone : true
}));
});
}
phash = (fm.file(phash) || {}).phash;
}
});
}
}
} else {
reqDef = [$.Deferred().resolve({files: []})];
}
fm.searchStatus.mixed = (reqDef.length > 1)? targetVolids : false;
return $.when.apply($, reqDef).done(function(data) {
var argLen = arguments.length,
i;
data.warning && fm.error(data.warning);
if (argLen > 1) {
data.files = (data.files || []);
for(i = 1; i < argLen; i++) {
arguments[i].warning && fm.error(arguments[i].warning);
if (arguments[i].files) {
data.files.push.apply(data.files, arguments[i].files);
}
}
}
// because "preventDone : true" so update files cache
data.files && data.files.length && fm.cache(data.files);
fm.lazy(function() {
fm.trigger('search', data);
}).then(function() {
// fire event with command name + 'done'
return fm.lazy(function() {
fm.trigger('searchdone');
});
}).then(function() {
// force update content
data.sync && fm.sync();
});
});
}
fm.getUI('toolbar').find('.'+fm.res('class', 'searchbtn')+' :text').focus();
return $.Deferred().reject();
};
};
/*
* File: /js/commands/selectall.js
*/
/**
* @class elFinder command "selectall"
* Select ALL of cwd items
*
* @author Naoki Sawada
**/
elFinder.prototype.commands.selectall = function() {
"use strict";
var self = this,
state = 0;
this.fm.bind('select', function(e) {
state = (e.data && e.data.selectall)? -1 : 0;
});
this.state = 0;
this.updateOnSelect = false;
this.getstate = function() {
return state;
};
this.exec = function() {
$(document).trigger($.Event('keydown', { keyCode: 65, ctrlKey : true, shiftKey : false, altKey : false, metaKey : false }));
return $.Deferred().resolve();
};
};
/*
* File: /js/commands/selectinvert.js
*/
/**
* @class elFinder command "selectinvert"
* Invert Selection of cwd items
*
* @author Naoki Sawada
**/
elFinder.prototype.commands.selectinvert = function() {
"use strict";
this.updateOnSelect = false;
this.getstate = function() {
return 0;
};
this.exec = function() {
$(document).trigger($.Event('keydown', { keyCode: 73, ctrlKey : true, shiftKey : true, altKey : false, metaKey : false }));
return $.Deferred().resolve();
};
};
/*
* File: /js/commands/selectnone.js
*/
/**
* @class elFinder command "selectnone"
* Unselect ALL of cwd items
*
* @author Naoki Sawada
**/
elFinder.prototype.commands.selectnone = function() {
"use strict";
var self = this,
fm = this.fm,
state = -1;
fm.bind('select', function(e) {
state = (e.data && e.data.unselectall)? -1 : 0;
});
this.state = -1;
this.updateOnSelect = false;
this.getstate = function() {
return state;
};
this.exec = function() {
fm.getUI('cwd').trigger('unselectall');
return $.Deferred().resolve();
};
};
/*
* File: /js/commands/sort.js
*/
/**
* @class elFinder command "sort"
* Change sort files rule
*
* @author Dmitry (dio) Levashov
**/
elFinder.prototype.commands.sort = function() {
"use strict";
var self = this,
fm = self.fm,
setVar = function() {
self.variants = [];
$.each(fm.sortRules, function(name, value) {
var sort = {
type : name,
order : name == fm.sortType ? fm.sortOrder == 'asc' ? 'desc' : 'asc' : fm.sortOrder
};
if ($.inArray(name, fm.sorters) !== -1) {
var arr = name == fm.sortType ? (sort.order == 'asc'? 's' : 'n') : '';
self.variants.push([sort, (arr? '
' : '') + ' ' + fm.i18n('sort'+name)]);
}
});
self.variants.push('|');
self.variants.push([
{
type : fm.sortType,
order : fm.sortOrder,
stick : !fm.sortStickFolders,
tree : fm.sortAlsoTreeview
},
(fm.sortStickFolders? '
' : '') + ' ' + fm.i18n('sortFoldersFirst')
]);
if (fm.ui.tree) {
self.variants.push('|');
self.variants.push([
{
type : fm.sortType,
order : fm.sortOrder,
stick : fm.sortStickFolders,
tree : !fm.sortAlsoTreeview
},
(fm.sortAlsoTreeview? '
' : '') + ' ' + fm.i18n('sortAlsoTreeview')
]);
}
};
/**
* Command options
*
* @type Object
*/
this.options = {ui : 'sortbutton'};
fm.bind('open sortchange', setVar)
.bind('open', function() {
fm.unbind('add', setVar).one('add', setVar);
fm.getUI('toolbar').find('.elfiner-button-sort .elfinder-button-menu .elfinder-button-menu-item').each(function() {
var tgt = $(this),
rel = tgt.attr('rel');
tgt.toggle(! rel || $.inArray(rel, fm.sorters) !== -1);
});
})
.bind('cwdrender', function() {
var cols = $(fm.cwd).find('div.elfinder-cwd-wrapper-list table');
if (cols.length) {
$.each(fm.sortRules, function(name, value) {
var td = cols.find('thead tr td.elfinder-cwd-view-th-'+name);
if (td.length) {
var current = ( name == fm.sortType),
sort = {
type : name,
order : current ? fm.sortOrder == 'asc' ? 'desc' : 'asc' : fm.sortOrder
},arr;
if (current) {
td.addClass('ui-state-active');
arr = fm.sortOrder == 'asc' ? 'n' : 's';
$('
').appendTo(td);
}
$(td).on('click', function(e){
if (! $(this).data('dragging')) {
e.stopPropagation();
if (! fm.getUI('cwd').data('longtap')) {
self.exec([], sort);
}
}
})
.hover(function() {
$(this).addClass('ui-state-hover');
},function() {
$(this).removeClass('ui-state-hover');
});
}
});
}
});
this.getstate = function() {
return 0;
};
this.exec = function(hashes, sortopt) {
var fm = this.fm,
sort = Object.assign({
type : fm.sortType,
order : fm.sortOrder,
stick : fm.sortStickFolders,
tree : fm.sortAlsoTreeview
}, sortopt);
return fm.lazy(function() {
fm.setSort(sort.type, sort.order, sort.stick, sort.tree);
this.resolve();
});
};
};
/*
* File: /js/commands/undo.js
*/
/**
* @class elFinder command "undo"
* Undo previous commands
*
* @author Naoki Sawada
**/
elFinder.prototype.commands.undo = function() {
"use strict";
var self = this,
fm = this.fm,
setTitle = function(undo) {
if (undo) {
self.title = fm.i18n('cmdundo') + ' ' + fm.i18n('cmd'+undo.cmd);
self.state = 0;
} else {
self.title = fm.i18n('cmdundo');
self.state = -1;
}
self.change();
},
cmds = [];
this.alwaysEnabled = true;
this.updateOnSelect = false;
this.shortcuts = [{
pattern : 'ctrl+z'
}];
this.syncTitleOnChange = true;
this.getstate = function() {
return this.state;
};
this.setUndo = function(undo, redo) {
var _undo = {};
if (undo) {
if ($.isPlainObject(undo) && undo.cmd && undo.callback) {
Object.assign(_undo, undo);
if (redo) {
delete redo.undo;
_undo.redo = redo;
} else {
fm.getCommand('redo').setRedo(null);
}
cmds.push(_undo);
setTitle(_undo);
}
}
};
this.exec = function() {
var redo = fm.getCommand('redo'),
dfd = $.Deferred(),
undo, res, _redo = {};
if (cmds.length) {
undo = cmds.pop();
if (undo.redo) {
Object.assign(_redo, undo.redo);
delete undo.redo;
} else {
_redo = null;
}
dfd.done(function() {
if (_redo) {
redo.setRedo(_redo, undo);
}
});
setTitle(cmds.length? cmds[cmds.length-1] : void(0));
res = undo.callback();
if (res && res.done) {
res.done(function() {
dfd.resolve();
}).fail(function() {
dfd.reject();
});
} else {
dfd.resolve();
}
if (cmds.length) {
this.update(0, cmds[cmds.length - 1].name);
} else {
this.update(-1, '');
}
} else {
dfd.reject();
}
return dfd;
};
fm.bind('exec', function(e) {
var data = e.data || {};
if (data.opts && data.opts._userAction) {
if (data.dfrd && data.dfrd.done) {
data.dfrd.done(function(res) {
if (res && res.undo && res.redo) {
res.undo.redo = res.redo;
self.setUndo(res.undo);
}
});
}
}
});
};
/**
* @class elFinder command "redo"
* Redo previous commands
*
* @author Naoki Sawada
**/
elFinder.prototype.commands.redo = function() {
"use strict";
var self = this,
fm = this.fm,
setTitle = function(redo) {
if (redo && redo.callback) {
self.title = fm.i18n('cmdredo') + ' ' + fm.i18n('cmd'+redo.cmd);
self.state = 0;
} else {
self.title = fm.i18n('cmdredo');
self.state = -1;
}
self.change();
},
cmds = [];
this.alwaysEnabled = true;
this.updateOnSelect = false;
this.shortcuts = [{
pattern : 'shift+ctrl+z ctrl+y'
}];
this.syncTitleOnChange = true;
this.getstate = function() {
return this.state;
};
this.setRedo = function(redo, undo) {
if (redo === null) {
cmds = [];
setTitle();
} else {
if (redo && redo.cmd && redo.callback) {
if (undo) {
redo.undo = undo;
}
cmds.push(redo);
setTitle(redo);
}
}
};
this.exec = function() {
var undo = fm.getCommand('undo'),
dfd = $.Deferred(),
redo, res, _undo = {}, _redo = {};
if (cmds.length) {
redo = cmds.pop();
if (redo.undo) {
Object.assign(_undo, redo.undo);
Object.assign(_redo, redo);
delete _redo.undo;
dfd.done(function() {
undo.setUndo(_undo, _redo);
});
}
setTitle(cmds.length? cmds[cmds.length-1] : void(0));
res = redo.callback();
if (res && res.done) {
res.done(function() {
dfd.resolve();
}).fail(function() {
dfd.reject();
});
} else {
dfd.resolve();
}
return dfd;
} else {
return dfd.reject();
}
};
};
/*
* File: /js/commands/up.js
*/
/**
* @class elFinder command "up"
* Go into parent directory
*
* @author Dmitry (dio) Levashov
**/
(elFinder.prototype.commands.up = function() {
"use strict";
this.alwaysEnabled = true;
this.updateOnSelect = false;
this.shortcuts = [{
pattern : 'ctrl+up'
}];
this.getstate = function() {
return this.fm.cwd().phash ? 0 : -1;
};
this.exec = function() {
var fm = this.fm,
cwdhash = fm.cwd().hash;
return this.fm.cwd().phash ? this.fm.exec('open', this.fm.cwd().phash).done(function() {
fm.one('opendone', function() {
fm.selectfiles({files : [cwdhash]});
});
}) : $.Deferred().reject();
};
}).prototype = { forceLoad : true }; // this is required command
/*
* File: /js/commands/upload.js
*/
/**
* @class elFinder command "upload"
* Upload files using iframe or XMLHttpRequest & FormData.
* Dialog allow to send files using drag and drop
*
* @type elFinder.command
* @author Dmitry (dio) Levashov
*/
elFinder.prototype.commands.upload = function() {
"use strict";
var hover = this.fm.res('class', 'hover');
this.disableOnSearch = true;
this.updateOnSelect = false;
// Shortcut opens dialog
this.shortcuts = [{
pattern : 'ctrl+u'
}];
/**
* Return command state
*
* @return Number
**/
this.getstate = function(select) {
var fm = this.fm, f,
sel = (select || [fm.cwd().hash]);
if (!this._disabled && sel.length == 1) {
f = fm.file(sel[0]);
}
return (f && f.mime == 'directory' && f.write)? 0 : -1;
};
this.exec = function(data) {
var fm = this.fm,
cwdHash = fm.cwd().hash,
getTargets = function() {
var tgts = data && (data instanceof Array)? data : null,
sel;
if (! data) {
if (! tgts && (sel = fm.selected()).length === 1 && fm.file(sel[0]).mime === 'directory') {
tgts = sel;
} else {
tgts = [ cwdHash ];
}
}
return tgts;
},
targets = getTargets(),
check = targets? targets[0] : (data && data.target? data.target : null),
targetDir = check? fm.file(check) : fm.cwd(),
fmUpload = function(data) {
fm.upload(data)
.fail(function(error) {
dfrd.reject(error);
})
.done(function(data) {
var cwd = fm.getUI('cwd'),
node;
dfrd.resolve(data);
if (data && data.added && data.added[0] && ! fm.ui.notify.children('.elfinder-notify-upload').length) {
var newItem = fm.findCwdNodes(data.added);
if (newItem.length) {
newItem.trigger('scrolltoview');
} else {
if (targetDir.hash !== cwdHash) {
node = $('
').append(
$('
')
.on('mouseenter mouseleave', function(e) {
$(this).toggleClass('ui-state-hover', e.type == 'mouseenter');
}).on('click', function() {
fm.exec('open', check).done(function() {
fm.one('opendone', function() {
fm.trigger('selectfiles', {files : $.map(data.added, function(f) {return f.hash;})});
});
});
})
);
} else {
fm.trigger('selectfiles', {files : $.map(data.added, function(f) {return f.hash;})});
}
fm.toast({msg: fm.i18n(['complete', fm.i18n('cmdupload')]), extNode: node});
}
}
});
},
upload = function(data) {
dialog.elfinderdialog('close');
if (targets) {
data.target = targets[0];
}
fmUpload(data);
},
getSelector = function() {
var hash = targetDir.hash,
dirs = $.grep(fm.files(hash), function(f) {
return (f.mime === 'directory' && f.write)? true : false;
});
if (! dirs.length) {
return $();
}
return $('
')
.on('click', function(e) {
e.stopPropagation();
e.preventDefault();
dirs = fm.sortFiles(dirs);
var $this = $(this),
cwd = fm.cwd(),
base = dialog.closest('div.ui-dialog'),
getRaw = function(f, icon) {
return {
label : fm.escape(f.i18 || f.name),
icon : icon,
remain : false,
callback : function() {
var title = base.children('.ui-dialog-titlebar:first').find('span.elfinder-upload-target');
targets = [ f.hash ];
title.html(' - ' + fm.escape(f.i18 || f.name));
$this.focus();
},
options : {
className : (targets && targets.length && f.hash === targets[0])? 'ui-state-active' : '',
iconClass : f.csscls || '',
iconImg : f.icon || ''
}
};
},
raw = [ getRaw(targetDir, 'opendir'), '|' ];
$.each(dirs, function(i, f) {
raw.push(getRaw(f, 'dir'));
});
$this.blur();
fm.trigger('contextmenu', {
raw: raw,
x: e.pageX || $(this).offset().left,
y: e.pageY || $(this).offset().top,
prevNode: base,
fitHeight: true
});
}).append('
');
},
inputButton = function(type, caption) {
var button,
input = $('
')
.change(function() {
upload({input : input.get(0), type : 'files'});
})
.on('dragover', function(e) {
e.originalEvent.dataTransfer.dropEffect = 'copy';
});
return $('
'+fm.i18n(caption)+'
')
.append($('
').append(input))
.on('click', function(e) {
if (e.target === this) {
e.stopPropagation();
e.preventDefault();
input.click();
}
})
.hover(function() {
$(this).toggleClass(hover);
});
},
dfrd = $.Deferred(),
dialog, dropbox, pastebox, dropUpload, paste, dirs, spinner, uidialog;
dropUpload = function(e) {
e.stopPropagation();
e.preventDefault();
var file = false,
type = '',
elfFrom = null,
mycwd = '',
data = null,
target = e._target || null,
trf = e.dataTransfer || null,
kind = (trf.items && trf.items.length && trf.items[0].kind)? trf.items[0].kind : '',
errors;
if (trf) {
try {
elfFrom = trf.getData('elfinderfrom');
if (elfFrom) {
mycwd = window.location.href + fm.cwd().hash;
if ((!target && elfFrom === mycwd) || target === mycwd) {
dfrd.reject();
return;
}
}
} catch(e) {}
if (kind === 'file' && (trf.items[0].getAsEntry || trf.items[0].webkitGetAsEntry)) {
file = trf;
type = 'data';
} else if (kind !== 'string' && trf.files && trf.files.length && $.inArray('Text', trf.types) === -1) {
file = trf.files;
type = 'files';
} else {
try {
if ((data = trf.getData('text/html')) && data.match(/<(?:img|a)/i)) {
file = [ data ];
type = 'html';
}
} catch(e) {}
if (! file && (data = trf.getData('text'))) {
file = [ data ];
type = 'text';
}
}
}
if (file) {
fmUpload({files : file, type : type, target : target, dropEvt : e});
} else {
errors = ['errUploadNoFiles'];
if (kind === 'file') {
errors.push('errFolderUpload');
}
fm.error(errors);
dfrd.reject();
}
};
if (!targets && data) {
if (data.input || data.files) {
data.type = 'files';
fmUpload(data);
} else if (data.dropEvt) {
dropUpload(data.dropEvt);
}
return dfrd;
}
paste = function(ev) {
var e = ev.originalEvent || ev;
var files = [], items = [];
var file;
if (e.clipboardData) {
if (e.clipboardData.items && e.clipboardData.items.length){
items = e.clipboardData.items;
for (var i=0; i < items.length; i++) {
if (e.clipboardData.items[i].kind == 'file') {
file = e.clipboardData.items[i].getAsFile();
files.push(file);
}
}
} else if (e.clipboardData.files && e.clipboardData.files.length) {
files = e.clipboardData.files;
}
if (files.length) {
upload({files : files, type : 'files', clipdata : true});
return;
}
}
var my = e.target || e.srcElement;
setTimeout(function () {
var type = 'text',
src;
if (my.innerHTML) {
$(my).find('img').each(function(i, v){
if (v.src.match(/^webkit-fake-url:\/\//)) {
// For Safari's bug.
// ref. https://bugs.webkit.org/show_bug.cgi?id=49141
// https://dev.ckeditor.com/ticket/13029
$(v).remove();
}
});
if ($(my).find('a,img').length) {
type = 'html';
}
src = my.innerHTML;
my.innerHTML = '';
upload({files : [ src ], type : type});
}
}, 1);
};
dialog = $('
')
.append(inputButton('multiple', 'selectForUpload'));
if (! fm.UA.Mobile && (function(input) {
return (typeof input.webkitdirectory !== 'undefined' || typeof input.directory !== 'undefined');})(document.createElement('input'))) {
dialog.append(inputButton('multiple webkitdirectory directory', 'selectFolder'));
}
if (targetDir.dirs) {
if (targetDir.hash === cwdHash || $('#'+fm.navHash2Id(targetDir.hash)).hasClass('elfinder-subtree-loaded')) {
getSelector().appendTo(dialog);
} else {
spinner = $('
')
.append('
')
.appendTo(dialog);
fm.request({cmd : 'tree', target : targetDir.hash})
.done(function() {
fm.one('treedone', function() {
spinner.replaceWith(getSelector());
uidialog.elfinderdialog('tabstopsInit');
});
})
.fail(function() {
spinner.remove();
});
}
}
if (fm.dragUpload) {
dropbox = $('
')
.on('paste', function(e){
paste(e);
})
.on('mousedown click', function(){
$(this).focus();
})
.on('focus', function(){
this.innerHTML = '';
})
.on('mouseover', function(){
$(this).addClass(hover);
})
.on('mouseout', function(){
$(this).removeClass(hover);
})
.on('dragenter', function(e) {
e.stopPropagation();
e.preventDefault();
$(this).addClass(hover);
})
.on('dragleave', function(e) {
e.stopPropagation();
e.preventDefault();
$(this).removeClass(hover);
})
.on('dragover', function(e) {
e.stopPropagation();
e.preventDefault();
e.originalEvent.dataTransfer.dropEffect = 'copy';
$(this).addClass(hover);
})
.on('drop', function(e) {
dialog.elfinderdialog('close');
targets && (e.originalEvent._target = targets[0]);
dropUpload(e.originalEvent);
})
.prependTo(dialog)
.after('
'+fm.i18n('or')+'
')[0];
} else {
pastebox = $('
'+fm.i18n('dropFilesBrowser')+'
')
.on('paste drop', function(e){
paste(e);
})
.on('mousedown click', function(){
$(this).focus();
})
.on('focus', function(){
this.innerHTML = '';
})
.on('dragenter mouseover', function(){
$(this).addClass(hover);
})
.on('dragleave mouseout', function(){
$(this).removeClass(hover);
})
.prependTo(dialog)
.after('
'+fm.i18n('or')+'
')[0];
}
uidialog = fm.dialog(dialog, {
title : this.title + '
' + (targetDir? ' - ' + fm.escape(targetDir.i18 || targetDir.name) : '') + '',
modal : true,
resizable : false,
destroyOnClose : true,
close : function() {
var cm = fm.getUI('contextmenu');
if (cm.is(':visible')) {
cm.click();
}
}
});
return dfrd;
};
};
/*
* File: /js/commands/view.js
*/
/**
* @class elFinder command "view"
* Change current directory view (icons/list)
*
* @author Dmitry (dio) Levashov
**/
elFinder.prototype.commands.view = function() {
"use strict";
var fm = this.fm;
this.value = fm.viewType;
this.alwaysEnabled = true;
this.updateOnSelect = false;
this.options = { ui : 'viewbutton'};
this.getstate = function() {
return 0;
};
this.exec = function() {
var self = this,
value = fm.storage('view', this.value == 'list' ? 'icons' : 'list');
return fm.lazy(function() {
fm.viewchange();
self.update(void(0), value);
this.resolve();
});
};
};
return elFinder;
}));