diff --git a/amd/build/vplide.min.js b/amd/build/vplide.min.js
index c6b545ceb4eb450b83ad2740181191a1c73dc3d1..24d12fbeb768483870d7981eb1e773a10f9c80d3 100644
--- a/amd/build/vplide.min.js
+++ b/amd/build/vplide.min.js
@@ -1 +1 @@
-define(["jquery","jqueryui","mod_vpl/vplutil","mod_vpl/vplidefile","mod_vpl/vplidebutton","mod_vpl/vplterminal","mod_vpl/vplvnc"],function(a,b,c,d,e,f,g){if("undefined"!=typeof i)return i;var h,i=function(b,i){function j(a){return!S[a]||i[a]}function k(a){L?a.originalEvent.dataTransfer.dropEffect="none":a.originalEvent.dataTransfer.dropEffect="copy",a.preventDefault()}function l(a){if(L)return a.stopImmediatePropagation(),!1;var b=a.originalEvent.dataTransfer;return b.files.length>0?(c.readSelectedFiles(b.files,function(a){return D.addFile(a,!0,H,G)},function(){D.fileListVisibleIfNeeded()}),a.stopImmediatePropagation(),!1):void 0}function m(a){if(L)return a.stopPropagation(),!1}function n(a,b){if("newHeader"in b&&b.newHeader.hasClass("vpl_ide_accordion_t_grade"))return!1}function o(){function b(a){for(var b=a.toLowerCase()+"/",c=0;c<j.length;c++){var d=j[c].getFileName().toLowerCase()+"/";if(0===d.indexOf(b)||0===b.indexOf(d))return!0}return!1}function e(a,b){if(c.isBlockly(a))return!1;if(c.isBlockly(b))for(var d=0;d<j.length;d++)if(c.isBlockly(j[d].getFileName()))return!0;return!1}var f=a("#vpl_tabs_ul"),g=a("#vpl_tabs").tabs("widget"),j=[],n=[],o=!0,p=this;this.updateFileList=function(){p.generateFileList()},this.fileNameExists=function(a){for(var b=a.toLowerCase(),c=0;c<j.length;c++)if(j[c].getFileName().toLowerCase()==b)return c;return-1},this.restrictedPaste=m,this.dropHandler=l,this.dragoverHandler=k,this.readOnly=M,this.restrictedEdit=L,this.adjustTabsTitles=E,this.minNumberOfFiles=J,this.scrollBarWidth=O;var q="";this.setClipboard=function(a){q=a},this.getClipboard=function(){return q},this.getTabPos=function(a){for(var b=0;b<n.length;b++)if(n[b]==a)return b;return n.length},this.getTheme=function(){return i.theme},this.setTheme=function(a){i.theme=a;for(var b=0;b<j.length;b++)j[b].setTheme(a)},this.addTab=function(a){var b='<a href="#vpl_file'+a+'"></a>';f.append('<li id="vpl_tab_name'+a+'">'+b+"</li>"),g.append('<div id="vpl_file'+a+'" class="vpl_ide_file"></div>')},this.removeTab=function(a){f.find("#vpl_tab_name"+a).remove(),g.find("#vpl_file"+a).remove()},this.open=function(a){var b;if(b="object"==typeof a?a:j[a],!b.isOpen()){var d=b.getId();p.addTab(d),n.push(b),U.setGetkeys(b.open()),g.tabs("refresh"),E(!1),c.delay("updateMenu",H),c.delay("updateFileList",p.updateFileList)}},this.close=function(a){if(a.isOpen()){var b,d=a.getId();a.close(),p.removeTab(d);var e=p.getTabPos(a);return n.splice(e,1),g.tabs("refresh"),E(!1),p.fileListVisible(!0),c.delay("updateFileList",p.updateFileList),c.delay("adjustTabsTitles",E,!1),n.length>e?(b=p.getFilePosById(n[e].getId()),void p.gotoFile(b,"c")):e>0?(b=p.getFilePosById(n[e-1].getId()),void p.gotoFile(b,"c")):void 0}},this.isClosed=function(a){return!j[a].isOpen()},this.fileListVisible=function(a){a!==W.vpl_visible&&(W.vpl_visible=a,a?(W.show(),F()):(W.hide(),F()))},this.isFileListVisible=function(){return W.vpl_visible},this.fileListVisibleIfNeeded=function(){if(!this.isFileListVisible())for(var a=0;a<j.length;a++)if(!j[a].isOpen())return void this.fileListVisible(!0)},this.setFontSize=function(a){i.fontSize=a;for(var b=0;b<j.length;b++)j[b].setFontSize(a)},this.getFontSize=function(){return i.fontSize},this.addFile=function(a,f,g,k){if("string"!=typeof a.name||!c.validPath(a.name))return k(Q("incorrect_file_name")+" ("+a.name+")"),!1;f!==!0&&(f=!1);var l=this.fileNameExists(a.name);if(l!=-1)return f?(j[l].setContent(a.contents),p.setModified(),g(),c.delay("updateFileList",p.updateFileList),a):(k(Q("filenotadded").replace(/\{\$a\}/g,a.name)),!1);if(b(a.name)||e("",a.name))return k(Q("filenotadded").replace(/\{\$a\}/g,a.name)),!1;if(j.length>=K)return k(Q("maxfilesexceeded")+" ("+K+")"),!1;var m=c.getUniqueId(),n=new d(m,a.name,a.contents,this,h,i.id);return 1==a.encoding?n.extendToBinary():c.isBlockly(a.name)?n.extendToBlockly():n.extendToCodeEditor(),j.push(n),p.setModified(),j.length>5&&p.fileListVisible(!0),g(),c.delay("updateFileList",p.updateFileList),n},this.renameFile=function(a,d,f){var g=this.fileNameExists(a);try{if(g==-1)throw"";if(g<J)throw"";if(j[g].getFileName()==d)return!0;if(!c.validPath(d)||b(d)||e(a,d))throw Q("incorrect_file_name");if(c.isBinary()&&c.fileExtension(a)!=c.fileExtension(d))throw Q("incorrect_file_name");if(!c.isBlockly(a)&&c.isBlockly(d)||c.isBlockly(a)&&!c.isBlockly(d))throw Q("incorrect_file_name");j[g].setFileName(d)}catch(h){return f(Q("filenotrenamed").replace(/\{\$a\}/g,d)+": "+h),!1}return p.setModified(),E(!1),c.delay("updateFileList",p.updateFileList),!0},this.deleteFile=function(a,b,d){var e=this.fileNameExists(a);return e==-1?(d(Q("filenotdeleted").replace(/\{\$a\}/g,a)),!1):e<J?(d(Q("filenotdeleted").replace(/\{\$a\}/g,a)),!1):(p.setModified(),p.close(j[e]),j.splice(e,1),c.delay("updateFileList",p.updateFileList),!0)},this.currentFile=function(){var a=g.tabs("option","active");if(a in n){var b=n[a];if(0===arguments.length)return b;var c=arguments[0];if("function"==typeof b[c]){var d=b[c],e=Array.prototype.slice(arguments);return e.shift(),d.apply(b,e)}}return!1},this.currentPos=function(){return g.tabs("option","active")},this.getFileTab=function(a){for(var b=0;b<n.length;b++)if(n[b].getId()==a)return b;return-1},this.getFilePosById=function(a){for(var b=0;b<j.length;b++)if(j[b].getId()==a)return b;return-1},this.gotoFile=function(a,b){var c=j[a];p.open(c),g.tabs("option","active",p.getFileTab(c.getId())),"c"!==b&&c.gotoLine(parseInt(b,10)),c.focus()},this.gotoFileLink=function(b){var c=a(b),d=c.data("file"),e=-1;if(e=d>""?this.fileNameExists(d):p.getFilePosById(c.data("fileid")),e>=0){var f=c.data("line");"undefined"==typeof f&&(f="c"),p.gotoFile(e,f)}},this.getFilesToSave=function(){for(var a=[],b=0;b<j.length;b++){var c={};c.name=j[b].getFileName(),c.contents=j[b].getContent(),c.encoding=j[b].isBinary()?1:0,a.push(c)}return a},this.resetModified=function(){o=!1;for(var a=0;a<j.length;a++)j[a].resetModified();c.delay("updateMenu",H),c.delay("updateFileList",p.updateFileList)},this.setModified=function(){o||(o=!0,c.delay("updateFileList",p.updateFileList)),c.delay("updateMenu",H)},this.isModified=function(){return o},this.length=function(){return j.length},this.clearAnnotations=function(){for(var a=0;a<j.length;a++)j[a].clearAnnotations()},this.getFile=function(a){return j[a]},this.getFiles=function(){return j},this.getDirectoryStructure=function(){var a={isDir:!0,content:{}};for(var b in j)if(j.hasOwnProperty(b)){var c=j[b],d=c.getFileName(),e=d.split("/"),f=a;for(var g in e)if(e.hasOwnProperty(g)){var h=e[g];g==e.length-1?f.content[h]={isDir:!1,content:c,pos:b}:(f.content[h]||(f.content[h]={isDir:!0,content:{}}),f=f.content[h])}}return a},this.generateFileList=function(){function a(d,e,f){for(var g in d.content)if(d.content.hasOwnProperty(g)){var h=d.content[g];if(h.isDir)f.push(e+c.iconFolder()+c.sanitizeText(g)),a(h,e+b,f);else{var i=h.content,j=c.sanitizeText(g),k=c.sanitizeText(i.getFileName());i.isOpen()&&(j="<b>"+j+"</b>");var l='href="#" data-fileid="'+i.getId()+'" title="'+k+'"',m="<a "+l+">"+j+"</a>";i.isModified()&&(m=c.iconModified()+m),h.pos<J&&(m+=c.iconRequired()),f.push(e+m)}}}if(p.isFileListVisible()){var b='<span class="vpl_ide_dirindent"></span>',d=p.getDirectoryStructure(),e=[],f="";a(d,"",e);for(var g=0;g<e.length;g++)f+=e[g]+"<br />";Y.html("<div>"+f+"</div>")}},f.on("click","span.vpl_ide_closeicon",function(){D.close(D.currentFile())}),f.on("dblclick","span.vpl_ide_closeicon",U.getAction("delete")),f.on("dblclick","a",U.getAction("rename")),Y.on("dblclick","a",U.getAction("rename"))}function p(){return ba===!1&&(ba=($.outerWidth(!0)-$.width())/2),ba}function q(a,b){var c,d=b.position.left-b.originalPosition.left;if(0!==d)c=$.width()+W.width()-W.vpl_minWidth,$.resizable("option","maxWidth",c),W.width(W.vpl_original_width+d);else{c=$.width()+_.width()-_.vpl_minWidth,$.resizable("option","maxWidth",c);var e=b.size.width-b.originalSize.width;_.width(_.vpl_original_width-e)}D.currentFile("adjustSize")}function r(){var a=["e","w","e","e, w"],b=0;b+=W.vpl_visible?1:0,b+=_.vpl_visible?2:0,$.resizable("destroy"),ca.handles=a[b],ca.disable=0===b,$.resizable(ca)}function s(){var b=a(window).outerHeight();b-=T.offset().top+T.height()+(N?p():20),b<150&&(b=150),V.height(b);var c=b-3*p();$.height(c),_.vpl_visible&&(_.height(c+p()),aa.accordion("refresh")),W.vpl_visible&&(Y.height(c-(X.outerHeight()+p())),W.height(c))}function t(){D.currentFile("focus")}function u(b,d){return c.showMessage(b,a.extend({},da,d))}function v(b){if("click"==b.type||"keypress"==b.type&&13==b.keyCode){ea.dialog("close");var c={name:a("#vpl_ide_input_newfilename").val(),contents:"",encoding:0},d=D.addFile(c,!1,H,G);return d&&(D.open(d),$.tabs("option","active",D.getTabPos(d)),d.focus()),!1}}function w(b){("click"==b.type||"keypress"==b.type&&13==b.keyCode)&&(ga.dialog("close"),D.renameFile(D.currentFile("getFileName"),a("#vpl_ide_input_renamefilename").val(),G),b.preventDefault())}function x(){c.requestAction("resetfiles","",{},i.ajaxurl).done(function(a){var b=a.files;for(var d in b)b.hasOwnProperty(d)&&D.addFile(b[d],!0,c.doNothing,G);D.fileListVisibleIfNeeded(),c.delay("updateMenu",H)}).fail(G)}function y(){c.requestAction("correctedfiles","",{},i.ajaxurl).done(function(a){var b=a.files;for(var d in b)D.addFile(b[d],!0,c.doNothing,G);D.fileListVisibleIfNeeded()}).fail(G)}function z(a,b,d){d||(d={}),xa.isConnected()||c.requestAction(a,"",d,i.ajaxurl).done(function(d){c.webSocketMonitor(d,a,b,Aa)}).fail(G)}function A(){z("run","running",{XGEOMETRY:wa.getCanvasSize()})}function B(){z("debug","debugging",{XGEOMETRY:wa.getCanvasSize()})}function C(){z("evaluate","evaluating")}var D,E,F,G,H,I=this,J=i.minfiles||0,K=i.maxfiles||0,L=i.restrictededitor||i.example,M=i.example,N=!1,O=c.scrollBarWidth();c.setStr(i.i18n);var P,Q=c.str,R=a("#"+b);if(P="undefined"==typeof c.get_absolute_path()?"../editor/VPLIDE.css":c.get_absolute_path()+"/editor/VPLIDE.css",a("head").append('<meta name="viewport" content="initial-scale=1">').append('<meta name="viewport" width="device-width">').append('<link rel="stylesheet" href="'+P+'"/>'),"object"!=typeof R)throw"VPL: constructor tag_id not found";var S={"new":!0,rename:!0,"delete":!0,save:!0,run:!0,edit:!0,debug:!0,evaluate:!0,"import":!0,resetfiles:!0,correctedfiles:!0,sort:!0,multidelete:!0,acetheme:!0,console:!0,comments:!0};"undefined"==typeof i.loadajaxurl&&(i.loadajaxurl=i.ajaxurl),function(){var a=J<K;i["new"]=a,i.rename=a,i["delete"]=a,i.comments=i.comments&&!i.example,i.acetheme=!0}(),i.sort=K-J>=2,i.multidelete=i.sort,i["import"]=!L,i.console=j("run")||j("debug"),"undefined"==typeof i.fontSize&&(i.fontSize=12),i.fontSize=parseInt(i.fontSize),R.on("drop",l),R.on("dragover",k);var T=a("#vpl_menu"),U=new e(T,j),V=a("#vpl_tr"),W=a("#vpl_filelist"),X=a("#vpl_filelist_header"),Y=a("#vpl_filelist_content"),Z=a("#vpl_tabs_ul"),$=a("#vpl_tabs"),_=a("#vpl_results"),aa=a("#vpl_results_accordion");W.vpl_minWidth=80,_.vpl_minWidth=100,this.updateEvaluationNumber=function(a){if("undefined"!=typeof a.nevaluations){var b=a.nevaluations;"undefined"!=typeof a.reductionbyevaluation&&a.reductionbyevaluation>""&&0!=a.reductionbyevaluation&&(0!=a.freeevaluations&&(b=b+"/"+a.freeevaluations),b=b+" -"+a.reductionbyevaluation),U.setExtracontent("evaluate",b)}},this.lastResult=null,this.getTerminal=function(){return va},this.setResultGrade=function(a,b){var c="grade",d="vpl_ide_accordion_t_"+c,e="vpl_ide_accordion_c_"+c;if(0==aa.find("."+e).length&&(aa.append('<div class="'+d+'"></div>'),aa.append('<div class="'+e+'"></div>')),"undefined"==typeof b)return aa.find("h4."+d).length>0;var f=aa.find("."+d);return a>""?(f.replaceWith('<h4 class="'+d+'">'+a+"</h4>"),!0):(f.replaceWith('<div class="'+d+'"></div>'),!1)},this.setResultTab=function(b,c,d){var e="vpl_ide_accordion_t_"+b,f="vpl_ide_accordion_c_"+b;if(0==aa.find("."+f).length&&(aa.append('<div class="'+e+'"></div>'),aa.append('<div class="'+f+'"></div>')),"undefined"==typeof d)return aa.find("h4."+e).length>0;var g=aa.find("."+e),h=aa.find("."+f),i=a("<div>"+c+"</div>");return i.find("h4").replaceWith(function(){return a("<h5>").append(a(this).contents())}),h.html()==i.html()?c>"":c>""?(g.replaceWith('<h4 class="'+e+'">'+Q(b)+"</h4>"),h.replaceWith('<div class="ui-widget '+f+'">'+i.html()+"</div>"),!0):(g.replaceWith('<div class="'+e+'"></div>'),h.replaceWith('<div class="'+f+'"></div>'),!1)},this.setResult=function(a,b){I.updateEvaluationNumber(a);var d,e=D.getFiles(),f=[];for(d=0;d<e.length;d++)f[d]=e[d].getFileName(),e[d].clearAnnotations();var g,h,j,k=!1,l=c.sanitizeText(a.grade);if(h=I.setResultGrade(l,a.grade),k=k||h,g=I.setResultTab("variables",a.variables,a.variables),k=k||g,j=c.processResult(a.compilation,f,e,!0,!1),g=I.setResultTab("compilation",j,a.compilation),k=k||g,j=c.processResult(a.evaluation,f,e,!1,!1),g=I.setResultTab("comments",j,a.evaluation),k=k||g,j=c.sanitizeText(a.execution),g=I.setResultTab("execution",j,a.execution),k=k||g,g=I.setResultTab("description",i.description,i.description),k=k||g){for(_.show(),_.vpl_visible=!0,aa.accordion("refresh"),aa.accordion("option","active",h?1:0),d=0;d<e.length;d++)for(var m=e[d].getAnnotations(),n=0;n<m.length;n++)if(b||"error"==m[n].type){D.gotoFile(d,m[n].row+1);break}}else _.hide(),_.vpl_visible=!1;c.delay("autoResizeTab",F)},aa.accordion({heightStyle:"fill",header:"h4",animate:!1,beforeActivate:n}),_.width(2*_.vpl_minWidth),aa.on("click","a",function(a){a.preventDefault(),D.gotoFileLink(a.currentTarget)}),_.vpl_visible=!1,_.hide(),W.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),X.text(Q("filelist")),X.html(c.iconFolder()+X.html()),X.addClass("ui-widget-header ui-button-text-only ui-corner-all"),Y.addClass("ui-widget ui-corner-all"),W.width(2*W.vpl_minWidth),W.on("click","a",function(a){a.preventDefault(),D.gotoFileLink(a.currentTarget)}),W.vpl_visible=!1,W.hide(),$.tabs({classes:{"ui-tabs-panel":null}});var ba=!1,ca={containment:"parent",resize:q,start:function(){a(window).off("resize",F),$.resizable("option","minWidth",100),_.vpl_visible&&(_.vpl_original_width=_.width()),W.vpl_visible&&(W.vpl_original_width=W.width())},stop:function(b,c){q(b,c),$.resizable("option","maxWidth",1e5),$.resizable("option","minWidth",0),F(),a(window).on("resize",F)},handles:""};$.resizable(ca),E=function(b){var c=$.width(),d=0;Z.width(1e5);var e=Z.children("li:visible").last();if(e.length){var f=Z.parent().scrollLeft();d=f+e.position().left+e.width()+ba,Z.width(d);var g=D.currentFile();if(g&&b){var h=a(g.getTabNameId()),i=f+h.position().left;i-=(c-h.outerWidth())/2,i<0&&(i=0),Z.parent().finish().animate({scrollLeft:i},"slow")}}d<c&&Z.width("")},F=function(){var a=$.width(),b=T.width(),c=!1;if(r(),V.width(T.outerWidth()),W.vpl_visible){var d=W.outerWidth()+ba;a+=d,d>=100?(b-=d,$.css("left",d)):c=!0}else $.css("left",0);if(_.vpl_visible){var e=_.outerWidth()+ba;a+=e,b-=e,b<100&&(c=!0)}if(c){var f=T.width()/a,g=0;W.vpl_visible&&(g=W.width()*f,W.width(g-ba),g+=ba,$.css("left",g)),$.width($.width()*f),_.vpl_visible&&_.width(T.width()-(g+$.width()+ba))}else $.width(b);E(!0),s(),D.currentFile("adjustSize")};var da=a.extend({},{close:t},c.dialogbaseOptions);G=function(a){return c.showErrorMessage(a,{close:t})};var ea=a("#vpl_ide_dialog_new"),fa={};fa[Q("ok")]=v,fa[Q("cancel")]=function(){a(this).dialog("close")},ea.find("input").on("keypress",v),ea.dialog(a.extend({},da,{title:Q("create_new_file"),buttons:fa}));var ga=a("#vpl_ide_dialog_rename");ga.find("input").on("keypress",w),fa[Q("ok")]=w,ga.dialog(a.extend({},da,{open:function(){a("#vpl_ide_input_renamefilename").val(D.currentFile("getFileName"))},title:Q("rename_file"),buttons:fa})),fa[Q("ok")]=function(){a(this).dialog("close")};var ha=a("#vpl_ide_dialog_comments");ha.dialog(a.extend({},da,{title:Q("comments"),width:"40em",buttons:fa})),a("#vpl_ide_input_comments").width("30em");var ia=a("#vpl_ide_dialog_about"),ja={};ja[Q("ok")]=function(){a(this).dialog("close")};var ka=a("#vpl_ide_dialog_shortcuts");ka.dialog(a.extend({},da,{open:function(){var b=U.getShortcuts(D.currentFile("getEditor"));a("#vpl_ide_dialog_shortcuts").html(b)},title:Q("shortcuts"),width:400,height:300,buttons:ja})),ka.dialog("option","height",300),ja[Q("shortcuts")]=function(){a(this).dialog("close"),ka.dialog("open")},ia.dialog(a.extend({},da,{open:function(){var b=U.getShortcuts(D.currentFile("getEditor"));ia.next().find("button").filter(function(){return a(this).text()==Q("shortcuts")}).button(""!=b?"enable":"disable")},title:Q("about"),width:400,height:300,buttons:ja})),ia.dialog("option","height",300);var la=a("#vpl_ide_dialog_sort"),ma={};ma[Q("ok")]=function(){var b=D.getFiles(),d=/[^\d]*/,e=[],f=0,g=a("#vpl_sort_list li");if(g.length==b.length){for(g.each(function(){var a=parseInt(this.id.replace(d,""));e.push(b[a])}),f=0;f<g.length;f++)b[f]=e[f];D.setModified(),c.delay("updateMenu",H),c.delay("updateFileList",D.updateFileList),a(this).dialog("close")}},ma[Q("cancel")]=function(){a(this).dialog("close")},la.dialog(a.extend({},da,{title:Q("sort"),buttons:ma,open:function(){var b=a("#vpl_sort_list");b.html("");for(var c=D.getFiles(),d=0;d<c.length;d++){var e=a('<li id="vpl_fsort_'+d+'"class="ui-widget-content"></li>');d<J&&e.addClass("ui-state-disabled"),e.text(d+1+"-"+c[d].getFileName()),b.append(e)}b.sortable({items:"li:not(.ui-state-disabled)",placeholder:"ui-state-highlight",start:function(a,b){b.item.addClass("ui-state-highlight")},stop:function(a,b){b.item.removeClass("ui-state-highlight")}}),b.disableSelection()},maxHeight:400}));var na=a("#vpl_ide_dialog_multidelete"),oa={};oa[Q("selectall")]=function(){a(this).find("input").prop("checked",!0)},oa[Q("deselectall")]=function(){a(this).find("input").prop("checked",!1)},oa[Q("deleteselected")]=function(){var b=D.getFiles(),d=[],e=a("#vpl_multidelete_list label");e.each(function(){var c=a(this);if(c.find("input").prop("checked")){var e=c.data("fileid");d.push(b[e].getFileName())}});for(var f=0;f<d.length;f++)D.deleteFile(d[f],!1,G);c.delay("updateMenu",H),c.delay("updateFileList",D.updateFileList),a(this).dialog("close")},oa[Q("cancel")]=function(){a(this).dialog("close")},na.dialog(a.extend({},da,{title:Q("multidelete"),buttons:oa,open:function(){var b=a("#vpl_multidelete_list");b.html("");for(var d=D.getFiles(),e=J;e<d.length;e++){var f=c.sanitizeText(d[e].getFileName()),g=a('<label><input type="checkbox"> '+f+"</label>");g.data("fileid",e),b.append(g),b.append("<br>")}b.find("label").button()},maxHeight:400,maxWidth:400}));var pa=a("#vpl_ide_dialog_fontsize"),qa=a("#vpl_ide_dialog_fontsize .vpl_fontsize_slider"),ra={};ra[Q("ok")]=function(){var b=qa.slider("value");D.setFontSize(b),a(this).dialog("close"),a.ajax({async:!0,type:"POST",url:"../editor/userpreferences.json.php",data:JSON.stringify({fontSize:b}),contentType:"application/json; charset=utf-8",dataType:"json"})},ra[Q("cancel")]=function(){D.setFontSize(qa.data("vpl_fontsize")),a(this).dialog("close")},ra[Q("reset")]=function(){qa.slider("value",12)},pa.dialog(a.extend({},da,{title:Q("fontsize"),buttons:ra,open:function(){qa.data("vpl_fontsize",D.getFontSize()),qa.slider("value",D.getFontSize())}})),qa.slider({min:1,max:48,change:function(){var a=qa.slider("value");D.setFontSize(a),pa.find(".vpl_fontsize_slider_value").text(a)}});var sa=a("#vpl_ide_dialog_acetheme"),ta=a("#vpl_ide_dialog_acetheme select"),ua={};ua[Q("ok")]=function(){D.setTheme(ta.val()),a(this).dialog("close"),a.ajax({async:!0,type:"POST",url:"../editor/userpreferences.json.php",data:JSON.stringify({aceTheme:ta.val()}),contentType:"application/json; charset=utf-8",dataType:"json"})},ua[Q("cancel")]=function(){D.setTheme(ta.data("acetheme")),a(this).dialog("close")},ua[Q("reset")]=function(){ta.val(ta.data("acetheme")),D.setTheme(ta.val())},sa.dialog(a.extend({},da,{title:Q("theme"),buttons:ua,modal:!1,open:function(){ta.data("acetheme",D.getTheme()),ta.val(D.getTheme())}})),ta.on("change",function(){D.setTheme(ta.val())});var va=new f("vpl_dialog_terminal","vpl_terminal",Q),wa=new g("vpl_dialog_vnc",Q),xa=va,ya=a("#vpl_ide_input_file"),za=function(){c.readSelectedFiles(this.files,function(a){return D.addFile(a,!0,H,G)},function(){D.fileListVisibleIfNeeded()})};ya.on("change",za),U.add({name:"filelist",originalAction:function(){D.fileListVisible(!D.isFileListVisible()),c.delay("updateMenu",H),c.delay("autoResizeTab",F),c.delay("updateFileList",D.updateFileList)},bindKey:{win:"Ctrl-L",mac:"Ctrl-L"}}),U.add({name:"new",originalAction:function(){D.length()<K&&ea.dialog("open")},bindKey:{win:"Alt-N",mac:"Option-N"}}),U.add({name:"rename",originalAction:function(){var a=D.currentFile();a&&D.getFilePosById(a.getId())>=J&&ga.dialog("open")},bindKey:{win:"Ctrl-R",mac:"Ctrl-R"}}),U.add({name:"delete",originalAction:function(){var a=D.currentFile();if(a){var b=a.getFileName(),c=Q("delete_file_fq").replace(/\{\$a\}/g,b);u(c,{ok:function(){D.deleteFile(b,G)},title:Q("delete_file_q"),icon:"trash"})}},bindKey:{win:"Ctrl-D",mac:"Ctrl-D"}}),U.add({name:"close",originalAction:function(){var a=D.currentFile();a&&D.close(a)},bindKey:{win:"Alt-W",mac:"Option-W"}}),U.add({name:"import",originalAction:function(){ya.val(""),ya.trigger("click")},bindKey:{win:"Ctrl-I",mac:"Ctrl-I"}}),U.add({name:"sort",originalAction:function(){la.dialog("open")},bindKey:{win:"Ctrl-O",mac:"Ctrl-O"}}),U.add({name:"multidelete",originalAction:function(){na.dialog("open")}}),U.add({name:"fontsize",originalAction:function(){pa.dialog("open")}}),U.add({name:"acetheme",originalAction:function(){sa.dialog("open")}}),U.add({name:"print",originalAction:function(){window.print()},bindKey:{win:"Alt-P",mac:"Command-P"}}),U.add({name:"undo",originalAction:function(){D.currentFile("undo")}}),U.add({name:"redo",originalAction:function(){D.currentFile("redo")}}),U.add({name:"select_all",editorName:"selectall",originalAction:function(){D.currentFile("selectAll")}}),U.add({name:"find",originalAction:function(){D.currentFile("find")}}),U.add({name:"find_replace",editorName:"replace",originalAction:function(){D.currentFile("replace")}}),U.add({name:"next",editorName:"findnext",originalAction:function(){D.currentFile("next")}}),U.add({name:"fullscreen",originalAction:function(){var b="header, footer, aside, #page-header, div.navbar, #nav-drawer";b+=", div.tabtree, #dock, .breadcrumb-nav, .moodle-actionmenu",N?(R.removeClass("vpl_ide_root_fullscreen"),a("body").removeClass("vpl_body_fullscreen"),U.setText("fullscreen","fullscreen"),a(b).show(),a("#vpl_ide_user").hide(),N=!1):(a("body").addClass("vpl_body_fullscreen").scrollTop(0),a(b).hide(),R.addClass("vpl_ide_root_fullscreen"),U.setText("fullscreen","regularscreen"),i.username&&a("#vpl_ide_user").show(),N=!0),t(),setTimeout(F,10)},bindKey:{win:"Alt-F",mac:"Ctrl-F"}}),U.add({name:"download",originalAction:function(){window.location=i.download}}),U.add({name:"correctedfiles",originalAction:function(){u(Q("surecorrectedfiles"),{title:Q("correctedfiles"),ok:y})}}),U.add({name:"resetfiles",originalAction:function(){u(Q("sureresetfiles"),{title:Q("resetfiles"),ok:x})}}),U.add({name:"save",originalAction:function(){var b={files:D.getFilesToSave(),comments:a("#vpl_ide_input_comments").val()};c.requestAction("save","saving",b,i.ajaxurl).done(function(a){D.resetModified(),U.setTimeLeft(a),c.delay("updateMenu",H)}).fail(G)},bindKey:{win:"Ctrl-S",mac:"Command-S"}});var Aa={getConsole:function(){return xa},setResult:I.setResult,ajaxurl:i.ajaxurl,run:function(a,b,c){"terminal"==a?(xa=va,va.connect(b.executionURL,function(){c.close(),t()})):(xa=wa,wa.connect(b.secure,b.server,b.portToUse,b.VNCpassword,b.executionPath,function(){c.close(),t()}))},lastAction:!1,getLastAction:function(){var a=this.lastAction;return this.lastAction=!1,a},setLastAction:function(a){this.lastAction=a}};U.add({name:"run",originalAction:function(){Aa.setLastAction(A),A()},bindKey:{win:"Ctrl-F11",mac:"Command-U"}}),U.add({name:"debug",originalAction:function(){Aa.setLastAction(B),B()},bindKey:{win:"Alt-F11",mac:"Option-U"}}),U.add({name:"evaluate",originalAction:function(){Aa.setLastAction(C),C()},bindKey:{win:"Shift-F11",mac:"Command-Option-U"}}),U.add({name:"comments",originalAction:function(){ha.dialog("open")}}),U.add({name:"console",originalAction:function(){xa.show()}}),U.add({name:"user"}),U.add({name:"about",originalAction:function(){ia.dialog("open")}}),U.add({name:"timeleft",originalAction:function(){U.toggleTimeLeft()}}),U.add({name:"more",originalAction:function(){var b=a("#vpl_ide_menuextra");b.is(":visible")?(U.setText("more","more",c.str("more")),b.hide()):(U.setText("more","less",c.str("less")),b.show()),c.delay("updateMenu",H),c.delay("autoResizeTab",F)}}),T.addClass("ui-widget-header ui-corner-all");var Ba="";Ba+=U.getHTML("more"),Ba+=U.getHTML("save"),Ba+="<span id='vpl_ide_mexecution'>",Ba+=U.getHTML("run"),Ba+=U.getHTML("debug"),Ba+=U.getHTML("evaluate"),Ba+=U.getHTML("comments"),Ba+=U.getHTML("console"),Ba+="</span> ",Ba+="<span id='vpl_ide_menuextra'>",Ba+="<span id='vpl_ide_file'>",Ba+=U.getHTML("filelist"),Ba+=U.getHTML("new"),Ba+=U.getHTML("rename"),Ba+=U.getHTML("delete"),Ba+=U.getHTML("import"),Ba+=U.getHTML("download"),Ba+=U.getHTML("resetfiles"),Ba+=U.getHTML("correctedfiles"),Ba+=U.getHTML("sort"),Ba+=U.getHTML("multidelete"),Ba+=U.getHTML("fontsize"),Ba+=U.getHTML("acetheme"),Ba+="</span> ",Ba+="<span id='vpl_ide_edit'>",Ba+=U.getHTML("undo"),Ba+=U.getHTML("redo"),Ba+=U.getHTML("select_all"),Ba+=U.getHTML("find"),Ba+=U.getHTML("find_replace"),Ba+=U.getHTML("next"),Ba+="</span> ",Ba+="</span> ",Ba+=U.getHTML("fullscreen")+" ",Ba+=U.getHTML("about")+" ",Ba+=U.getHTML("user")+" ",Ba+=U.getHTML("timeleft"),Ba+='<div class="clearfix"></div>',T.append(Ba),a("#vpl_ide_more").button(),a("#vpl_ide_save").button(),a("#vpl_ide_menuextra").hide(),a("#vpl_ide_file").controlgroup(),a("#vpl_ide_edit").controlgroup(),a("#vpl_ide_mexecution").controlgroup(),a("#vpl_ide_fullscreen").button(),a("#vpl_ide_acetheme").button(),a("#vpl_ide_about").button(),a("#vpl_ide_user").button().css("float","right").hide(),a("#vpl_ide_timeleft").button().css("float","right").hide(),a("#vpl_menu .ui-button").css("padding","6px"),a("#vpl_menu .ui-button-text").css("padding","0");for(var Ca=["filelist","more","fullscreen","about","resetfiles","download","comments","console","import","fontsize"],Da=0;Da<Ca.length;Da++)U.enable(Ca[Da],!0);U.setExtracontent("user",i.username),U.setTimeLeft(i),H=function(){var a,b=D.currentFile(),d=D.length();d?$.show():$.hide(),D.isFileListVisible()?U.setText("filelist","filelistclose",c.str("filelist")):U.setText("filelist","filelist",c.str("filelist")),c.log("updateMenu",!0);var e=D.isModified();U.enable("save",e),U.enable("run",!e),U.enable("debug",!e),U.enable("evaluate",!e),U.enable("download",!e),U.enable("new",d<K),U.enable("sort",d-J>1),U.enable("multidelete",d-J>1),U.enable("acetheme",!0),U.enable("correctedfiles",i.correctedfiles);var f;if(b&&0!==d){var g=D.getFilePosById(b.getId());U.enable("rename",g>=J&&0!==d),U.enable("delete",g>=J&&0!==d),U.enable("undo",b.hasUndo()),U.enable("redo",b.hasRedo()),U.enable("select_all",b.hasSelectAll()),U.enable("find",b.hasFind()),U.enable("find_replace",b.hasFindReplace()),U.enable("next",b.hasNext()),c.delay("updateFileList",D.updateFileList)}else for(f=["rename","delete","undo","redo","select_all","find","find_replace","next"],a=0;a<f.length;a++)U.enable(f[a],!1)},$.on("tabsactivate",function(){D.currentFile("focus"),c.delay("updateMenu",H),c.delay("autoResizeTab",F)});var Ea=a(window);Ea.on("resize",F),i.example||Ea.on("beforeunload",function(){if(D.isModified())return Q("changesNotSaved")}),D=new o,F(),function(){function a(){var a=T.width();b!=a&&(b=a,F())}var b=T.width();a(),setInterval(a,1e3)}(),D.resetModified(),c.requestAction("load","loading",i,i.loadajaxurl).done(function(b){for(var d=!0,e=b.files,f=0;f<e.length;f++){var g=e[f],h=D.addFile(g,!1,H,G);h?(h.resetModified(),f<J||e.length<=5?D.open(h):D.fileListVisible(!0)):d=!1}c.delay("updateMenu",H),D.generateFileList(),$.tabs("option","active",0),b.compilationexecution&&I.setResult(b.compilationexecution,!1),U.setTimeLeft(b),b.comments>""&&a("#vpl_ide_input_comments").val(b.comments),d?D.resetModified():D.setModified(),0===D.length()&&K>0?U.getAction("new")():i.saved||D.setModified()}).fail(G)};return window.VPLIDE=i,{init:function(a,b){h=new i(a,b)}}});
\ No newline at end of file
+define(["jquery","jqueryui","mod_vpl/vplutil","mod_vpl/vplidefile","mod_vpl/vplidebutton","mod_vpl/vplterminal","mod_vpl/vplvnc"],function(a,b,c,d,e,f,g){if("undefined"!=typeof i)return i;var h,i=function(b,i){var j,k,l,m,n,o=this,p=i.minfiles||0,q=i.maxfiles||0,r=i.restrictededitor||i.example,s=i.example,t=!1,u=c.scrollBarWidth();c.setStr(i.i18n);var v,w=c.str,x=a("#"+b);if(v="undefined"==typeof c.get_absolute_path()?"../editor/VPLIDE.css":c.get_absolute_path()+"/editor/VPLIDE.css",a("head").append('<meta name="viewport" content="initial-scale=1">').append('<meta name="viewport" width="device-width">').append('<link rel="stylesheet" href="'+v+'"/>'),"object"!=typeof x)throw"VPL: constructor tag_id not found";var y,z={new:!0,rename:!0,delete:!0,save:!0,run:!0,edit:!0,debug:!0,evaluate:!0,import:!0,resetfiles:!0,correctedfiles:!0,sort:!0,multidelete:!0,acetheme:!0,console:!0,comments:!0};function A(a){return!z[a]||i[a]}function B(a){a.originalEvent.dataTransfer.dropEffect=r?"none":"copy",a.preventDefault()}function C(a){if(r)return a.stopImmediatePropagation(),!1;for(var b=[],d=function(a,c=""){return new Promise(function(e){if(a.isFile)a.file(function(a){var d=c+a.name;Object.defineProperty(a,"name",{get:function(){return d}}),b.push(a),e()});else if(a.isDirectory){a.createReader().readEntries(function(b){for(var f=[],g=0;g<b.length;g++)f.push(d(b[g],c+a.name+"/"));Promise.all(f).then(e)})}else e()})},e=a.originalEvent.dataTransfer,f=[],g=0;g<e.items.length;g++)f.push(d(e.items[g].webkitGetAsEntry()));return e.files.length>0?(Promise.all(f).then(function(){c.readSelectedFiles(b,function(a){return j.addFile(a,!0,n,m)},function(){j.fileListVisibleIfNeeded()})}),a.stopImmediatePropagation(),!1):void 0}function D(a){if(r)return a.stopPropagation(),!1}"undefined"==typeof i.loadajaxurl&&(i.loadajaxurl=i.ajaxurl),y=p<q,i.new=y,i.rename=y,i.delete=y,i.comments=i.comments&&!i.example,i.acetheme=!0,i.sort=q-p>=2,i.multidelete=i.sort,i.import=!r,i.console=A("run")||A("debug"),"undefined"==typeof i.fontSize&&(i.fontSize=12),i.fontSize=parseInt(i.fontSize),x.on("drop",C),x.on("dragover",B);var E=a("#vpl_menu"),F=new e(E,A),G=a("#vpl_tr"),H=a("#vpl_filelist"),I=a("#vpl_filelist_header"),J=a("#vpl_filelist_content"),K=a("#vpl_tabs_ul"),L=a("#vpl_tabs"),M=a("#vpl_results"),N=a("#vpl_results_accordion");H.vpl_minWidth=80,M.vpl_minWidth=100,this.updateEvaluationNumber=function(a){if("undefined"!=typeof a.nevaluations){var b=a.nevaluations;"undefined"!=typeof a.reductionbyevaluation&&a.reductionbyevaluation>""&&0!=a.reductionbyevaluation&&(0!=a.freeevaluations&&(b=b+"/"+a.freeevaluations),b=b+" -"+a.reductionbyevaluation),F.setExtracontent("evaluate",b)}},this.lastResult=null,this.getTerminal=function(){return ma},this.setResultGrade=function(a,b){var c="vpl_ide_accordion_t_grade";if(0==N.find(".vpl_ide_accordion_c_grade").length&&(N.append('<div class="'+c+'"></div>'),N.append('<div class="vpl_ide_accordion_c_grade"></div>')),"undefined"==typeof b)return N.find("h4."+c).length>0;var d=N.find("."+c);return a>""?(d.replaceWith('<h4 class="'+c+'">'+a+"</h4>"),!0):(d.replaceWith('<div class="'+c+'"></div>'),!1)},this.setResultTab=function(b,c,d){var e="vpl_ide_accordion_t_"+b,f="vpl_ide_accordion_c_"+b;if(0==N.find("."+f).length&&(N.append('<div class="'+e+'"></div>'),N.append('<div class="'+f+'"></div>')),"undefined"==typeof d)return N.find("h4."+e).length>0;var g=N.find("."+e),h=N.find("."+f),i=a("<div>"+c+"</div>");return i.find("h4").replaceWith(function(){return a("<h5>").append(a(this).contents())}),h.html()==i.html()?c>"":c>""?(g.replaceWith('<h4 class="'+e+'">'+w(b)+"</h4>"),h.replaceWith('<div class="ui-widget '+f+'">'+i.html()+"</div>"),!0):(g.replaceWith('<div class="'+e+'"></div>'),h.replaceWith('<div class="'+f+'"></div>'),!1)},this.setResult=function(a,b){o.updateEvaluationNumber(a);var d,e=j.getFiles(),f=[];for(d=0;d<e.length;d++)f[d]=e[d].getFileName(),e[d].clearAnnotations();var g,h,k,m=!1,n=c.sanitizeText(a.grade);if(h=o.setResultGrade(n,a.grade),m=m||h,g=o.setResultTab("variables",a.variables,a.variables),m=m||g,k=c.processResult(a.compilation,f,e,!0,!1),g=o.setResultTab("compilation",k,a.compilation),m=m||g,k=c.processResult(a.evaluation,f,e,!1,!1),g=o.setResultTab("comments",k,a.evaluation),m=m||g,k=c.sanitizeText(a.execution),g=o.setResultTab("execution",k,a.execution),m=m||g,g=o.setResultTab("description",i.description,i.description),m=m||g){for(M.show(),M.vpl_visible=!0,N.accordion("refresh"),N.accordion("option","active",h?1:0),d=0;d<e.length;d++)for(var p=e[d].getAnnotations(),q=0;q<p.length;q++)if(b||"error"==p[q].type){j.gotoFile(d,p[q].row+1);break}}else M.hide(),M.vpl_visible=!1;c.delay("autoResizeTab",l)},N.accordion({heightStyle:"fill",header:"h4",animate:!1,beforeActivate:function(a,b){if("newHeader"in b&&b.newHeader.hasClass("vpl_ide_accordion_t_grade"))return!1}}),M.width(2*M.vpl_minWidth),N.on("click","a",function(a){a.preventDefault(),j.gotoFileLink(a.currentTarget)}),M.vpl_visible=!1,M.hide(),H.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),I.text(w("filelist")),I.html(c.iconFolder()+I.html()),I.addClass("ui-widget-header ui-button-text-only ui-corner-all"),J.addClass("ui-widget ui-corner-all"),H.width(2*H.vpl_minWidth),H.on("click","a",function(a){a.preventDefault(),j.gotoFileLink(a.currentTarget)}),H.vpl_visible=!1,H.hide(),L.tabs({classes:{"ui-tabs-panel":null}});var O=!1;function P(){return!1===O&&(O=(L.outerWidth(!0)-L.width())/2),O}function Q(a,b){var c,d=b.position.left-b.originalPosition.left;if(0!==d)c=L.width()+H.width()-H.vpl_minWidth,L.resizable("option","maxWidth",c),H.width(H.vpl_original_width+d);else{c=L.width()+M.width()-M.vpl_minWidth,L.resizable("option","maxWidth",c);var e=b.size.width-b.originalSize.width;M.width(M.vpl_original_width-e)}j.currentFile("adjustSize")}var R={containment:"parent",resize:Q,start:function(){a(window).off("resize",l),L.resizable("option","minWidth",100),M.vpl_visible&&(M.vpl_original_width=M.width()),H.vpl_visible&&(H.vpl_original_width=H.width())},stop:function(b,c){Q(0,c),L.resizable("option","maxWidth",1e5),L.resizable("option","minWidth",0),l(),a(window).on("resize",l)},handles:""};function S(){j.currentFile("focus")}L.resizable(R),k=function(b){var c=L.width(),d=0;K.width(1e5);var e=K.children("li:visible").last();if(e.length){var f=K.parent().scrollLeft();d=f+e.position().left+e.width()+O,K.width(d);var g=j.currentFile();if(g&&b){var h=a(g.getTabNameId()),i=f+h.position().left;(i-=(c-h.outerWidth())/2)<0&&(i=0),K.parent().finish().animate({scrollLeft:i},"slow")}}d<c&&K.width("")},l=function(){var b,c=L.width(),d=E.width(),e=!1;if(b=0,b+=H.vpl_visible?1:0,b+=M.vpl_visible?2:0,L.resizable("destroy"),R.handles=["e","w","e","e, w"][b],R.disable=0===b,L.resizable(R),G.width(E.outerWidth()),H.vpl_visible){var f=H.outerWidth()+O;c+=f,f>=100?(d-=f,L.css("left",f)):e=!0}else L.css("left",0);if(M.vpl_visible){var g=M.outerWidth()+O;c+=g,(d-=g)<100&&(e=!0)}if(e){var h=E.width()/c,i=0;H.vpl_visible&&(i=H.width()*h,H.width(i-O),i+=O,L.css("left",i)),L.width(L.width()*h),M.vpl_visible&&M.width(E.width()-(i+L.width()+O))}else L.width(d);k(!0),function(){var b=a(window).outerHeight();(b-=E.offset().top+E.height()+(t?P():20))<150&&(b=150),G.height(b);var c=b-3*P();L.height(c),M.vpl_visible&&(M.height(c+P()),N.accordion("refresh")),H.vpl_visible&&(J.height(c-(I.outerHeight()+P())),H.height(c))}(),j.currentFile("adjustSize")};var T=a.extend({},{close:S},c.dialogbaseOptions);function U(b,d){return c.showMessage(b,a.extend({},T,d))}m=function(a){return c.showErrorMessage(a,{close:S})};var V=a("#vpl_ide_dialog_new");function W(b){if("click"==b.type||"keypress"==b.type&&13==b.keyCode){V.dialog("close");var c={name:a("#vpl_ide_input_newfilename").val(),contents:"",encoding:0},d=j.addFile(c,!1,n,m);return d&&(j.open(d),L.tabs("option","active",j.getTabPos(d)),d.focus()),!1}}var X={};X[w("ok")]=W,X[w("cancel")]=function(){a(this).dialog("close")},V.find("input").on("keypress",W),V.dialog(a.extend({},T,{title:w("create_new_file"),buttons:X}));var Y=a("#vpl_ide_dialog_rename");function Z(b){("click"==b.type||"keypress"==b.type&&13==b.keyCode)&&(Y.dialog("close"),j.renameFile(j.currentFile("getFileName"),a("#vpl_ide_input_renamefilename").val(),m),b.preventDefault())}Y.find("input").on("keypress",Z),X[w("ok")]=Z,Y.dialog(a.extend({},T,{open:function(){a("#vpl_ide_input_renamefilename").val(j.currentFile("getFileName"))},title:w("rename_file"),buttons:X})),X[w("ok")]=function(){a(this).dialog("close")};var $=a("#vpl_ide_dialog_comments");$.dialog(a.extend({},T,{title:w("comments"),width:"40em",buttons:X})),a("#vpl_ide_input_comments").width("30em");var _=a("#vpl_ide_dialog_about"),aa={};aa[w("ok")]=function(){a(this).dialog("close")};var ba=a("#vpl_ide_dialog_shortcuts");ba.dialog(a.extend({},T,{open:function(){var b=F.getShortcuts(j.currentFile("getEditor"));a("#vpl_ide_dialog_shortcuts").html(b)},title:w("shortcuts"),width:400,height:300,buttons:aa})),ba.dialog("option","height",300),aa[w("shortcuts")]=function(){a(this).dialog("close"),ba.dialog("open")},_.dialog(a.extend({},T,{open:function(){var b=F.getShortcuts(j.currentFile("getEditor"));_.next().find("button").filter(function(){return a(this).text()==w("shortcuts")}).button(""!=b?"enable":"disable")},title:w("about"),width:400,height:300,buttons:aa})),_.dialog("option","height",300);var ca=a("#vpl_ide_dialog_sort"),da={};da[w("ok")]=function(){var b=j.getFiles(),d=/[^\d]*/,e=[],f=0,g=a("#vpl_sort_list li");if(g.length==b.length){for(g.each(function(){var a=parseInt(this.id.replace(d,""));e.push(b[a])}),f=0;f<g.length;f++)b[f]=e[f];j.setModified(),c.delay("updateMenu",n),c.delay("updateFileList",j.updateFileList),a(this).dialog("close")}},da[w("cancel")]=function(){a(this).dialog("close")},ca.dialog(a.extend({},T,{title:w("sort"),buttons:da,open:function(){var b=a("#vpl_sort_list");b.html("");for(var c=j.getFiles(),d=0;d<c.length;d++){var e=a('<li id="vpl_fsort_'+d+'"class="ui-widget-content"></li>');d<p&&e.addClass("ui-state-disabled"),e.text(d+1+"-"+c[d].getFileName()),b.append(e)}b.sortable({items:"li:not(.ui-state-disabled)",placeholder:"ui-state-highlight",start:function(a,b){b.item.addClass("ui-state-highlight")},stop:function(a,b){b.item.removeClass("ui-state-highlight")}}),b.disableSelection()},maxHeight:400}));var ea=a("#vpl_ide_dialog_multidelete"),fa={};fa[w("selectall")]=function(){a(this).find("input").prop("checked",!0)},fa[w("deselectall")]=function(){a(this).find("input").prop("checked",!1)},fa[w("deleteselected")]=function(){var b=j.getFiles(),d=[];a("#vpl_multidelete_list label").each(function(){var c=a(this);if(c.find("input").prop("checked")){var e=c.data("fileid");d.push(b[e].getFileName())}});for(var e=0;e<d.length;e++)j.deleteFile(d[e],!1,m);c.delay("updateMenu",n),c.delay("updateFileList",j.updateFileList),a(this).dialog("close")},fa[w("cancel")]=function(){a(this).dialog("close")},ea.dialog(a.extend({},T,{title:w("multidelete"),buttons:fa,open:function(){var b=a("#vpl_multidelete_list");b.html("");for(var d=j.getFiles(),e=p;e<d.length;e++){var f=c.sanitizeText(d[e].getFileName()),g=a('<label><input type="checkbox"> '+f+"</label>");g.data("fileid",e),b.append(g),b.append("<br>")}b.find("label").button()},maxHeight:400,maxWidth:400}));var ga=a("#vpl_ide_dialog_fontsize"),ha=a("#vpl_ide_dialog_fontsize .vpl_fontsize_slider"),ia={};ia[w("ok")]=function(){var b=ha.slider("value");j.setFontSize(b),a(this).dialog("close"),a.ajax({async:!0,type:"POST",url:"../editor/userpreferences.json.php",data:JSON.stringify({fontSize:b}),contentType:"application/json; charset=utf-8",dataType:"json"})},ia[w("cancel")]=function(){j.setFontSize(ha.data("vpl_fontsize")),a(this).dialog("close")},ia[w("reset")]=function(){ha.slider("value",12)},ga.dialog(a.extend({},T,{title:w("fontsize"),buttons:ia,open:function(){ha.data("vpl_fontsize",j.getFontSize()),ha.slider("value",j.getFontSize())}})),ha.slider({min:1,max:48,change:function(){var a=ha.slider("value");j.setFontSize(a),ga.find(".vpl_fontsize_slider_value").text(a)}});var ja=a("#vpl_ide_dialog_acetheme"),ka=a("#vpl_ide_dialog_acetheme select"),la={};la[w("ok")]=function(){j.setTheme(ka.val()),a(this).dialog("close"),a.ajax({async:!0,type:"POST",url:"../editor/userpreferences.json.php",data:JSON.stringify({aceTheme:ka.val()}),contentType:"application/json; charset=utf-8",dataType:"json"})},la[w("cancel")]=function(){j.setTheme(ka.data("acetheme")),a(this).dialog("close")},la[w("reset")]=function(){ka.val(ka.data("acetheme")),j.setTheme(ka.val())},ja.dialog(a.extend({},T,{title:w("theme"),buttons:la,modal:!1,open:function(){ka.data("acetheme",j.getTheme()),ka.val(j.getTheme())}})),ka.on("change",function(){j.setTheme(ka.val())});var ma=new f("vpl_dialog_terminal","vpl_terminal",w),na=new g("vpl_dialog_vnc",w),oa=ma,pa=a("#vpl_ide_input_file");function qa(){c.requestAction("resetfiles","",{},i.ajaxurl).done(function(a){var b=a.files;for(var d in b)b.hasOwnProperty(d)&&j.addFile(b[d],!0,c.doNothing,m);j.fileListVisibleIfNeeded(),c.delay("updateMenu",n)}).fail(m)}function ra(){c.requestAction("correctedfiles","",{},i.ajaxurl).done(function(a){var b=a.files;for(var d in b)j.addFile(b[d],!0,c.doNothing,m);j.fileListVisibleIfNeeded()}).fail(m)}pa.on("change",function(){c.readSelectedFiles(this.files,function(a){return j.addFile(a,!0,n,m)},function(){j.fileListVisibleIfNeeded()})}),F.add({name:"filelist",originalAction:function(){j.fileListVisible(!j.isFileListVisible()),c.delay("updateMenu",n),c.delay("autoResizeTab",l),c.delay("updateFileList",j.updateFileList)},bindKey:{win:"Ctrl-L",mac:"Ctrl-L"}}),F.add({name:"new",originalAction:function(){j.length()<q&&V.dialog("open")},bindKey:{win:"Alt-N",mac:"Option-N"}}),F.add({name:"rename",originalAction:function(){var a=j.currentFile();a&&j.getFilePosById(a.getId())>=p&&Y.dialog("open")},bindKey:{win:"Ctrl-R",mac:"Ctrl-R"}}),F.add({name:"delete",originalAction:function(){var a=j.currentFile();if(a){var b=a.getFileName();U(w("delete_file_fq").replace(/\{\$a\}/g,b),{ok:function(){j.deleteFile(b,m)},title:w("delete_file_q"),icon:"trash"})}},bindKey:{win:"Ctrl-D",mac:"Ctrl-D"}}),F.add({name:"close",originalAction:function(){var a=j.currentFile();a&&j.close(a)},bindKey:{win:"Alt-W",mac:"Option-W"}}),F.add({name:"import",originalAction:function(){pa.val(""),pa.trigger("click")},bindKey:{win:"Ctrl-I",mac:"Ctrl-I"}}),F.add({name:"sort",originalAction:function(){ca.dialog("open")},bindKey:{win:"Ctrl-O",mac:"Ctrl-O"}}),F.add({name:"multidelete",originalAction:function(){ea.dialog("open")}}),F.add({name:"fontsize",originalAction:function(){ga.dialog("open")}}),F.add({name:"acetheme",originalAction:function(){ja.dialog("open")}}),F.add({name:"print",originalAction:function(){window.print()},bindKey:{win:"Alt-P",mac:"Command-P"}}),F.add({name:"undo",originalAction:function(){j.currentFile("undo")}}),F.add({name:"redo",originalAction:function(){j.currentFile("redo")}}),F.add({name:"select_all",editorName:"selectall",originalAction:function(){j.currentFile("selectAll")}}),F.add({name:"find",originalAction:function(){j.currentFile("find")}}),F.add({name:"find_replace",editorName:"replace",originalAction:function(){j.currentFile("replace")}}),F.add({name:"next",editorName:"findnext",originalAction:function(){j.currentFile("next")}}),F.add({name:"fullscreen",originalAction:function(){var b="header, footer, aside, #page-header, div.navbar, #nav-drawer";b+=", div.tabtree, #dock, .breadcrumb-nav, .moodle-actionmenu",t?(x.removeClass("vpl_ide_root_fullscreen"),a("body").removeClass("vpl_body_fullscreen"),F.setText("fullscreen","fullscreen"),a(b).show(),a("#vpl_ide_user").hide(),t=!1):(a("body").addClass("vpl_body_fullscreen").scrollTop(0),a(b).hide(),x.addClass("vpl_ide_root_fullscreen"),F.setText("fullscreen","regularscreen"),i.username&&a("#vpl_ide_user").show(),t=!0),S(),setTimeout(l,10)},bindKey:{win:"Alt-F",mac:"Ctrl-F"}}),F.add({name:"download",originalAction:function(){window.location=i.download}}),F.add({name:"correctedfiles",originalAction:function(){U(w("surecorrectedfiles"),{title:w("correctedfiles"),ok:ra})}}),F.add({name:"resetfiles",originalAction:function(){U(w("sureresetfiles"),{title:w("resetfiles"),ok:qa})}}),F.add({name:"save",originalAction:function(){var b={files:j.getFilesToSave(),comments:a("#vpl_ide_input_comments").val()};c.requestAction("save","saving",b,i.ajaxurl).done(function(a){j.resetModified(),F.setTimeLeft(a),c.delay("updateMenu",n)}).fail(m)},bindKey:{win:"Ctrl-S",mac:"Command-S"}});var sa={getConsole:function(){return oa},setResult:o.setResult,ajaxurl:i.ajaxurl,run:function(a,b,c){"terminal"==a?(oa=ma,ma.connect(b.executionURL,function(){c.close(),S()})):(oa=na,na.connect(b.secure,b.server,b.portToUse,b.VNCpassword,b.executionPath,function(){c.close(),S()}))},lastAction:!1,getLastAction:function(){var a=this.lastAction;return this.lastAction=!1,a},setLastAction:function(a){this.lastAction=a}};function ta(a,b,d){d||(d={}),oa.isConnected()||c.requestAction(a,"",d,i.ajaxurl).done(function(d){c.webSocketMonitor(d,a,b,sa)}).fail(m)}function ua(){ta("run","running",{XGEOMETRY:na.getCanvasSize()})}function va(){ta("debug","debugging",{XGEOMETRY:na.getCanvasSize()})}function wa(){ta("evaluate","evaluating")}F.add({name:"run",originalAction:function(){sa.setLastAction(ua),ua()},bindKey:{win:"Ctrl-F11",mac:"Command-U"}}),F.add({name:"debug",originalAction:function(){sa.setLastAction(va),va()},bindKey:{win:"Alt-F11",mac:"Option-U"}}),F.add({name:"evaluate",originalAction:function(){sa.setLastAction(wa),wa()},bindKey:{win:"Shift-F11",mac:"Command-Option-U"}}),F.add({name:"comments",originalAction:function(){$.dialog("open")}}),F.add({name:"console",originalAction:function(){oa.show()}}),F.add({name:"user"}),F.add({name:"about",originalAction:function(){_.dialog("open")}}),F.add({name:"timeleft",originalAction:function(){F.toggleTimeLeft()}}),F.add({name:"more",originalAction:function(){var b=a("#vpl_ide_menuextra");b.is(":visible")?(F.setText("more","more",c.str("more")),b.hide()):(F.setText("more","less",c.str("less")),b.show()),c.delay("updateMenu",n),c.delay("autoResizeTab",l)}}),E.addClass("ui-widget-header ui-corner-all");var xa="";xa+=F.getHTML("more"),xa+=F.getHTML("save"),xa+="<span id='vpl_ide_mexecution'>",xa+=F.getHTML("run"),xa+=F.getHTML("debug"),xa+=F.getHTML("evaluate"),xa+=F.getHTML("comments"),xa+=F.getHTML("console"),xa+="</span> ",xa+="<span id='vpl_ide_menuextra'>",xa+="<span id='vpl_ide_file'>",xa+=F.getHTML("filelist"),xa+=F.getHTML("new"),xa+=F.getHTML("rename"),xa+=F.getHTML("delete"),xa+=F.getHTML("import"),xa+=F.getHTML("download"),xa+=F.getHTML("resetfiles"),xa+=F.getHTML("correctedfiles"),xa+=F.getHTML("sort"),xa+=F.getHTML("multidelete"),xa+=F.getHTML("fontsize"),xa+=F.getHTML("acetheme"),xa+="</span> ",xa+="<span id='vpl_ide_edit'>",xa+=F.getHTML("undo"),xa+=F.getHTML("redo"),xa+=F.getHTML("select_all"),xa+=F.getHTML("find"),xa+=F.getHTML("find_replace"),xa+=F.getHTML("next"),xa+="</span> ",xa+="</span> ",xa+=F.getHTML("fullscreen")+" ",xa+=F.getHTML("about")+" ",xa+=F.getHTML("user")+" ",xa+=F.getHTML("timeleft"),xa+='<div class="clearfix"></div>',E.append(xa),a("#vpl_ide_more").button(),a("#vpl_ide_save").button(),a("#vpl_ide_menuextra").hide(),a("#vpl_ide_file").controlgroup(),a("#vpl_ide_edit").controlgroup(),a("#vpl_ide_mexecution").controlgroup(),a("#vpl_ide_fullscreen").button(),a("#vpl_ide_acetheme").button(),a("#vpl_ide_about").button(),a("#vpl_ide_user").button().css("float","right").hide(),a("#vpl_ide_timeleft").button().css("float","right").hide(),a("#vpl_menu .ui-button").css("padding","6px"),a("#vpl_menu .ui-button-text").css("padding","0");for(var ya=["filelist","more","fullscreen","about","resetfiles","download","comments","console","import","fontsize"],za=0;za<ya.length;za++)F.enable(ya[za],!0);F.setExtracontent("user",i.username),F.setTimeLeft(i),n=function(){var a,b=j.currentFile(),d=j.length();d?L.show():L.hide(),j.isFileListVisible()?F.setText("filelist","filelistclose",c.str("filelist")):F.setText("filelist","filelist",c.str("filelist")),c.log("updateMenu",!0);var e,f=j.isModified();if(F.enable("save",f),F.enable("run",!f),F.enable("debug",!f),F.enable("evaluate",!f),F.enable("download",!f),F.enable("new",d<q),F.enable("sort",d-p>1),F.enable("multidelete",d-p>1),F.enable("acetheme",!0),F.enable("correctedfiles",i.correctedfiles),b&&0!==d){var g=j.getFilePosById(b.getId());F.enable("rename",g>=p&&0!==d),F.enable("delete",g>=p&&0!==d),F.enable("undo",b.hasUndo()),F.enable("redo",b.hasRedo()),F.enable("select_all",b.hasSelectAll()),F.enable("find",b.hasFind()),F.enable("find_replace",b.hasFindReplace()),F.enable("next",b.hasNext()),c.delay("updateFileList",j.updateFileList)}else for(e=["rename","delete","undo","redo","select_all","find","find_replace","next"],a=0;a<e.length;a++)F.enable(e[a],!1)},L.on("tabsactivate",function(){j.currentFile("focus"),c.delay("updateMenu",n),c.delay("autoResizeTab",l)});var Aa=a(window);Aa.on("resize",l),i.example||Aa.on("beforeunload",function(){if(j.isModified())return w("changesNotSaved")}),j=new function(){var b=a("#vpl_tabs_ul"),e=a("#vpl_tabs").tabs("widget"),f=[],g=[],m=!0,o=this;function t(a){for(var b=a.toLowerCase()+"/",c=0;c<f.length;c++){var d=f[c].getFileName().toLowerCase()+"/";if(0===d.indexOf(b)||0===b.indexOf(d))return!0}return!1}function v(a,b){if(c.isBlockly(a))return!1;if(c.isBlockly(b))for(var d=0;d<f.length;d++)if(c.isBlockly(f[d].getFileName()))return!0;return!1}this.updateFileList=function(){o.generateFileList()},this.fileNameExists=function(a){for(var b=a.toLowerCase(),c=0;c<f.length;c++)if(f[c].getFileName().toLowerCase()==b)return c;return-1},this.restrictedPaste=D,this.dropHandler=C,this.dragoverHandler=B,this.readOnly=s,this.restrictedEdit=r,this.adjustTabsTitles=k,this.minNumberOfFiles=p,this.scrollBarWidth=u;var x="";this.setClipboard=function(a){x=a},this.getClipboard=function(){return x},this.getTabPos=function(a){for(var b=0;b<g.length;b++)if(g[b]==a)return b;return g.length},this.getTheme=function(){return i.theme},this.setTheme=function(a){i.theme=a;for(var b=0;b<f.length;b++)f[b].setTheme(a)},this.addTab=function(a){var c='<a href="#vpl_file'+a+'"></a>';b.append('<li id="vpl_tab_name'+a+'">'+c+"</li>"),e.append('<div id="vpl_file'+a+'" class="vpl_ide_file"></div>')},this.removeTab=function(a){b.find("#vpl_tab_name"+a).remove(),e.find("#vpl_file"+a).remove()},this.open=function(a){var b;if(!(b="object"==typeof a?a:f[a]).isOpen()){var d=b.getId();o.addTab(d),g.push(b),F.setGetkeys(b.open()),e.tabs("refresh"),k(!1),c.delay("updateMenu",n),c.delay("updateFileList",o.updateFileList)}},this.close=function(a){if(a.isOpen()){var b,d=a.getId();a.close(),o.removeTab(d);var f=o.getTabPos(a);return g.splice(f,1),e.tabs("refresh"),k(!1),o.fileListVisible(!0),c.delay("updateFileList",o.updateFileList),c.delay("adjustTabsTitles",k,!1),g.length>f?(b=o.getFilePosById(g[f].getId()),void o.gotoFile(b,"c")):f>0?(b=o.getFilePosById(g[f-1].getId()),void o.gotoFile(b,"c")):void 0}},this.isClosed=function(a){return!f[a].isOpen()},this.fileListVisible=function(a){a!==H.vpl_visible&&(H.vpl_visible=a,a?(H.show(),l()):(H.hide(),l()))},this.isFileListVisible=function(){return H.vpl_visible},this.fileListVisibleIfNeeded=function(){if(!this.isFileListVisible())for(var a=0;a<f.length;a++)if(!f[a].isOpen())return void this.fileListVisible(!0)},this.setFontSize=function(a){i.fontSize=a;for(var b=0;b<f.length;b++)f[b].setFontSize(a)},this.getFontSize=function(){return i.fontSize},this.addFile=function(a,b,e,g){if("string"!=typeof a.name||!c.validPath(a.name))return g(w("incorrect_file_name")+" ("+a.name+")"),!1;!0!==b&&(b=!1);var j=this.fileNameExists(a.name);if(-1!=j)return b?(f[j].setContent(a.contents),o.setModified(),e(),c.delay("updateFileList",o.updateFileList),a):(g(w("filenotadded").replace(/\{\$a\}/g,a.name)),!1);if(t(a.name)||v("",a.name))return g(w("filenotadded").replace(/\{\$a\}/g,a.name)),!1;if(f.length>=q)return g(w("maxfilesexceeded")+" ("+q+")"),!1;var k=c.getUniqueId(),l=new d(k,a.name,a.contents,this,h,i.id);return 1==a.encoding?l.extendToBinary():c.isBlockly(a.name)?l.extendToBlockly():l.extendToCodeEditor(),f.push(l),o.setModified(),f.length>5&&o.fileListVisible(!0),e(),c.delay("updateFileList",o.updateFileList),l},this.renameFile=function(a,b,d){var e=this.fileNameExists(a);try{if(-1==e)throw"";if(e<p)throw"";if(f[e].getFileName()==b)return!0;if(!c.validPath(b)||t(b)||v(a,b))throw w("incorrect_file_name");if(c.isBinary()&&c.fileExtension(a)!=c.fileExtension(b))throw w("incorrect_file_name");if(!c.isBlockly(a)&&c.isBlockly(b)||c.isBlockly(a)&&!c.isBlockly(b))throw w("incorrect_file_name");f[e].setFileName(b)}catch(a){return d(w("filenotrenamed").replace(/\{\$a\}/g,b)+": "+a),!1}return o.setModified(),k(!1),c.delay("updateFileList",o.updateFileList),!0},this.deleteFile=function(a,b,d){var e=this.fileNameExists(a);return-1==e?(d(w("filenotdeleted").replace(/\{\$a\}/g,a)),!1):e<p?(d(w("filenotdeleted").replace(/\{\$a\}/g,a)),!1):(o.setModified(),o.close(f[e]),f.splice(e,1),c.delay("updateFileList",o.updateFileList),!0)},this.currentFile=function(){var a=e.tabs("option","active");if(a in g){var b=g[a];if(0===arguments.length)return b;var c=arguments[0];if("function"==typeof b[c]){var d=b[c],f=Array.prototype.slice(arguments);return f.shift(),d.apply(b,f)}}return!1},this.currentPos=function(){return e.tabs("option","active")},this.getFileTab=function(a){for(var b=0;b<g.length;b++)if(g[b].getId()==a)return b;return-1},this.getFilePosById=function(a){for(var b=0;b<f.length;b++)if(f[b].getId()==a)return b;return-1},this.gotoFile=function(a,b){var c=f[a];o.open(c),e.tabs("option","active",o.getFileTab(c.getId())),"c"!==b&&c.gotoLine(parseInt(b,10)),c.focus()},this.gotoFileLink=function(b){var c=a(b),d=c.data("file"),e=-1;if((e=d>""?this.fileNameExists(d):o.getFilePosById(c.data("fileid")))>=0){var f=c.data("line");"undefined"==typeof f&&(f="c"),o.gotoFile(e,f)}},this.getFilesToSave=function(){for(var a=[],b=0;b<f.length;b++){var c={};c.name=f[b].getFileName(),c.contents=f[b].getContent(),c.encoding=f[b].isBinary()?1:0,a.push(c)}return a},this.resetModified=function(){m=!1;for(var a=0;a<f.length;a++)f[a].resetModified();c.delay("updateMenu",n),c.delay("updateFileList",o.updateFileList)},this.setModified=function(){m||(m=!0,c.delay("updateFileList",o.updateFileList)),c.delay("updateMenu",n)},this.isModified=function(){return m},this.length=function(){return f.length},this.clearAnnotations=function(){for(var a=0;a<f.length;a++)f[a].clearAnnotations()},this.getFile=function(a){return f[a]},this.getFiles=function(){return f},this.getDirectoryStructure=function(){var a={isDir:!0,content:{}};for(var b in f)if(f.hasOwnProperty(b)){var c=f[b],d=c.getFileName().split("/"),e=a;for(var g in d)if(d.hasOwnProperty(g)){var h=d[g];g==d.length-1?e.content[h]={isDir:!1,content:c,pos:b}:(e.content[h]||(e.content[h]={isDir:!0,content:{}}),e=e.content[h])}}return a},this.generateFileList=function(){if(o.isFileListVisible()){var a='<span class="vpl_ide_dirindent"></span>',b=[],d="";!function b(d,e,f){for(var g in d.content)if(d.content.hasOwnProperty(g)){var h=d.content[g];if(h.isDir)f.push(e+c.iconFolder()+c.sanitizeText(g)),b(h,e+a,f);else{var i=h.content,j=c.sanitizeText(g),k=c.sanitizeText(i.getFileName());i.isOpen()&&(j="<b>"+j+"</b>");var l='<a href="#" data-fileid="'+i.getId()+'" title="'+k+'">'+j+"</a>";i.isModified()&&(l=c.iconModified()+l),h.pos<p&&(l+=c.iconRequired()),f.push(e+l)}}}(o.getDirectoryStructure(),"",b);for(var e=0;e<b.length;e++)d+=b[e]+"<br />";J.html("<div>"+d+"</div>")}},b.on("click","span.vpl_ide_closeicon",function(){j.close(j.currentFile())}),b.on("dblclick","span.vpl_ide_closeicon",F.getAction("delete")),b.on("dblclick","a",F.getAction("rename")),J.on("dblclick","a",F.getAction("rename"))},l(),function(){var a=E.width();function b(){var b=E.width();a!=b&&(a=b,l())}b(),setInterval(b,1e3)}(),j.resetModified(),c.requestAction("load","loading",i,i.loadajaxurl).done(function(b){for(var d=!0,e=b.files,f=0;f<e.length;f++){var g=e[f],h=j.addFile(g,!1,n,m);h?(h.resetModified(),f<p||e.length<=5?j.open(h):j.fileListVisible(!0)):d=!1}c.delay("updateMenu",n),j.generateFileList(),L.tabs("option","active",0),b.compilationexecution&&o.setResult(b.compilationexecution,!1),F.setTimeLeft(b),b.comments>""&&a("#vpl_ide_input_comments").val(b.comments),d?j.resetModified():j.setModified(),0===j.length()&&q>0?F.getAction("new")():i.saved||j.setModified()}).fail(m)};return window.VPLIDE=i,{init:function(a,b){h=new i(a,b)}}});
\ No newline at end of file
diff --git a/amd/src/vplide.js b/amd/src/vplide.js
index b5316dc8f080033e84469da4edcecc54ab0fbcf0..d659f962112b62963cebb13f0d777a92d3cc5abe 100644
--- a/amd/src/vplide.js
+++ b/amd/src/vplide.js
@@ -21,6 +21,7 @@
  * @author Juan Carlos Rodríguez-del-Pino <jcrodriguez@dis.ulpgc.es>
  */
 
+/* globals Promise */
 define(['jquery',
          'jqueryui',
          'mod_vpl/vplutil',
@@ -121,14 +122,56 @@ define(['jquery',
                     e.stopImmediatePropagation();
                     return false;
                 }
+                var droppedFiles = [];
+                // Function that lists all files and subfiles of given entry into droppedFiles.
+                var listDroppedFiles = function(entry, path="") {
+                    return new Promise(function(resolve){
+                        if (entry.isFile) {
+                            // Current entry is a file : add it to the list.
+                            entry.file(function(file) {
+                                // Change its name s.t. it preserves directories structure.
+                                var fullName = path + file.name;
+                                Object.defineProperty(file, "name", {
+                                    get: function(){ return fullName; }
+                                });
+                                droppedFiles.push(file);
+                                resolve();
+                            });
+                        } else if (entry.isDirectory) {
+                            // Current entry is a directory : process its content.
+                            var dirReader = entry.createReader();
+                            dirReader.readEntries(function(entries) {
+                                var dirPromises = [];
+                                for (var i=0; i<entries.length; i++) {
+                                    dirPromises.push(listDroppedFiles(entries[i], path + entry.name + "/"));
+                                }
+                                Promise.all(dirPromises).then(resolve);
+                            });
+                        } else {
+                            // This is neither a directory nor a file : ignore it.
+                            resolve();
+                        }
+                    });
+                };
                 var dt = e.originalEvent.dataTransfer;
+
+                // List every element of the drop event.
+                var promises = [];
+                for (var i=0; i<dt.items.length; i++) {
+                    promises.push(listDroppedFiles(dt.items[i].webkitGetAsEntry()));
+                }
+
                 // Drop files.
                 if (dt.files.length > 0) {
-                    VPLUtil.readSelectedFiles(dt.files, function(file) {
-                        return fileManager.addFile(file, true, updateMenu, showErrorMessage);
-                    },
-                    function(){
-                        fileManager.fileListVisibleIfNeeded();
+                    Promise.all(promises)
+                    .then(function(){
+                        VPLUtil.readSelectedFiles(droppedFiles, function(file) {
+                            return fileManager.addFile(file, true, updateMenu, showErrorMessage);
+                        },
+                        function(){
+                            fileManager.fileListVisibleIfNeeded();
+                        });
+                        return;
                     });
                     e.stopImmediatePropagation();
                     return false;