file_manager.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958
  1. var FM = {};
  2. GLOBAL.ajax_url = '/file_manager/fm_api.php';
  3. FM.DIR_MARKER = '  /';
  4. FM.CURRENT_TAB = '';
  5. FM.CURRENT_A_LINE = -1;
  6. FM.CURRENT_B_LINE = -1;
  7. FM.BG_TAB = '';
  8. FM.BG_LINE = 0;
  9. FM.ROOT_DIR = '';
  10. FM.TAB_A = '.listing-left';
  11. FM.TAB_B = '.listing-right';
  12. FM.TAB_A_MENU = '.menu-left';
  13. FM.TAB_B_MENU = '.menu-right';
  14. FM.ORDER_BOX_A = $('.context-menu.sort-order.tab-a');
  15. FM.ORDER_BOX_B = $('.context-menu.sort-order.tab-b');
  16. FM.ORDER_TAB_A = 'type_asc';
  17. FM.ORDER_TAB_B = 'type_asc';
  18. FM.TAB_A_CURRENT_PATH = GLOBAL.TAB_A__PATH;
  19. FM.TAB_B_CURRENT_PATH = GLOBAL.TAB_B_PATH;
  20. FM.IMAGES = {'A':[], 'B': []};
  21. FM.IMG_FILETYPES = 'png, jpg, jpeg, gif';
  22. FM.directoryNotAvailable = function(reply) {
  23. alert('Directory not available'); // todo: translate
  24. }
  25. FM.showError = function(type, message) {
  26. alert(message);
  27. }
  28. FM.formatPath = function(dir) {
  29. var correct_path = '';
  30. if (dir.substr(0, GLOBAL.ROOT_DIR.length) == GLOBAL.ROOT_DIR) {
  31. correct_path = dir;
  32. }
  33. else {
  34. correct_path = GLOBAL.ROOT_DIR + '/' + dir;
  35. }
  36. correct_path = correct_path.replace(/\/(\/+)/g, '/');
  37. return correct_path;
  38. }
  39. FM.init = function() {
  40. FM.setTabActive(FM.TAB_A);
  41. FM.ROOT_DIR = 'undefined' == typeof GLOBAL.ROOT_DIR ? '' : GLOBAL.ROOT_DIR;
  42. var dir_A = 'undefined' == typeof GLOBAL.START_DIR_A ? '' : GLOBAL.START_DIR_A;
  43. var dir_B = 'undefined' == typeof GLOBAL.START_DIR_B ? '' : GLOBAL.START_DIR_B;
  44. FM.TAB_A_CURRENT_PATH = FM.formatPath(GLOBAL.START_DIR_A);
  45. FM.TAB_B_CURRENT_PATH = FM.formatPath(GLOBAL.START_DIR_B);
  46. FM.open(dir_A, FM.TAB_A);
  47. FM.open(dir_B, FM.TAB_B);
  48. }
  49. FM.setActive = function(index, box) {
  50. var tab = FM.getTabLetter(box);
  51. $(box + ' .selected').removeClass('selected');
  52. $(box).find('li:eq('+index+')').addClass('selected');
  53. //$(box).find('li:eq('+index+')').addClass('selected');
  54. var w_h = $(window).height();
  55. var pos = $(box).find('li:eq('+index+')').position();
  56. console.log(w_h);
  57. console.log(pos);
  58. if (pos.top > w_h) {
  59. $(box).scrollTo($(box).find('li:eq('+index+')'));
  60. }
  61. else {
  62. if (Math.abs(pos.top) > w_h) {
  63. $(box).scrollTo($(box).find('li:eq('+index+')'));
  64. }
  65. }
  66. FM['CURRENT_' + tab + '_LINE'] = index;
  67. FM.CURRENT_TAB = box;
  68. }
  69. FM.setSecondInactive = function(index, box) {
  70. //$(box + ' .active').removeClass('selected-inactive');
  71. $(box).find('li:eq('+index+')').addClass('selected-inactive');
  72. FM.BG_LINE = index;
  73. FM.BG_TAB = box;
  74. }
  75. FM.goUp = function() {
  76. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  77. var index = FM['CURRENT_' + tab + '_LINE'];
  78. index -= 1;
  79. if (index < 0) {
  80. index = $(FM.CURRENT_TAB).find('li').length - 1;
  81. }
  82. FM.setActive(index, FM.CURRENT_TAB);
  83. }
  84. FM.goDown = function() {
  85. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  86. var index = FM['CURRENT_' + tab + '_LINE'];
  87. index += 1;
  88. if (index > ($(FM.CURRENT_TAB).find('li').length - 1)) {
  89. index = 0;
  90. }
  91. FM.setActive(index, FM.CURRENT_TAB);
  92. }
  93. FM.open = function(dir, box) {
  94. var tab = FM.getTabLetter(box);
  95. FM['TAB_'+tab+'_CURRENT_PATH'] = dir;
  96. var params = {
  97. 'dir': dir
  98. };
  99. App.Ajax.request('cd', params, function(reply) {
  100. if (reply.result) {
  101. var html = FM.generate_listing(reply.listing, box);
  102. }
  103. else {
  104. FM.directoryNotAvailable(reply);
  105. }
  106. });
  107. }
  108. FM.isItemFile = function(item) {
  109. return item.type == 'f';
  110. }
  111. FM.isItemDir = function(item) {
  112. return item.type == 'd';
  113. }
  114. FM.getFileType = function(name) {
  115. var filetype = name.split('.').pop().toLowerCase();
  116. return filetype.length > 6 || name.indexOf('.') <= 0 ? '' : filetype;
  117. }
  118. FM.sortItems = function(items, box) {
  119. var sorted = [];
  120. var files = [];
  121. var dirs = [];
  122. var combined = []
  123. $.each(items, function(i, o) {
  124. if (i > 0) { // i == 0 means first .. element in list
  125. if (FM.isItemFile(o)) {
  126. files.push(o);
  127. }
  128. else {
  129. dirs.push(o);
  130. }
  131. }
  132. });
  133. // var sort_type = $(box).parents('.window').find('.menu').find('.sort-by-v').val();
  134. var sort_type = FM.ORDER_TAB_A;
  135. if($(box).closest('.window').find('.menu').hasClass('menu-right')){
  136. sort_type = FM.ORDER_TAB_B;
  137. }
  138. switch (sort_type) {
  139. case 'type_asc':
  140. files.sort(function (a, b) {
  141. return a.name.localeCompare( b.name );
  142. });
  143. dirs.sort(function (a, b) {
  144. return a.name.localeCompare( b.name );
  145. });
  146. sorted = $.merge(dirs, files);
  147. break;
  148. case 'type_desc':
  149. files.sort(function (a, b) {
  150. return a.name.localeCompare( b.name );
  151. });
  152. dirs.sort(function (a, b) {
  153. return a.name.localeCompare( b.name );
  154. });
  155. sorted = $.merge(files, dirs);
  156. break;
  157. case 'size_asc':
  158. files.sort(function (a, b) {
  159. var size_a = parseInt(a.size, 10);
  160. var size_b = parseInt(b.size, 10);
  161. return ((size_a < size_b) ? -1 : ((size_a > size_b) ? 1 : 0));
  162. });
  163. sorted = $.merge(dirs, files);
  164. break;
  165. case 'size_desc':
  166. files.sort(function (a, b) {
  167. var size_a = parseInt(a.size, 10);
  168. var size_b = parseInt(b.size, 10);
  169. return ((size_a > size_b) ? -1 : ((size_a < size_b) ? 1 : 0));
  170. });
  171. sorted = $.merge(dirs, files);
  172. break;
  173. case 'date_asc':
  174. sorted = $.merge(dirs, files);
  175. sorted.sort(function (a, b) {
  176. var time_a = a.time.split('.')[0];
  177. var time_b = b.time.split('.')[0];
  178. var date_a = Date.parseDate(a.date + ' ' + time_a, 'yy-m-d h:i:s');
  179. var date_b = Date.parseDate(b.date + ' ' + time_b, 'yy-m-d h:i:s');
  180. return ((date_a < date_b) ? -1 : ((date_a > date_b) ? 1 : 0));
  181. });
  182. break;
  183. case 'date_desc':
  184. sorted = $.merge(dirs, files);
  185. sorted.sort(function (a, b) {
  186. var time_a = a.time.split('.')[0];
  187. var time_b = b.time.split('.')[0];
  188. var date_a = Date.parseDate(a.date + ' ' + time_a, 'yy-m-d h:i:s');
  189. var date_b = Date.parseDate(b.date + ' ' + time_b, 'yy-m-d h:i:s');
  190. return ((date_a > date_b) ? -1 : ((date_a < date_b) ? 1 : 0));
  191. });
  192. break;
  193. case 'name_asc':
  194. sorted = $.merge(dirs, files);
  195. sorted.sort(function (a, b) {
  196. return a.name.localeCompare(b.name);
  197. });
  198. break;
  199. case 'name_desc':
  200. sorted = $.merge(dirs, files);
  201. sorted.sort(function (a, b) {
  202. return a.name.localeCompare(b.name);
  203. });
  204. sorted = sorted.reverse();
  205. break;
  206. default:
  207. files.sort(function (a, b) {
  208. return a.name.localeCompare( b.name );
  209. });
  210. dirs.sort(function (a, b) {
  211. return a.name.localeCompare( b.name );
  212. });
  213. sorted = $.merge(dirs, files);
  214. break;
  215. }
  216. sorted = $.merge([items[0]], sorted);
  217. return sorted;
  218. }
  219. FM.openFile = function(dir, box, elm) {
  220. var tab = FM.getTabLetter(box);
  221. FM['TAB_'+tab+'_CURRENT_PATH'] = dir;
  222. var elm = $(elm).hasClass('dir') ? $(elm) : $(elm).closest('.dir');
  223. var src = $.parseJSON($(elm).find('.source').val());
  224. var myWindow = window.open('/edit/file/?path=' + src.full_path, '_blank');//, src.full_path, "width=900, height=700");
  225. /*var params = {
  226. 'dir': dir
  227. };
  228. App.Ajax.request('open_file', params, function(reply) {
  229. if (reply.result) {
  230. //var html = FM.generate_listing(reply.listing, box);
  231. }
  232. else {
  233. //FM.directoryNotAvailable(reply);
  234. alert('Cannot open file');
  235. }
  236. });*/
  237. }
  238. FM.getTabLetter = function(box) {
  239. var tab = 'A';
  240. if (box == FM.TAB_B) {
  241. tab = 'B';
  242. }
  243. return tab;
  244. }
  245. FM.generate_listing = function(reply, box) {
  246. var tab = FM.getTabLetter(box);
  247. FM.IMAGES[tab] = [];
  248. var acc = [];
  249. if (reply.length == 0) {
  250. reply = [{
  251. type: 'd',
  252. name: '',
  253. permissions: '',
  254. owner: '',
  255. size: '',
  256. time: '',
  257. date: ''
  258. }];
  259. }
  260. var path_arr = FM['TAB_'+tab+'_CURRENT_PATH'].split('/');
  261. path_arr = path_arr.filter(function(v){return v!==''});
  262. path_arr.pop();
  263. var back_path = '/' + path_arr.join('/');
  264. if (back_path == FM.ROOT_DIR || path_arr.length < FM.ROOT_DIR.split('/').length) {
  265. back_path = '';//FM.ROOT_DIR;
  266. }
  267. reply = FM.sortItems(reply, box);
  268. $(reply).each(function(i, o) {
  269. var path = FM.formatPath(FM['TAB_'+tab+'_CURRENT_PATH']+'/'+o.name);
  270. var cl_act = o.type == 'd' ? 'onClick="FM.open(\'' + path + '\', \'' + box + '\')"' : 'onClick="FM.openFile(\''+path+'\', \'' + box + '\', this)"';
  271. if (o.name == '') {
  272. path = FM.formatPath(back_path);
  273. cl_act = o.type == 'd' ? 'onClick="FM.open(\'' + path + '\', \'' + box + '\')"' : 'onClick="FM.openFile(\''+path+'\', \'' + box + '\', this)"';
  274. o = {
  275. type: 'd',
  276. name: '..',
  277. permissions: '',
  278. owner: '',
  279. size: '',
  280. time: '',
  281. date: ''
  282. }
  283. }
  284. var time = o.time.split('.');
  285. time = time[0];
  286. o.full_path = path;
  287. o.filetype = FM.getFileType(o.name);
  288. if(FM.IMG_FILETYPES.indexOf(o.filetype) >= 0 && o.filetype.length > 0) {
  289. FM.IMAGES[tab][FM.IMAGES[tab].length] = {'img': "/view/file/?path=/home/admin/"+o.name+"&raw=true", 'thumb': "/view/file/?path=/home/admin/"+o.name+"&raw=true", 'id': 'img-'+i};
  290. cl_act = 'onClick="FM.fotoramaOpen(\'' + tab + '\', \'img-' + i +'\')"';
  291. }
  292. var tpl = Tpl.get('entry_line', 'FM');
  293. tpl.set(':CL_ACTION_1', cl_act);
  294. tpl.set(':SOURCE', $.toJSON(o));
  295. tpl.set(':NAME', o.name);
  296. tpl.set(':PERMISSIONS', o.permissions);
  297. tpl.set(':OWNER', o.owner);
  298. tpl.set(':SIZE', o.size);
  299. tpl.set(':TIME', time);
  300. tpl.set(':DATE', o.date);
  301. if (FM.isItemDir(o)) {
  302. tpl.set(':ITEM_TYPE', 'filetype-dir');
  303. }
  304. else {
  305. tpl.set(':ITEM_TYPE', 'filetype-' + o.filetype);
  306. }
  307. acc.push(tpl.finalize());
  308. });
  309. $(box).html(acc.done());
  310. FM['CURRENT_'+tab+'_LINE'] = -1;
  311. }
  312. FM.fotoramaOpen = function(tab, img_index) {
  313. console.log('index: ' + img_index);
  314. $('.fotorama').fotorama({
  315. nav: 'thumbs',
  316. arrows: true,
  317. click: true,
  318. allowfullscreen: true,
  319. fit: 'scaledown',
  320. thumbfit: 'scaledown',
  321. data: FM.IMAGES[tab]
  322. });
  323. $('.fotorama').on('fotorama:fullscreenexit', function (e, fotorama) {
  324. $('.fotorama').data('fotorama').destroy();
  325. });
  326. $('.fotorama').fotorama().data('fotorama').requestFullScreen();
  327. $('.fotorama').fotorama().data('fotorama').show(img_index);
  328. }
  329. FM.selectItem = function(item, box) {
  330. $(box).find('.active').removeClass('active');
  331. $(box).find('.selected').removeClass('selected');
  332. /*if ($(item).hasClass('active')) {
  333. $(item).removeClass('active');
  334. }
  335. else {
  336. $(item).addClass('active');
  337. }*/
  338. if ($(item).hasClass('selected')) {
  339. $(item).removeClass('selected');
  340. }
  341. else {
  342. $(item).addClass('selected');
  343. }
  344. FM.setTabActive(box);
  345. }
  346. FM.switchTab = function() {
  347. if (FM.CURRENT_TAB == FM.TAB_A) {
  348. FM.setTabActive(FM.TAB_B);
  349. $(FM.TAB_B).find('.selected-inactive').removeClass('selected-inactive');
  350. $(FM.TAB_A).find('.selected').addClass('selected-inactive');
  351. }
  352. else {
  353. FM.setTabActive(FM.TAB_A);
  354. $(FM.TAB_A).find('.selected-inactive').removeClass('selected-inactive');
  355. $(FM.TAB_B).find('.selected').addClass('selected-inactive');
  356. }
  357. }
  358. FM.setTabActive = function(box) {
  359. FM.CURRENT_TAB = box;
  360. $('.window.active').removeClass('active');
  361. $('.listing-left.active').removeClass('active');
  362. $('.listing-right.active').removeClass('active');
  363. $(FM.CURRENT_TAB).addClass('active');
  364. $(FM.CURRENT_TAB).closest('.window').addClass('active');
  365. }
  366. FM.confirmRename = function() {
  367. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  368. var box = FM['TAB_' + tab];
  369. var selected = $(FM['TAB_' + tab] ).find('.dir.active');
  370. if (!selected) {
  371. return alert('No file selected');
  372. }
  373. var src = selected.find('.source').val();
  374. src = $.parseJSON(src);
  375. var target_name = $('#rename-title').val();
  376. if (target_name.trim().length == 0) {
  377. return alert('Cannot be renamed.');
  378. }
  379. var params = {
  380. item: src.name,
  381. target_name: target_name,
  382. dir: FM['TAB_' + tab + '_CURRENT_PATH']
  383. };
  384. App.Ajax.request('rename_file', params, function(reply) {
  385. if (reply.result) {
  386. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  387. }
  388. else {
  389. FM.showError('rename-items', reply.message);
  390. }
  391. FM.popupClose();
  392. });
  393. }
  394. FM.renameItems = function() {
  395. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  396. var selected = $(FM['TAB_' + tab] ).find('.dir.active');
  397. if (selected.length == 0) {
  398. return alert('No file selected');
  399. }
  400. var src = selected.find('.source').val();
  401. src = $.parseJSON(src);
  402. var tpl = Tpl.get('popup_rename', 'FM');
  403. tpl.set(':FILENAME', src.name);
  404. FM.popupOpen(tpl.finalize());
  405. /*var tab = FM.getTabLetter(FM.CURRENT_TAB);
  406. var box = FM.CURRENT_TAB;
  407. var delete_list = $(box).find('.active');
  408. if (delete_list.length == 0) {
  409. return FM.showError('hint', 'No selected items');
  410. }
  411. $(delete_list).each(function(i, o) {
  412. var opt = $(o).find('.source').val();
  413. opt = $.parseJSON(opt);
  414. prompt('Rename "' + opt.name + '" to:');
  415. });*/
  416. }
  417. FM.popupOpen = function(html) {
  418. $('<div>').attr('id', 'popup').html(html).flayer();
  419. }
  420. FM.popupClose = function() {
  421. return $('#popup').flayer_close();
  422. }
  423. FM.copyItems = function() {
  424. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  425. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  426. if (!selected) {
  427. return alert('No file selected');
  428. }
  429. var opposite_tab = 'A';
  430. if (tab == 'A') {
  431. opposite_tab = 'B';
  432. }
  433. var src = selected.find('.source').val();
  434. src = $.parseJSON(src);
  435. console.log(src);
  436. var params = {
  437. item: src.full_path,
  438. filename: src.name,
  439. dir: FM['TAB_' + tab + '_CURRENT_PATH'],
  440. dir_target: FM['TAB_' + opposite_tab + '_CURRENT_PATH']
  441. };
  442. App.Ajax.request('copy_files', params, function(reply) {
  443. if (reply.result) {
  444. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], FM['TAB_' + tab]);
  445. FM.open(FM['TAB_' + opposite_tab + '_CURRENT_PATH'], FM['TAB_' + opposite_tab]);
  446. }
  447. else {
  448. FM.showError('delete-items', reply.message);
  449. }
  450. //FM.popupClose();
  451. });
  452. }
  453. FM.downloadFiles = function() {
  454. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  455. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  456. if (!selected) {
  457. return alert('No file selected');
  458. }
  459. var src = selected.find('.source').val();
  460. src = $.parseJSON(src);
  461. if (src.type != 'f') {
  462. return alert('Only files can be dosnloaded in this version');
  463. }
  464. var path = src.full_path;
  465. var win = window.open('/download/file/?path=' + path, '_blank');
  466. win.focus();
  467. }
  468. FM.uploadFile = function() {
  469. //return alert('Not available atm..');
  470. //$('<div>123</div>').flayer();
  471. }
  472. FM.confirmDelete = function() {
  473. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  474. var box = FM['TAB_' + tab];
  475. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  476. if (!selected) {
  477. return alert('No file selected');
  478. }
  479. var src = selected.find('.source').val();
  480. src = $.parseJSON(src);
  481. var params = {
  482. item: src.full_path,
  483. dir: FM['TAB_' + tab + '_CURRENT_PATH']
  484. };
  485. App.Ajax.request('delete_files', params, function(reply) {
  486. if (reply.result) {
  487. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  488. }
  489. else {
  490. FM.showError('delete-items', reply.message);
  491. }
  492. FM.popupClose();
  493. });
  494. }
  495. FM.deleteItems = function() {
  496. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  497. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  498. if (selected.length == 0) {
  499. return alert('No file selected');
  500. }
  501. var src = selected.find('.source').val();
  502. src = $.parseJSON(src);
  503. var tpl = Tpl.get('popup_delete', 'FM');
  504. tpl.set(':FILENAME', src.name);
  505. FM.popupOpen(tpl.finalize());
  506. /*var tab = FM.getTabLetter(FM.CURRENT_TAB);
  507. var confirmed = confirm(App.i18n.ARE_YOU_SURE);
  508. var box = FM.CURRENT_TAB;
  509. var delete_list = $(box).find('.selected');
  510. if (delete_list.length == 0) {
  511. return FM.showError('hint', 'No selected items');
  512. }
  513. var params = {
  514. items: [],
  515. dir: FM['TAB_' + tab + '_CURRENT_PATH']
  516. };
  517. $(delete_list).each(function(i, opt){
  518. var opt = $(o).find('.source').val();
  519. opt = $.parseJSON(opt);
  520. params.items.push(opt.name);
  521. });
  522. App.Ajax.request('delete_files', params, function(reply) {
  523. if (reply.result) {
  524. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  525. }
  526. else {
  527. FM.showError('delete-items', reply.message);
  528. }
  529. });*/
  530. }
  531. FM.confirmCreateDir = function() {
  532. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  533. var box = FM['TAB_' + tab];
  534. /*var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  535. if (!selected) {
  536. return alert('No file selected');
  537. }
  538. var src = selected.find('.source').val();
  539. src = $.parseJSON(src);*/
  540. var dirname = $('#rename-title').val();
  541. if (dirname.trim().length == 0) {
  542. return alert('Cannot be created.');
  543. }
  544. var params = {
  545. dirname: dirname,
  546. dir: FM['TAB_' + tab + '_CURRENT_PATH']
  547. };
  548. App.Ajax.request('create_dir', params, function(reply) {
  549. if (reply.result) {
  550. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  551. }
  552. else {
  553. FM.showError('create-file', reply.message);
  554. }
  555. FM.popupClose();
  556. });
  557. }
  558. FM.createDir = function() {
  559. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  560. var tpl = Tpl.get('popup_create_dir', 'FM');
  561. FM.popupOpen(tpl.finalize());
  562. /*var dirname = prompt('Enter dir name:');
  563. if (dirname.trim() != '') {
  564. var box = FM.CURRENT_TAB;
  565. var tab = FM.getTabLetter(box);
  566. var params = {
  567. 'dirname': dirname,
  568. 'dir': FM['TAB_' + tab + '_CURRENT_PATH']
  569. };
  570. App.Ajax.request('create_dir', params, function(reply) {
  571. if (reply.result) {
  572. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  573. }
  574. else {
  575. FM.showError('create-dir', reply.message);
  576. }
  577. });
  578. }
  579. else {
  580. FM.showError('dirname-empty', 'Dirname cannot be empty');
  581. }*/
  582. }
  583. FM.confirmCreateFile = function() {
  584. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  585. var box = FM['TAB_' + tab];
  586. /*var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  587. if (!selected) {
  588. return alert('No file selected');
  589. }
  590. var src = selected.find('.source').val();
  591. src = $.parseJSON(src);*/
  592. var filename = $('#rename-title').val();
  593. if (filename.trim().length == 0) {
  594. return alert('Cannot be created.');
  595. }
  596. var params = {
  597. filename: filename,
  598. dir: FM['TAB_' + tab + '_CURRENT_PATH']
  599. };
  600. App.Ajax.request('create_file', params, function(reply) {
  601. if (reply.result) {
  602. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  603. }
  604. else {
  605. FM.showError('create-file', reply.message);
  606. }
  607. FM.popupClose();
  608. });
  609. }
  610. FM.createFile = function() {
  611. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  612. var tpl = Tpl.get('popup_create_file', 'FM');
  613. FM.popupOpen(tpl.finalize());
  614. /*var filename = prompt('Enter file name:');
  615. if (filename.trim() != '') {
  616. var box = FM.CURRENT_TAB;
  617. var tab = FM.getTabLetter(box);
  618. var params = {
  619. 'filename': filename,
  620. 'dir': FM['TAB_' + tab + '_CURRENT_PATH']
  621. };
  622. App.Ajax.request('create_file', params, function(reply) {
  623. if (reply.result) {
  624. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  625. }
  626. else {
  627. FM.showError('create-file', reply.message);
  628. }
  629. });
  630. }
  631. else {
  632. FM.showError('filename-empty', 'Filename cannot be empty');
  633. }*/
  634. }
  635. FM.showOrderBox = function(elm, tab) {
  636. var primary_box = FM.ORDER_BOX_A;
  637. var secondary_box = FM.ORDER_BOX_B;
  638. if(tab == FM.TAB_B){
  639. primary_box = FM.ORDER_BOX_B;
  640. secondary_box = FM.ORDER_BOX_A;
  641. }
  642. secondary_box.hide();
  643. if(primary_box.is(':visible')){
  644. primary_box.hide();
  645. return;
  646. }
  647. var offset = elm.offset();
  648. offset.top += elm.outerHeight() + 10;
  649. offset.left += elm.outerWidth() - primary_box.outerWidth();
  650. primary_box.css({top: offset.top, left: offset.left});
  651. primary_box.show();
  652. }
  653. FM.reOrderList = function(elm){
  654. var tab = FM.TAB_A;
  655. var menu = $(FM.TAB_A_MENU);
  656. var path = FM.TAB_A_CURRENT_PATH;
  657. var primary_box = FM.ORDER_BOX_A;
  658. var tab_order_type = FM.ORDER_TAB_A;
  659. if(elm.closest('.context-menu').hasClass('tab-b')){
  660. tab = FM.TAB_B;
  661. path = FM.TAB_B_CURRENT_PATH;
  662. primary_box = FM.ORDER_BOX_B;
  663. menu = FM.TAB_B_MENU;
  664. tab_order_type = FM.ORDER_TAB_B;
  665. }
  666. var entity = elm.closest('li').attr('entity');
  667. var direction = 'asc';
  668. if(elm.hasClass('up')){
  669. direction = 'desc';
  670. }
  671. if(tab == FM.TAB_A){
  672. FM.ORDER_TAB_A = entity+'_'+direction;
  673. }else{
  674. FM.ORDER_TAB_B = entity+'_'+direction;
  675. }
  676. primary_box.find('span').removeClass('selected');
  677. $(menu).find('.sort-by .entity').html(elm.closest('li').find('span').html());
  678. $(menu).find('.sort-by').removeClass('desc asc').addClass(direction).addClass('sort-by');
  679. elm.addClass('selected');
  680. primary_box.hide();
  681. FM.open(path, tab);
  682. }
  683. FM.init();
  684. $(document).ready(function() {
  685. //return alert('statechange: Back');
  686. /*$(document).bind('keydown.up', function() {
  687. console.log(1);
  688. //try{FM.goUp();}catch(e){console.log(e);}
  689. //console.log(FM);
  690. FM.goUp();
  691. });
  692. $(document).bind('keydown.down', function() {
  693. console.log(1);
  694. //try{FM.goUp();}catch(e){console.log(e);}
  695. //console.log(FM);
  696. FM.goDown();
  697. });*/
  698. var ph = $('.window .pwd').outerHeight();
  699. var mh = $('.window .menu').outerHeight();
  700. var wh = $(window).outerHeight();
  701. var hgt = wh - (ph + mh) - 8;
  702. $('.window ul').outerHeight(hgt);
  703. shortcut.add("Down",function() {
  704. FM.goDown();
  705. },{
  706. 'type': 'keydown',
  707. 'propagate': false,
  708. 'disable_in_input': false,
  709. 'target': document
  710. });
  711. shortcut.add("Up",function() {
  712. FM.goUp();
  713. },{
  714. 'type': 'keydown',
  715. 'propagate': false,
  716. 'disable_in_input': false,
  717. 'target': document
  718. });
  719. shortcut.add("Tab",function() {
  720. FM.switchTab();
  721. },{
  722. 'type': 'keydown',
  723. 'propagate': false,
  724. 'disable_in_input': false,
  725. 'target': document
  726. });
  727. shortcut.add("Enter",function() {
  728. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  729. var elm = $(FM.CURRENT_TAB).find('.dir:eq('+FM['CURRENT_'+tab+'_LINE']+')');
  730. if (elm.length == 1) {
  731. var src = $.parseJSON($(elm).find('.source').val());
  732. if (src.type == 'd') {
  733. FM.open(src.full_path, FM.CURRENT_TAB);
  734. }
  735. else {
  736. FM.openFile(src.full_path, FM.CURRENT_TAB, elm);
  737. }
  738. }
  739. },{
  740. 'type': 'keydown',
  741. 'propagate': false,
  742. 'disable_in_input': false,
  743. 'target': document
  744. });
  745. /* is jQuery .live() has been removed in version 1.9 onwards
  746. $(FM.TAB_A + ' .dir').live('click', function(evt) {
  747. FM.selectItem(evt.target, FM.TAB_A);
  748. });
  749. $(FM.TAB_B + ' .dir').live('click', function(evt) {
  750. FM.selectItem(evt.target, FM.TAB_B);
  751. });
  752. */
  753. $(FM.TAB_A).on('click', '.dir', function(evt) {
  754. FM.selectItem(evt.target, FM.TAB_A);
  755. });
  756. $(FM.TAB_B).on('click', '.dir', function(evt) {
  757. FM.selectItem(evt.target, FM.TAB_B);
  758. });
  759. $(FM.TAB_A_MENU).on('click', '.sort-by', function(evt){
  760. FM.showOrderBox($(evt.target), FM.TAB_A);
  761. });
  762. $(FM.TAB_B_MENU).on('click', '.sort-by', function(evt){
  763. FM.showOrderBox($(evt.target), FM.TAB_B);
  764. });
  765. $('.context-menu.sort-order').on('click', 'span', function(evt){
  766. FM.reOrderList($(evt.target));
  767. });
  768. $('.warning-box .close').on('click', function(evt){
  769. $(evt.target).closest('.warning-box').hide();
  770. });
  771. });
  772. /*$(document).bind('keydown.tab', function() {
  773. FM.switchTab();
  774. });*/
  775. $(window).bind('statechange', function(evt){
  776. $(evt).stopPropagation();
  777. // History.getState()
  778. alert('No way back yet');
  779. })