file_manager.js 27 KB

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