PageRenderTime 29ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/admin/include/plugins/file_manager/file_manager.js

http://xklog.googlecode.com/
JavaScript | 385 lines | 383 code | 0 blank | 2 comment | 2 complexity | b5796bb04a3c91e6993d35a438b4b307 MD5 | raw file
Possible License(s): AGPL-1.0
  1. // http://www.JSON.org/json2.js
  2. // See http://www.JSON.org/js.html
  3. if (!this.JSON) {
  4. this.JSON = {};
  5. }
  6. (function () {
  7. function f(n) {
  8. return n < 10 ? '0' + n : n;
  9. }
  10. if (typeof Date.prototype.toJSON !== 'function') {
  11. Date.prototype.toJSON = function (key) {
  12. return isFinite(this.valueOf()) ?
  13. this.getUTCFullYear() + '-' +
  14. f(this.getUTCMonth() + 1) + '-' +
  15. f(this.getUTCDate()) + 'T' +
  16. f(this.getUTCHours()) + ':' +
  17. f(this.getUTCMinutes()) + ':' +
  18. f(this.getUTCSeconds()) + 'Z' : null;
  19. };
  20. String.prototype.toJSON =
  21. Number.prototype.toJSON =
  22. Boolean.prototype.toJSON = function (key) {
  23. return this.valueOf();
  24. };
  25. }
  26. var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  27. escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  28. gap,
  29. indent,
  30. meta = {
  31. '\b': '\\b',
  32. '\t': '\\t',
  33. '\n': '\\n',
  34. '\f': '\\f',
  35. '\r': '\\r',
  36. '"' : '\\"',
  37. '\\': '\\\\'
  38. },
  39. rep;
  40. function quote(string) {
  41. escapable.lastIndex = 0;
  42. return escapable.test(string) ?
  43. '"' + string.replace(escapable, function (a) {
  44. var c = meta[a];
  45. return typeof c === 'string' ? c :
  46. '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  47. }) + '"' :
  48. '"' + string + '"';
  49. }
  50. function str(key, holder) {
  51. var i, // The loop counter.
  52. k, // The member key.
  53. v, // The member value.
  54. length,
  55. mind = gap,
  56. partial,
  57. value = holder[key];
  58. if (value && typeof value === 'object' &&
  59. typeof value.toJSON === 'function') {
  60. value = value.toJSON(key);
  61. }
  62. if (typeof rep === 'function') {
  63. value = rep.call(holder, key, value);
  64. }
  65. switch (typeof value) {
  66. case 'string':
  67. return quote(value);
  68. case 'number':
  69. return isFinite(value) ? String(value) : 'null';
  70. case 'boolean':
  71. case 'null':
  72. return String(value);
  73. case 'object':
  74. if (!value) {
  75. return 'null';
  76. }
  77. gap += indent;
  78. partial = [];
  79. if (Object.prototype.toString.apply(value) === '[object Array]') {
  80. length = value.length;
  81. for (i = 0; i < length; i += 1) {
  82. partial[i] = str(i, value) || 'null';
  83. }
  84. v = partial.length === 0 ? '[]' :
  85. gap ? '[\n' + gap +
  86. partial.join(',\n' + gap) + '\n' +
  87. mind + ']' :
  88. '[' + partial.join(',') + ']';
  89. gap = mind;
  90. return v;
  91. }
  92. if (rep && typeof rep === 'object') {
  93. length = rep.length;
  94. for (i = 0; i < length; i += 1) {
  95. k = rep[i];
  96. if (typeof k === 'string') {
  97. v = str(k, value);
  98. if (v) {
  99. partial.push(quote(k) + (gap ? ': ' : ':') + v);
  100. }
  101. }
  102. }
  103. } else {
  104. for (k in value) {
  105. if (Object.hasOwnProperty.call(value, k)) {
  106. v = str(k, value);
  107. if (v) {
  108. partial.push(quote(k) + (gap ? ': ' : ':') + v);
  109. }
  110. }
  111. }
  112. }
  113. v = partial.length === 0 ? '{}' :
  114. gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
  115. mind + '}' : '{' + partial.join(',') + '}';
  116. gap = mind;
  117. return v;
  118. }
  119. }
  120. if (typeof JSON.stringify !== 'function') {
  121. JSON.stringify = function (value, replacer, space) {
  122. var i;
  123. gap = '';
  124. indent = '';
  125. if (typeof space === 'number') {
  126. for (i = 0; i < space; i += 1) {
  127. indent += ' ';
  128. }
  129. } else if (typeof space === 'string') {
  130. indent = space;
  131. }
  132. rep = replacer;
  133. if (replacer && typeof replacer !== 'function' &&
  134. (typeof replacer !== 'object' ||
  135. typeof replacer.length !== 'number')) {
  136. throw new Error('JSON.stringify');
  137. }
  138. return str('', {'': value});
  139. };
  140. }
  141. if (typeof JSON.parse !== 'function') {
  142. JSON.parse = function (text, reviver) {
  143. var j;
  144. function walk(holder, key) {
  145. var k, v, value = holder[key];
  146. if (value && typeof value === 'object') {
  147. for (k in value) {
  148. if (Object.hasOwnProperty.call(value, k)) {
  149. v = walk(value, k);
  150. if (v !== undefined) {
  151. value[k] = v;
  152. } else {
  153. delete value[k];
  154. }
  155. }
  156. }
  157. }
  158. return reviver.call(holder, key, value);
  159. }
  160. cx.lastIndex = 0;
  161. if (cx.test(text)) {
  162. text = text.replace(cx, function (a) {
  163. return '\\u' +
  164. ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  165. });
  166. }
  167. if (/^[\],:{}\s]*$/.
  168. test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
  169. replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
  170. replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
  171. j = eval('(' + text + ')');
  172. return typeof reviver === 'function' ?
  173. walk({'': j}, '') : j;
  174. }
  175. throw new SyntaxError('JSON.parse');
  176. };
  177. }
  178. }());
  179. // http://www.JSON.org/json2.js end
  180. var JSON_URL = './../../php/file_manager_json.php';
  181. var KE = parent.KE;
  182. location.href.match(/\?id=([\w-]+)/i);
  183. var id = RegExp.$1;
  184. KE.event.ready(function() {
  185. var moveupLink = KE.$('moveup', document);
  186. var viewType = KE.$('viewType', document);
  187. var orderType = KE.$('orderType', document);
  188. var listTable = KE.$('listTable', document);
  189. var viewTable = KE.$('viewTable', document);
  190. var listDiv = KE.$('listDiv', document);
  191. var viewDiv = KE.$('viewDiv', document);
  192. var changeType = function(type) {
  193. if (type == 'VIEW') {
  194. listDiv.style.display = 'none';
  195. viewDiv.style.display = '';
  196. } else {
  197. listDiv.style.display = '';
  198. viewDiv.style.display = 'none';
  199. }
  200. };
  201. var insertLink = function(url) {
  202. var stack = KE.g[id].dialogStack;
  203. if (stack.length > 1) {
  204. var parentDialog = stack[stack.length - 2];
  205. var dialogDoc = KE.util.getIframeDoc(parentDialog.iframe);
  206. KE.$('url', dialogDoc).value = url;
  207. var currentDialog = stack[stack.length - 1];
  208. currentDialog.hide();
  209. return true;
  210. } else {
  211. return false;
  212. }
  213. }
  214. var insertImage = function(url, title) {
  215. if (!insertLink(url)) {
  216. KE.util.insertHtml(id, '<img src="' + url + '" alt="' + title + '" border="0" />');
  217. }
  218. };
  219. var insertFile = function(url, title) {
  220. if (!insertLink(url)) {
  221. KE.util.insertHtml(id, '<a href="' + url + '" target="_blank">' + title + '</a>');
  222. }
  223. };
  224. var makeFileTitle = function (filename, filesize, datetime) {
  225. var title = filename + ' (' + Math.ceil(filesize / 1024) + 'KB, ' + datetime + ')';
  226. return title;
  227. };
  228. var bindTitle = function (el, data) {
  229. if (data.is_dir) {
  230. el.title = data.filename;
  231. } else {
  232. el.title = makeFileTitle(data.filename, data.filesize, data.datetime);
  233. }
  234. };
  235. var bindEvent = function (el, result, data, createFunc) {
  236. var fileUrl = result.current_url + data.filename;
  237. fileUrl = KE.format.getUrl(fileUrl, KE.g[id].urlType);
  238. if (data.is_dir) {
  239. el.onclick = (function (url, path, title) {
  240. return function () {
  241. reloadPage(path, orderType.value, createFunc);
  242. }
  243. })(fileUrl, escape(result.current_dir_path + data.filename + '/'), data.filename);
  244. } else if (data.is_photo) {
  245. el.onclick = (function (url, title) {
  246. return function () {
  247. insertImage(url, title);
  248. }
  249. })(fileUrl, data.filename);
  250. } else {
  251. el.onclick = (function (url, title) {
  252. return function () {
  253. insertFile(url, title);
  254. }
  255. })(fileUrl, data.filename);
  256. }
  257. };
  258. var createCommon = function(result, createFunc) {
  259. if (result.current_dir_path) {
  260. moveupLink.onclick = function () {
  261. reloadPage(result.moveup_dir_path, orderType.value, createFunc);
  262. };
  263. } else {
  264. moveupLink.onclick = null;
  265. }
  266. var onchangeFunc = function() {
  267. changeType(viewType.value);
  268. if (viewType.value == 'VIEW') reloadPage(result.current_dir_path, orderType.value, createView);
  269. else reloadPage(result.current_dir_path, orderType.value, createList);
  270. };
  271. viewType.onchange = onchangeFunc;
  272. orderType.onchange = onchangeFunc;
  273. };
  274. var createList = function(responseText) {
  275. listDiv.innerHTML = '';
  276. var result = JSON.parse(responseText);
  277. createCommon(result, createList);
  278. var table = KE.$$('table', document);
  279. table.className = 'file-list-table';
  280. table.cellPadding = 0;
  281. table.cellSpacing = 2;
  282. table.border = 0;
  283. listDiv.appendChild(table);
  284. var fileList = result.file_list;
  285. for (var i = 0, len = fileList.length; i < len; i++) {
  286. var data = fileList[i];
  287. var row = table.insertRow(i);
  288. row.onmouseover = function () { this.className = 'selected'; };
  289. row.onmouseout = function () { this.className = 'noselected'; };
  290. var cell0 = row.insertCell(0);
  291. cell0.className = 'name';
  292. var iconName = data.is_dir ? 'folder-16.gif' : 'file-16.gif';
  293. var img = KE.$$('img', document);
  294. img.src = './images/' + iconName;
  295. img.width = 16;
  296. img.height = 16;
  297. img.alt = data.filename;
  298. cell0.appendChild(img);
  299. cell0.appendChild(document.createTextNode(' ' + data.filename));
  300. if (!data.is_dir || data.has_file) {
  301. row.style.cursor = 'pointer';
  302. img.title = data.filename;
  303. cell0.title = data.filename;
  304. bindEvent(cell0, result, data, createList);
  305. } else {
  306. img.title = '????';
  307. cell0.title = '????';
  308. }
  309. var cell1 = row.insertCell(1);
  310. cell1.className = 'size';
  311. cell1.innerHTML = data.is_dir ? '-' : Math.ceil(data.filesize / 1024) + 'KB';
  312. var cell2 = row.insertCell(2);
  313. cell2.className = 'datetime';
  314. cell2.innerHTML = data.datetime;
  315. }
  316. };
  317. var createView = function(responseText) {
  318. viewDiv.innerHTML = '';
  319. var result = JSON.parse(responseText);
  320. createCommon(result, createView);
  321. var fileList = result.file_list;
  322. for (var i = 0, len = fileList.length; i < len; i++) {
  323. var data = fileList[i];
  324. var div = KE.$$('div', document);
  325. div.className = 'file-view-area';
  326. viewDiv.appendChild(div);
  327. var tableObj = KE.util.createTable(document);
  328. var table = tableObj.table;
  329. table.className = 'photo noselected';
  330. table.onmouseover = function () { this.className = 'photo selected'; };
  331. table.onmouseout = function () { this.className = 'photo noselected'; };
  332. var cell = tableObj.cell;
  333. cell.valign = 'middle';
  334. cell.align = 'center';
  335. var fileUrl = result.current_url + data.filename;
  336. var iconUrl = data.is_dir ? './images/folder-64.gif' : (data.is_photo ? fileUrl : './images/file-64.gif');
  337. var img = KE.$$('img', document);
  338. img.src = iconUrl;
  339. img.width = data.is_dir ? 64 : 80;
  340. img.height = data.is_dir ? 64 : 80;
  341. img.alt = data.filename;
  342. if (!data.is_dir || data.has_file) {
  343. table.style.cursor = 'pointer';
  344. bindTitle(img, data);
  345. bindTitle(table, data);
  346. bindEvent(table, result, data, createView);
  347. } else {
  348. img.title = '????';
  349. table.title = '????';
  350. }
  351. cell.appendChild(img);
  352. div.appendChild(table);
  353. var titleDiv = KE.$$('div', document);
  354. titleDiv.className = 'name';
  355. titleDiv.title = data.filename;
  356. titleDiv.innerHTML = data.filename;
  357. div.appendChild(titleDiv);
  358. }
  359. };
  360. var httpRequest = function (param, func) {
  361. KE.util.showLoadingPage(id);
  362. var req = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
  363. var url = JSON_URL;
  364. url += param;
  365. url += (url.match(/\?/) ? "&" : "?") + (new Date()).getTime()
  366. req.open('GET', url, true);
  367. req.onreadystatechange = function () {
  368. if (req.readyState == 4) {
  369. if(req.status == 200) {
  370. func(req.responseText);
  371. KE.util.hideLoadingPage(id);
  372. }
  373. }
  374. };
  375. req.send(null);
  376. };
  377. var reloadPage = function (path, order, func) {
  378. httpRequest('?path=' + path + '&order=' + order, func);
  379. };
  380. changeType('VIEW');
  381. viewType.value = 'VIEW';
  382. reloadPage('', orderType.value, createView);
  383. }, window, document);