1 | <?php
|
---|
2 |
|
---|
3 | /** This file is part of KCFinder project
|
---|
4 | *
|
---|
5 | * @desc Folder 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.initFolders = function() {
|
---|
16 | $('#folders').scroll(function() {
|
---|
17 | browser.hideDialog();
|
---|
18 | });
|
---|
19 | $('div.folder > a').unbind();
|
---|
20 | $('div.folder > a').bind('click', function() {
|
---|
21 | browser.hideDialog();
|
---|
22 | return false;
|
---|
23 | });
|
---|
24 | $('div.folder > a > span.brace').unbind();
|
---|
25 | $('div.folder > a > span.brace').click(function() {
|
---|
26 | if ($(this).hasClass('opened') || $(this).hasClass('closed'))
|
---|
27 | browser.expandDir($(this).parent());
|
---|
28 | });
|
---|
29 | $('div.folder > a > span.folder').unbind();
|
---|
30 | $('div.folder > a > span.folder').click(function() {
|
---|
31 | browser.changeDir($(this).parent());
|
---|
32 | });
|
---|
33 | $('div.folder > a > span.folder').rightClick(function(e) {
|
---|
34 | _.unselect();
|
---|
35 | browser.menuDir($(this).parent(), e);
|
---|
36 | });
|
---|
37 |
|
---|
38 | if ($.browser.msie && $.browser.version &&
|
---|
39 | (parseInt($.browser.version.substr(0, 1)) < 8)
|
---|
40 | ) {
|
---|
41 | var fls = $('div.folder').get();
|
---|
42 | var body = $('body').get(0);
|
---|
43 | var div;
|
---|
44 | $.each(fls, function(i, folder) {
|
---|
45 | div = document.createElement('div');
|
---|
46 | div.style.display = 'inline';
|
---|
47 | div.style.margin = div.style.border = div.style.padding = '0';
|
---|
48 | div.innerHTML='<table style="border-collapse:collapse;border:0;margin:0;width:0"><tr><td nowrap="nowrap" style="white-space:nowrap;padding:0;border:0">' + $(folder).html() + "</td></tr></table>";
|
---|
49 | body.appendChild(div);
|
---|
50 | $(folder).css('width', $(div).innerWidth() + 'px');
|
---|
51 | body.removeChild(div);
|
---|
52 | });
|
---|
53 | }
|
---|
54 | };
|
---|
55 |
|
---|
56 | browser.setTreeData = function(data, path) {
|
---|
57 | if (!path)
|
---|
58 | path = '';
|
---|
59 | else if (path.length && (path.substr(path.length - 1, 1) != '/'))
|
---|
60 | path += '/';
|
---|
61 | path += data.name;
|
---|
62 | var selector = '#folders a[href="kcdir:/' + _.escapeDirs(path) + '"]';
|
---|
63 | $(selector).data({
|
---|
64 | name: data.name,
|
---|
65 | path: path,
|
---|
66 | readable: data.readable,
|
---|
67 | writable: data.writable,
|
---|
68 | removable: data.removable,
|
---|
69 | hasDirs: data.hasDirs
|
---|
70 | });
|
---|
71 | $(selector + ' span.folder').addClass(data.current ? 'current' : 'regular');
|
---|
72 | if (data.dirs && data.dirs.length) {
|
---|
73 | $(selector + ' span.brace').addClass('opened');
|
---|
74 | $.each(data.dirs, function(i, cdir) {
|
---|
75 | browser.setTreeData(cdir, path + '/');
|
---|
76 | });
|
---|
77 | } else if (data.hasDirs)
|
---|
78 | $(selector + ' span.brace').addClass('closed');
|
---|
79 | };
|
---|
80 |
|
---|
81 | browser.buildTree = function(root, path) {
|
---|
82 | if (!path) path = "";
|
---|
83 | path += root.name;
|
---|
84 | var html = '<div class="folder"><a href="kcdir:/' + _.escapeDirs(path) + '"><span class="brace"> </span><span class="folder">' + _.htmlData(root.name) + '</span></a>';
|
---|
85 | if (root.dirs) {
|
---|
86 | html += '<div class="folders">';
|
---|
87 | for (var i = 0; i < root.dirs.length; i++) {
|
---|
88 | cdir = root.dirs[i];
|
---|
89 | html += browser.buildTree(cdir, path + '/');
|
---|
90 | }
|
---|
91 | html += '</div>';
|
---|
92 | }
|
---|
93 | html += '</div>';
|
---|
94 | return html;
|
---|
95 | };
|
---|
96 |
|
---|
97 | browser.expandDir = function(dir) {
|
---|
98 | var path = dir.data('path');
|
---|
99 | if (dir.children('.brace').hasClass('opened')) {
|
---|
100 | dir.parent().children('.folders').hide(500, function() {
|
---|
101 | if (path == browser.dir.substr(0, path.length))
|
---|
102 | browser.changeDir(dir);
|
---|
103 | });
|
---|
104 | dir.children('.brace').removeClass('opened');
|
---|
105 | dir.children('.brace').addClass('closed');
|
---|
106 | } else {
|
---|
107 | if (dir.parent().children('.folders').get(0)) {
|
---|
108 | dir.parent().children('.folders').show(500);
|
---|
109 | dir.children('.brace').removeClass('closed');
|
---|
110 | dir.children('.brace').addClass('opened');
|
---|
111 | } else if (!$('#loadingDirs').get(0)) {
|
---|
112 | dir.parent().append('<div id="loadingDirs">' + this.label("Loading folders...") + '</div>');
|
---|
113 | $('#loadingDirs').css('display', 'none');
|
---|
114 | $('#loadingDirs').show(200, function() {
|
---|
115 | $.ajax({
|
---|
116 | type: 'POST',
|
---|
117 | dataType: 'json',
|
---|
118 | url: browser.baseGetData('expand'),
|
---|
119 | data: {dir:path},
|
---|
120 | async: false,
|
---|
121 | success: function(data) {
|
---|
122 | $('#loadingDirs').hide(200, function() {
|
---|
123 | $('#loadingDirs').detach();
|
---|
124 | });
|
---|
125 | if (browser.check4errors(data))
|
---|
126 | return;
|
---|
127 |
|
---|
128 | var html = '';
|
---|
129 | $.each(data.dirs, function(i, cdir) {
|
---|
130 | html += '<div class="folder"><a href="kcdir:/' + _.escapeDirs(path + '/' + cdir.name) + '"><span class="brace"> </span><span class="folder">' + _.htmlData(cdir.name) + '</span></a></div>';
|
---|
131 | });
|
---|
132 | if (html.length) {
|
---|
133 | dir.parent().append('<div class="folders">' + html + '</div>');
|
---|
134 | var folders = $(dir.parent().children('.folders').first());
|
---|
135 | folders.css('display', 'none');
|
---|
136 | $(folders).show(500);
|
---|
137 | $.each(data.dirs, function(i, cdir) {
|
---|
138 | browser.setTreeData(cdir, path);
|
---|
139 | });
|
---|
140 | }
|
---|
141 | if (data.dirs.length) {
|
---|
142 | dir.children('.brace').removeClass('closed');
|
---|
143 | dir.children('.brace').addClass('opened');
|
---|
144 | } else {
|
---|
145 | dir.children('.brace').removeClass('opened');
|
---|
146 | dir.children('.brace').removeClass('closed');
|
---|
147 | }
|
---|
148 | browser.initFolders();
|
---|
149 | browser.initDropUpload();
|
---|
150 | },
|
---|
151 | error: function() {
|
---|
152 | $('#loadingDirs').detach();
|
---|
153 | browser.alert(browser.label("Unknown error."));
|
---|
154 | }
|
---|
155 | });
|
---|
156 | });
|
---|
157 | }
|
---|
158 | }
|
---|
159 | };
|
---|
160 |
|
---|
161 | browser.changeDir = function(dir) {
|
---|
162 | if (dir.children('span.folder').hasClass('regular')) {
|
---|
163 | $('div.folder > a > span.folder').removeClass('current');
|
---|
164 | $('div.folder > a > span.folder').removeClass('regular');
|
---|
165 | $('div.folder > a > span.folder').addClass('regular');
|
---|
166 | dir.children('span.folder').removeClass('regular');
|
---|
167 | dir.children('span.folder').addClass('current');
|
---|
168 | $('#files').html(browser.label("Loading files..."));
|
---|
169 | $.ajax({
|
---|
170 | type: 'POST',
|
---|
171 | dataType: 'json',
|
---|
172 | url: browser.baseGetData('chDir'),
|
---|
173 | data: {dir:dir.data('path')},
|
---|
174 | async: false,
|
---|
175 | success: function(data) {
|
---|
176 | if (browser.check4errors(data))
|
---|
177 | return;
|
---|
178 | browser.files = data.files;
|
---|
179 | browser.orderFiles();
|
---|
180 | browser.dir = dir.data('path');
|
---|
181 | browser.dirWritable = data.dirWritable;
|
---|
182 | var title = "KCFinder: /" + browser.dir;
|
---|
183 | document.title = title;
|
---|
184 | if (browser.opener.TinyMCE)
|
---|
185 | tinyMCEPopup.editor.windowManager.setTitle(window, title);
|
---|
186 | browser.statusDir();
|
---|
187 | },
|
---|
188 | error: function() {
|
---|
189 | $('#files').html(browser.label("Unknown error."));
|
---|
190 | }
|
---|
191 | });
|
---|
192 | }
|
---|
193 | };
|
---|
194 |
|
---|
195 | browser.statusDir = function() {
|
---|
196 | for (var i = 0, size = 0; i < this.files.length; i++)
|
---|
197 | size += parseInt(this.files[i].size);
|
---|
198 | size = this.humanSize(size);
|
---|
199 | $('#fileinfo').html(this.files.length + ' ' + this.label("files") + ' (' + size + ')');
|
---|
200 | };
|
---|
201 |
|
---|
202 | browser.menuDir = function(dir, e) {
|
---|
203 | var data = dir.data();
|
---|
204 | var html = '<div class="menu">';
|
---|
205 | if (this.clipboard && this.clipboard.length) {
|
---|
206 | if (this.access.files.copy)
|
---|
207 | html += '<a href="kcact:cpcbd"' + (!data.writable ? ' class="denied"' : '') + '>' +
|
---|
208 | this.label("Copy {count} files", {count: this.clipboard.length}) + '</a>';
|
---|
209 | if (this.access.files.move)
|
---|
210 | html += '<a href="kcact:mvcbd"' + (!data.writable ? ' class="denied"' : '') + '>' +
|
---|
211 | this.label("Move {count} files", {count: this.clipboard.length}) + '</a>';
|
---|
212 | if (this.access.files.copy || this.access.files.move)
|
---|
213 | html += '<div class="delimiter"></div>';
|
---|
214 | }
|
---|
215 | html +=
|
---|
216 | '<a href="kcact:refresh">' + this.label("Refresh") + '</a>';
|
---|
217 | if (this.support.zip) html+=
|
---|
218 | '<div class="delimiter"></div>' +
|
---|
219 | '<a href="kcact:download">' + this.label("Download") + '</a>';
|
---|
220 | if (this.access.dirs.create || this.access.dirs.rename || this.access.dirs['delete'])
|
---|
221 | html += '<div class="delimiter"></div>';
|
---|
222 | if (this.access.dirs.create)
|
---|
223 | html += '<a href="kcact:mkdir"' + (!data.writable ? ' class="denied"' : '') + '>' +
|
---|
224 | this.label("New Subfolder...") + '</a>';
|
---|
225 | if (this.access.dirs.rename)
|
---|
226 | html += '<a href="kcact:mvdir"' + (!data.removable ? ' class="denied"' : '') + '>' +
|
---|
227 | this.label("Rename...") + '</a>';
|
---|
228 | if (this.access.dirs['delete'])
|
---|
229 | html += '<a href="kcact:rmdir"' + (!data.removable ? ' class="denied"' : '') + '>' +
|
---|
230 | this.label("Delete") + '</a>';
|
---|
231 | html += '</div>';
|
---|
232 |
|
---|
233 | $('#dialog').html(html);
|
---|
234 | this.showMenu(e);
|
---|
235 | $('div.folder > a > span.folder').removeClass('context');
|
---|
236 | if (dir.children('span.folder').hasClass('regular'))
|
---|
237 | dir.children('span.folder').addClass('context');
|
---|
238 |
|
---|
239 | if (this.clipboard && this.clipboard.length && data.writable) {
|
---|
240 |
|
---|
241 | $('.menu a[href="kcact:cpcbd"]').click(function() {
|
---|
242 | browser.hideDialog();
|
---|
243 | browser.copyClipboard(data.path);
|
---|
244 | return false;
|
---|
245 | });
|
---|
246 |
|
---|
247 | $('.menu a[href="kcact:mvcbd"]').click(function() {
|
---|
248 | browser.hideDialog();
|
---|
249 | browser.moveClipboard(data.path);
|
---|
250 | return false;
|
---|
251 | });
|
---|
252 | }
|
---|
253 |
|
---|
254 | $('.menu a[href="kcact:refresh"]').click(function() {
|
---|
255 | browser.hideDialog();
|
---|
256 | browser.refreshDir(dir);
|
---|
257 | return false;
|
---|
258 | });
|
---|
259 |
|
---|
260 | $('.menu a[href="kcact:download"]').click(function() {
|
---|
261 | browser.hideDialog();
|
---|
262 | browser.post(browser.baseGetData('downloadDir'), {dir:data.path});
|
---|
263 | return false;
|
---|
264 | });
|
---|
265 |
|
---|
266 | $('.menu a[href="kcact:mkdir"]').click(function(e) {
|
---|
267 | if (!data.writable) return false;
|
---|
268 | browser.hideDialog();
|
---|
269 | browser.fileNameDialog(
|
---|
270 | e, {dir: data.path},
|
---|
271 | 'newDir', '', browser.baseGetData('newDir'), {
|
---|
272 | title: "New folder name:",
|
---|
273 | errEmpty: "Please enter new folder name.",
|
---|
274 | errSlash: "Unallowable characters in folder name.",
|
---|
275 | errDot: "Folder name shouldn't begins with '.'"
|
---|
276 | }, function() {
|
---|
277 | browser.refreshDir(dir);
|
---|
278 | browser.initDropUpload();
|
---|
279 | if (!data.hasDirs) {
|
---|
280 | dir.data('hasDirs', true);
|
---|
281 | dir.children('span.brace').addClass('closed');
|
---|
282 | }
|
---|
283 | }
|
---|
284 | );
|
---|
285 | return false;
|
---|
286 | });
|
---|
287 |
|
---|
288 | $('.menu a[href="kcact:mvdir"]').click(function(e) {
|
---|
289 | if (!data.removable) return false;
|
---|
290 | browser.hideDialog();
|
---|
291 | browser.fileNameDialog(
|
---|
292 | e, {dir: data.path},
|
---|
293 | 'newName', data.name, browser.baseGetData('renameDir'), {
|
---|
294 | title: "New folder name:",
|
---|
295 | errEmpty: "Please enter new folder name.",
|
---|
296 | errSlash: "Unallowable characters in folder name.",
|
---|
297 | errDot: "Folder name shouldn't begins with '.'"
|
---|
298 | }, function(dt) {
|
---|
299 | if (!dt.name) {
|
---|
300 | browser.alert(browser.label("Unknown error."));
|
---|
301 | return;
|
---|
302 | }
|
---|
303 | var currentDir = (data.path == browser.dir);
|
---|
304 | dir.children('span.folder').html(_.htmlData(dt.name));
|
---|
305 | dir.data('name', dt.name);
|
---|
306 | dir.data('path', _.dirname(data.path) + '/' + dt.name);
|
---|
307 | if (currentDir)
|
---|
308 | browser.dir = dir.data('path');
|
---|
309 | browser.initDropUpload();
|
---|
310 | },
|
---|
311 | true
|
---|
312 | );
|
---|
313 | return false;
|
---|
314 | });
|
---|
315 |
|
---|
316 | $('.menu a[href="kcact:rmdir"]').click(function() {
|
---|
317 | if (!data.removable) return false;
|
---|
318 | browser.hideDialog();
|
---|
319 | browser.confirm(
|
---|
320 | "Are you sure you want to delete this folder and all its content?",
|
---|
321 | function(callBack) {
|
---|
322 | $.ajax({
|
---|
323 | type: 'POST',
|
---|
324 | dataType: 'json',
|
---|
325 | url: browser.baseGetData('deleteDir'),
|
---|
326 | data: {dir: data.path},
|
---|
327 | async: false,
|
---|
328 | success: function(data) {
|
---|
329 | if (callBack) callBack();
|
---|
330 | if (browser.check4errors(data))
|
---|
331 | return;
|
---|
332 | dir.parent().hide(500, function() {
|
---|
333 | var folders = dir.parent().parent();
|
---|
334 | var pDir = folders.parent().children('a').first();
|
---|
335 | dir.parent().detach();
|
---|
336 | if (!folders.children('div.folder').get(0)) {
|
---|
337 | pDir.children('span.brace').first().removeClass('opened');
|
---|
338 | pDir.children('span.brace').first().removeClass('closed');
|
---|
339 | pDir.parent().children('.folders').detach();
|
---|
340 | pDir.data('hasDirs', false);
|
---|
341 | }
|
---|
342 | if (pDir.data('path') == browser.dir.substr(0, pDir.data('path').length))
|
---|
343 | browser.changeDir(pDir);
|
---|
344 | browser.initDropUpload();
|
---|
345 | });
|
---|
346 | },
|
---|
347 | error: function() {
|
---|
348 | if (callBack) callBack();
|
---|
349 | browser.alert(browser.label("Unknown error."));
|
---|
350 | }
|
---|
351 | });
|
---|
352 | }
|
---|
353 | );
|
---|
354 | return false;
|
---|
355 | });
|
---|
356 | };
|
---|
357 |
|
---|
358 | browser.refreshDir = function(dir) {
|
---|
359 | var path = dir.data('path');
|
---|
360 | if (dir.children('.brace').hasClass('opened') || dir.children('.brace').hasClass('closed')) {
|
---|
361 | dir.children('.brace').removeClass('opened');
|
---|
362 | dir.children('.brace').addClass('closed');
|
---|
363 | }
|
---|
364 | dir.parent().children('.folders').first().detach();
|
---|
365 | if (path == browser.dir.substr(0, path.length))
|
---|
366 | browser.changeDir(dir);
|
---|
367 | browser.expandDir(dir);
|
---|
368 | return true;
|
---|
369 | };
|
---|