/* RoxyFileman - web based file manager. Ready to use with CKEditor, TinyMCE. Can be easily integrated with any other WYSIWYG editor or CMS. Copyright (C) 2013, RoxyFileman.com - Lyubomir Arsov. All rights reserved. For licensing, see LICENSE.txt or http://RoxyFileman.com/license This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Contact: Lyubomir Arsov, liubo (at) web-lobby.com */ $.ajaxSetup ({cache: false}); function selectFile(item){ $('#pnlFileList li').removeClass('selected'); $(item).prop('class', 'selected'); var html = RoxyUtils.GetFilename($(item).attr('data-path')); html += ' ('+t('Size')+': '+RoxyUtils.FormatFileSize($(item).attr('data-size')); if($(item).attr('data-w') > 0) html += ', '+t('Dimensions')+':'+$(item).attr('data-w')+'x'+$(item).attr('data-h'); html += ')'; $('#pnlStatus').html(html); } function getLastDir(){ return RoxyUtils.GetCookie('roxyld'); } function setLastDir(path){ RoxyUtils.SetCookie('roxyld', path, 10); } function selectDir(item){ var d = Directory.Parse($(item).parent('li').attr('data-path')); if(d){ d.Select(); } } function startDragDir(){ } function startDragFile(){ selectFile(this); } function dragFileOver(){ $(this).children('img.dir').attr('src', 'images/folder-green.png'); } function dragFileOut(){ $('#pnlDirList').find('img.dir').attr('src', 'images/folder.png'); } function makeDragFile(e){ var f = new File($(e.target).closest('li').attr('data-path')); return '
 '+f.name+'
'; } function makeDragDir(e){ var f = new Directory($(e.target).attr('data-path')?$(e.target).attr('data-path'):$(e.target).closest('li').attr('data-path')); return '
 '+f.name+'
'; } function moveDir(e, ui, obj){ var dir = Directory.Parse(ui.draggable.attr('data-path')); var target = Directory.Parse($(obj).parent('li').attr('data-path')); if(target.fullPath != dir.path) dir.Move(target.fullPath); } function moveFile(e, ui, obj){ var f = new File(ui.draggable.attr('data-path')); var d = Directory.Parse($(obj).parent('li').attr('data-path')); var src = Directory.Parse(f.path); if(f.path != d.fullPath) f.Move(d.fullPath); } function moveObject(e, ui){ e.stopPropagation(); if(ui.draggable.hasClass('directory')) moveDir(e, ui, this); else moveFile(e, ui, this); dragFileOut(); } function clickFirstOnEnter(elId){ $('#'+elId).unbind('keypress'); $('.actions input').each(function(){this.blur();}); $('#'+elId).keypress(function(e) { if (e.keyCode == $.ui.keyCode.ENTER) { e.stopPropagation(); $(this).parent().find('.ui-dialog-buttonset button').eq(0).trigger('click'); } }); } function addDir(){ var f = getSelectedDir(); if(!f) return; clickFirstOnEnter('pnlDirName'); $('#txtDirName').val(''); var dialogButtons = {}; dialogButtons[t('CreateDir')] = function(){ var newName = $.trim($('#txtDirName').val()); if(!newName) alert(t('E_MissingDirName')); if(f.Create(newName)){ $('#pnlDirName').dialog('close'); } }; dialogButtons[t('Cancel')] = function(){$('#pnlDirName').dialog('close');}; $('#pnlDirName').dialog({title: t('T_CreateDir'),modal:true,buttons:dialogButtons}); } var uploadFileList = new Array(); function showUploadList(files){ var filesPane = $('#uploadFilesList'); filesPane.html(''); clearFileField(); for(i = 0; i < files.length; i++){ filesPane.append('
'+files[i].name+' ('+RoxyUtils.FormatFileSize(files[i].size)+')
'); } if(files.length > 0) $('#btnUpload').button('enable'); else $('#btnUpload').button('disable'); } function listUploadFiles(files){ if(!window.FileList) { $('#btnUpload').button('enable'); } else if(files.length > 0) { uploadFileList = new Array(); addUploadFiles(files); } } function addUploadFiles(files){ for(i = 0; i < files.length; i++) uploadFileList.push(files[i]); showUploadList(uploadFileList); } function removeUpload(i){ var el = findUploadElement(i); el.remove(); try{ uploadFileList.splice(i, 1); showUploadList(uploadFileList); } catch(ex){ //alert(ex); } } function findUploadElement(i){ return $('#uploadFilesList .fileUpload:eq(' + (i)+ ')'); } function updateUploadProgress(e, i){ var el = findUploadElement(i); var percent = 99; if (e.lengthComputable) { percent = Math.floor((e.loaded / e.total) * 100); } if(percent > 99) percent = 99; el.find('.uploadProgress').css('width', percent + '%'); el.find('.progressPercent').html(' - ' + percent + '%'); } function uploadComplete(e, i){ uploadFinished(e, i, 'ok'); } function uploadError(e, i){ setUploadError(i); uploadFinished(e, i, 'error'); } function setUploadError(i){ var el = findUploadElement(i); el.find('.uploadProgress').css('width', '100%').addClass('uploadError').removeClass('uploadComplete'); el.find('.progressPercent').html(' - ' + t('E_UploadingFile')+''); } function setUploadSuccess(i){ var el = findUploadElement(i); el.find('.uploadProgress').css('width', '100%').removeClass('uploadError').addClass('uploadComplete'); el.find('.progressPercent').html(' - 100%'); } function uploadCanceled(e, i){ uploadFinished(e, i, 'error'); } function uploadFinished(e, i, res){ var el = findUploadElement(i); var httpRes = null; try{ httpRes = JSON.parse(e.target.responseText); } catch(ex){} if((httpRes && httpRes.res == 'error') || res != 'ok'){ res = 'error'; setUploadError(i); } else{ res = 'ok'; setUploadSuccess(i) } el.attr('data-ulpoad', res); checkUploadResult(); } function checkUploadResult(){ var all = $('#uploadFilesList .fileUpload').length; var completed = $('#uploadFilesList .fileUpload[data-ulpoad]').length; var success = $('#uploadFilesList .fileUpload[data-ulpoad="ok"]').length; if(completed == all){ //$('#uploadResult').html(success + ' files uploaded; '+(all - success)+' failed'); uploadFileList = new Array(); var d = Directory.Parse($('#hdDir').val()); d.ListFiles(true); $('#btnUpload').button('disable'); } } function fileUpload(f, i){ var http = new XMLHttpRequest(); var fData = new FormData(); var el = findUploadElement(i); el.find('.removeUpload').remove(); fData.append("action", 'upload'); fData.append("method", 'ajax'); fData.append("d", $('#hdDir').attr('value')); fData.append("files[]", f); http.upload.addEventListener("progress", function(e){updateUploadProgress(e, i);}, false); http.addEventListener("load", function(e){uploadComplete(e, i);}, false); http.addEventListener("error", function(e){uploadError(e, i);}, false); http.addEventListener("abort", function(e){uploadCanceled(e, i);}, false); http.open("POST", RoxyFilemanConf.UPLOAD, true); http.setRequestHeader("Accept", "*/*"); http.send(fData); } function dropFiles(e, append){ if(e && e.dataTransfer && e.dataTransfer.files){ addFile(); if(append) addUploadFiles(e.dataTransfer.files); else listUploadFiles(e.dataTransfer.files); } else addFile(); } function clearFileField(selector){ if(!selector) selector = '#fileUploads'; try{ $(selector).val(''); $(selector).val(null); } catch(ex){} } function addFileClick(){ $('#uploadResult').html(''); showUploadList(new Array()); addFile(); } function addFile(){ clickFirstOnEnter('dlgAddFile'); $('#uploadResult').html(''); clearFileField(); var dialogButtons = {}; dialogButtons[t('Upload')] = {id:'btnUpload', text: t('Upload'), disabled:true, click:function(){ if(!$('#fileUploads').val() && (!uploadFileList || uploadFileList.length == 0)) alert(t('E_SelectFiles')); else{ if(!RoxyFilemanConf.UPLOAD){ alert(t('E_ActionDisabled')); //$('#dlgAddFile').dialog('close'); } else{ if(window.FormData && window.XMLHttpRequest && window.FileList && uploadFileList && uploadFileList.length > 0){ for(i = 0; i < uploadFileList.length; i++){ fileUpload(uploadFileList[i], i); } } else{ document.forms['addfile'].action = RoxyFilemanConf.UPLOAD; document.forms['addfile'].submit(); } } } }}; dialogButtons[t('Cancel')] = function(){$('#dlgAddFile').dialog('close');}; $('#dlgAddFile').dialog({title:t('T_AddFile'),modal:true,buttons:dialogButtons,width:400}); } function fileUploaded(res){ if(res.res == 'ok' && res.msg){ $('#dlgAddFile').dialog('close'); var d = Directory.Parse($('#hdDir').val()); d.ListFiles(true); alert(res.msg); } else if(res.res == 'ok'){ $('#dlgAddFile').dialog('close'); var d = Directory.Parse($('#hdDir').val()); d.ListFiles(true); } else alert(res.msg); } function renameDir(){ var f = getSelectedDir(); if(!f) return; if($('[data-path="'+f.fullPath+'"]').parents('li').length < 1){ alert(t('E_CannotRenameRoot')); return; } clickFirstOnEnter('pnlDirName'); $('#txtDirName').val(f.name); var dialogButtons = {}; dialogButtons[t('RenameDir')] = function(){ var newName = $.trim($('#txtDirName').val()); if(!newName) alert(t('E_MissingDirName')); if(f.Rename(newName)) $('#pnlDirName').dialog('close'); }; dialogButtons[t('Cancel')] = function(){$('#pnlDirName').dialog('close');}; $('#pnlDirName').dialog({title:t('T_RenameDir'),modal:true,buttons:dialogButtons}); RoxyUtils.SelectText('txtDirName', 0, new String(f.name).length); } function renameFile(){ var f = getSelectedFile(); if(!f) return; clickFirstOnEnter('pnlRenameFile'); $('#txtFileName').val(f.name); var dialogButtons = {}; dialogButtons[t('RenameFile')] = function(){ var newName = $.trim($('#txtFileName').val()); if(!newName) alert('Missing file name'); else if(f.Rename(newName)){ $('li[data-path="'+f.fullPath+'"] .name').text(newName); $('li[data-path="'+f.fullPath+'"]').attr('data-path', RoxyUtils.MakePath(f.path, newName)); $('#pnlRenameFile').dialog('close'); } }; dialogButtons[t('Cancel')] = function(){$('#pnlRenameFile').dialog('close');}; $('#pnlRenameFile').dialog({title:t('T_RenameFile'),modal:true,buttons:dialogButtons}); if(f.name.lastIndexOf('.') > 0) RoxyUtils.SelectText('txtFileName', 0, f.name.lastIndexOf('.')); } function getSelectedFile(){ var ret = null; if($('#pnlFileList .selected').length > 0) ret = new File($('#pnlFileList .selected').attr('data-path')); return ret; } function getSelectedDir(){ var ret = null; if($('#pnlDirList .selected')) ret = Directory.Parse($('#pnlDirList .selected').closest('li').attr('data-path')); return ret; } function deleteDir(path){ var d = null; if(path) d = Directory.Parse(path); else d = getSelectedDir(); if(d && confirm(t('Q_DeleteFolder'))){ d.Delete(); } } function deleteFile(){ var f = getSelectedFile(); if(f && confirm(t('Q_DeleteFile'))){ f.Delete(); } } function previewFile(){ var f = getSelectedFile(); if(f){ window.open(f.fullPath); } } function downloadFile(){ var f = getSelectedFile(); if(f && RoxyFilemanConf.DOWNLOAD){ var url = RoxyUtils.AddParam(RoxyFilemanConf.DOWNLOAD, 'f', f.fullPath); window.frames['frmUploadFile'].location.href = url; } else if(!RoxyFilemanConf.DOWNLOAD) alert(t('E_ActionDisabled')); } function downloadDir(){ var d = getSelectedDir(); if(d && RoxyFilemanConf.DOWNLOADDIR){ var url = RoxyUtils.AddParam(RoxyFilemanConf.DOWNLOADDIR, 'd', d.fullPath); window.frames['frmUploadFile'].location.href = url; } else if(!RoxyFilemanConf.DOWNLOAD) alert(t('E_ActionDisabled')); } function closeMenus(el){ if(!el || el == 'dir') $('#menuDir').fadeOut(); if(!el || el == 'file') $('#menuFile').fadeOut(); } function selectFirst(){ var item = $('#pnlDirList li:first').children('div').first(); if(item.length > 0) selectDir(item); else window.setTimeout('selectFirst()', 300); } function tooltipContent(){ if($('#menuFile').is(':visible')) return ''; var html = ''; var f = File.Parse($(this).attr('data-path')); if($('#hdViewType').val() == 'thumb' && f.IsImage()){ html = f.fullPath+'
'+t('Size')+': '+RoxyUtils.FormatFileSize(f.size) + ' '+t('Dimensions')+': '+f.width+'x'+f.height+''; } else if(f.IsImage()){ if(RoxyFilemanConf.GENERATETHUMB){ imgUrl = RoxyUtils.AddParam(RoxyFilemanConf.GENERATETHUMB, 'f', f.fullPath); imgUrl = RoxyUtils.AddParam(imgUrl, 'width', RoxyFilemanConf.PREVIEW_THUMB_WIDTH); imgUrl = RoxyUtils.AddParam(imgUrl, 'height', RoxyFilemanConf.PREVIEW_THUMB_HEIGHT); } else imgUrl = f.fullPath; html = '
'+f.name+'
'+t('Size')+': '+RoxyUtils.FormatFileSize(f.size) + ' '+t('Dimensions')+': '+f.width+'x'+f.height+''; } else html = f.fullPath+' '+t('Size')+': '+RoxyUtils.FormatFileSize(f.size) + ''; return html; } function filterFiles(){ var str = $('#txtSearch').val(); $('#pnlSearchNoFiles').hide(); if($('#pnlFileList li').length == 0) return; if(!str){ $('#pnlFileList li').show(); return; } var i = 0; $('#pnlFileList li').each(function(){ var name = $(this).children('.name').text(); if(name.toLowerCase().indexOf(str.toLowerCase()) > -1){ i++; $(this).show(); } else{ $(this).removeClass('selected'); $(this).hide(); } }); if(i == 0) $('#pnlSearchNoFiles').show(); } function sortFiles(){ var d = getSelectedDir(); if(!d) return; d.ListFiles(); filterFiles(); switchView($('#hdViewType').val()); } function switchView(t){ if(t == $('#hdViewType').val()) return; if(!t) t = $('#hdViewType').val(); $('.btnView').removeClass('selected'); if(t == 'thumb'){ $('#pnlFileList .icon').attr('src', 'images/blank.gif'); $('#pnlFileList').addClass('thumbView'); if($('#dynStyle').length == 0){ $('head').append('