/** * This file is part of Moodle - http://moodle.org/ * File manager * @copyright 1999 onwards Dongsheng Cai * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ var fm_cfg = {}; var fm_move_dlg = null; var fm_rename_dlg = null; var fm_mkdir_dlg = null; // initialize file manager var filemanager = (function(){ function _filemanager() { this.init = function(client_id, options) { this.client_id = client_id; html_compiler(client_id, options); } } return _filemanager; })(); filemanager.url = moodle_cfg.wwwroot + '/files/files_ajax.php'; filemanager.fileicon = moodle_cfg.wwwroot + '/pix/i/settings.gif'; // callback function for file picker function filemanager_callback(obj) { refresh_filemanager(obj.filepath, fm_cfg[obj.client_id]); fm_cfg[obj.client_id].currentfiles++; if (fm_cfg[obj.client_id].currentfiles>=fm_cfg[obj.client_id].maxfiles && fm_cfg[client_id].maxfiles!=-1) { var btn = document.getElementById('btnadd-'+obj.client_id); btn.style.display = 'none'; } } // setup options for file picker function fm_launch_filepicker(el_id, options) { var picker = document.createElement('DIV'); picker.id = 'file-picker-'+options.client_id; picker.className = 'file-picker'; document.body.appendChild(picker); var el=document.getElementById(el_id); var params = {}; params.env = 'filemanager'; params.itemid = options.itemid; params.maxfiles = options.maxfiles; params.maxbytes = options.maxbytes; params.savepath = options.savepath; params.target = el; params.callback = filemanager_callback; var fp = open_filepicker(options.client_id, params); return false; } // create a new folder in draft area function mkdir(e, client_id, itemid) { var mkdir_cb = { success: function(o) { var result = json_decode(o.responseText); fm_mkdir_dlg.hide(); refresh_filemanager(result.filepath, fm_cfg[client_id]); } } var perform = function(e) { var foldername = document.getElementById('fm-newname').value; if (!foldername) { return; } var params = []; params['itemid'] = itemid; params['newdirname'] = foldername; params['sesskey'] = moodle_cfg.sesskey; params['filepath'] = fm_cfg[client_id].currentpath; var trans = YAHOO.util.Connect.asyncRequest('POST', filemanager.url+'?action=mkdir', mkdir_cb, build_querystring(params)); YAHOO.util.Event.preventDefault(e); } if (!document.getElementById('fm-mkdir-dlg')) { var el = document.createElement('DIV'); el.id = 'fm-mkdir-dlg'; el.innerHTML = '
'+mstr.repository.entername+'
'; document.body.appendChild(el); var x = YAHOO.util.Event.getPageX(e); var y = YAHOO.util.Event.getPageY(e); fm_mkdir_dlg = new YAHOO.widget.Dialog("fm-mkdir-dlg", { width: "300px", visible: true, x:y, y:y, constraintoviewport : true }); } var buttons = [ { text:mstr.moodle.ok, handler:perform, isDefault:true }, { text:mstr.moodle.cancel, handler:function(){this.cancel();}}]; fm_mkdir_dlg.cfg.queueProperty("buttons", buttons); fm_mkdir_dlg.render(); fm_mkdir_dlg.show(); var k1 = new YAHOO.util.KeyListener(document.getElementById('fm-mkdir-dlg'), {keys:13}, {fn:function(){perform();}, correctScope: true}); k1.enable(); document.getElementById('fm-newname').value = ''; } // generate html function html_compiler(client_id, options) { var list = options.list; var breadcrumb = document.getElementById('fm-path-'+client_id); var count = 0; if (options.path) { breadcrumb.innerHTML = ''; var count = 0; for(var p in options.path) { var sep = document.createElement('SPAN'); sep.innerHTML = ' ▶ '; if (count==0) { sep.innerHTML = 'Path: '; } else { sep.innerHTML = ' ▶ '; } count++; var pathid = 'fm-path-node-'+client_id; pathid += ('-'+count); var el = document.createElement('A'); el.id = pathid; el.innerHTML = options.path[p].name; el.href = '###'; breadcrumb.appendChild(sep); breadcrumb.appendChild(el); var args = {}; args.itemid = options.itemid; args.requestpath = options.path[p].path; args.client_id = client_id; YAHOO.util.Event.addListener(pathid, 'click', click_breadcrumb, args); } } var template = document.getElementById('fm-tmpl'); var container = document.getElementById('filemanager-' + client_id); var listhtml = ''); options.client_id=client_id; YAHOO.util.Event.addListener(file_ids, 'click', create_filemenu, file_data); YAHOO.util.Event.addListener(folder_ids, 'click', create_foldermenu, folder_data); YAHOO.util.Event.addListener(zip_ids, 'click', create_zipmenu, zip_data); YAHOO.util.Event.addListener(html_ids, 'mouseover', fm_mouseover_menu, html_data); YAHOO.util.Event.addListener(html_ids, 'mouseout', fm_mouseout_menu, html_data); YAHOO.util.Event.addListener(foldername_ids,'click', click_folder, folder_data); } function fm_mouseover_menu(ev, args) { this.style.backgroundColor = '#0066EE'; var menu = args[this.id]; menu = document.getElementById(menu); menu.style.display = 'inline'; } function fm_mouseout_menu(ev, args) { this.style.backgroundColor = 'transparent'; var menu = args[this.id]; menu = document.getElementById(menu); menu.style.display = 'none'; } function click_breadcrumb(ev, args) { var params = []; params['itemid'] = args.itemid; params['sesskey'] = moodle_cfg.sesskey; params['filepath'] = args.requestpath; this.cb = { success: function(o) { var data = json_decode(o.responseText); for(var key in data) { this.options[key] = data[key]; } html_compiler(this.client_id, this.options); } } this.cb.options = args; this.cb.client_id = args.client_id; fm_cfg[args.client_id].currentpath = args.requestpath; fm_loading('filemanager-'+args.client_id, 'fm-prgressbar'); var trans = YAHOO.util.Connect.asyncRequest('POST', filemanager.url+'?action=list', this.cb, build_querystring(params)); } function click_folder(ev, args) { var file = args[this.id]; refresh_filemanager(file.filepath, args); } function refresh_filemanager(path, args) { var params = []; params['itemid'] = args.itemid; params['filepath'] = path; params['sesskey'] = moodle_cfg.sesskey; this.cb = { success: function(o) { var data = json_decode(o.responseText); for(var key in data) { this.options[key] = data[key]; } html_compiler(this.client_id, this.options); } } this.cb.options = args; this.cb.client_id = args.client_id; fm_cfg[args.client_id].currentpath = params['filepath']; fm_loading('filemanager-'+args.client_id, 'fm-prgressbar'); var trans = YAHOO.util.Connect.asyncRequest('POST', filemanager.url+'?action=list', this.cb, build_querystring(params)); } function create_foldermenu(e, data) { var file = data[this.id]; this.zip = function(type, ev, obj) { this.cb = { success: function(o) { var result = json_decode(o.responseText); if (result) { refresh_filemanager(result.filepath, fm_cfg[this.client_id]); } } } this.cb.client_id = obj.client_id; this.cb.file = this.file; var params = []; params['itemid'] = obj.itemid; params['filepath'] = this.file.filepath; params['filename'] = '.'; params['sesskey'] = moodle_cfg.sesskey; fm_loading('filemanager-'+obj.client_id, 'fm-prgressbar'); var trans = YAHOO.util.Connect.asyncRequest('POST', filemanager.url+'?action=zip', this.cb, build_querystring(params)); } this.zip.file = file; var menuitems = [ {text: mstr.editor.zip, onclick: {fn: this.zip, obj: data, scope: this.zip}}, ]; create_menu(e, 'foldermenu', menuitems, file, data); } function create_filemenu(e, data) { var file = data[this.id]; var menuitems = [ {text: mstr.moodle.download, url:file.url} ]; create_menu(e, 'filemenu', menuitems, file, data); } function create_zipmenu(e, data) { var file = data[this.id]; this.unzip = function(type, ev, obj) { this.cb = { success:function(o) { var result = json_decode(o.responseText); if (result) { refresh_filemanager(result.filepath, fm_cfg[this.client_id]); } } } this.cb.client_id = obj.client_id; var params = []; params['itemid'] = obj.itemid; params['filepath'] = this.file.filepath; params['filename'] = this.file.fullname; params['sesskey'] = moodle_cfg.sesskey; fm_loading('filemanager-'+obj.client_id, 'fm-prgressbar'); var trans = YAHOO.util.Connect.asyncRequest('POST', filemanager.url+'?action=unzip', this.cb, build_querystring(params)); } this.unzip.file = file; var menuitems = [ {text: mstr.moodle.download, url:file.url}, {text: mstr.moodle.unzip, onclick: {fn: this.unzip, obj: data, scope: this.unzip}} ]; create_menu(e, 'zipmenu', menuitems, file, data); } function create_menu(ev, menuid, menuitems, file, options) { var position = YAHOO.util.Event.getXY(ev); var el = document.getElementById(menuid); var menu = new YAHOO.widget.Menu(menuid, {xy:position}); this.remove = function(type, ev, obj) { var args = {}; args.message = mstr.repository.confirmdeletefile; args.callback = function() { var params = {}; if (this.file.type == 'folder') { params['filename'] = '.'; params['filepath'] = this.file.fullname; } else { params['filename'] = this.file.fullname; params['filepath'] = fm_cfg[this.client_id].currentpath; } params['itemid'] = this.itemid; params['sesskey'] = moodle_cfg.sesskey; fm_loading('filemanager-'+this.client_id, 'fm-prgressbar'); var trans = YAHOO.util.Connect.asyncRequest('POST', filemanager.url+'?action=delete', this.cb, build_querystring(params)); } var dlg = confirm_dialog(ev, args); dlg.file = file; dlg.client_id = obj.client_id; dlg.itemid = obj.itemid; dlg.cb = { success: function(o) { var result = json_decode(o.responseText); if (!result) { alert(mstr.error.cannotdeletefile); } fm_cfg[this.client_id].currentfiles--; if (fm_cfg[this.client_id].currentfiles
'; document.body.appendChild(el); fm_rename_dlg = new YAHOO.widget.Dialog("fm-rename-dlg", { width: "300px", fixedcenter: true, visible: true, constraintoviewport : true }); } var buttons = [ { text:mstr.moodle.rename, handler:perform, isDefault:true }, { text:mstr.moodle.cancel, handler:function(){this.cancel();}}]; fm_rename_dlg.cfg.queueProperty("buttons", buttons); fm_rename_dlg.render(); fm_rename_dlg.show(); var k1 = new YAHOO.util.KeyListener(scope, {keys:13}, {fn:function(){perform();}, correctScope: true}); k1.enable(); document.getElementById('fm-rename-input').value = file.fullname; } this.rename.file = file; this.move = function(type, ev, obj) { var tree = new YAHOO.widget.TreeView("fm-tree"); var file = this.file; this.asyncMove = function(e) { if (!tree.targetpath) { return; } var cb = { success : function(o) { var result = json_decode(o.responseText); var p = '/'; if (result) { p = result.filepath; } refresh_filemanager(result.filepath, fm_cfg[obj.client_id]); this.dlg.cancel(); } } cb.dlg = this; var params = {}; if (file.type == 'folder') { alert('Moving folder is not supported yet'); return; action = 'movedir'; } else { action = 'movefile'; } params['filepath'] = file.filepath; params['filename'] = file.fullname; params['itemid'] = obj.itemid; params['sesskey'] = moodle_cfg.sesskey; params['newfilepath'] = tree.targetpath; fm_loading('filemanager-'+obj.client_id, 'fm-prgressbar'); var trans = YAHOO.util.Connect.asyncRequest('POST', filemanager.url+'?action='+action, cb, build_querystring(params)); } var buttons = [ { text:mstr.moodle.move, handler:this.asyncMove, isDefault:true }, { text:mstr.moodle.cancel, handler:function(){this.cancel();}}]; fm_move_dlg.cfg.queueProperty("buttons", buttons); tree.subscribe("dblClickEvent", function(e) { // update destidatoin folder this.targetpath = e.node.data.path; var el = document.getElementById('fm-move-div'); el.innerHTML = '"' + this.targetpath + '" has been selected.'; YAHOO.util.Event.preventDefault(e); }); this.loadDataForNode = function(node, onCompleteCallback) { this.cb = { success: function(o) { var data = json_decode(o.responseText); data = data.children; if (data.length == 0) { // so it is empty } else { for (var i in data) { var textnode = {label: data[i].fullname, path: data[i].filepath, itemid: this.itemid}; var tmpNode = new YAHOO.widget.TextNode(textnode, node, false); } } this.complete(); } } var params = {}; params['itemid'] = node.data.itemid; params['filepath'] = node.data.path; params['sesskey'] = moodle_cfg.sesskey; var trans = YAHOO.util.Connect.asyncRequest('POST', filemanager.url+'?action=dir', this.cb, build_querystring(params)); this.cb.complete = onCompleteCallback; this.cb.itemid = node.data.itemid; } this.loadDataForNode.itemid = obj.itemid; fm_move_dlg.subscribe('show', function(){ var el = document.getElementById('fm-move-div'); el.innerHTML = '
'+mstr.repository.nopathselected+'
'; var rootNode = tree.getRoot(); tree.setDynamicLoad(this.loadDataForNode); tree.removeChildren(rootNode); var textnode = {label: "Files", path: '/', itemid: obj.itemid}; var tmpNode = new YAHOO.widget.TextNode(textnode, rootNode, true); tree.draw(); }, this, true); fm_move_dlg.render(); fm_move_dlg.show(); } this.move.file = file; var shared_items = [ {text: mstr.moodle.rename+'...', onclick: {fn: this.rename, obj: options, scope: this.rename}}, {text: mstr.moodle.move+'...', onclick: {fn: this.move, obj: options, scope: this.move}}, {text: mstr.moodle['delete']+'...', onclick: {fn: this.remove, obj: options, scope: this.remove}} ]; menu.addItems(menuitems); menu.addItems(shared_items); if (fm_cfg[options.client_id].mainfile && (file.type!='folder')) { this.set_mainfile = function(type, ev, obj) { if (fm_cfg[obj.client_id].mainfile) { var mainfile = document.getElementById(fm_cfg[obj.client_id].mainfile+'-id'); mainfile.value = this.file.filepath+this.file.fullname; document.getElementById(fm_cfg[obj.client_id].mainfile+'-label').innerHTML = mainfile.value; } fm_cfg[obj.client_id].mainfilename = this.file.fullname; refresh_filemanager(fm_cfg[obj.client_id].currentpath, fm_cfg[obj.client_id]); } this.set_mainfile.file = file; menu.addItem({text: mstr.resource.setmainfile, onclick: {fn: this.set_mainfile, obj: options, scope: this.set_mainfile}}); } menu.render(document.body); menu.show(); menu.subscribe('hide', function(){ this.destroy(); }); } function setup_filebrowser(client_id, options) { if (!options) { options = {}; } fm_cfg[client_id] = {}; fm_cfg[client_id] = options; fm_cfg[client_id].mainfile = options.mainfile; fm_cfg[client_id].currentpath = '/'; fm_cfg[client_id].currentfiles = 0; // XXX: When editing existing folder, currentfiles shouldn't // be 0 fm_cfg[client_id].maxfiles = options.maxfiles; if (options.mainfile) { var mainfilename = document.getElementById(options.mainfile+'-id'); if (mainfilename.value) { var re = new RegExp(".*\/(.*)$", "i"); var result = mainfilename.value.match(re); document.getElementById(options.mainfile+'-label').innerHTML = mainfilename.value; fm_cfg[client_id].mainfilename = result[1]; } else { fm_cfg[client_id].mainfilename = ''; } } var fm = new filemanager(); fm.init(client_id, options); setup_buttons(client_id, options); } function setup_buttons(client_id, options) { //var fileadd = new YAHOO.widget.Button("btnadd-"+client_id); var fileadd = document.getElementById("btnadd-"+client_id);; var foldercreate = document.getElementById("btncrt-"+client_id); var folderdownload = document.getElementById("btndwn-"+client_id); var el = null; if (!fm_move_dlg) { el = document.createElement('DIV'); el.id = 'fm-move-dlg'; document.body.appendChild(el); fm_move_dlg = new YAHOO.widget.Dialog("fm-move-dlg", { width : "600px", fixedcenter : true, visible : false, constraintoviewport : true }); } else { el = document.getElementById('fm-move-div'); } el.innerHTML = '
'+mstr.repository.nopathselected+'
'; fm_move_dlg.render(); // if maxfiles == -1, the no limit if (fm_cfg[client_id].filecount >= fm_cfg[client_id].maxfiles && fm_cfg[client_id].maxfiles!=-1) { fileadd.style.display = 'none'; } else { fm_cfg[client_id].currentfiles = fm_cfg[client_id].filecount; fileadd.onclick = function(e) { this.options.savepath = this.options.currentpath; fm_launch_filepicker(this.options.target, this.options); } fileadd.options = fm_cfg[client_id]; } if (fm_cfg[client_id].subdirs) { foldercreate.onclick = function(e) { mkdir(e, this.options.client_id, this.options.itemid); } foldercreate.options = fm_cfg[client_id]; } else { foldercreate.style.display = 'none'; } folderdownload.onclick = function() { var cb = { success:function(o) { var result = json_decode(o.responseText); refresh_filemanager(result.filepath, fm_cfg[this.client_id]); var win = window.open(result.fileurl, 'fm-download-folder'); if (!win) { alert(mstr.repository.popupblockeddownload); } } }; cb.client_id = this.options.client_id; var params = []; params['itemid'] = this.options.itemid; params['sesskey'] = moodle_cfg.sesskey; params['filepath'] = this.options.currentpath; var trans = YAHOO.util.Connect.asyncRequest('POST', filemanager.url+'?action=downloaddir', cb, build_querystring(params)); } folderdownload.options = fm_cfg[client_id]; } function fm_loading(container, id) { if (!document.getElementById(id)) { var el = document.createElement('DIV'); el.id = id; el.style.backgroundColor = "white"; var container = document.getElementById(container); container.innerHTML = ''; container.appendChild(el); } var loading = new YAHOO.widget.Module(id, {visible:false}); loading.setBody('
'+mstr.repository.loading+'
'); loading.render(); loading.show(); return loading; }