OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / scripts / kcfinder-2.51 / js / browser / files.js
1 <?php
2
3 /** This file is part of KCFinder project
4   *
5   *      @desc File related functionality
6   *   @package KCFinder
7   *   @version 2.51
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
13   */?>
14
15 browser.initFiles = function() {
16     $(document).unbind('keydown');
17     $(document).keydown(function(e) {
18         return !browser.selectAll(e);
19     });
20     $('#files').unbind();
21     $('#files').scroll(function() {
22         browser.hideDialog();
23     });
24     $('.file').unbind();
25     $('.file').click(function(e) {
26         _.unselect();
27         browser.selectFile($(this), e);
28     });
29     $('.file').rightClick(function(e) {
30         _.unselect();
31         browser.menuFile($(this), e);
32     });
33     $('.file').dblclick(function() {
34         _.unselect();
35         browser.returnFile($(this));
36     });
37     $('.file').mouseup(function() {
38         _.unselect();
39     });
40     $('.file').mouseout(function() {
41         _.unselect();
42     });
43     $.each(this.shows, function(i, val) {
44         var display = (_.kuki.get('show' + val) == 'off')
45             ? 'none' : 'block';
46         $('#files .file div.' + val).css('display', display);
47     });
48     this.statusDir();
49 };
50
51 browser.showFiles = function(callBack, selected) {
52     this.fadeFiles();
53     setTimeout(function() {
54         var html = '';
55         $.each(browser.files, function(i, file) {
56             var stamp = [];
57             $.each(file, function(key, val) {
58                 stamp[stamp.length] = key + "|" + val;
59             });
60             stamp = _.md5(stamp.join('|'));
61             if (_.kuki.get('view') == 'list') {
62                 if (!i) html += '<table summary="list">';
63                 var icon = _.getFileExtension(file.name);
64                 if (file.thumb)
65                     icon = '.image';
66                 else if (!icon.length || !file.smallIcon)
67                     icon = '.';
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>' +
73                 '</tr>';
74                 if (i == browser.files.length - 1) html += '</table>';
75             } else {
76                 if (file.thumb)
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");
81                 } else {
82                     var icon = file.bigIcon ? _.getFileExtension(file.name) : '.';
83                     if (!icon.length) icon = '.';
84                     icon = 'themes/' + browser.theme + '/img/files/big/' + icon + '.png';
85                 }
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>' +
91                 '</div>';
92             }
93         });
94         $('#files').html('<div>' + html + '<div>');
95         $.each(browser.files, function(i, file) {
96             var item = $('#files .file').get(i);
97             $(item).data(file);
98             if (_.inArray(file.name, selected) ||
99                 ((typeof selected != 'undefined') && !selected.push && (file.name == selected))
100             )
101                 $(item).addClass('selected');
102         });
103         $('#files > div').css({opacity:'', filter:''});
104         if (callBack) callBack();
105         browser.initFiles();
106     }, 200);
107 };
108
109 browser.selectFile = function(file, e) {
110     if (e.ctrlKey || e.metaKey) {
111         if (file.hasClass('selected'))
112             file.removeClass('selected');
113         else
114             file.addClass('selected');
115         var files = $('.file.selected').get();
116         var size = 0;
117         if (!files.length)
118             this.statusDir();
119         else {
120             $.each(files, function(i, cfile) {
121                 size += parseInt($(cfile).data('size'));
122             });
123             size = this.humanSize(size);
124             if (files.length > 1)
125                 $('#fileinfo').html(files.length + ' ' + this.label("selected files") + ' (' + size + ')');
126             else {
127                 var data = $(files[0]).data();
128                 $('#fileinfo').html(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
129             }
130         }
131     } else {
132         var data = file.data();
133         $('.file').removeClass('selected');
134         file.addClass('selected');
135         $('#fileinfo').html(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
136     }
137 };
138
139 browser.selectAll = function(e) {
140     if ((!e.ctrlKey && !e.metaKey) || ((e.keyCode != 65) && (e.keyCode != 97)))
141         return false;
142     var files = $('.file').get();
143     if (files.length) {
144         var size = 0;
145         $.each(files, function(i, file) {
146             if (!$(file).hasClass('selected'))
147                 $(file).addClass('selected');
148             size += parseInt($(file).data('size'));
149         });
150         size = this.humanSize(size);
151         $('#fileinfo').html(files.length + ' ' + this.label("selected files") + ' (' + size + ')');
152     }
153     return true;
154 };
155
156 browser.returnFile = function(file) {
157
158     var fileURL = file.substr
159         ? file : browser.uploadURL + '/' + browser.dir + '/' + file.data('name');
160     fileURL = _.escapeDirs(fileURL);
161
162     if (this.opener.CKEditor) {
163         this.opener.CKEditor.object.tools.callFunction(this.opener.CKEditor.funcNum, fileURL, '');
164         window.close();
165
166     } else if (this.opener.FCKeditor) {
167         window.opener.SetUrl(fileURL) ;
168         window.close() ;
169
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);
179         }
180         tinyMCEPopup.close();
181
182     } else if (this.opener.callBack) {
183
184         if (window.opener && window.opener.KCFinder) {
185             this.opener.callBack(fileURL);
186             window.close();
187         }
188
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);
194         }
195
196     } else if (this.opener.callBackMultiple) {
197         if (window.opener && window.opener.KCFinder) {
198             this.opener.callBackMultiple([fileURL]);
199             window.close();
200         }
201
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]);
207         }
208
209     }
210 };
211
212 browser.returnFiles = function(files) {
213     if (this.opener.callBackMultiple && files.length) {
214         var rfiles = [];
215         $.each(files, function(i, file) {
216             rfiles[i] = browser.uploadURL + '/' + browser.dir + '/' + $(file).data('name');
217             rfiles[i] = _.escapeDirs(rfiles[i]);
218         });
219         this.opener.callBackMultiple(rfiles);
220         if (window.opener) window.close()
221     }
222 };
223
224 browser.returnThumbnails = function(files) {
225     if (this.opener.callBackMultiple) {
226         var rfiles = [];
227         var j = 0;
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++]);
232             }
233         });
234         this.opener.callBackMultiple(rfiles);
235         if (window.opener) window.close()
236     }
237 };
238
239 browser.menuFile = function(file, e) {
240     var data = file.data();
241     var path = this.dir + '/' + data.name;
242     var files = $('.file.selected').get();
243     var html = '';
244
245     if (file.hasClass('selected') && files.length && (files.length > 1)) {
246         var thumb = false;
247         var notWritable = 0;
248         var cdata;
249         $.each(files, function(i, cfile) {
250             cdata = $(cfile).data();
251             if (cdata.thumb) thumb = true;
252             if (!data.writable) notWritable++;
253         });
254         if (this.opener.callBackMultiple) {
255             html += '<a href="kcact:pick">' + this.label("Select") + '</a>';
256             if (thumb) html +=
257                 '<a href="kcact:pick_thumb">' + this.label("Select Thumbnails") + '</a>';
258         }
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>';
265         }
266
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>';
274
275         if (html.length) {
276             html = '<div class="menu">' + html + '</div>';
277             $('#dialog').html(html);
278             this.showMenu(e);
279         } else
280             return;
281
282         $('.menu a[href="kcact:pick"]').click(function() {
283             browser.returnFiles(files);
284             browser.hideDialog();
285             return false;
286         });
287
288         $('.menu a[href="kcact:pick_thumb"]').click(function() {
289             browser.returnThumbnails(files);
290             browser.hideDialog();
291             return false;
292         });
293
294         $('.menu a[href="kcact:download"]').click(function() {
295             browser.hideDialog();
296             var pfiles = [];
297             $.each(files, function(i, cfile) {
298                 pfiles[i] = $(cfile).data('name');
299             });
300             browser.post(browser.baseGetData('downloadSelected'), {dir:browser.dir, files:pfiles});
301             return false;
302         });
303
304         $('.menu a[href="kcact:clpbrdadd"]').click(function() {
305             browser.hideDialog();
306             var msg = '';
307             $.each(files, function(i, cfile) {
308                 var cdata = $(cfile).data();
309                 var failed = false;
310                 for (i = 0; i < browser.clipboard.length; i++)
311                     if ((browser.clipboard[i].name == cdata.name) &&
312                         (browser.clipboard[i].dir == browser.dir)
313                     ) {
314                         failed = true
315                         msg += cdata.name + ": " + browser.label("This file is already added to the Clipboard.") + "\n";
316                         break;
317                     }
318
319                 if (!failed) {
320                     cdata.dir = browser.dir;
321                     browser.clipboard[browser.clipboard.length] = cdata;
322                 }
323             });
324             browser.initClipboard();
325             if (msg.length) browser.alert(msg.substr(0, msg.length - 1));
326             return false;
327         });
328
329         $('.menu a[href="kcact:rm"]').click(function() {
330             if ($(this).hasClass('denied')) return false;
331             browser.hideDialog();
332             var failed = 0;
333             var dfiles = [];
334             $.each(files, function(i, cfile) {
335                 var cdata = $(cfile).data();
336                 if (!cdata.writable)
337                     failed++;
338                 else
339                     dfiles[dfiles.length] = browser.dir + "/" + cdata.name;
340             });
341             if (failed == files.length) {
342                 browser.alert(browser.label("The selected files are not removable."));
343                 return false;
344             }
345
346             var go = function(callBack) {
347                 browser.fadeFiles();
348                 $.ajax({
349                     type: 'POST',
350                     dataType: 'json',
351                     url: browser.baseGetData('rm_cbd'),
352                     data: {files:dfiles},
353                     async: false,
354                     success: function(data) {
355                         if (callBack) callBack();
356                         browser.check4errors(data);
357                         browser.refresh();
358                     },
359                     error: function() {
360                         if (callBack) callBack();
361                         $('#files > div').css({
362                             opacity: '',
363                             filter: ''
364                         });
365                         browser.alert(browser.label("Unknown error."));
366                     }
367                 });
368             };
369
370             if (failed)
371                 browser.confirm(
372                     browser.label("{count} selected files are not removable. Do you want to delete the rest?", {count:failed}),
373                     go
374                 )
375
376             else
377                 browser.confirm(
378                     browser.label("Are you sure you want to delete all selected files?"),
379                     go
380                 );
381
382             return false;
383         });
384
385     } else {
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>';
395         }
396
397         if (data.thumb || data.smallThumb)
398             html +='<a href="kcact:view">' + this.label("View") + '</a>';
399
400         html +=
401             '<a href="kcact:download">' + this.label("Download") + '</a>';
402
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>';
414         html += '</div>';
415
416         $('#dialog').html(html);
417         this.showMenu(e);
418
419         $('.menu a[href="kcact:pick"]').click(function() {
420             browser.returnFile(file);
421             browser.hideDialog();
422             return false;
423         });
424
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();
429             return false;
430         });
431
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" />' +
436             '</form>';
437             $('#dialog').html(html);
438             $('#downloadForm input').get(0).value = browser.dir;
439             $('#downloadForm input').get(1).value = data.name;
440             $('#downloadForm').submit();
441             return false;
442         });
443
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)
448                 ) {
449                     browser.hideDialog();
450                     browser.alert(browser.label("This file is already added to the Clipboard."));
451                     return false;
452                 }
453             var cdata = data;
454             cdata.dir = browser.dir;
455             browser.clipboard[browser.clipboard.length] = cdata;
456             browser.initClipboard();
457             browser.hideDialog();
458             return false;
459         });
460
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 '.'"
470                 },
471                 function() {
472                     browser.refresh();
473                 }
474             );
475             return false;
476         });
477
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?"),
482                 function(callBack) {
483                     $.ajax({
484                         type: 'POST',
485                         dataType: 'json',
486                         url: browser.baseGetData('delete'),
487                         data: {dir:browser.dir, file:data.name},
488                         async: false,
489                         success: function(data) {
490                             if (callBack) callBack();
491                             browser.clearClipboard();
492                             if (browser.check4errors(data))
493                                 return;
494                             browser.refresh();
495                         },
496                         error: function() {
497                             if (callBack) callBack();
498                             browser.alert(browser.label("Unknown error."));
499                         }
500                     });
501                 }
502             );
503             return false;
504         });
505     }
506
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();
515             img.src = url;
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);
523                 });
524                 browser.refresh();
525             };
526             var onImgLoad = function() {
527                 browser.lock = false;
528                 $('#files .file').each(function() {
529                     if ($(this).data('name') == data.name)
530                         browser.ssImage = this;
531                 });
532                 $('#loading').css('display', 'none');
533                 $('#dialog').html('<div class="slideshow"><img /></div>');
534                 $('#dialog img').attr({
535                     src: url,
536                     title: data.name
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({
548                             width: f_w,
549                             height: f_h
550                         });
551                     }
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);
558                         });
559                         if (browser.ssImage) {
560                             browser.selectFile($(browser.ssImage), e);
561                         }
562                     });
563                     browser.showDialog();
564                     var images = [];
565                     $.each(browser.files, function(i, file) {
566                         if (file.thumb || file.smallThumb)
567                             images[images.length] = file;
568                     });
569                     if (images.length)
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)) {
576                                             var nimg = i
577                                                 ? images[i - 1]
578                                                 : images[images.length - 1];
579                                             browser.lock = true;
580                                             showImage(nimg);
581                                         }
582                                         if (!browser.lock && (e.keyCode == 39)) {
583                                             var nimg = (i >= images.length - 1)
584                                                 ? images[0]
585                                                 : images[i + 1];
586                                             browser.lock = true;
587                                             showImage(nimg);
588                                         }
589                                     }
590                                     if (e.keyCode == 27) {
591                                         browser.hideDialog();
592                                         $(document).unbind('keydown');
593                                         $(document).keydown(function(e) {
594                                             return !browser.selectAll(e);
595                                         });
596                                     }
597                                 });
598                             }
599                         });
600                 });
601             };
602             if (img.complete)
603                 onImgLoad();
604             else
605                 img.onload = onImgLoad;
606         };
607         showImage(data);
608         return false;
609     });
610 };