3 * elFinder transport to support old protocol.
6 * $('selector').elfinder({
8 * transport : new elFinderSupportVer1()
11 * @author Dmitry (dio) Levashov
13 window.elFinderSupportVer1 = function(upload) {
16 this.upload = upload || 'auto';
18 this.init = function(fm) {
20 this.fm.parseUploadData = function(text) {
24 return {error : ['errResponse', 'errDataEmpty']};
28 data = $.parseJSON(text);
30 return {error : ['errResponse', 'errDataNotJSON']}
33 return self.normalize('upload', data);
38 this.send = function(opts) {
48 dfrd.abort = function() {
49 !xhr.isRejected() && !xhr.isResolved() && xhr.abort();
58 return dfrd.resolve({tree : []});
61 opts.data.cmd = 'read';
62 opts.data.current = fm.file(opts.data.target).phash;
65 opts.data.cmd = 'edit';
66 opts.data.current = fm.file(opts.data.target).phash;
70 opts.data.current = fm.file(opts.data.targets[0]).phash;
75 opts.data.current = fm.file(opts.data.target).phash;
78 _opts = $.extend(true, {}, opts);
80 $.each(opts.data.targets, function(i, hash) {
81 $.ajax($.extend(_opts, {data : {cmd : 'duplicate', target : hash, current : fm.file(hash).phash}}))
82 .error(function(error) {
83 fm.error(fm.res('error', 'connect'));
85 .done(function(data) {
86 data = self.normalize('duplicate', data);
89 } else if (data.added) {
90 fm.trigger('add', {added : data.added});
94 return dfrd.resolve({})
99 opts.data.current = opts.data.target;
102 opts.data.current = opts.data.dst
106 return dfrd.resolve({error : fm.res('error', 'cmdsupport')});
109 return dfrd.resolve({error : fm.res('error', 'cmdsupport')});
113 // cmd = opts.data.cmd
116 .fail(function(error) {
119 .done(function(raw) {
120 data = self.normalize(cmd, raw);
122 // cmd != 'open' && self.fm.log(data);
124 if (cmd == 'paste' && !data.error) {
137 // fix old connectors errors messages as possible
139 // 'Unknown command' : 'Unknown command.',
140 // 'Invalid backend configuration' : 'Invalid backend configuration.',
141 // 'Access denied' : 'Access denied.',
142 // 'PHP JSON module not installed' : 'PHP JSON module not installed.',
143 // 'File not found' : 'File not found.',
144 // 'Invalid name' : 'Invalid file name.',
145 // 'File or folder with the same name already exists' : 'File named "$1" already exists in this location.',
146 // 'Not allowed file type' : 'Not allowed file type.',
147 // 'File exceeds the maximum allowed filesize' : 'File exceeds maximum allowed size.',
148 // 'Unable to copy into itself' : 'Unable to copy "$1" into itself.',
149 // 'Unable to create archive' : 'Unable to create archive.',
150 // 'Unable to extract files from archive' : 'Unable to extract files from "$1".'
153 this.normalize = function(cmd, data) {
156 filter = function(file) { return file && file.hash && file.name && file.mime ? file : null; },
159 if ((cmd == 'tmb' || cmd == 'get')) {
164 // $.each(data.error, function(i, msg) {
165 // if (self.errors[msg]) {
166 // data.error[i] = self.errors[msg];
171 if (cmd == 'upload' && data.error && data.cwd) {
172 data.warning = $.extend({}, data.error);
183 phash = this.fm.file(data.target.hash).phash;
184 return {changed : [this.normalizeFile(data.target, phash)]};
187 phash = data.cwd.hash;
190 $.each(this.normalizeTree(data.tree), function(i, file) {
191 files[file.hash] = file;
195 $.each(data.cdc||[], function(i, file) {
196 var hash = file.hash;
199 files[hash].date = file.date;
200 files[hash].locked = file.hash == phash ? true : file.rm === void(0) ? false : !file.rm;
202 files[hash] = self.normalizeFile(file, phash, data.tmb);
207 $.each(this.fm.files(), function(hash, file) {
208 if (!files[hash] && file.phash != phash && file.mime == 'directory') {
216 cwd : files[phash] || this.normalizeFile(data.cwd),
217 files : $.map(files, function(f) { return f }),
218 options : self.normalizeOptions(data),
219 init : !!data.params,
227 current : data.cwd.hash,
229 warning : data.warning,
230 options : {tmb : !!data.tmb}
231 }, this.fm.diff($.map(files, filter)));
236 * Convert old api tree into plain array of dirs
238 * @param Object root dir
241 this.normalizeTree = function(root) {
244 traverse = function(dirs, phash) {
247 for (i = 0; i < dirs.length; i++) {
249 result.push(self.normalizeFile(dir, phash))
250 dir.dirs.length && traverse(dir.dirs, dir.hash);
260 * Convert file info from old api format into new one
263 * @param String parent dir hash
266 this.normalizeFile = function(file, phash, tmb) {
267 var mime = file.mime || 'directory',
268 size = mime == 'directory' && !file.linkTo ? 0 : file.size,
275 date : file.date || 'unknown',
279 locked : !phash ? true : file.rm === void(0) ? false : !file.rm
282 if (file.mime == 'application/x-empty') {
283 info.mime = 'text/plain';
286 info.alias = file.linkTo;
290 info.linkTo = file.linkTo;
295 } else if (info.mime.indexOf('image/') === 0 && tmb) {
300 if (file.dirs && file.dirs.length) {
307 info.resize = file.resize;
312 this.normalizeOptions = function(data) {
315 disabled : data.disabled || [],
322 opts.url = data.params.url;
324 create : data.params.archives || [],
325 extract : data.params.extract || []
329 if (opts.path.indexOf('/') !== -1) {
330 opts.separator = '/';
331 } else if (opts.path.indexOf('\\') !== -1) {
332 opts.separator = '\\';