3 /** This file is part of KCFinder project
5 * @desc File related functionality
8 * @author Pavel Tzonkov <pavelc@users.sourceforge.net>
9 * @copyright 2010, 2011 KCFinder Project
10 * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2
11 * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2
12 * @link http://kcfinder.sunhater.com
15 browser.initFiles = function() {
16 $(document).unbind('keydown');
17 $(document).keydown(function(e) {
18 return !browser.selectAll(e);
21 $('#files').scroll(function() {
25 $('.file').click(function(e) {
27 browser.selectFile($(this), e);
29 $('.file').rightClick(function(e) {
31 browser.menuFile($(this), e);
33 $('.file').dblclick(function() {
35 browser.returnFile($(this));
37 $('.file').mouseup(function() {
40 $('.file').mouseout(function() {
43 $.each(this.shows, function(i, val) {
44 var display = (_.kuki.get('show' + val) == 'off')
46 $('#files .file div.' + val).css('display', display);
51 browser.showFiles = function(callBack, selected) {
53 setTimeout(function() {
55 $.each(browser.files, function(i, file) {
57 $.each(file, function(key, val) {
58 stamp[stamp.length] = key + "|" + val;
60 stamp = _.md5(stamp.join('|'));
61 if (_.kuki.get('view') == 'list') {
62 if (!i) html += '<table summary="list">';
63 var icon = _.getFileExtension(file.name);
66 else if (!icon.length || !file.smallIcon)
68 icon = 'themes/' + browser.theme + '/img/files/small/' + icon + '.png';
69 html += '<tr class="file">' +
70 '<td class="name" style="background-image:url(' + icon + ')">' + _.htmlData(file.name) + '</td>' +
71 '<td class="time">' + file.date + '</td>' +
72 '<td class="size">' + browser.humanSize(file.size) + '</td>' +
74 if (i == browser.files.length - 1) html += '</table>';
77 var icon = browser.baseGetData('thumb') + '&file=' + encodeURIComponent(file.name) + '&dir=' + encodeURIComponent(browser.dir) + '&stamp=' + stamp;
78 else if (file.smallThumb) {
79 var icon = browser.uploadURL + '/' + browser.dir + '/' + file.name;
80 icon = _.escapeDirs(icon).replace(/\'/g, "%27");
82 var icon = file.bigIcon ? _.getFileExtension(file.name) : '.';
83 if (!icon.length) icon = '.';
84 icon = 'themes/' + browser.theme + '/img/files/big/' + icon + '.png';
86 html += '<div class="file">' +
87 '<div class="thumb" style="background-image:url(\'' + icon + '\')" ></div>' +
88 '<div class="name">' + _.htmlData(file.name) + '</div>' +
89 '<div class="time">' + file.date + '</div>' +
90 '<div class="size">' + browser.humanSize(file.size) + '</div>' +
94 $('#files').html('<div>' + html + '<div>');
95 $.each(browser.files, function(i, file) {
96 var item = $('#files .file').get(i);
98 if (_.inArray(file.name, selected) ||
99 ((typeof selected != 'undefined') && !selected.push && (file.name == selected))
101 $(item).addClass('selected');
103 $('#files > div').css({opacity:'', filter:''});
104 if (callBack) callBack();
109 browser.selectFile = function(file, e) {
110 if (e.ctrlKey || e.metaKey) {
111 if (file.hasClass('selected'))
112 file.removeClass('selected');
114 file.addClass('selected');
115 var files = $('.file.selected').get();
120 $.each(files, function(i, cfile) {
121 size += parseInt($(cfile).data('size'));
123 size = this.humanSize(size);
124 if (files.length > 1)
125 $('#fileinfo').html(files.length + ' ' + this.label("selected files") + ' (' + size + ')');
127 var data = $(files[0]).data();
128 $('#fileinfo').html(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
132 var data = file.data();
133 $('.file').removeClass('selected');
134 file.addClass('selected');
135 $('#fileinfo').html(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
139 browser.selectAll = function(e) {
140 if ((!e.ctrlKey && !e.metaKey) || ((e.keyCode != 65) && (e.keyCode != 97)))
142 var files = $('.file').get();
145 $.each(files, function(i, file) {
146 if (!$(file).hasClass('selected'))
147 $(file).addClass('selected');
148 size += parseInt($(file).data('size'));
150 size = this.humanSize(size);
151 $('#fileinfo').html(files.length + ' ' + this.label("selected files") + ' (' + size + ')');
156 browser.returnFile = function(file) {
158 var fileURL = file.substr
159 ? file : browser.uploadURL + '/' + browser.dir + '/' + file.data('name');
160 fileURL = _.escapeDirs(fileURL);
162 if (this.opener.CKEditor) {
163 this.opener.CKEditor.object.tools.callFunction(this.opener.CKEditor.funcNum, fileURL, '');
166 } else if (this.opener.FCKeditor) {
167 window.opener.SetUrl(fileURL) ;
170 } else if (this.opener.TinyMCE) {
171 var win = tinyMCEPopup.getWindowArg('window');
172 win.document.getElementById(tinyMCEPopup.getWindowArg('input')).value = fileURL;
173 if (win.getImageData) win.getImageData();
174 if (typeof(win.ImageDialog) != "undefined") {
175 if (win.ImageDialog.getImageData)
176 win.ImageDialog.getImageData();
177 if (win.ImageDialog.showPreviewImage)
178 win.ImageDialog.showPreviewImage(fileURL);
180 tinyMCEPopup.close();
182 } else if (this.opener.callBack) {
184 if (window.opener && window.opener.KCFinder) {
185 this.opener.callBack(fileURL);
189 if (window.parent && window.parent.KCFinder) {
190 var button = $('#toolbar a[href="kcact:maximize"]');
191 if (button.hasClass('selected'))
192 this.maximize(button);
193 this.opener.callBack(fileURL);
196 } else if (this.opener.callBackMultiple) {
197 if (window.opener && window.opener.KCFinder) {
198 this.opener.callBackMultiple([fileURL]);
202 if (window.parent && window.parent.KCFinder) {
203 var button = $('#toolbar a[href="kcact:maximize"]');
204 if (button.hasClass('selected'))
205 this.maximize(button);
206 this.opener.callBackMultiple([fileURL]);
212 browser.returnFiles = function(files) {
213 if (this.opener.callBackMultiple && files.length) {
215 $.each(files, function(i, file) {
216 rfiles[i] = browser.uploadURL + '/' + browser.dir + '/' + $(file).data('name');
217 rfiles[i] = _.escapeDirs(rfiles[i]);
219 this.opener.callBackMultiple(rfiles);
220 if (window.opener) window.close()
224 browser.returnThumbnails = function(files) {
225 if (this.opener.callBackMultiple) {
228 $.each(files, function(i, file) {
229 if ($(file).data('thumb')) {
230 rfiles[j] = browser.thumbsURL + '/' + browser.dir + '/' + $(file).data('name');
231 rfiles[j] = _.escapeDirs(rfiles[j++]);
234 this.opener.callBackMultiple(rfiles);
235 if (window.opener) window.close()
239 browser.menuFile = function(file, e) {
240 var data = file.data();
241 var path = this.dir + '/' + data.name;
242 var files = $('.file.selected').get();
245 if (file.hasClass('selected') && files.length && (files.length > 1)) {
249 $.each(files, function(i, cfile) {
250 cdata = $(cfile).data();
251 if (cdata.thumb) thumb = true;
252 if (!data.writable) notWritable++;
254 if (this.opener.callBackMultiple) {
255 html += '<a href="kcact:pick">' + this.label("Select") + '</a>';
257 '<a href="kcact:pick_thumb">' + this.label("Select Thumbnails") + '</a>';
259 if (data.thumb || data.smallThumb || this.support.zip) {
260 html += (html.length ? '<div class="delimiter"></div>' : '');
261 if (data.thumb || data.smallThumb)
262 html +='<a href="kcact:view">' + this.label("View") + '</a>';
263 if (this.support.zip) html += (html.length ? '<div class="delimiter"></div>' : '') +
264 '<a href="kcact:download">' + this.label("Download") + '</a>';
267 if (this.access.files.copy || this.access.files.move)
268 html += (html.length ? '<div class="delimiter"></div>' : '') +
269 '<a href="kcact:clpbrdadd">' + this.label("Add to Clipboard") + '</a>';
270 if (this.access.files['delete'])
271 html += (html.length ? '<div class="delimiter"></div>' : '') +
272 '<a href="kcact:rm"' + ((notWritable == files.length) ? ' class="denied"' : '') +
273 '>' + this.label("Delete") + '</a>';
276 html = '<div class="menu">' + html + '</div>';
277 $('#dialog').html(html);
282 $('.menu a[href="kcact:pick"]').click(function() {
283 browser.returnFiles(files);
284 browser.hideDialog();
288 $('.menu a[href="kcact:pick_thumb"]').click(function() {
289 browser.returnThumbnails(files);
290 browser.hideDialog();
294 $('.menu a[href="kcact:download"]').click(function() {
295 browser.hideDialog();
297 $.each(files, function(i, cfile) {
298 pfiles[i] = $(cfile).data('name');
300 browser.post(browser.baseGetData('downloadSelected'), {dir:browser.dir, files:pfiles});
304 $('.menu a[href="kcact:clpbrdadd"]').click(function() {
305 browser.hideDialog();
307 $.each(files, function(i, cfile) {
308 var cdata = $(cfile).data();
310 for (i = 0; i < browser.clipboard.length; i++)
311 if ((browser.clipboard[i].name == cdata.name) &&
312 (browser.clipboard[i].dir == browser.dir)
315 msg += cdata.name + ": " + browser.label("This file is already added to the Clipboard.") + "\n";
320 cdata.dir = browser.dir;
321 browser.clipboard[browser.clipboard.length] = cdata;
324 browser.initClipboard();
325 if (msg.length) browser.alert(msg.substr(0, msg.length - 1));
329 $('.menu a[href="kcact:rm"]').click(function() {
330 if ($(this).hasClass('denied')) return false;
331 browser.hideDialog();
334 $.each(files, function(i, cfile) {
335 var cdata = $(cfile).data();
339 dfiles[dfiles.length] = browser.dir + "/" + cdata.name;
341 if (failed == files.length) {
342 browser.alert(browser.label("The selected files are not removable."));
346 var go = function(callBack) {
351 url: browser.baseGetData('rm_cbd'),
352 data: {files:dfiles},
354 success: function(data) {
355 if (callBack) callBack();
356 browser.check4errors(data);
360 if (callBack) callBack();
361 $('#files > div').css({
365 browser.alert(browser.label("Unknown error."));
372 browser.label("{count} selected files are not removable. Do you want to delete the rest?", {count:failed}),
378 browser.label("Are you sure you want to delete all selected files?"),
386 html += '<div class="menu">';
387 $('.file').removeClass('selected');
388 file.addClass('selected');
389 $('#fileinfo').html(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
390 if (this.opener.callBack || this.opener.callBackMultiple) {
391 html += '<a href="kcact:pick">' + this.label("Select") + '</a>';
392 if (data.thumb) html +=
393 '<a href="kcact:pick_thumb">' + this.label("Select Thumbnail") + '</a>';
394 html += '<div class="delimiter"></div>';
397 if (data.thumb || data.smallThumb)
398 html +='<a href="kcact:view">' + this.label("View") + '</a>';
401 '<a href="kcact:download">' + this.label("Download") + '</a>';
403 if (this.access.files.copy || this.access.files.move)
404 html += '<div class="delimiter"></div>' +
405 '<a href="kcact:clpbrdadd">' + this.label("Add to Clipboard") + '</a>';
406 if (this.access.files.rename || this.access.files['delete'])
407 html += '<div class="delimiter"></div>';
408 if (this.access.files.rename)
409 html += '<a href="kcact:mv"' + (!data.writable ? ' class="denied"' : '') + '>' +
410 this.label("Rename...") + '</a>';
411 if (this.access.files['delete'])
412 html += '<a href="kcact:rm"' + (!data.writable ? ' class="denied"' : '') + '>' +
413 this.label("Delete") + '</a>';
416 $('#dialog').html(html);
419 $('.menu a[href="kcact:pick"]').click(function() {
420 browser.returnFile(file);
421 browser.hideDialog();
425 $('.menu a[href="kcact:pick_thumb"]').click(function() {
426 var path = browser.thumbsURL + '/' + browser.dir + '/' + data.name;
427 browser.returnFile(path);
428 browser.hideDialog();
432 $('.menu a[href="kcact:download"]').click(function() {
433 var html = '<form id="downloadForm" method="post" action="' + browser.baseGetData('download') + '">' +
434 '<input type="hidden" name="dir" />' +
435 '<input type="hidden" name="file" />' +
437 $('#dialog').html(html);
438 $('#downloadForm input').get(0).value = browser.dir;
439 $('#downloadForm input').get(1).value = data.name;
440 $('#downloadForm').submit();
444 $('.menu a[href="kcact:clpbrdadd"]').click(function() {
445 for (i = 0; i < browser.clipboard.length; i++)
446 if ((browser.clipboard[i].name == data.name) &&
447 (browser.clipboard[i].dir == browser.dir)
449 browser.hideDialog();
450 browser.alert(browser.label("This file is already added to the Clipboard."));
454 cdata.dir = browser.dir;
455 browser.clipboard[browser.clipboard.length] = cdata;
456 browser.initClipboard();
457 browser.hideDialog();
461 $('.menu a[href="kcact:mv"]').click(function(e) {
462 if (!data.writable) return false;
463 browser.fileNameDialog(
464 e, {dir: browser.dir, file: data.name},
465 'newName', data.name, browser.baseGetData('rename'), {
466 title: "New file name:",
467 errEmpty: "Please enter new file name.",
468 errSlash: "Unallowable characters in file name.",
469 errDot: "File name shouldn't begins with '.'"
478 $('.menu a[href="kcact:rm"]').click(function() {
479 if (!data.writable) return false;
480 browser.hideDialog();
481 browser.confirm(browser.label("Are you sure you want to delete this file?"),
486 url: browser.baseGetData('delete'),
487 data: {dir:browser.dir, file:data.name},
489 success: function(data) {
490 if (callBack) callBack();
491 browser.clearClipboard();
492 if (browser.check4errors(data))
497 if (callBack) callBack();
498 browser.alert(browser.label("Unknown error."));
507 $('.menu a[href="kcact:view"]').click(function() {
508 browser.hideDialog();
509 var ts = new Date().getTime();
510 var showImage = function(data) {
511 url = _.escapeDirs(browser.uploadURL + '/' + browser.dir + '/' + data.name) + '?ts=' + ts,
512 $('#loading').html(browser.label("Loading image..."));
513 $('#loading').css('display', 'inline');
514 var img = new Image();
516 img.onerror = function() {
517 browser.lock = false;
518 $('#loading').css('display', 'none');
519 browser.alert(browser.label("Unknown error."));
520 $(document).unbind('keydown');
521 $(document).keydown(function(e) {
522 return !browser.selectAll(e);
526 var onImgLoad = function() {
527 browser.lock = false;
528 $('#files .file').each(function() {
529 if ($(this).data('name') == data.name)
530 browser.ssImage = this;
532 $('#loading').css('display', 'none');
533 $('#dialog').html('<div class="slideshow"><img /></div>');
534 $('#dialog img').attr({
537 }).fadeIn('fast', function() {
538 var o_w = $('#dialog').outerWidth();
539 var o_h = $('#dialog').outerHeight();
540 var f_w = $(window).width() - 30;
541 var f_h = $(window).height() - 30;
542 if ((o_w > f_w) || (o_h > f_h)) {
543 if ((f_w / f_h) > (o_w / o_h))
544 f_w = parseInt((o_w * f_h) / o_h);
545 else if ((f_w / f_h) < (o_w / o_h))
546 f_h = parseInt((o_h * f_w) / o_w);
547 $('#dialog img').attr({
552 $('#dialog').unbind('click');
553 $('#dialog').click(function(e) {
554 browser.hideDialog();
555 $(document).unbind('keydown');
556 $(document).keydown(function(e) {
557 return !browser.selectAll(e);
559 if (browser.ssImage) {
560 browser.selectFile($(browser.ssImage), e);
563 browser.showDialog();
565 $.each(browser.files, function(i, file) {
566 if (file.thumb || file.smallThumb)
567 images[images.length] = file;
570 $.each(images, function(i, image) {
571 if (image.name == data.name) {
572 $(document).unbind('keydown');
573 $(document).keydown(function(e) {
574 if (images.length > 1) {
575 if (!browser.lock && (e.keyCode == 37)) {
578 : images[images.length - 1];
582 if (!browser.lock && (e.keyCode == 39)) {
583 var nimg = (i >= images.length - 1)
590 if (e.keyCode == 27) {
591 browser.hideDialog();
592 $(document).unbind('keydown');
593 $(document).keydown(function(e) {
594 return !browser.selectAll(e);
605 img.onload = onImgLoad;