file_manager.js 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860
  1. var FM = {};
  2. FM.Env = {};
  3. GLOBAL.ajax_url = '/file_manager/fm_api.php';
  4. FM.DIR_MARKER = '  /';
  5. FM.errorMessageTimeout = 3500;
  6. FM.CURRENT_TAB = '';
  7. FM.CURRENT_A_LINE = -1;
  8. FM.CURRENT_B_LINE = -1;
  9. FM.BG_TAB = '';
  10. FM.BG_LINE = 0;
  11. FM.ROOT_DIR = '';
  12. FM.TAB_A = '.listing-left';
  13. FM.TAB_B = '.listing-right';
  14. FM.TAB_A_MENU = '.menu-left';
  15. FM.TAB_B_MENU = '.menu-right';
  16. FM.ORDER_BOX_A = $('.context-menu.sort-order.tab-a');
  17. FM.ORDER_BOX_B = $('.context-menu.sort-order.tab-b');
  18. FM.ORDER_TAB_A = 'type_asc';
  19. FM.ORDER_TAB_B = 'type_asc';
  20. FM.TAB_A_CURRENT_PATH = GLOBAL.TAB_A__PATH;
  21. FM.TAB_B_CURRENT_PATH = GLOBAL.TAB_B_PATH;
  22. FM.IMAGES = {'A':[], 'B': []};
  23. FM.IMG_FILETYPES = 'png, jpg, jpeg, gif';
  24. FM.SUPPORTED_ARCHIEVES = [
  25. 'zip', 'tgz', 'tar.gz',
  26. 'gzip', 'tbz', 'tar.bz',
  27. 'gz', 'zip', 'tar', 'rar'
  28. ];
  29. FM.EDITABLE_FILETYPES = [
  30. 'txt', 'php', 'js', 'html'
  31. ];
  32. FM.EDITABLE_MIMETYPES = [
  33. 'application/emma+xml',
  34. 'application/epp+xml',
  35. 'application/javascript',
  36. 'application/json',
  37. 'application/jsonml+json ',
  38. 'application/lost+xml',
  39. 'application/marc',
  40. 'application/msword',
  41. 'application/sru+xml',
  42. 'application/vnd.android.package-archive',
  43. 'text/csv',
  44. 'text/css',
  45. 'text/javascript',
  46. 'text/html',
  47. 'text/x-java-source'
  48. ];
  49. FM.EDITABLE_MIMETYPES_MASKS = [
  50. /(.)*text(.)*/,
  51. /(.)*inode(.)*/
  52. ];
  53. FM.preselectedItems = {'A': [], 'B': []};
  54. FM.directoryNotAvailable = function(reply) {
  55. var tpl = Tpl.get('popup_alert', 'FM');
  56. tpl.set(':TEXT', App.Constants.FM_DIRECTORY_NOT_AVAILABLE);
  57. FM.popupOpen(tpl.finalize());
  58. }
  59. FM.showError = function(type, message) {
  60. if (FM.isPopupOpened()) {
  61. var ref = FM.getPopupReference();
  62. if (ref.find('.warning-message').length > 0) {
  63. ref.find('.warning-message').html('<p class="msg-item">' + message + '</p>');
  64. ref.find('.warning-message').show();
  65. clearInterval(FM.Env.errorMessageHideTimeout);
  66. FM.Env.errorMessageHideTimeout =
  67. setTimeout(function() {
  68. ref.find('.warning-message').fadeOut();
  69. }, FM.errorMessageTimeout);
  70. return;
  71. }
  72. }
  73. else {
  74. FM.popupClose();
  75. var tpl = Tpl.get('popup_alert', 'FM');
  76. tpl.set(':TEXT', message);
  77. FM.popupOpen(tpl.finalize());
  78. }
  79. }
  80. FM.formatPath = function(dir) {
  81. var correct_path = '';
  82. if (dir.substr(0, GLOBAL.ROOT_DIR.length) == GLOBAL.ROOT_DIR) {
  83. correct_path = dir;
  84. }
  85. else {
  86. correct_path = GLOBAL.ROOT_DIR + '/' + dir;
  87. }
  88. correct_path = correct_path.replace(/\/(\/+)/g, '/');
  89. return correct_path;
  90. }
  91. FM.init = function() {
  92. FM.setTabActive(FM.TAB_A);
  93. FM.ROOT_DIR = 'undefined' == typeof GLOBAL.ROOT_DIR ? '' : GLOBAL.ROOT_DIR;
  94. var dir_A = 'undefined' == typeof GLOBAL.START_DIR_A ? '' : GLOBAL.START_DIR_A;
  95. var dir_B = 'undefined' == typeof GLOBAL.START_DIR_B ? '' : GLOBAL.START_DIR_B;
  96. FM.TAB_A_CURRENT_PATH = FM.formatPath(GLOBAL.START_DIR_A);
  97. FM.TAB_B_CURRENT_PATH = FM.formatPath(GLOBAL.START_DIR_B);
  98. FM.open(dir_A, FM.TAB_A, function() {
  99. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  100. if (FM['CURRENT_' + tab + '_LINE'] == -1) {
  101. FM.setActive(0, FM.CURRENT_TAB);
  102. }
  103. });
  104. FM.open(dir_B, FM.TAB_B, function() {
  105. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  106. if (FM['CURRENT_' + tab + '_LINE'] == -1) {
  107. FM.setActive(0, FM.CURRENT_TAB);
  108. }
  109. });
  110. }
  111. FM.setActive = function(index, box) {
  112. var tab = FM.getTabLetter(box);
  113. $(box + ' .selected').removeClass('selected');
  114. $(box).find('li.dir:eq('+index+')').addClass('selected');
  115. //$(box).find('li:eq('+index+')').addClass('selected');
  116. //var w_h = $(window).height() - 100;
  117. var w_offset = $(box).scrollTop();
  118. var w_height = $(box).height()
  119. var pos = $(box).find('li.selected').position();
  120. //console.log(w_height);
  121. //console.log(w_offset);
  122. //console.log(pos);
  123. var wwh = w_height - w_offset + pos.top;
  124. //console.info(wwh);
  125. //console.info((pos.top + w_offset) + ' > ' + w_height);
  126. //console.log((pos.top + w_offset) > w_height);
  127. /* if (pos.top > w_height) {
  128. var cur_elm = $(box).find('li.selected').position();
  129. var cur_elm_height = $(box).find('li.selected').height();
  130. //$(box).scrollTo(wwh - 350);
  131. $(box).scrollTo(w_offset + cur_elm.top - w_height/2 + cur_elm_height/2);
  132. }
  133. else {*/
  134. var cur_elm = $(box).find('li.selected').position();
  135. var cur_elm_height = $(box).find('li.selected').height();
  136. $(box).scrollTo(w_offset + cur_elm.top - w_height/2 + cur_elm_height/2);
  137. //}
  138. FM['CURRENT_' + tab + '_LINE'] = index;
  139. FM.CURRENT_TAB = box;
  140. $(FM.preselectedItems[tab]).each(function(i, index) {
  141. $(box).find('.dir:eq(' + index + ')').addClass('selected');
  142. });
  143. }
  144. FM.setSecondInactive = function(index, box) {
  145. //$(box + ' .active').removeClass('selected-inactive');
  146. $(box).find('li:eq('+index+')').addClass('selected-inactive');
  147. FM.BG_LINE = index;
  148. FM.BG_TAB = box;
  149. }
  150. FM.goToTop = function() {
  151. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  152. var index = 0;
  153. FM.setActive(index, FM.CURRENT_TAB);
  154. }
  155. FM.goToBottom = function() {
  156. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  157. var index = $(FM.CURRENT_TAB).find('.dir').length - 1;
  158. FM.setActive(index, FM.CURRENT_TAB);
  159. }
  160. FM.goUp = function() {
  161. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  162. var index = FM['CURRENT_' + tab + '_LINE'];
  163. index -= 1;
  164. if (index < 0) {
  165. index = $(FM.CURRENT_TAB).find('li.dir').length - 1;
  166. }
  167. FM.setActive(index, FM.CURRENT_TAB);
  168. }
  169. FM.goDown = function() {
  170. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  171. var index = FM['CURRENT_' + tab + '_LINE'];
  172. index += 1;
  173. if (index > ($(FM.CURRENT_TAB).find('li.dir').length - 1)) {
  174. index = 0;
  175. }
  176. FM.setActive(index, FM.CURRENT_TAB);
  177. }
  178. FM.open = function(dir, box, callback) {
  179. var tab = FM.getTabLetter(box);
  180. FM['TAB_'+tab+'_CURRENT_PATH'] = dir;
  181. var params = {
  182. 'dir': dir
  183. };
  184. App.Ajax.request('cd', params, function(reply) {
  185. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  186. FM.preselectedItems[tab] = [];
  187. if (reply.result == true) {
  188. var html = FM.generate_listing(reply.listing, box);
  189. }
  190. else {
  191. FM.directoryNotAvailable(reply);
  192. }
  193. callback && callback(reply);
  194. var current_pwd = dir.trim() == '' ? FM.ROOT_DIR : dir;
  195. FM.updateTopLevelPathBar(box, tab, current_pwd);
  196. var path_a = FM['TAB_A_CURRENT_PATH'] == '' ? FM.ROOT_DIR : FM['TAB_A_CURRENT_PATH'];
  197. var path_b = FM['TAB_B_CURRENT_PATH'] == '' ? FM.ROOT_DIR : FM['TAB_B_CURRENT_PATH'];
  198. var url = '/list/directory/?dir_a='+path_a+'&dir_b='+path_b;
  199. history.pushState({}, null, url);
  200. if (FM['CURRENT_' + tab + '_LINE'] == -1) {
  201. FM.setActive(0, FM.CURRENT_TAB);
  202. }
  203. });
  204. }
  205. FM.updateTopLevelPathBar = function(box, tab, path) {
  206. console.log(path);
  207. var formattedPath = [];
  208. path = path.replace(FM.ROOT_DIR, '');
  209. formattedPath.push('<a href="javascript:void(0)" onClick="FM.open(\''+FM.ROOT_DIR+'\', \''+box+'\')">'+FM.ROOT_DIR+'</span>');
  210. $.each(path.split('/'), function(i, part) {
  211. if (part.trim() == '') {
  212. return;
  213. }
  214. formattedPath.push('<a href="javascript:void(0)" onClick="FM.open(\''+part+'\', \''+box+'\')">'+part+'</span>');
  215. });
  216. $('.pwd-tab-' + tab).html(formattedPath.join('/'));
  217. }
  218. FM.isItemFile = function(item) {
  219. return item.type == 'f';
  220. }
  221. FM.isItemDir = function(item) {
  222. return item.type == 'd';
  223. }
  224. FM.getFileType = function(name) {
  225. var filetype = name.split('.').pop().toLowerCase();
  226. return filetype.length > 6 || name.indexOf('.') <= 0 ? '' : filetype;
  227. }
  228. FM.sortItems = function(items, box) {
  229. var sorted = [];
  230. var files = [];
  231. var dirs = [];
  232. var combined = []
  233. $.each(items, function(i, o) {
  234. if (i > 0) { // i == 0 means first .. element in list
  235. if (FM.isItemFile(o)) {
  236. files.push(o);
  237. }
  238. else {
  239. dirs.push(o);
  240. }
  241. }
  242. });
  243. // var sort_type = $(box).parents('.window').find('.menu').find('.sort-by-v').val();
  244. var sort_type = FM.ORDER_TAB_A;
  245. if($(box).closest('.window').find('.menu').hasClass('menu-right')){
  246. sort_type = FM.ORDER_TAB_B;
  247. }
  248. switch (sort_type) {
  249. case 'type_asc':
  250. files.sort(function (a, b) {
  251. return a.name.localeCompare( b.name );
  252. });
  253. dirs.sort(function (a, b) {
  254. return a.name.localeCompare( b.name );
  255. });
  256. sorted = $.merge(dirs, files);
  257. break;
  258. case 'type_desc':
  259. files.sort(function (a, b) {
  260. return a.name.localeCompare( b.name );
  261. });
  262. dirs.sort(function (a, b) {
  263. return a.name.localeCompare( b.name );
  264. });
  265. sorted = $.merge(files, dirs);
  266. break;
  267. case 'size_asc':
  268. files.sort(function (a, b) {
  269. var size_a = parseInt(a.size, 10);
  270. var size_b = parseInt(b.size, 10);
  271. return ((size_a < size_b) ? -1 : ((size_a > size_b) ? 1 : 0));
  272. });
  273. sorted = $.merge(dirs, files);
  274. break;
  275. case 'size_desc':
  276. files.sort(function (a, b) {
  277. var size_a = parseInt(a.size, 10);
  278. var size_b = parseInt(b.size, 10);
  279. return ((size_a > size_b) ? -1 : ((size_a < size_b) ? 1 : 0));
  280. });
  281. sorted = $.merge(dirs, files);
  282. break;
  283. case 'date_asc':
  284. sorted = $.merge(dirs, files);
  285. sorted.sort(function (a, b) {
  286. var time_a = a.time.split('.')[0];
  287. var time_b = b.time.split('.')[0];
  288. var date_a = Date.parseDate(a.date + ' ' + time_a, 'yy-m-d h:i:s');
  289. var date_b = Date.parseDate(b.date + ' ' + time_b, 'yy-m-d h:i:s');
  290. return ((date_a < date_b) ? -1 : ((date_a > date_b) ? 1 : 0));
  291. });
  292. break;
  293. case 'date_desc':
  294. sorted = $.merge(dirs, files);
  295. sorted.sort(function (a, b) {
  296. var time_a = a.time.split('.')[0];
  297. var time_b = b.time.split('.')[0];
  298. var date_a = Date.parseDate(a.date + ' ' + time_a, 'yy-m-d h:i:s');
  299. var date_b = Date.parseDate(b.date + ' ' + time_b, 'yy-m-d h:i:s');
  300. return ((date_a > date_b) ? -1 : ((date_a < date_b) ? 1 : 0));
  301. });
  302. break;
  303. case 'name_asc':
  304. sorted = $.merge(dirs, files);
  305. sorted.sort(function (a, b) {
  306. return a.name.localeCompare(b.name);
  307. });
  308. break;
  309. case 'name_desc':
  310. sorted = $.merge(dirs, files);
  311. sorted.sort(function (a, b) {
  312. return a.name.localeCompare(b.name);
  313. });
  314. sorted = sorted.reverse();
  315. break;
  316. default:
  317. files.sort(function (a, b) {
  318. return a.name.localeCompare( b.name );
  319. });
  320. dirs.sort(function (a, b) {
  321. return a.name.localeCompare( b.name );
  322. });
  323. sorted = $.merge(dirs, files);
  324. break;
  325. }
  326. sorted = $.merge([items[0]], sorted);
  327. return sorted;
  328. }
  329. FM.isFileEditable = function(src, mime) {
  330. if ('undefined' == typeof src.filetype) {
  331. return false;
  332. }
  333. if ($.inArray(src.filetype, FM.EDITABLE_FILETYPES) != -1) {
  334. return true;
  335. }
  336. var mime_type = mime.split(';');
  337. mime_type = mime_type[0];
  338. if ($.inArray(mime_type, FM.EDITABLE_MIMETYPES) != -1) {
  339. return true;
  340. }
  341. var editable = false;
  342. $.each(FM.EDITABLE_MIMETYPES_MASKS, function(i, mask) {
  343. if (mime_type.search(mask) != -1) {
  344. editable = true;
  345. }
  346. });
  347. return editable;
  348. }
  349. FM.editFileFromSubcontext = function(elm) {
  350. var elm = $(elm).hasClass('dir') ? $(elm) : $(elm).closest('.dir');
  351. var src = $.parseJSON($(elm).find('.source').val());
  352. var myWindow = window.open('/edit/file/?path=' + src.full_path, '_blank');//, src.full_path, "width=900, height=700");
  353. }
  354. FM.downloadFileFromSubcontext = function(elm) {
  355. var elm = $(elm).hasClass('dir') ? $(elm) : $(elm).closest('.dir');
  356. var src = $.parseJSON($(elm).find('.source').val());
  357. var path = src.full_path;
  358. var win = window.open('/download/file/?path=' + path, '_blank');
  359. win.focus();
  360. }
  361. FM.openFile = function(dir, box, elm) {
  362. var tab = FM.getTabLetter(box);
  363. FM['TAB_'+tab+'_CURRENT_PATH'] = dir;
  364. var elm = $(elm).hasClass('dir') ? $(elm) : $(elm).closest('.dir');
  365. var src = $.parseJSON($(elm).find('.source').val());
  366. if (FM.isItemPseudo(src)) {
  367. return FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], FM['TAB_' + tab]);
  368. }
  369. var params = {
  370. dir: src.full_path
  371. };
  372. App.Ajax.request('check_file_type', params, function(reply) {
  373. if (reply.result) {
  374. if (FM.isFileEditable(src, reply.data)) {
  375. var myWindow = window.open('/edit/file/?path=' + src.full_path, '_blank');//, src.full_path, "width=900, height=700");
  376. }
  377. else {
  378. var path = src.full_path;
  379. var win = window.open('/download/file/?path=' + path, '_blank');
  380. //win.focus();
  381. }
  382. }
  383. else {
  384. // force download file
  385. var path = src.full_path;
  386. var win = window.open('/download/file/?path=' + path, '_blank');
  387. //win.focus();
  388. }
  389. });
  390. }
  391. FM.getTabLetter = function(box) {
  392. var tab = 'A';
  393. if (box == FM.TAB_B) {
  394. tab = 'B';
  395. }
  396. return tab;
  397. }
  398. FM.toggleSubContextMenu = function(ref) {
  399. $(ref).find('.subcontext-menu').toggleClass('subcontext-menu-hidden');
  400. }
  401. FM.generate_listing = function(reply, box) {
  402. var tab = FM.getTabLetter(box);
  403. FM.IMAGES[tab] = [];
  404. var acc = [];
  405. if (reply.length == 0) {
  406. reply = [{
  407. type: 'd',
  408. name: '',
  409. permissions: '',
  410. owner: '',
  411. size: '',
  412. time: '',
  413. date: ''
  414. }];
  415. }
  416. var path_arr = FM['TAB_'+tab+'_CURRENT_PATH'].split('/');
  417. path_arr = path_arr.filter(function(v){return v!==''});
  418. path_arr.pop();
  419. var back_path = '/' + path_arr.join('/');
  420. if (back_path == FM.ROOT_DIR || path_arr.length < FM.ROOT_DIR.split('/').length) {
  421. back_path = '';//FM.ROOT_DIR;
  422. }
  423. reply = FM.sortItems(reply, box);
  424. $(reply).each(function(i, o) {
  425. var path = FM.formatPath(FM['TAB_'+tab+'_CURRENT_PATH']+'/'+o.name);
  426. var cl_act = o.type == 'd' ? 'onClick="FM.open(\'' + path + '\', \'' + box + '\')"' : 'onClick="FM.openFile(\''+path+'\', \'' + box + '\', this)"';
  427. //var cl_act = o.type == 'd' ? 'onDblClick="FM.open(\'' + path + '\', \'' + box + '\')"' : 'onDblClick="FM.openFile(\''+path+'\', \'' + box + '\', this)"';
  428. //var cl_act = '';
  429. if (o.name == '') {
  430. path = FM.formatPath(back_path);
  431. cl_act = o.type == 'd' ? 'onClick="FM.open(\'' + path + '\', \'' + box + '\')"' : 'onClick="FM.openFile(\''+path+'\', \'' + box + '\', this)"';
  432. o = {
  433. type: 'd',
  434. name: '..',
  435. permissions: '',
  436. owner: '',
  437. size: '',
  438. time: '',
  439. date: ''
  440. }
  441. }
  442. var time = o.time.split('.');
  443. time = time[0];
  444. var psDate = new Date(o.date);
  445. o.full_path = path;
  446. o.filetype = FM.getFileType(o.name);
  447. if(FM.IMG_FILETYPES.indexOf(o.filetype) >= 0 && o.filetype.length > 0) {
  448. 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};
  449. cl_act = 'onClick="FM.fotoramaOpen(\'' + tab + '\', \'img-' + i +'\')"';
  450. }
  451. var t_index = tab + '_' + i;
  452. var tpl = Tpl.get('entry_line', 'FM');
  453. tpl.set(':CL_ACTION_1', cl_act);
  454. tpl.set(':SOURCE', $.toJSON(o));
  455. tpl.set(':NAME', o.name);
  456. tpl.set(':PERMISSIONS', o.permissions);
  457. tpl.set(':OWNER', o.owner);
  458. tpl.set(':SIZE_VALUE', o.type == 'f' ? FM.humanFileSizeValue(o.size) : '&nbsp;');
  459. tpl.set(':SIZE_UNIT', o.type == 'f' ? FM.humanFileSizeUnit(o.size) : '&nbsp;');
  460. tpl.set(':TIME', (psDate.getFullYear() != new Date().getFullYear()) ? psDate.getFullYear() || "" : time);
  461. tpl.set(':DATE', o.date.trim() != '' ? psDate.format('mmm d') : '&nbsp;'/*o.date*/);
  462. if (o.name == '..' || o.type == 'd') {
  463. tpl.set(':SUBMENU_CLASS', 'hidden');
  464. }
  465. else {
  466. tpl.set(':SUBMENU_CLASS', '');
  467. }
  468. /*tpl.set(':index', t_index);
  469. tpl.set(':index1', t_index);
  470. tpl.set(':index2', t_index);*/
  471. if (FM.isItemDir(o)) {
  472. tpl.set(':ITEM_TYPE', 'filetype-dir');
  473. }
  474. else {
  475. tpl.set(':ITEM_TYPE', 'filetype-' + o.filetype);
  476. }
  477. acc.push(tpl.finalize());
  478. });
  479. $(box).html(acc.done());
  480. FM['CURRENT_'+tab+'_LINE'] = -1;
  481. }
  482. FM.toggleCheck = function(uid) {
  483. var ref = $('#check' + uid);
  484. if (ref.length > 0) {
  485. $(ref).hasClass('checkbox-selected') ? $(ref).addClass('checkbox-selected') : $(ref).removeClass('checkbox-selected');
  486. }
  487. }
  488. FM.fotoramaOpen = function(tab, img_index) {
  489. console.log('index: ' + img_index);
  490. $('.fotorama').fotorama({
  491. nav: 'thumbs',
  492. arrows: true,
  493. click: true,
  494. allowfullscreen: true,
  495. fit: 'scaledown',
  496. thumbfit: 'scaledown',
  497. data: FM.IMAGES[tab]
  498. });
  499. $('.fotorama').on('fotorama:fullscreenexit', function (e, fotorama) {
  500. $('.fotorama').data('fotorama').destroy();
  501. });
  502. $('.fotorama').fotorama().data('fotorama').requestFullScreen();
  503. $('.fotorama').fotorama().data('fotorama').show(img_index);
  504. }
  505. FM.bulkOperation = function(ref) {
  506. //console.log(ref);
  507. var box = $(ref).parents('.menu').hasClass('menu-left') ? FM.setTabActive(FM.TAB_A, 'skip_highlights') : FM.setTabActive(FM.TAB_B, 'skip_highlights');
  508. var operation = $(ref).val();
  509. if ('function' == typeof FM[operation]) {
  510. FM[operation] && FM[operation](ref);
  511. }
  512. $(ref).find('option[value=-1]').attr('selected', true);
  513. }
  514. FM.checkBulkStatus = function(bulkStatuses, acc) {
  515. var status = false;
  516. var msg = '';
  517. if (bulkStatuses.length == acc.length) {
  518. $.each(bulkStatuses, function(i, o) {
  519. if (o != true) {
  520. msg += '<p>'+o+'</p>';
  521. }
  522. });
  523. if (msg == '') {
  524. status = true;
  525. }
  526. }
  527. if (status == true) {
  528. $('#popup .results').html(App.Constants.FM_DONE);
  529. $('.controls p').replaceWith('<p class="ok" onClick="FM.bulkPopupClose();">close</p>');
  530. }
  531. else {
  532. $('#popup .results').html(msg);
  533. $('.controls p').replaceWith('<p class="ok" onClick="FM.bulkPopupClose();">close</p>');
  534. }
  535. }
  536. FM.bulkPopupClose = function() {
  537. FM.popupClose();
  538. FM.open(FM['TAB_A_CURRENT_PATH'], FM['TAB_A']);
  539. FM.open(FM['TAB_B_CURRENT_PATH'], FM['TAB_B']);
  540. }
  541. FM.humanFileSize = function(size) {
  542. var sizes = [' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB'];
  543. for (var i = 1; i < sizes.length; i++) {
  544. if (size < Math.pow(1024, i)) return (Math.round((size/Math.pow(1024, i-1))*100)/100) + sizes[i-1];
  545. }
  546. return size;
  547. }
  548. FM.humanFileSizeValue = function(size) {
  549. var sizes = ['b', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
  550. for (var i = 1; i < sizes.length; i++) {
  551. if (size < Math.pow(1024, i)) return (Math.round((size/Math.pow(1024, i-1))*100)/100);
  552. }
  553. return size;
  554. }
  555. FM.humanFileSizeUnit = function(size) {
  556. if (!parseInt(size)) return "&nbsp;";
  557. var sizes = ['b', ' kb', ' Mb', ' Gb', ' Tb', ' Pb', ' Eb', ' Zb', ' Yb'];
  558. for (var i = 1; i < sizes.length; i++) {
  559. if (size < Math.pow(1024, i)) return sizes[i-1];
  560. }
  561. return sizes[i];
  562. }
  563. FM.bulkCopy = function() {
  564. var acc = $(FM.CURRENT_TAB).find('.dir.selected');
  565. if (acc.length > 0) {
  566. //FM.popupClose();
  567. var cfr_html = '';
  568. $.each(acc, function(i, o) {
  569. var ref = $(o);
  570. var src = $(ref).find('.source').val();
  571. src = $.parseJSON(src);
  572. if (!FM.isItemPseudo(o)) {
  573. cfr_html += '<div>'+src.name+'</div>';
  574. }
  575. });
  576. var tpl = Tpl.get('popup_bulk', 'FM');
  577. tpl.set(':ACTION', App.Constants.FM_YOU_ARE_COPYING);
  578. tpl.set(':TEXT', cfr_html);
  579. FM.popupOpen(tpl.finalize());
  580. var bulkStatuses = [];
  581. $.each(acc, function(i, o) {
  582. var ref = $(o);
  583. var src = $(ref).find('.source').val();
  584. src = $.parseJSON(src);
  585. /*if (!FM.isItemPseudo(o)) {
  586. cfr_html += '<div>'+src.name+'</div>';
  587. }*/
  588. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  589. var opposite_tab = 'A';
  590. if (tab == 'A') {
  591. opposite_tab = 'B';
  592. }
  593. if (FM.isItemPseudo(src)) {
  594. return FM.displayError(
  595. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  596. );
  597. }
  598. var dest = FM['TAB_' + opposite_tab + '_CURRENT_PATH' ];
  599. if (dest == '') {
  600. dest = GLOBAL.ROOT_DIR;
  601. }
  602. var action = FM.isItemFile(src) ? 'copy_file' : 'copy_directory';
  603. var params = {
  604. item: src.full_path,
  605. filename: src.name,
  606. dir: FM['TAB_' + tab + '_CURRENT_PATH'],
  607. dir_target: dest
  608. };
  609. App.Ajax.request(action, params, function(reply) {
  610. if (reply.result == true) {
  611. bulkStatuses.push(true);
  612. }
  613. else {
  614. //FM.showError('copy-items', reply.message);
  615. bulkStatuses.push(reply.message);
  616. }
  617. FM.checkBulkStatus(bulkStatuses, acc);
  618. });
  619. });
  620. }
  621. }
  622. FM.bulkRemove = function() {
  623. var acc = $(FM.CURRENT_TAB).find('.dir.selected');
  624. if (acc.length > 0) {
  625. //FM.popupClose();
  626. var cfr_html = '';
  627. $.each(acc, function(i, o) {
  628. var ref = $(o);
  629. var src = $(ref).find('.source').val();
  630. src = $.parseJSON(src);
  631. if (!FM.isItemPseudo(o)) {
  632. cfr_html += '<div>'+src.name+'</div>';
  633. }
  634. });
  635. var tpl = Tpl.get('popup_bulk', 'FM');
  636. tpl.set(':ACTION', App.Constants.FM_YOU_ARE_REMOVING);
  637. tpl.set(':TEXT', cfr_html);
  638. FM.popupOpen(tpl.finalize());
  639. var bulkStatuses = [];
  640. $.each(acc, function(i, o) {
  641. var ref = $(o);
  642. var src = $(ref).find('.source').val();
  643. src = $.parseJSON(src);
  644. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  645. var opposite_tab = 'A';
  646. if (tab == 'A') {
  647. opposite_tab = 'B';
  648. }
  649. if (FM.isItemPseudo(src)) {
  650. return FM.displayError(
  651. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  652. );
  653. }
  654. var dest = FM['TAB_' + opposite_tab + '_CURRENT_PATH' ];
  655. if (dest == '') {
  656. dest = GLOBAL.ROOT_DIR;
  657. }
  658. var params = {
  659. item: src.full_path,
  660. dir: FM['TAB_' + tab + '_CURRENT_PATH']
  661. };
  662. App.Ajax.request('delete_files', params, function(reply) {
  663. if (reply.result == true) {
  664. bulkStatuses.push(true);
  665. }
  666. else {
  667. //FM.showError('copy-items', reply.message);
  668. bulkStatuses.push(reply.message);
  669. }
  670. FM.checkBulkStatus(bulkStatuses, acc);
  671. });
  672. });
  673. }
  674. }
  675. FM.toggleAllItemsSelected = function() {
  676. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  677. var box = FM['TAB_' + tab];
  678. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  679. var dir_items = $(FM['TAB_' + tab] ).find('.dir');
  680. if (selected.length == dir_items.length) {
  681. $(box).find('.dir').removeClass('selected');
  682. var index = FM['CURRENT_' + tab + '_LINE'];
  683. $(box).find('.dir:eq(' + index + ')').addClass('selected');
  684. $(FM.preselectedItems[tab]).each(function(i, index) {
  685. $(box).find('.dir:eq(' + index + ')').addClass('selected');
  686. });
  687. }
  688. else {
  689. $(box).find('.dir').addClass('selected');
  690. }
  691. }
  692. FM.selectCurrentElementAndGoToNext = function () {
  693. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  694. var box = FM['TAB_' + tab];
  695. var index = FM['CURRENT_' + tab + '_LINE'];
  696. if ($.inArray(index, FM.preselectedItems[tab]) != -1) {
  697. FM.preselectedItems[tab] = $.grep(FM.preselectedItems[tab], function(i) {
  698. return i != index;
  699. });
  700. $(box).find('.dir:eq(' + index + ')').removeClass('selected');
  701. //FM.preselectedItems[tab].push(index);
  702. }
  703. else {
  704. $(box).find('.dir:eq(' + index + ')').addClass('selected');
  705. FM.preselectedItems[tab].push(index);
  706. }
  707. FM.goDown();
  708. }
  709. FM.selectItem = function(item, box) {
  710. //console.log(item);
  711. /*if ($(item).hasClass('ch-toggle')) {
  712. if ($(item).parents('.dir').prev('.dir').length == 0) {
  713. var checked = $(item).parents('.dir').find('.ch-toggle').is(':checked');
  714. $(item).parents('.listing').find('.ch-toggle').prop('checked', checked);
  715. }
  716. return;
  717. }*/
  718. if (FM.CURRENT_TAB == FM.TAB_A) {
  719. FM.setTabActive(FM.TAB_B, 'skip_highlights');
  720. $(FM.TAB_B).find('.selected-inactive').removeClass('selected-inactive');
  721. // tmp
  722. //$(FM.TAB_A).find('.selected-inactive').removeClass('selected-inactive');
  723. $(FM.TAB_B).find('.selected').removeClass('selected');
  724. //$(FM.TAB_A).find('.selected').addClass('selected-inactive');
  725. $(FM.TAB_B).find('.selected').addClass('selected-inactive').removeClass('selected');
  726. }
  727. else {
  728. FM.setTabActive(FM.TAB_A, 'skip_highlights');
  729. $(FM.TAB_A).find('.selected-inactive').removeClass('selected-inactive');
  730. //$(FM.TAB_B).find('.selected-inactive').removeClass('selected-inactive');
  731. //$(FM.TAB_B).find('.selected').addClass('selected-inactive');
  732. $(FM.TAB_A).find('.selected').removeClass('selected');
  733. $(FM.TAB_A).find('.selected').addClass('selected-inactive').removeClass('selected');
  734. }
  735. $(box).find('.active').removeClass('active');
  736. $(box).find('.selected').removeClass('selected');
  737. //
  738. // tmp
  739. //$(FM.TAB_A).find('.selected-inactive').removeClass('selected-inactive');
  740. //$(FM.TAB_B).find('.selected-inactive').removeClass('selected-inactive');
  741. /*if ($(item).hasClass('active')) {
  742. $(item).removeClass('active');
  743. }
  744. else {
  745. $(item).addClass('active');
  746. }*/
  747. if ($(item).hasClass('selected')) {
  748. $(item).removeClass('selected');
  749. }
  750. else {
  751. $(item).addClass('selected');
  752. }
  753. FM.setTabActive(box);
  754. var item = $(item).hasClass('dir') ? item : $(item).parents('.dir');
  755. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  756. var src = $(item).find('.source').val();
  757. src = $.parseJSON(src);
  758. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  759. if (FM.itemIsArchieve(src)) {
  760. $('.menu-'+tab+' .extract-btn').show();
  761. }
  762. else {
  763. $('.menu-'+tab+' .extract-btn').hide();
  764. }
  765. }
  766. FM.isItemPseudo = function(item) {
  767. if (item.name == '.' || item.name == '..') {
  768. return true;
  769. }
  770. return false;
  771. }
  772. FM.itemIsArchieve = function(item) {
  773. if ($.inArray(item.filetype, FM.SUPPORTED_ARCHIEVES) != -1) {
  774. return true;
  775. }
  776. return false;
  777. }
  778. FM.unpackItem = function() {
  779. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  780. var box = FM['TAB_' + tab];
  781. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  782. if (selected.length == 0) {
  783. return alert('No file selected');
  784. }
  785. var src = selected.find('.source').val();
  786. src = $.parseJSON(src);
  787. if (FM.isItemPseudo(src)) {
  788. return FM.displayError(
  789. App.Constants.FM_NO_FILE_SELECTED
  790. );
  791. }
  792. if (!FM.itemIsArchieve(src)) {
  793. return FM.displayError(
  794. App.Constants.FM_FILE_TYPE_NOT_SUPPORTED
  795. );
  796. }
  797. var dst = FM['TAB_' + tab + '_CURRENT_PATH'];
  798. if (dst == '') {
  799. dst = GLOBAL.ROOT_DIR;
  800. }
  801. var tpl = Tpl.get('popup_unpack', 'FM');
  802. tpl.set(':FILENAME', src.name);
  803. tpl.set(':DST_DIRNAME', dst + '/' + src.name + '_extracted');
  804. FM.popupOpen(tpl.finalize());
  805. }
  806. FM.packItem = function() {
  807. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  808. var box = FM['TAB_' + tab];
  809. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  810. if (selected.length == 0) {
  811. return FM.displayError(
  812. App.Constants.FM_NO_FILE_SELECTED
  813. );
  814. }
  815. var src = selected.find('.source').val();
  816. src = $.parseJSON(src);
  817. if (FM.isItemPseudo(src)) {
  818. return FM.displayError(
  819. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  820. );
  821. }
  822. if (FM.isItemPseudo(src)) {
  823. return FM.displayError(
  824. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  825. );
  826. }
  827. var dst = FM['TAB_' + tab + '_CURRENT_PATH'];
  828. if (dst == '') {
  829. dst = GLOBAL.ROOT_DIR;
  830. }
  831. var tpl = Tpl.get('popup_pack', 'FM');
  832. tpl.set(':FILENAME', src.name);
  833. tpl.set(':DST_DIRNAME', dst + '/' + src.name + '_packed.tar.gz');
  834. FM.popupOpen(tpl.finalize());
  835. }
  836. FM.switchTab = function() {
  837. if (FM.CURRENT_TAB == FM.TAB_A) {
  838. FM.setTabActive(FM.TAB_B);
  839. $(FM.TAB_B).find('.selected-inactive').removeClass('selected-inactive');
  840. $(FM.TAB_A).find('.selected').addClass('selected-inactive');
  841. }
  842. else {
  843. FM.setTabActive(FM.TAB_A);
  844. $(FM.TAB_A).find('.selected-inactive').removeClass('selected-inactive');
  845. $(FM.TAB_B).find('.selected').addClass('selected-inactive');
  846. }
  847. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  848. if (FM['CURRENT_' + tab + '_LINE'] == -1) {
  849. FM.setActive(0, FM.CURRENT_TAB);
  850. }
  851. }
  852. FM.setTabActive = function(box, action) {
  853. FM.CURRENT_TAB = box;
  854. $('.window.active').removeClass('active');
  855. $('.listing-left.active').removeClass('active');
  856. $('.listing-right.active').removeClass('active');
  857. $(FM.CURRENT_TAB).addClass('active');
  858. $(FM.CURRENT_TAB).closest('.window').addClass('active');
  859. if (action == 'skip_highlights') {
  860. return true;
  861. }
  862. if (FM.CURRENT_TAB == FM.TAB_A) {
  863. $(FM.TAB_B).find('.selected').addClass('selected-inactive').removeClass('selected');
  864. $(FM.TAB_A).find('.selected-inactive').addClass('selected').removeClass('selected-inactive');
  865. if ($(FM.TAB_A).find('.selected-inactive').length == 0 && $(FM.TAB_A).find('.selected').length == 0) {
  866. }
  867. }
  868. else {
  869. $(FM.TAB_A).find('.selected').addClass('selected-inactive').removeClass('selected');
  870. $(FM.TAB_B).find('.selected-inactive').addClass('selected').removeClass('selected-inactive');
  871. }
  872. }
  873. FM.confirmRename = function() {
  874. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  875. var box = FM['TAB_' + tab];
  876. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  877. if (!selected) {
  878. return FM.displayError(
  879. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  880. );
  881. }
  882. var src = selected.find('.source').val();
  883. src = $.parseJSON(src);
  884. var target_name = $('#rename-title').val();
  885. if (target_name.trim().length == 0) {
  886. return FM.displayError(
  887. App.Constants.FM_FILE_NAME_CANNOT_BE_EMPTY
  888. );
  889. }
  890. var action = FM.isItemFile(src) ? 'rename_file' : 'rename_directory';
  891. var params = {
  892. item: src.name,
  893. target_name: target_name,
  894. dir: FM['TAB_' + tab + '_CURRENT_PATH'] + '/'
  895. };
  896. App.Ajax.request(action, params, function(reply) {
  897. if (reply.result == true) {
  898. FM.popupClose();
  899. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  900. }
  901. else {
  902. FM.showError('rename-items', reply.message);
  903. }
  904. });
  905. }
  906. FM.renameItems = function() {
  907. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  908. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  909. if (selected.length == 0) {
  910. return FM.displayError(
  911. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  912. );
  913. }
  914. var src = selected.find('.source').val();
  915. src = $.parseJSON(src);
  916. if (FM.isItemPseudo(src)) {
  917. return FM.displayError(
  918. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  919. );
  920. }
  921. var tpl = Tpl.get('popup_rename', 'FM');
  922. tpl.set(':FILENAME', src.name);
  923. tpl.set(':NEW_NAME', src.name);
  924. FM.popupOpen(tpl.finalize());
  925. }
  926. FM.popupOpen = function(html) {
  927. $('<div>').attr('id', 'popup').html(html).flayer({
  928. afterStart: function(elm) {
  929. elm.find('input[type="text"]:first').focus();
  930. }
  931. });
  932. }
  933. FM.popupClose = function() {
  934. clearTimeout(FM.Env.errorMessageHideTimeout);
  935. return $('#popup').flayer_close();
  936. }
  937. FM.copyItems = function() {
  938. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  939. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  940. if (selected.length == 0) {
  941. return FM.displayError(
  942. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  943. );
  944. }
  945. if (selected.length > 1) { // multi operation
  946. return FM.bulkCopy();
  947. }
  948. var src = selected.find('.source').val();
  949. src = $.parseJSON(src);
  950. if (FM.isItemPseudo(src)) {
  951. return FM.displayError(
  952. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  953. );
  954. }
  955. var opposite_tab = 'A';
  956. if (tab == 'A') {
  957. opposite_tab = 'B';
  958. }
  959. var dst = FM['TAB_' + opposite_tab + '_CURRENT_PATH'];
  960. if (dst == '') {
  961. dst = GLOBAL.ROOT_DIR;
  962. }
  963. var tpl = Tpl.get('popup_copy', 'FM');
  964. tpl.set(':SRC_FILENAME', src.full_path);
  965. tpl.set(':DST_FILENAME', dst + '/' + src.name);
  966. FM.popupOpen(tpl.finalize());
  967. }
  968. FM.confirmUnpackItem = function () {
  969. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  970. var box = FM['TAB_' + tab];
  971. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  972. if (selected.length == 0) {
  973. return FM.displayError(
  974. App.Constants.FM_NO_FILE_SELECTED
  975. );
  976. }
  977. var opposite_tab = 'A';
  978. if (tab == 'A') {
  979. opposite_tab = 'B';
  980. }
  981. var src = selected.find('.source').val();
  982. src = $.parseJSON(src);
  983. if (FM.isItemPseudo(src)) {
  984. return FM.displayError(
  985. App.Constants.FM_NO_FILE_SELECTED
  986. );
  987. }
  988. if (!FM.itemIsArchieve(src)) {
  989. return FM.displayError(
  990. App.Constants.FM_FILE_TYPE_NOT_SUPPORTED
  991. );
  992. }
  993. var dst = FM['TAB_' + tab + '_CURRENT_PATH'];
  994. if (dst == '') {
  995. dst = GLOBAL.ROOT_DIR;
  996. }
  997. var params = {
  998. item: src.full_path,
  999. filename: src.name,
  1000. dir: FM['TAB_' + tab + '_CURRENT_PATH'],
  1001. dir_target: $('#unpack-destination').val()
  1002. };
  1003. App.Ajax.request('unpack_item', params, function(reply) {
  1004. if (reply.result == true) {
  1005. FM.popupClose();
  1006. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], FM['TAB_' + tab]);
  1007. FM.open(FM['TAB_' + opposite_tab + '_CURRENT_PATH'], FM['TAB_' + opposite_tab]);
  1008. }
  1009. else {
  1010. FM.showError('unpack_item', reply.message);
  1011. }
  1012. });
  1013. }
  1014. FM.confirmPackItem = function () {
  1015. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1016. var box = FM['TAB_' + tab];
  1017. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  1018. if (selected.length == 0) {
  1019. return FM.displayError(
  1020. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  1021. );
  1022. }
  1023. var opposite_tab = 'A';
  1024. if (tab == 'A') {
  1025. opposite_tab = 'B';
  1026. }
  1027. var src = selected.find('.source').val();
  1028. src = $.parseJSON(src);
  1029. if (FM.isItemPseudo(src)) {
  1030. return FM.displayError(
  1031. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  1032. );
  1033. }
  1034. var dst = FM['TAB_' + tab + '_CURRENT_PATH'];
  1035. if (dst == '') {
  1036. dst = GLOBAL.ROOT_DIR;
  1037. }
  1038. var params = {
  1039. item: src.full_path,
  1040. filename: src.name,
  1041. dir: FM['TAB_' + tab + '_CURRENT_PATH'],
  1042. dir_target: $('#pack-destination').val()
  1043. };
  1044. App.Ajax.request('pack_item', params, function(reply) {
  1045. if (reply.result == true) {
  1046. FM.popupClose();
  1047. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], FM['TAB_' + tab]);
  1048. FM.open(FM['TAB_' + opposite_tab + '_CURRENT_PATH'], FM['TAB_' + opposite_tab]);
  1049. }
  1050. else {
  1051. FM.showError('unpack_item', reply.message);
  1052. }
  1053. });
  1054. }
  1055. FM.confirmCopyItems = function () {
  1056. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1057. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  1058. if (!selected) {
  1059. return FM.displayError(
  1060. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  1061. );
  1062. }
  1063. var opposite_tab = 'A';
  1064. if (tab == 'A') {
  1065. opposite_tab = 'B';
  1066. }
  1067. var src = selected.find('.source').val();
  1068. src = $.parseJSON(src);
  1069. if (FM.isItemPseudo(src)) {
  1070. return FM.displayError(
  1071. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  1072. );
  1073. }
  1074. var dest = $('#copy_dest').val();
  1075. if (dest == '') {
  1076. dest = GLOBAL.ROOT_DIR;
  1077. }
  1078. var action = FM.isItemFile(src) ? 'copy_file' : 'copy_directory';
  1079. var params = {
  1080. item: src.full_path,
  1081. filename: src.name,
  1082. dir: FM['TAB_' + tab + '_CURRENT_PATH'],
  1083. dir_target: dest
  1084. };
  1085. App.Ajax.request(action, params, function(reply) {
  1086. if (reply.result == true) {
  1087. FM.popupClose();
  1088. // FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], FM['TAB_' + tab]);
  1089. FM.open(FM['TAB_' + opposite_tab + '_CURRENT_PATH'], FM['TAB_' + opposite_tab]);
  1090. }
  1091. else {
  1092. FM.showError('copy-items', reply.message);
  1093. }
  1094. });
  1095. }
  1096. FM.downloadFiles = function() {
  1097. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1098. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  1099. if (!selected) {
  1100. return FM.displayError(
  1101. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  1102. );
  1103. }
  1104. var src = selected.find('.source').val();
  1105. src = $.parseJSON(src);
  1106. if (FM.isItemPseudo(src) || FM.isItemDir(src)) {
  1107. alert('Folder downloads are in progress atm');
  1108. }
  1109. if (FM.isItemPseudo(src)) {
  1110. if (FM.isItemPseudo(src)) {
  1111. return FM.displayError(
  1112. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  1113. );
  1114. }
  1115. }
  1116. var path = src.full_path;
  1117. var win = window.open('/download/file/?path=' + path, '_blank');
  1118. win.focus();
  1119. }
  1120. FM.uploadFile = function() {
  1121. //return alert('Not available atm..');
  1122. //$('<div>123</div>').flayer();
  1123. }
  1124. FM.confirmDelete = function() {
  1125. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1126. var box = FM['TAB_' + tab];
  1127. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  1128. if (!selected) {
  1129. return FM.displayError(
  1130. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  1131. );
  1132. }
  1133. var src = selected.find('.source').val();
  1134. src = $.parseJSON(src);
  1135. if (FM.isItemPseudo(src)) {
  1136. return FM.displayError(
  1137. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  1138. );
  1139. }
  1140. var params = {
  1141. item: src.full_path,
  1142. dir: FM['TAB_' + tab + '_CURRENT_PATH']
  1143. };
  1144. App.Ajax.request('delete_files', params, function(reply) {
  1145. if (reply.result == true) {
  1146. FM.popupClose();
  1147. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  1148. }
  1149. else {
  1150. FM.showError('delete-items', reply.message);
  1151. }
  1152. });
  1153. }
  1154. FM.deleteItems = function() {
  1155. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1156. var selected = $(FM['TAB_' + tab] ).find('.dir.selected');
  1157. if (selected.length == 0) {
  1158. return FM.displayError(
  1159. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  1160. );
  1161. }
  1162. if (selected.length > 1) { // multi operation
  1163. return FM.bulkRemove();
  1164. }
  1165. var src = selected.find('.source').val();
  1166. src = $.parseJSON(src);
  1167. if (FM.isItemPseudo(src)) {
  1168. return FM.displayError(
  1169. App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED
  1170. );
  1171. }
  1172. var tpl = Tpl.get('popup_delete', 'FM');
  1173. tpl.set(':FILENAME', src.name);
  1174. FM.popupOpen(tpl.finalize());
  1175. }
  1176. FM.displayError = function(msg) {
  1177. if (FM.isPopupOpened()) {
  1178. var ref = FM.getPopupReference();
  1179. if (ref.find('.warning-message').length > 0) {
  1180. ref.find('.warning-message').html('<p class="msg-item">' + msg + '</p>');
  1181. ref.find('.warning-message').show();
  1182. clearInterval(FM.Env.errorMessageHideTimeout);
  1183. FM.Env.errorMessageHideTimeout =
  1184. setTimeout(function() {
  1185. ref.find('.warning-message').fadeOut();
  1186. }, FM.errorMessageTimeout);
  1187. return;
  1188. }
  1189. }
  1190. FM.popupClose();
  1191. var tpl = Tpl.get('popup_alert', 'FM');
  1192. tpl.set(':TEXT', msg);
  1193. FM.popupOpen(tpl.finalize());
  1194. //return alert(msg);
  1195. }
  1196. FM.confirmCreateDir = function() {
  1197. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1198. var box = FM['TAB_' + tab];
  1199. var dirname = $('#rename-title').val();
  1200. if (dirname.trim().length == 0) {
  1201. return FM.displayError(
  1202. App.Constants.FM_DIRECTORY_NAME_CANNOT_BE_EMPTY
  1203. );
  1204. }
  1205. var params = {
  1206. dirname: dirname,
  1207. dir: FM['TAB_' + tab + '_CURRENT_PATH']
  1208. };
  1209. App.Ajax.request('create_dir', params, function(reply) {
  1210. if (reply.result == true) {
  1211. FM.popupClose();
  1212. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  1213. }
  1214. else {
  1215. FM.showError('create-dir', reply.message);
  1216. }
  1217. });
  1218. }
  1219. FM.createDir = function() {
  1220. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1221. var tpl = Tpl.get('popup_create_dir', 'FM');
  1222. FM.popupOpen(tpl.finalize());
  1223. }
  1224. FM.confirmCreateFile = function() {
  1225. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1226. var box = FM['TAB_' + tab];
  1227. var filename = $('#rename-title').val();
  1228. if (filename.trim().length == 0) {
  1229. return FM.displayError(
  1230. App.Constants.FM_FILE_NAME_CANNOT_BE_EMPTY
  1231. );
  1232. }
  1233. var params = {
  1234. filename: filename,
  1235. dir: FM['TAB_' + tab + '_CURRENT_PATH']
  1236. };
  1237. App.Ajax.request('create_file', params, function(reply) {
  1238. if (reply.result == true) {
  1239. FM.popupClose();
  1240. FM.open(FM['TAB_' + tab + '_CURRENT_PATH'], box);
  1241. }
  1242. else {
  1243. FM.showError('create-file', reply.message);
  1244. }
  1245. });
  1246. }
  1247. FM.createFile = function() {
  1248. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1249. var tpl = Tpl.get('popup_create_file', 'FM');
  1250. FM.popupOpen(tpl.finalize());
  1251. }
  1252. FM.showOrderBox = function(elm, tab) {
  1253. var primary_box = FM.ORDER_BOX_A;
  1254. var secondary_box = FM.ORDER_BOX_B;
  1255. if(tab == FM.TAB_B){
  1256. primary_box = FM.ORDER_BOX_B;
  1257. secondary_box = FM.ORDER_BOX_A;
  1258. }
  1259. secondary_box.hide();
  1260. if(primary_box.is(':visible')){
  1261. primary_box.hide();
  1262. return;
  1263. }
  1264. var offset = elm.offset();
  1265. offset.top += elm.outerHeight() + 10;
  1266. offset.left += elm.outerWidth() - primary_box.outerWidth();
  1267. primary_box.css({top: offset.top, left: offset.left});
  1268. primary_box.show();
  1269. }
  1270. FM.reOrderList = function(elm){
  1271. var tab = FM.TAB_A;
  1272. var menu = $(FM.TAB_A_MENU);
  1273. var path = FM.TAB_A_CURRENT_PATH;
  1274. var primary_box = FM.ORDER_BOX_A;
  1275. var tab_order_type = FM.ORDER_TAB_A;
  1276. if(elm.closest('.context-menu').hasClass('tab-b')){
  1277. tab = FM.TAB_B;
  1278. path = FM.TAB_B_CURRENT_PATH;
  1279. primary_box = FM.ORDER_BOX_B;
  1280. menu = FM.TAB_B_MENU;
  1281. tab_order_type = FM.ORDER_TAB_B;
  1282. }
  1283. var entity = elm.closest('li').attr('entity');
  1284. var direction = 'asc';
  1285. if(elm.hasClass('up')){
  1286. direction = 'desc';
  1287. }
  1288. if(tab == FM.TAB_A){
  1289. FM.ORDER_TAB_A = entity+'_'+direction;
  1290. }else{
  1291. FM.ORDER_TAB_B = entity+'_'+direction;
  1292. }
  1293. primary_box.find('span').removeClass('active');
  1294. $(menu).find('.sort-by .entity').html(elm.closest('li').find('span').html());
  1295. $(menu).find('.sort-by').removeClass('desc asc').addClass(direction).addClass('sort-by');
  1296. elm.addClass('active');
  1297. primary_box.hide();
  1298. FM.open(path, tab);
  1299. }
  1300. FM.isPopupOpened = function() {
  1301. var ref = $('#popup');
  1302. if (ref.length > 0) {
  1303. return true;
  1304. }
  1305. return false;
  1306. }
  1307. FM.getPopupReference = function() {
  1308. var ref = $('#popup');
  1309. return ref;
  1310. }
  1311. FM.handlePopupSubmit = function() {
  1312. try {
  1313. var method = $('#popup').find('.ok').attr('onClick');
  1314. if (method) {
  1315. method = method.replace('\(\);', '').replace('FM.', '');
  1316. if ('function' == typeof FM[method]) {
  1317. FM[method]();
  1318. }
  1319. }
  1320. }
  1321. catch(e) {
  1322. }
  1323. }
  1324. FM.handlePopupCancel = function() {
  1325. FM.popupClose();
  1326. }
  1327. FM.init();
  1328. $(document).ready(function() {
  1329. $('.progress-container').hide();
  1330. var ph = $('.window .pwd').outerHeight();
  1331. var mh = $('.window .menu').outerHeight();
  1332. var wh = $(window).outerHeight();
  1333. var hgt = wh - (ph + mh) - 8;
  1334. $('.window ul').outerHeight(hgt);
  1335. shortcut.add("Esc",function() {
  1336. if (FM.isPopupOpened()) {
  1337. return FM.handlePopupCancel();
  1338. }
  1339. },{
  1340. 'type': 'keydown',
  1341. 'propagate': false,
  1342. 'disable_in_input': false,
  1343. 'target': document
  1344. });
  1345. shortcut.add("Down",function() {
  1346. FM.goDown();
  1347. },{
  1348. 'type': 'keydown',
  1349. 'propagate': false,
  1350. 'disable_in_input': false,
  1351. 'target': document
  1352. });
  1353. shortcut.add("Up",function() {
  1354. FM.goUp();
  1355. },{
  1356. 'type': 'keydown',
  1357. 'propagate': false,
  1358. 'disable_in_input': false,
  1359. 'target': document
  1360. });
  1361. shortcut.add("Left",function() {
  1362. FM.setTabActive(FM.TAB_A);
  1363. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1364. if (FM['CURRENT_' + tab + '_LINE'] == -1) {
  1365. FM.setActive(0, FM.CURRENT_TAB);
  1366. }
  1367. },{
  1368. 'type': 'keydown',
  1369. 'propagate': false,
  1370. 'disable_in_input': false,
  1371. 'target': document
  1372. });
  1373. shortcut.add("Right",function() {
  1374. FM.setTabActive(FM.TAB_B);
  1375. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1376. if (FM['CURRENT_' + tab + '_LINE'] == -1) {
  1377. FM.setActive(0, FM.CURRENT_TAB);
  1378. }
  1379. },{
  1380. 'type': 'keydown',
  1381. 'propagate': false,
  1382. 'disable_in_input': false,
  1383. 'target': document
  1384. });
  1385. shortcut.add("Home",function() {
  1386. FM.goToTop();
  1387. },{
  1388. 'type': 'keydown',
  1389. 'propagate': false,
  1390. 'disable_in_input': false,
  1391. 'target': document
  1392. });
  1393. shortcut.add("End",function() {
  1394. FM.goToBottom();
  1395. },{
  1396. 'type': 'keydown',
  1397. 'propagate': false,
  1398. 'disable_in_input': false,
  1399. 'target': document
  1400. });
  1401. shortcut.add("Tab",function() {
  1402. FM.switchTab();
  1403. },{
  1404. 'type': 'keydown',
  1405. 'propagate': false,
  1406. 'disable_in_input': false,
  1407. 'target': document
  1408. });
  1409. shortcut.add("Space",function() {
  1410. FM.selectCurrentElementAndGoToNext();
  1411. },{
  1412. 'type': 'keydown',
  1413. 'propagate': false,
  1414. 'disable_in_input': false,
  1415. 'target': document
  1416. });
  1417. shortcut.add("Insert",function() {
  1418. FM.selectCurrentElementAndGoToNext();
  1419. },{
  1420. 'type': 'keydown',
  1421. 'propagate': false,
  1422. 'disable_in_input': false,
  1423. 'target': document
  1424. });
  1425. shortcut.add("ctrl+a",function() {
  1426. FM.toggleAllItemsSelected();
  1427. },{
  1428. 'type': 'keydown',
  1429. 'propagate': false,
  1430. 'disable_in_input': false,
  1431. 'target': document
  1432. });
  1433. shortcut.add("Enter",function() {
  1434. if (FM.isPopupOpened()) {
  1435. return FM.handlePopupSubmit();
  1436. }
  1437. var tab = FM.getTabLetter(FM.CURRENT_TAB);
  1438. var elm = $(FM.CURRENT_TAB).find('.dir:eq('+FM['CURRENT_'+tab+'_LINE']+')');
  1439. if (elm.length == 1) {
  1440. var src = $.parseJSON($(elm).find('.source').val());
  1441. if (src.type == 'd') {
  1442. FM.open(src.full_path, FM.CURRENT_TAB);
  1443. }
  1444. else {
  1445. FM.openFile(src.full_path, FM.CURRENT_TAB, elm);
  1446. }
  1447. }
  1448. },{
  1449. 'type': 'keydown',
  1450. 'propagate': false,
  1451. 'disable_in_input': false,
  1452. 'target': document
  1453. });
  1454. /* is jQuery .live() has been removed in version 1.9 onwards
  1455. $(FM.TAB_A + ' .dir').live('click', function(evt) {
  1456. FM.selectItem(evt.target, FM.TAB_A);
  1457. });
  1458. $(FM.TAB_B + ' .dir').live('click', function(evt) {
  1459. FM.selectItem(evt.target, FM.TAB_B);
  1460. });
  1461. */
  1462. /*$(FM.TAB_A).on('click', '.dir', function(evt) {
  1463. //console.log(evt);
  1464. if (evt.ctrlKey || evt.metaKey || evt.altKey) {
  1465. return;
  1466. }
  1467. FM.selectItem(evt.target, FM.TAB_A);
  1468. });
  1469. $(FM.TAB_B).on('click', '.dir', function(evt) {
  1470. if (evt.ctrlKey || evt.metaKey || evt.altKey) {
  1471. return;
  1472. }
  1473. FM.selectItem(evt.target, FM.TAB_B);
  1474. });*/
  1475. $(FM.TAB_A_MENU).on('click', '.sort-by', function(evt){
  1476. FM.showOrderBox($(evt.target), FM.TAB_A);
  1477. });
  1478. $(FM.TAB_B_MENU).on('click', '.sort-by', function(evt){
  1479. FM.showOrderBox($(evt.target), FM.TAB_B);
  1480. });
  1481. $('.context-menu.sort-order').on('click', 'span', function(evt){
  1482. FM.reOrderList($(evt.target));
  1483. });
  1484. $('.warning-box .close').on('click', function(evt){
  1485. $(evt.target).closest('.warning-box').hide();
  1486. });
  1487. $('.menu-A .extract-btn').hide();
  1488. $('.menu-B .extract-btn').hide();
  1489. });
  1490. /*$(document).bind('keydown.tab', function() {
  1491. FM.switchTab();
  1492. });*/
  1493. $(window).bind('statechange', function(evt){
  1494. $(evt).stopPropagation();
  1495. // History.getState()
  1496. //alert('No way back yet');
  1497. })