d&&(i.on("update."+t.namespace,h),void 0===n&&(u=0,p(),n=f(g.hash),void 0===n&&(n=0)),b=a.slice(n,n+d),B[m]=i,w=n?Math.max(-1,n-d):-1,x=n+d>=a.length?0:n+d,r=Math.ceil(a.length/d),s=Math.ceil(n/d)),e.each(b||a,function(e,t){T.push(V(t)),t.node&&(z[t.hash]=t.node)}),k=w>-1?e('').text(t.i18n("btnPrevious",s,r)).button({icons:{primary:"ui-icon-caret-1-n"}}).on("click",function(e){e.preventDefault(),e.stopPropagation(),v(w,"up")}):e(),C=x?e('').text(t.i18n("btnNext",s+2,r)).button({icons:{primary:"ui-icon-caret-1-s"}}).on("click",function(e){e.preventDefault(),e.stopPropagation(),v(x,"down")}):e(),y(),i.empty()[b?"addClass":"removeClass"]("elfinder-navbar-hasmore").append(k,T.join(""),C),e.each(z,function(n,i){e("#"+t.navHash2Id(n)).parent().replaceWith(i)}),o&&Q(t.navHash2Id(b["up"===o?b.length-1:0].hash)),!l&&t.lazy(function(){ne(null,i)})},y=function(){e.each(i.children(".elfinder-navbar-wrapper"),function(n,i){var o,r,l=e(i),c=l.children("[id]:first");c.hasClass(b)&&(o=t.navId2Hash(c.attr("id")),
o&&void 0!==(r=s[o])&&(a[r].node=l.detach()))})};v()},y={},w=[],x=!0;h--;)a=i[h],m[a.hash]||e("#"+t.navHash2Id(a.hash)).length||(m[a.hash]=!0,(o=K(a.phash)).length?a.phash&&((s=!o.children().length)||o.hasClass("elfinder-navbar-hasmore")||(r=G(o,a)).length)?s?(y[a.phash]||(y[a.phash]=[]),y[a.phash].push(a)):r?(d=V(a),r.before(d),!l&&(f=f.add(d))):w.push(a):(d=V(a),o[x||a.phash?"append":"prepend"](d),x=!1,a.phash&&!a.isroot||(c=e("#"+t.navHash2Id(a.hash)).parent()),!l&&ne(null,c)):u.push(a));return Object.keys(y).length&&e.each(y,function(e,t){var n=K(e);t.sort(Y),v(n,t)}),w.length&&o.trigger("update."+t.namespace,{added:w}),u.length&&u.lengths?a.animate({scrollTop:a.scrollTop()+l-o-r/3},{duration:"fast",complete:function(){d.resolve()}}):d.resolve()):d.reject()},100)),d},Z=function(n){var i,a,o,r=n||t.cwd(),s=r.hash?[r.hash]:[];for(a=t.root(r.hash),o=t.file(a);o&&(i=o.phash)&&(s.unshift(i),a=t.root(i),o=t.file(a),!e("#"+t.navHash2Id(o.hash)).hasClass(b)););return s},ee=function(n){var i=n||t.cwd(),a=i.hash,o=e("#"+t.navHash2Id(a));if(!o.length){for(;i&&i.phash;)B[i.phash]&&!e("#"+t.navHash2Id(i.hash)).length&&B[i.phash].trigger("update."+t.namespace,{select:i.hash}),i=t.file(i.phash);o=e("#"+t.navHash2Id(a))}return o},te=function(n,i){var a,r,s=t.cwd(),l=s.hash,c=void 0===i?u:i,p=function(n){var i,o,s=e.Deferred(),l=[],d=Z(n),p=function(e,n,i){var a={cmd:e,target:n};return i&&(a.until=i),t.request({data:a,preventFail:!0})};return l=e.map(d,function(n){var a,o,r=t.file(n),s=!!r&&t.isRoot(r),l=e("#"+t.navHash2Id(n)),c=function(e,n){var i,a,o=n||1;return a=!!(i=t.file(e))&&i.phash,a&&o>1?c(a,--o):a},d=function(){var i=c(n);for(a=i;i&&!e("#"+t.navHash2Id(i)).hasClass(b);)a=i,i=c(i);return i||(a=void 0,i=t.root(n)),i}();return l.hasClass(b)||!s&&r&&e("#"+t.navHash2Id(r.phash)).hasClass(b)?null:(s||d===c(n)||d===c(n,2)?(a=void 0,o="tree",s||(n=c(n))):o="parents",i||(i="tree"===o?n:d),p(o,n,a))}),l.length?(ee(t.file(i)),o=t.navHash2Id(i),c&&Q(o),a=e("#"+o),r=e(t.res("tpl","navspinner")).insertBefore(a.children("."+w)),a.removeClass(g),e.when.apply(e,l).done(function(){var e,t,n,i={};if(t=arguments.length,t>0)for(n=0;n0}).addClass(i)})},ae=e(this).addClass(i).on("mouseenter mouseleave",m,function(n){var i="mouseenter"===n.type;if(!i||!oe){var a=e(this);a.hasClass(k+" "+T)||(l||!i||a.data("dragRegisted")||a.hasClass(c+" "+z+" elfinder-na elfinder-wo")||(a.data("dragRegisted",!0),t.isCommandEnabled("copy",t.navId2Hash(a.attr("id")))&&a.draggable(t.draggable)),a.toggleClass(C,i))}}).on("dragenter",m,function(t){if(t.originalEvent.dataTransfer){var n=e(this);n.addClass(C),n.is("."+g+":not(."+v+")")&&n.data("expandTimer",setTimeout(function(){n.is("."+g+"."+C)&&n.children("."+w).click()},500))}}).on("dragleave",m,function(t){if(t.originalEvent.dataTransfer){var n=e(this);n.data("expandTimer")&&clearTimeout(n.data("expandTimer")),n.removeClass(C)}}).on("click",m,function(n){var i=e(this),a=t.navId2Hash(i.attr("id"));t.file(a);return i.data("longtap")?(i.removeData("longtap"),void n.stopPropagation()):void(a==t.cwd().hash||i.hasClass(T)?(i.hasClass(g)&&i.children("."+w).click(),t.select({selected:[a],origin:"tree"})):t.exec("open",a).done(function(){t.one("opendone",function(){t.select({selected:[a],origin:"tree"})})}))}).on("touchstart",m,function(n){if(!(n.originalEvent.touches.length>1)){var i,a=n.originalEvent;return"INPUT"===n.target.nodeName?void n.stopPropagation():void(i=e(this).addClass(C).removeData("longtap").data("tmlongtap",setTimeout(function(e){i.data("longtap",!0),t.trigger("contextmenu",{type:"navbar",targets:[t.navId2Hash(i.attr("id"))],x:a.touches[0].pageX,y:a.touches[0].pageY})},500)))}}).on("touchmove touchend",m,function(t){return"INPUT"===t.target.nodeName?void t.stopPropagation():(clearTimeout(e(this).data("tmlongtap")),void("touchmove"==t.type&&e(this).removeClass(C)))}).on("click",m+"."+g+" ."+w,function(n){var i,a=e(this),o=a.parent(m),r=o.next("."+h),s=e.Deferred(),l=30;n.stopPropagation(),o.hasClass(b)?(o.toggleClass(v),t.lazy(function(){i=o.hasClass(v)?r.children().length+r.find("div.elfinder-navbar-subtree[style*=block]").children().length:r.find("div:visible").length,i>l?(r.toggle(),t.draggingUiHelper&&t.draggingUiHelper.data("refreshPositions",1),F()):r.stop(!0,!0).slideToggle("normal",function(){t.draggingUiHelper&&t.draggingUiHelper.data("refreshPositions",1),F()})}).always(function(){s.resolve()})):(_.insertBefore(a),o.removeClass(g),t.request({cmd:"tree",target:t.navId2Hash(o.attr("id"))}).done(function(e){J(Object.assign([],X(e.tree))),r.children().length&&(o.addClass(g+" "+v),r.children().length>l?(r.show(),t.draggingUiHelper&&t.draggingUiHelper.data("refreshPositions",1),F()):r.stop(!0,!0).slideDown("normal",function(){t.draggingUiHelper&&t.draggingUiHelper.data("refreshPositions",1),F()}))}).always(function(e){_.remove(),o.addClass(b),t.one("treedone",function(){s.resolve()})})),a.data("dfrd",s)}).on("contextmenu",m,function(n){var i=e(this);return i.find("input:text").length?void n.stopPropagation():(n.preventDefault(),t.trigger("contextmenu",{type:"navbar",targets:[t.navId2Hash(e(this).attr("id"))],x:n.pageX,y:n.pageY}),i.addClass("ui-state-hover"),t.getUI("contextmenu").children().on("mouseenter",function(){i.addClass("ui-state-hover")}),void t.bind("closecontextmenu",function(){i.removeClass("ui-state-hover")}))}).on("scrolltoview",m,function(n,i){var a=e(this);Q(a.attr("id")).done(function(){i&&"undefined"!==i.blink&&!i.blink||t.resources.blink(a,"lookme")})}).on("create."+t.namespace,function(n,i){var a=K(i.phash),o=i.move||!1,r=e(V(i)).addClass("elfinder-navbar-wrapper-tmp"),s=t.selected();o&&s.length&&t.trigger("lockfiles",{files:s}),a.prepend(r)}),oe=!1,re=t.getUI("navbar").append(ae).show().on("scroll",function(){oe=!0,r&&clearTimeout(r),r=setTimeout(function(){oe=!1,F()},50)}),se=t.sortAlsoTreeview;t.open(function(e){var n=e.data,i=X(n.files),a=t.getUI("contextmenu");n.init&&ae.empty(),t.UA.iOS&&re.removeClass("overflow-scrolling-touch").addClass("overflow-scrolling-touch"),i.length?t.lazy(function(){a.data("cmdMaps")||a.data("cmdMaps",{}),J(i),ie(i,b),te(i)}):te()}).add(function(e){var t=X(e.data.added);t.length&&(J(t),ie(t,g))}).change(function(n){if(!o){var i,a,r,s,c,d,p,u,f,g,y,w,x=X(n.data.changed,!0),k=x.length,C=k;e();for(e.each(B,function(e,n){n.trigger("update."+t.namespace,{change:"prepare"})});C--;)if(i=x[C],a=i.phash,(r=e("#"+t.navHash2Id(i.hash))).length){if(y=r.parent(),a){if(c=r.closest("."+h),d=K(a),p=r.parent().next(),u=G(d,i),!d.length)continue;d[0]===c[0]&&p.get(0)===u.get(0)||(u.length?u.before(y):d.append(y))}f=r.hasClass(v),g=r.hasClass(b),s=e(V(i)),r.replaceWith(s.children(m)),!l&&ne(null,y),i.dirs&&(f||g)&&(r=e("#"+t.navHash2Id(i.hash)))&&r.next("."+h).children().length&&(f&&r.addClass(v),g&&r.addClass(b)),w|=i.dirs==-1}w&&F(),e.each(B,function(e,n){n.trigger("update."+t.namespace,{change:"done"})}),k&&te(void 0,!1)}}).remove(function(n){var i,a,o,r=n.data.removed,s=r.length;for(e.each(B,function(e,n){n.trigger("update."+t.namespace,{removed:r}),n.trigger("update."+t.namespace,{change:"prepare"})});s--;)(i=e("#"+t.navHash2Id(r[s]))).length&&(o=!0,a=i.closest("."+h),i.parent().detach(),a.children().length||a.hide().prev(m).removeClass(g+" "+v+" "+b));o&&t.getUI("navbar").children(".ui-resizable-handle").trigger("resize"),e.each(B,function(e,n){n.trigger("update."+t.namespace,{change:"done"})})}).bind("lockfiles unlockfiles",function(n){var i="lockfiles"==n.type,a=!!n.data.helper&&n.data.helper.data("locked"),o=i&&!a?"disable":"enable",r=e.grep(n.data.files||[],function(e){var n=t.file(e);return!(!n||"directory"!=n.mime)});e.each(r,function(n,r){var s=e("#"+t.navHash2Id(r));s.length&&!a&&(s.hasClass(z)&&s.draggable(o),s.hasClass(I)&&s.droppable(o),s[i?"addClass":"removeClass"](T))})}).bind("sortchange",function(){if(t.sortAlsoTreeview||se!==t.sortAlsoTreeview){var n,i,a=[],o={},r={},s="",l=!1;t.lazy(function(){n=X(t.files()),se=t.sortAlsoTreeview,ae.empty(),J(e.map(t.roots,function(e){var n=t.file(e);return n&&!n.phash?n:null})),Object.keys(B).length?(a=Z(),a.length>1?(e.each(a,function(e,n){var i=t.file(t.root(n)).volumeid;0===e&&(s=i),r[i]=n,o[n]=[]}),e.each(n,function(e,t){return t.volumeid?void o[r[t.volumeid]||r[s]].push(t):(l=!0,!1)})):l=!0,l?e.each(a,function(e,a){J(n),i=ee(t.file(a)),ie(n,b)}):e.each(o,function(e,n){J(n),i=ee(t.file(e)),ie(n,b)})):(J(n),i=ee(),ie(n,b)),te()},100)}})}),this},e.fn.elfinderuploadbutton=function(t){return this.each(function(){var n=e(this).elfinderbutton(t).off("click"),i=e("").appendTo(n),a=e(' ').on("change",function(){var n=e(this);n.val()&&(t.exec({input:n.remove()[0]}),a.clone(!0).appendTo(i))}).on("dragover",function(e){e.originalEvent.dataTransfer.dropEffect="copy"});i.append(a.clone(!0)),t.change(function(){i[t.disabled()?"hide":"show"]()}).change()})},e.fn.elfinderviewbutton=function(t){return this.each(function(){var n=e(this).elfinderbutton(t),i=n.children(".elfinder-button-icon");t.change(function(){var e="icons"==t.value;i.toggleClass("elfinder-button-icon-view-list",e),t.className=e?"view-list":"",t.title=t.fm.i18n(e?"viewlist":"viewicons"),n.attr("title",t.title)})})},e.fn.elfinderworkzone=function(t){var n="elfinder-workzone";return this.not("."+n).each(function(){var i=e(this).addClass(n),a=i.outerHeight(!0)-i.height(),o=Math.round(i.height()),r=i.parent(),s=function(s){var l=r.height()-a,c=r.attr("style"),d=Math.round(i.height());s&&(s.preventDefault(),s.stopPropagation()),r.css("overflow","hidden").children(":visible:not(."+n+")").each(function(){var t=e(this);"absolute"!=t.css("position")&&"fixed"!=t.css("position")&&(l-=t.outerHeight(!0))}),r.attr("style",c||""),l=Math.max(0,Math.round(l)),o===l&&d===l||(o=Math.round(i.height()),i.height(l),t.trigger("wzresize"))},l=function(){a=i.outerHeight(!0)-i.height(),s()};r.on("resize."+t.namespace,s),t.one("cssloaded",l).bind("uiresize",s)}),this},i.prototype.commands.archive=function(){var t,n=this,i=n.fm,a=[];this.variants=[],this.disableOnSearch=!1,this.nextAction={},i.bind("open reload",function(){n.variants=[],e.each(a=i.option("archivers").create||[],function(e,t){n.variants.push([t,i.mime2kind(t)])}),n.change()}),this.getstate=function(n){var o,r=this.files(n),s=r.length,l=s&&!i.isRoot(r[0])&&(i.file(r[0].phash)||{}).write&&!e.grep(r,function(e){return!e.read}).length;return l&&i.searchStatus.state>1&&(o=i.cwd().volumeid,l=s===e.grep(r,function(e){return!(!e.read||0!==e.hash.indexOf(o))}).length),l&&!this._disabled&&a.length&&(s||t&&"pending"==t.state())?0:-1},this.exec=function(o,r){var s,l,c=this.files(o),d=c.length,p=r||a[0],u=i.file(c[0].phash)||null,h=["errArchive","errPerm","errCreatingTempDir","errFtpDownloadFile","errFtpUploadFile","errFtpMkdir","errArchiveExec","errExtractExec","errRm"];if(t=e.Deferred().fail(function(e){e&&i.error(e)}),!d||!a.length||e.inArray(p,a)===-1)return t.reject();if(!u.write)return t.reject(h);for(s=0;s1?"Archive":c[0].name)+(i.option("archivers").createext?"."+i.option("archivers").createext[p]:""),n.data={targets:n.hashes(o),type:p},i.cwd().hash!==u.hash?l=i.exec("open",u.hash).done(function(){i.one("cwdrender",function(){i.selectfiles({files:o}),t=e.proxy(i.res("mixin","make"),n)()})}):(i.selectfiles({files:o}),t=e.proxy(i.res("mixin","make"),n)()),t}},(i.prototype.commands.back=function(){this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+left backspace"}],this.getstate=function(){return this.fm.history.canBack()?0:-1},this.exec=function(){return this.fm.history.back()}}).prototype={forceLoad:!0},i.prototype.commands.chmod=function(){this.updateOnSelect=!1;var t=this.fm,n={0:"owner",1:"group",2:"other"},i={read:t.i18n("read"),write:t.i18n("write"),execute:t.i18n("execute"),perm:t.i18n("perm"),kind:t.i18n("kind"),files:t.i18n("files")},a=function(e){return!isNaN(parseInt(e,8)&&parseInt(e,8)<=511)||e.match(/^([r-][w-][x-]){3}$/i)};this.tpl={main:' {title}
{dataTable}',itemTitle:'{name} {kind} ',groupTitle:"{items}: {num} ",dataTable:''+i.perm+':
',fieldset:'{f_title}{name} '+i.read+' '+i.write+' '+i.execute+" "},this.shortcuts=[{}],this.getstate=function(e){var t=this.fm;return e=e||t.selected(),0==e.length&&(e=[t.cwd().hash]),this.checkstate(this.files(e))?0:-1},this.checkstate=function(t){var n=t.length;if(!n)return!1;var i=e.grep(t,function(e){return!(!(e.isowner&&e.perm&&a(e.perm))||1!=n&&"directory"==e.mime)}).length;return n==i},this.exec=function(t){var o=this.hashes(t),r=this.files(o);r.length||(o=[this.fm.cwd().hash],r=this.files(o));var s,l,c=this.fm,d=e.Deferred().always(function(){c.enable()}),p=this.tpl,u=r.length,h=r[0],f=c.namespace+"-perm-"+h.hash,m=p.main,g=' checked="checked"',v=function(){var e={};return e[c.i18n("btnApply")]=b,e[c.i18n("btnCancel")]=function(){I.elfinderdialog("close")},e},b=function(){var t,n=e.trim(e("#"+f+"-perm").val());return!!a(n)&&(I.elfinderdialog("close"),t={cmd:"chmod",targets:o,mode:n},void c.request({data:t,notify:{type:"chmod",cnt:u}}).fail(function(e){d.reject(e)}).done(function(n){n.changed&&n.changed.length&&(n.undo={cmd:"chmod",callback:function(){var t=[];return e.each(S,function(e,n){t.push(c.request({data:{cmd:"chmod",targets:n,mode:e},notify:{type:"undo",cnt:n.length}}))}),e.when.apply(null,t)}},n.redo={cmd:"chmod",callback:function(){return c.request({data:t,notify:{type:"redo",cnt:o.length}})}}),d.resolve(n)}))},y=function(){for(var t,i="",a=0;a<3;a++)t=0,e("#"+f+"-read-"+n[a]+"-perm").is(":checked")&&(t=4|t),e("#"+f+"-write-"+n[a]+"-perm").is(":checked")&&(t=2|t),e("#"+f+"-execute-"+n[a]+"-perm").is(":checked")&&(t=1|t),i+=t.toString(8);e("#"+f+"-perm").val(i)},w=function(t){for(var i,a=0;a<3;a++)i=parseInt(t.slice(a,a+1),8),e("#"+f+"-read-"+n[a]+"-perm").prop("checked",!1),e("#"+f+"-write-"+n[a]+"-perm").prop("checked",!1),e("#"+f+"-execute-"+n[a]+"-perm").prop("checked",!1),4==(4&i)&&e("#"+f+"-read-"+n[a]+"-perm").prop("checked",!0),2==(2&i)&&e("#"+f+"-write-"+n[a]+"-perm").prop("checked",!0),1==(1&i)&&e("#"+f+"-execute-"+n[a]+"-perm").prop("checked",!0);y()},x=function(e){for(var t,n,i,a="777",o="",r=e.length,s=0;s1?"elfinder-cwd-icon-group":c.mime2class(h.mime)),u>1?s=p.groupTitle.replace("{items}",c.i18n("items")).replace("{num}",u):(s=p.itemTitle.replace("{name}",h.name).replace("{kind}",c.mime2kind(h)),A=c.tmb(h)),l=C(x(r),1==r.length?r[0]:{}),m=m.replace("{title}",s).replace("{dataTable}",l).replace(/{id}/g,f),I=c.dialog(m,z),I.attr("id",f),A&&e(" ").on("load",function(){I.find(".elfinder-cwd-icon").addClass(A.className).css("background-image","url('"+A.url+"')")}).attr("src",A.url),e("#"+f+"-table-perm :checkbox").on("click",function(){y("perm")}),e("#"+f+"-perm").on("keydown",function(t){var n=t.keyCode;if(t.stopPropagation(),n==e.ui.keyCode.ENTER)return void b()}).on("focus",function(t){e(this).trigger("select")}).on("keyup",function(t){3==e(this).val().length&&(e(this).trigger("select"),w(e(this).val()))}),d)}},i.prototype.commands.colwidth=function(){this.alwaysEnabled=!0,this.updateOnSelect=!1,this.getstate=function(){return"fixed"===this.fm.getUI("cwd").find("table").css("table-layout")?0:-1},this.exec=function(){this.fm.getUI("cwd").trigger("colwidth")}},i.prototype.commands.copy=function(){this.shortcuts=[{pattern:"ctrl+c ctrl+insert"}],this.getstate=function(t){var n=this.files(t),i=n.length;return i&&e.grep(n,function(e){return!!e.read}).length==i?0:-1},this.exec=function(t){var n=this.fm,i=e.Deferred().fail(function(e){n.error(e)});return e.each(this.files(t),function(e,t){if(!t.read)return!i.reject(["errCopy",t.name,"errPerm"])}),"rejected"==i.state()?i:i.resolve(n.clipboard(this.hashes(t)))}},i.prototype.commands.cut=function(){var t=this.fm;this.shortcuts=[{pattern:"ctrl+x shift+insert"}],this.getstate=function(n){var i=this.files(n),a=i.length;return a&&e.grep(i,function(e){return!(!e.read||e.locked||t.isRoot(e))}).length==a?0:-1},this.exec=function(n){var i=e.Deferred().fail(function(e){t.error(e)});return e.each(this.files(n),function(e,n){return!n.read||n.locked||t.isRoot(n)?!i.reject(["errCopy",n.name,"errPerm"]):n.locked?!i.reject(["errLocked",n.name]):void 0}),"rejected"==i.state()?i:i.resolve(t.clipboard(this.hashes(n),!0))}},i.prototype.commands.zipdl=function(){},i.prototype.commands.download=function(){var t=this,n=this.fm,i=null,a=!1,o=!1,r=function(r,s){var l,c;if(null!==i&&(n.searchStatus.state>1?o=n.searchStatus.mixed:n.leafRoots[n.cwd().hash]&&(l=n.cwd().volumeid,e.each(r,function(e,t){if(0!==t.indexOf(l))return o=!0,!1})),a=n.isCommandEnabled("zipdl",r[0])),o){if(c=i?"zipdl":"download",r=e.grep(r,function(t){var a=n.file(t),o=!(!a||!i&&"directory"===a.mime||!n.isCommandEnabled(c,t));return a&&s&&!o&&e("#"+n.cwdHash2Id(a.hash)).trigger("unselect"),o}),!r.length)return[]}else if(!n.isCommandEnabled("download",r[0]))return[];return e.grep(t.files(r),function(t){var i=!(!t.read||!a&&"directory"==t.mime);return s&&!i&&e("#"+n.cwdHash2Id(t.hash)).trigger("unselect"),i})};this.linkedCmds=["zipdl"],this.shortcuts=[{pattern:"shift+enter"}],this.getstate=function(e){var t=this.hashes(e),i=t.length,o=this.options.maxRequests||10;return i<1?-1:(i=r(t).length,i&&(a||i<=o&&(!n.UA.IE&&!n.UA.Mobile||1==i))?0:-1)},n.bind("contextmenu",function(n){var i,a,o=t.fm,r=null,s=function(t){var n=t.url||o.url(t.hash);return{icon:"link",node:e(" ").attr({href:n,target:"_blank",title:o.i18n("link")}).text(t.name).on("mousedown click touchstart touchmove touchend contextmenu",function(e){e.stopPropagation()}).on("dragstart",function(n){var i=n.dataTransfer||n.originalEvent.dataTransfer||null;if(r=null,i){var a=function(t){var n,i=t.mime,a=o.tmb(t);return n='
',a&&(n=e(n).addClass(a.className).css("background-image","url('"+a.url+"')").get(0).outerHTML),n};i.effectAllowed="copyLink",i.setDragImage&&(r=e('').append(a(t)).appendTo(e(document.body)),i.setDragImage(r.get(0),50,47)),o.UA.IE||(i.setData("elfinderfrom",window.location.href+t.phash),i.setData("elfinderfrom:"+i.getData("elfinderfrom"),""))}}).on("dragend",function(e){r&&r.remove()})}};if(t.extra=null,n.data&&(i=n.data.targets||[],1===i.length&&(a=o.file(i[0]))&&"directory"!==a.mime))if("1"!=a.url)t.extra=s(a);else{var l;t.extra={icon:"link",node:e("
").attr({href:"#",title:o.i18n("getLink"),draggable:"false"}).text(a.name).on("click touchstart",function(e){if(!("touchstart"===e.type&&e.originalEvent.touches.length>1)){var t=l.parent();e.stopPropagation(),e.preventDefault(),t.removeClass("ui-state-disabled").addClass("elfinder-button-icon-spinner"),o.request({data:{cmd:"url",target:a.hash},preventDefault:!0}).always(function(e){if(t.removeClass("elfinder-button-icon-spinner"),e.url){var n=o.file(a.hash);n.url=e.url,l.replaceWith(s(a).node)}else t.addClass("ui-state-disabled")})}})},l=t.extra.node,l.ready(function(){setTimeout(function(){l.parent().addClass("ui-state-disabled").css("pointer-events","auto")},10)})}}).one("open",function(){n.api>=2.1012&&(i=n.getCommand("zipdl"))}),this.exec=function(t){var n,i,s,l,c,d=this.hashes(t),p=this.fm,u=(p.options.url,r(d,!0)),h=e.Deferred(),f="",m={},g=!1,v=function(t){return function(){var n,a,o,r=e.Deferred(),s=p.file(p.root(t[0])),c=1===t.length,d=s?s.i18||s.name:null;return c?(n=p.file(t[0]))&&(a=n.i18||n.name):(e.each(t,function(){var e=p.file(this);return!e||o&&o!==e.phash?(o=null,!1):void(o=e.phash)}),o&&(n=p.file(o))&&(a=(n.i18||n.name)+"-"+t.length)),a&&(d=a),d&&(d=" ("+d+")"),p.request({data:{cmd:"zipdl",targets:t},notify:{type:"zipdl",cnt:1,hideCnt:!0,msg:p.i18n("ntfzipdl")+d},cancel:!0,eachCancel:!0,preventDefault:!0}).done(function(n){var o,s,c,d,u,h={},f="dlw"+ +new Date;n.error?(p.error(n.error),r.resolve()):n.zipdl&&(o=n.zipdl,a?a+=".zip":a=o.name,l&&(!p.UA.Safari||p.isSameOrigin(p.options.url))||g?(i=p.options.url+(p.options.url.indexOf("?")===-1?"?":"&")+"cmd=zipdl&download=1",e.each([t[0],o.file,a,o.mime],function(e,t){i+="&targets%5B%5D="+encodeURIComponent(t)}),e.each(p.customData,function(e,t){i+="&"+encodeURIComponent(e)+"="+encodeURIComponent(t)}),i+="&"+encodeURIComponent(a),c=e("
").attr("href",i).attr("download",p.escape(a)).attr("target","_blank").on("click",function(){r.resolve(),s&&s.elfinderdialog("destroy")}),g?(c.append('
'+p.escape(a)),h[p.i18n("btnCancel")]=function(){s.elfinderdialog("destroy")},s=p.dialog(c,{title:p.i18n("link"),buttons:h,width:"200px",destroyOnClose:!0,close:function(){"resolved"!==r.state()&&r.resolve()}})):(b(c.hide().appendTo("body").get(0)),c.remove())):(d=e('
').append('
').append('
'),e.each([t[0],o.file,a,o.mime],function(e,t){d.append('
')}),e.each(p.customData,function(e,t){d.append('
')}),d.attr("target",f).appendTo("body"),u=e('
',c='',d=/\{url\}/,p=/\{link\}/,u=/\{author\}/,h=/\{work\}/,f="replace",m="ui-priority-primary",g="ui-priority-secondary",v="elfinder-help-license",b='{title} ',y=['','"),e.inArray("about",m)!==-1&&C(),e.inArray("shortcuts",m)!==-1&&T(),e.inArray("help",m)!==-1&&(l=r.baseUrl+"js/i18n/help/%s.html.js",z()),e.inArray("preference",m)!==-1&&S(),e.inArray("debug",m)!==-1&&O(),y.push("
"),D=e(y.join("")),D.find(".ui-tabs-nav li").on("mouseenter mouseleave",function(){e(this).toggleClass("ui-state-hover")}).children().on("click",function(t){var n=e(this);t.preventDefault(),t.stopPropagation(),n.hasClass("ui-tabs-selected")||(n.parent().addClass("ui-tabs-selected ui-state-active").siblings().removeClass("ui-tabs-selected").removeClass("ui-state-active"),D.children(".ui-tabs-panel").hide().filter(n.attr("href")).show())}).filter(":first").trigger("click"),I&&h(),A&&(i=D.find(".elfinder-help-tab-debug").hide(),a=D.find("#"+r.namespace+"-help-debug").children("div:first"),o=a.children("ul:first").on("click",function(e){e.preventDefault(),e.stopPropagation()}),s.debug={},r.bind("backenddebug",function(e){A&&e.data&&e.data.debug&&(s.debug={options:e.data.options,debug:Object.assign({cmd:r.currentReqCmd},e.data.debug)},s.dialog&&j())})),D.find("#"+r.namespace+"-help-about").find(".apiver").text(r.api),s.dialog=r.dialog(D,{title:s.title,width:530,maxWidth:"window",maxHeight:"window",autoOpen:!1,destroyOnClose:!1,close:function(){A&&(i.hide(),a.tabs("destroy")),n=!1}}).on("click",function(e){e.stopPropagation()}).css({overflow:"hidden"}),c=s.dialog.children(".ui-tabs"),d=c.children(".ui-tabs-nav:first"),p=c.children(".ui-tabs-panel"),u=s.dialog.outerHeight(!0)-s.dialog.height(),s.dialog.closest(".ui-dialog").on("resize",function(){p.height(s.dialog.height()-u-d.outerHeight(!0)-20)}),l&&s.dialog.one("initContents",function(){e.ajax({url:s.options.helpSource?s.options.helpSource:l.replace("%s",r.lang),dataType:"html"}).done(function(t){e("#"+r.namespace+"-help-help").html(t)}).fail(function(){e.ajax({url:l.replace("%s","en"),dataType:"html"}).done(function(t){e("#"+r.namespace+"-help-help").html(t)})})}),s.state=0}).one("open",function(){var e=!1;r.one("backenddebug",function(){e=!0}).one("opendone",function(){setTimeout(function(){!e&&A&&(A=!1,i.hide(),a.hide(),o.hide())},0)})}),this.getstate=function(){return 0},this.exec=function(s,l){var c=l?l.tab:void 0,d=function(){A&&(a.tabs(),o.find("a:first").trigger("click"),i.show(),n=!0)};return t?d():(t=!0,r.lazy(U).done(d)),this.dialog.trigger("initContents").elfinderdialog("open").find((c?".elfinder-help-tab-"+c:".ui-tabs-nav li")+" a:first").trigger("click"),e.Deferred().resolve()}}).prototype={forceLoad:!0},i.prototype.commands.preference=function(){this.linkedCmds=["help"],this.alwaysEnabled=!0,this.getstate=function(){return 0},this.exec=function(){return this.fm.exec("help",void 0,{tab:"preference"})}},i.prototype.commands.hidden=function(){this.hidden=!0,this.updateOnSelect=!1,this.getstate=function(){return-1}},(i.prototype.commands.home=function(){this.title="Home",this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+home ctrl+shift+up",description:"Home"}],this.getstate=function(){var e=this.fm.root(),t=this.fm.cwd().hash;return e&&t&&e!=t?0:-1},this.exec=function(){return this.fm.exec("open",this.fm.root())}}).prototype={forceLoad:!0},(i.prototype.commands.info=function(){var t=this.fm,n="elfinder-info-spinner",i="elfinder-info-button",a={calc:t.i18n("calc"),size:t.i18n("size"),unknown:t.i18n("unknown"),path:t.i18n("path"),aliasfor:t.i18n("aliasfor"),modify:t.i18n("modify"),perms:t.i18n("perms"),locked:t.i18n("locked"),dim:t.i18n("dim"),kind:t.i18n("kind"),files:t.i18n("files"),folders:t.i18n("folders"),roots:t.i18n("volumeRoots"),items:t.i18n("items"),yes:t.i18n("yes"),no:t.i18n("no"),link:t.i18n("link"),owner:t.i18n("owner"),group:t.i18n("group"),perm:t.i18n("perm"),getlink:t.i18n("getLink")};this.tpl={main:' {title}
',itemTitle:'{name} {kind} ',groupTitle:"{items}: {num} ",row:'{label} : {value} ',spinner:'{text} '},this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+i"}],this.init=function(){e.each(a,function(e,n){a[e]=t.i18n(n)})},this.getstate=function(){return 0},this.exec=function(t){var o=this.files(t);o.length||(o=this.files([this.fm.cwd().hash]));var r,s,l,c,d,p,u,h,f=this.fm,m=this.options,g=this.tpl,v=g.row,b=o.length,y=[],w=g.main,x="{label}",k="{value}",C=[],T=null,z={title:f.i18n("selectionInfo"),width:"auto",close:function(){e(this).elfinderdialog("destroy"),T&&"pending"===T.state()&&T.reject(),e.grep(C,function(e){e&&"pending"===e.state()&&e.reject()})}},I=[],S=function(e,t,i){O.find("."+n+"-"+t).parent().html(e).addClass(i||"")},A=f.namespace+"-info-"+e.map(o,function(e){return e.hash}).join("-"),O=f.getUI().find("#"+A),j=[],D="",M="elfinder-font-mono elfinder-info-hash";if(!b)return e.Deferred().reject();if(O.length)return O.elfinderdialog("toTop"),e.Deferred().resolve();if(1===b){if(l=o[0],l.icon&&(D=" "+f.getIconStyle(l)),w=w.replace("{dirclass}",l.csscls?f.escape(l.csscls):"").replace("{class}",f.mime2class(l.mime)).replace("{style}",D),c=g.itemTitle.replace("{name}",f.escape(l.i18||l.name)).replace("{kind}",''+f.mime2kind(l)+" "),s=f.tmb(l),l.read?"directory"!=l.mime||l.alias?r=f.formatSize(l.size):(r=g.spinner.replace("{text}",a.calc).replace("{name}","size"),I.push(l.hash)):r=a.unknown,y.push(v.replace(x,a.size).replace(k,r)),l.alias&&y.push(v.replace(x,a.aliasfor).replace(k,l.alias)),(u=f.path(l.hash,!0))?y.push(v.replace(x,a.path).replace(k,f.escape(u).replace(/(\/|\\)/g,"$1")).replace("{class}","elfinder-info-path")):(y.push(v.replace(x,a.path).replace(k,g.spinner.replace("{text}",a.calc).replace("{name}","path")).replace("{class}","elfinder-info-path")),C.push(f.path(l.hash,!0,{notify:null}).fail(function(){S(a.unknown,"path")}).done(function(e){S(e.replace(/(\/|\\)/g,"$1"),"path")}))),l.read){var U,E=f.escape(l.name);if("1"==l.url)y.push(v.replace(x,a.link).replace(k,''+a.getlink+" "));else{if(m.nullUrlDirLinkSelf&&"directory"==l.mime&&null===l.url){var F=window.location;U=F.pathname+F.search+"#elf_"+l.hash}else U=f.url(l.hash);y.push(v.replace(x,a.link).replace(k,''+E+" "));
}}l.dim?y.push(v.replace(x,a.dim).replace(k,l.dim)):l.mime.indexOf("image")!==-1&&(l.width&&l.height?y.push(v.replace(x,a.dim).replace(k,l.width+"x"+l.height)):(y.push(v.replace(x,a.dim).replace(k,g.spinner.replace("{text}",a.calc).replace("{name}","dim"))),C.push(f.request({data:{cmd:"dim",target:l.hash},preventDefault:!0}).fail(function(){S(a.unknown,"dim")}).done(function(e){if(S(e.dim||a.unknown,"dim"),e.dim){var t=e.dim.split("x"),n=f.file(l.hash);n.width=t[0],n.height=t[1]}})))),y.push(v.replace(x,a.modify).replace(k,f.formatDate(l))),y.push(v.replace(x,a.perms).replace(k,f.formatPermissions(l))),y.push(v.replace(x,a.locked).replace(k,l.locked?a.yes:a.no)),l.owner&&y.push(v.replace(x,a.owner).replace(k,l.owner)),l.group&&y.push(v.replace(x,a.group).replace(k,l.group)),l.perm&&y.push(v.replace(x,a.perm).replace(k,f.formatFileMode(l.perm))),window.ArrayBuffer&&(f.options.cdns.sparkmd5||f.options.cdns.jssha)&&"directory"!==l.mime&&l.size>0&&(!m.showHashMaxsize||l.size<=m.showHashMaxsize)&&(h=[],e.each(f.storage("hashchekcer")||m.showHashAlgorisms,function(e,t){l[t]?y.push(v.replace(x,f.i18n(t)).replace(k,l[t]).replace("{class}",M)):(y.push(v.replace(x,f.i18n(t)).replace(k,g.spinner.replace("{text}",a.calc).replace("{name}",t))),h.push(t))}),C.push(f.getContentsHashes(l.hash,h).progress(function(t){e.each(h,function(e,n){t[n]&&S(t[n],n,M)})}).always(function(){e.each(h,function(e,t){S(a.unknown,t)})}))),m.custom&&e.each(m.custom,function(t,n){n.mimes&&!e.grep(n.mimes,function(e){return l.mime===e||0===l.mime.indexOf(e+"/")}).length||n.hashRegex&&!l.hash.match(n.hashRegex)||(y.push(v.replace(x,f.i18n(n.label)).replace(k,n.tpl.replace("{id}",A))),n.action&&"function"==typeof n.action&&j.push(n.action))})}else w=w.replace("{class}","elfinder-cwd-icon-group"),c=g.groupTitle.replace("{items}",a.items).replace("{num}",b),d=e.grep(o,function(e){return"directory"==e.mime}).length,d?(p=e.grep(o,function(e){return!("directory"!==e.mime||e.phash&&!e.isroot)}).length,d-=p,y.push(v.replace(x,a.kind).replace(k,p===b||d===b?a[p?"roots":"folders"]:e.map({roots:p,folders:d,files:b-p-d},function(e,t){return e?a[t]+" "+e:null}).join(", "))),y.push(v.replace(x,a.size).replace(k,g.spinner.replace("{text}",a.calc).replace("{name}","size"))),I=e.map(o,function(e){return e.hash})):(r=0,e.each(o,function(e,t){var n=parseInt(t.size);n>=0&&r>=0?r+=n:r="unknown"}),y.push(v.replace(x,a.kind).replace(k,a.files)),y.push(v.replace(x,a.size).replace(k,f.formatSize(r))));return w=w.replace("{title}",c).replace("{content}",y.join("").replace(/{class}/g,"")),O=f.dialog(w,z),O.attr("id",A),l&&"1"==l.url&&O.on("click","."+n+"-url",function(){e(this).parent().html(g.spinner.replace("{text}",f.i18n("ntfurl")).replace("{name}","url")),f.request({data:{cmd:"url",target:l.hash},preventDefault:!0}).fail(function(){S(E,"url")}).done(function(e){if(e.url){S(''+E+" "||E,"url");var t=f.file(l.hash);t.url=e.url}else S(E,"url")})}),s&&e(" ").on("load",function(){O.find(".elfinder-cwd-icon").addClass(s.className).css("background-image","url('"+s.url+"')")}).attr("src",s.url),I.length&&(T=f.getSize(I).done(function(e){S(e.formated,"size")}).fail(function(){S(a.unknown,"size")})),j.length&&e.each(j,function(e,t){try{t(l,f,O)}catch(n){f.debug("error",n)}}),e.Deferred().resolve()}}).prototype={forceLoad:!0},i.prototype.commands.mkdir=function(){var t,n=this.fm,i=this;this.value="",this.disableOnSearch=!0,this.updateOnSelect=!1,this.mime="directory",this.prefix="untitled folder",this.exec=function(a,o){return a&&a.length&&o&&o._currentType&&"navbar"===o._currentType?(this.origin=o._currentType,this.data={target:a[0]}):(this.origin=t?t:"cwd",delete this.data),a||this.options.intoNewFolderToolbtn||n.getUI("cwd").trigger("unselectall"),this.move=!("navbar"===this.origin||!n.selected().length),e.proxy(n.res("mixin","make"),i)()},this.shortcuts=[{pattern:"ctrl+shift+n"}],this.init=function(){this.options.intoNewFolderToolbtn&&(this.syncTitleOnChange=!0)},n.bind("select",function(e){var a=e.data&&e.data.selected?e.data.selected:[];i.className="mkdir",t=a.length?e.data.origin||"":"",a.length&&"navbar"!==t?(i.title=n.i18n("cmdmkdirin"),i.className+=" elfinder-button-icon-mkdirin"):i.title=n.i18n("cmdmkdir"),i.update(void 0,i.title)}),this.getstate=function(i){var a=n.cwd(),o="navbar"===t||i&&i[0]!=a.hash?this.files(i||n.selected()):[],r=o.length;return"navbar"===t?r&&o[0].write&&o[0].read?0:-1:!a.write||r&&e.grep(o,function(e){return!(!e.read||e.locked)}).length!=r?-1:0}},i.prototype.commands.mkfile=function(){this.disableOnSearch=!0,this.updateOnSelect=!1,this.mime="text/plain",this.prefix="untitled file.txt",this.exec=e.proxy(this.fm.res("mixin","make"),this),this.getstate=function(){return this.fm.cwd().write?0:-1}},i.prototype.commands.netmount=function(){var t,n=this;this.alwaysEnabled=!0,this.updateOnSelect=!1,this.drivers=[],this.handlers={load:function(){this.drivers=this.fm.netDrivers}},this.getstate=function(){return this.drivers.length?0:-1},this.exec=function(){var i,a=n.fm,o=e.Deferred(),r=n.options,s=function(){var s,l=function(){c.protocol.trigger("change","winfocus")},c={protocol:e(" ").on("change",function(e,n){var o=this.value;t.find(".elfinder-netmount-tr").hide(),t.find(".elfinder-netmount-tr-"+o).show(),i.children(".ui-dialog-buttonpane:first").find("button").show(),"function"==typeof r[o].select&&r[o].select(a,e,n),setTimeout(function(){t.find("input:text.elfinder-tabstop:visible:first").trigger("focus")},20)}).addClass("ui-corner-all")},d={title:a.i18n("netMountDialogTitle"),resizable:!1,modal:!0,destroyOnClose:!1,open:function(){e(window).on("focus."+a.namespace,l),c.protocol.trigger("change")},close:function(){"pending"==o.state()&&o.reject(),e(window).off("focus."+a.namespace,l)},buttons:{}},p=function(){var i=c.protocol.val(),s={cmd:"netmount",protocol:i},l=r[i];return e.each(t.find("input.elfinder-netmount-inputs-"+i),function(t,n){var i,a;a=e(n),a.is(":radio,:checkbox")?a.is(":checked")&&(i=e.trim(a.val())):i=e.trim(a.val()),i&&(s[n.name]=i)}),s.host?(a.request({data:s,notify:{type:"netmount",cnt:1,hideCnt:!0}}).done(function(e){var t;e.added&&e.added.length&&(e.added[0].phash&&(t=a.file(e.added[0].phash))&&(t.dirs||(t.dirs=1,a.change({changed:[t]}))),a.one("netmountdone",function(){a.exec("open",e.added[0].hash)})),o.resolve()}).fail(function(e){l.fail&&"function"==typeof l.fail&&l.fail(a,e),o.reject(e)}),void n.dialog.elfinderdialog("close")):a.trigger("error",{error:"errNetMountHostReq",opts:{modal:!0}})},u=e('').on("keydown","input",function(t){var n,i=!0;t.keyCode===e.ui.keyCode.ENTER&&(e.each(u.find("input:visible:not(.elfinder-input-optional)"),function(){if(""===e(this).val())return i=!1,n=e(this),!1}),i?p():n.trigger("focus"))}),h=e("
");return t=e('').append(e(" ").append(e(""+a.i18n("protocol")+" ")).append(e(" ").append(c.protocol))),e.each(n.drivers,function(n,i){r[i]&&(c.protocol.append(''+a.i18n(r[i].name||i)+" "),e.each(r[i].inputs,function(n,o){o.attr("name",n),"hidden"!=o.attr("type")?(o.addClass("ui-corner-all elfinder-netmount-inputs-"+i),t.append(e(" ").addClass("elfinder-netmount-tr elfinder-netmount-tr-"+i).append(e(""+a.i18n(n)+" ")).append(e(" ").append(o)))):(o.addClass("elfinder-netmount-inputs-"+i),h.append(o))}),r[i].protocol=c.protocol)}),t.append(h),t.find(".elfinder-netmount-tr").hide(),d.buttons[a.i18n("btnMount")]=p,d.buttons[a.i18n("btnCancel")]=function(){n.dialog.elfinderdialog("close")},t.find("select,input").addClass("elfinder-tabstop"),s=a.dialog(u.append(t),d),i=s.closest(".ui-dialog"),s.ready(function(){c.protocol.trigger("change"),s.elfinderdialog("posInit")}),s};return n.dialog?n.dialog.elfinderdialog("open"):n.dialog=s(),o.promise()},n.fm.bind("netmount",function(e){var i=e.data||null,a=n.options;i&&i.protocol&&a[i.protocol]&&"function"==typeof a[i.protocol].done&&(a[i.protocol].done(n.fm,i),t.find("select,input").addClass("elfinder-tabstop"),n.dialog.elfinderdialog("tabstopsInit"))})},i.prototype.commands.netunmount=function(){this.alwaysEnabled=!0,this.updateOnSelect=!1,this.drivers=[],this.handlers={load:function(){this.drivers=this.fm.netDrivers}},this.getstate=function(e){var t,n=this.fm;return e&&this.drivers.length&&!this._disabled&&(t=n.file(e[0]))&&t.netkey?0:-1},this.exec=function(t){var n=this,i=this.fm,a=e.Deferred().fail(function(e){e&&i.error(e)}),o=i.file(t[0]),r=function(t){var n,a=[];return i.leafRoots&&(n=[],e.each(i.leafRoots,function(a,o){var r,s=i.parents(a);(r=e.inArray(t,s))!==-1&&(r=s.length-r,e.each(o,function(e,t){n.push({i:r,hash:t})}))}),n.length&&(n.sort(function(e,t){return e.i").hide().appendTo(e("body")),h="string"==typeof u.get(0).download,w=y.length;w--;){if(m="elf_open_window",i=y[w],!i.read)return b.reject(["errOpen",i.name,"errPerm"]);if(f=p&&i.mime.match(p),a=v.openUrl(i.hash,!f),v.UA.Mobile||!f){if(h)!f&&u.attr("download",i.name),u.attr("href",a).attr("target","_blank").get(0).click();else if(n=window.open(a),!n)return b.reject("errPopup")}else{if(g="string"==typeof k.method&&"get"===k.method.toLowerCase(),!g&&0===a.indexOf(v.options.url)&&v.customData&&Object.keys(v.customData).length&&!i.mime.match(/^(?:video|audio)/)&&(a=""),"window"===C?(s=c=Math.round(2*screen.availWidth/3),l=d=Math.round(2*screen.availHeight/3),parseInt(i.width)&&parseInt(i.height)?(s=parseInt(i.width),l=parseInt(i.height)):i.dim&&(o=i.dim.split("x"),s=parseInt(o[0]),l=parseInt(o[1])),c>=s&&d>=l?(c=s,d=l):s-c>l-d?d=Math.round(l*(c/s)):c=Math.round(s*(d/l)),r="width="+c+",height="+d,n=window.open(a,m,r+",top=50,left=50,scrollbars=yes,resizable=yes,titlebar=no")):("tabs"===C&&(m=i.hash),n=window.open("about:blank",m)),!n)return b.reject("errPopup");if(""===a){var T=document.createElement("form");T.action=v.options.url,T.method="POST",T.target=m,T.style.display="none";var z=Object.assign({},v.customData,{cmd:"file",target:i.hash,_t:i.ts||parseInt(+new Date/1e3)});e.each(z,function(e,t){var n=document.createElement("input");n.name=e,n.value=t,T.appendChild(n)}),document.body.appendChild(T),T.submit()}else"window"!==C&&(n.location=a);n.trigger("focus")}}return u.remove(),b.resolve(t)};if(w>1)v.confirm({title:"openMulti",text:["openMultiConfirm",w+""],accept:{label:"cmdopen",callback:function(){T()}},cancel:{label:"btnCancel",callback:function(){b.reject()}},buttons:v.getCommand("zipdl")&&v.isCommandEnabled("zipdl",v.cwd().hash)?[{label:"cmddownload",callback:function(){v.exec("download",t),b.reject()}}]:[]});else{if(m=v.storage("selectAction"),m&&(e.each(m.split("/"),function(){var e=this.valueOf();return("open"===e||!(g=v.getCommand(e))||!g.enabled())&&void(g=null)}),g))return g.exec();T()}return b}}).prototype={forceLoad:!0},i.prototype.commands.opendir=function(){this.alwaysEnabled=!0,this.getstate=function(){var e,t=this.fm.selected(),n=t.length;return 1!==n?-1:(e=this.fm.getUI("workzone"),e.hasClass("elfinder-search-result")?0:-1)},this.exec=function(t){var n,i=this.fm,a=e.Deferred(),o=this.files(t),r=o.length;return r&&o[0].phash?(n=o[0].phash,i.trigger("searchend",{noupdate:!0}),i.request({data:{cmd:"open",target:n},notify:{type:"open",cnt:1,hideCnt:!0},syncOnFail:!1}),a):a.reject()}},i.prototype.commands.paste=function(){this.updateOnSelect=!1,this.handlers={changeclipboard:function(){this.update()}},this.shortcuts=[{pattern:"ctrl+v shift+insert"}],this.getstate=function(e){if(this._disabled)return-1;if(e){if(Array.isArray(e)){if(1!=e.length)return-1;e=this.fm.file(e[0])}}else e=this.fm.cwd();return this.fm.clipboard().length&&"directory"==e.mime&&e.write?0:-1},this.exec=function(t,n){var i,a,o=this,r=o.fm,s=n||{},l=t?this.files(t)[0]:r.cwd(),c=r.clipboard(),d=c.length,p=!!d&&c[0].cut,u=s._cmd?s._cmd:p?"move":"copy",h="err"+u.charAt(0).toUpperCase()+u.substr(1),f=[],m=[],g=e.Deferred().fail(function(e){e&&r.error(e)}).always(function(){r.unlockfiles({files:e.map(c,function(e){return e.hash})})}),v=function(t){return t.length&&r._commands.duplicate?r.getCommand("duplicate").exec(t):e.Deferred().resolve()},b=function(t){var n,i=e.Deferred(),a=[],c={},d=function(t,n){for(var i=[],a=t.length;a--;)e.inArray(t[a].name,n)!==-1&&i.unshift(a);return i},h=function(e){var n=a[e],o=t[n],s=e==a.length-1;o&&r.confirm({title:r.i18n(u+"Files"),text:["errExists",o.name,"restore"===u?"confirmRest":"confirmRepl"],all:!s,accept:{label:"btnYes",callback:function(n){s||n?m(t):h(++e)}},reject:{label:"btnNo",callback:function(n){var i;if(n)for(i=a.length;e '),P=e("
"),R=e('
'),H=e('
'),q=e('
').on("click touchstart",function(t){if(!j){var n=p.window,i=n.hasClass(x),o=e(window),r=function(){p.preview.trigger("changesize")};t.stopPropagation(),t.preventDefault(),i?(G="",N(),n.toggleClass(x).css(n.data("position")),o.trigger(p.resize).off(p.resize,r),$.off("mouseenter mouseleave"),H.off(E)):(n.toggleClass(x).data("position",{left:n.css("left"),top:n.css("top"),width:n.width(),height:n.height(),display:"block"}).removeAttr("style"),e(window).on(p.resize,r).trigger(p.resize),H.on(E,function(e){O||("mousemove"!==e.type&&"touchstart"!==e.type||(N(),D=setTimeout(function(){(u.UA.Mobile||$.parent().find(".elfinder-quicklook-navbar:hover").length<1)&&$.fadeOut("slow",function(){H.show()})},3e3)),H.is(":visible")&&(L(),H.data("tm",setTimeout(function(){H.show()},3e3))))}).show().trigger("mousemove"),$.on("mouseenter mouseleave",function(e){O||("mouseenter"===e.type?N():H.trigger("mousemove"))})),u.zIndex&&n.css("z-index",u.zIndex+1),u.UA.Mobile?$.attr("style",G):$.attr("style",G).draggable(i?"destroy":{start:function(){O=!0,j=!0,H.show(),N()},stop:function(){O=!1,G=p.navbar.attr("style"),setTimeout(function(){j=!1},20)}}),e(this).toggleClass(w+"-fullscreen-off");var s=n;a.is(".ui-resizable")&&(s=s.add(a)),s.resizable(i?"enable":"disable").removeClass("ui-state-disabled"),n.trigger("viewchange")}}),_=function(){p.update(void 0,function(){var t=p.fm,n=t.selectedFiles(),i=n.length,a=(p.docked(),function(){var a=0;return e.each(n,function(e,t){var n=parseInt(t.ts);a>=0?n>a&&(a=n):a="unknown"}),{hash:n[0].hash+"/"+ +new Date,name:t.i18n("items")+": "+i,mime:"group",size:K,ts:a,files:e.map(n,function(e){return e.hash}),getSize:!0}});return i||(i=1,n=[t.cwd()]),1===i?n[0]:a()}())},N=function(){p.window.hasClass(x)&&(D&&clearTimeout(D),D=null,$.stop(!0,!0).css("display","block"),L())},L=function(){H.data("tm")&&clearTimeout(H.data("tm")),H.removeData("tm"),H.hide()},W=e('
').on("click touchstart",function(e){return!j&&C(M),!1}),B=e('
').on("click touchstart",function(e){return!j&&C(U),!1}),$=e('
').append(W).append(q).append(B).append('
').append(e('
').on("click touchstart",function(e){return!j&&p.window.trigger("close"),!1})),V=e(' ').on("mousedown",function(e){e.stopPropagation(),p.window.trigger("close")}),X=e(' ').on("mousedown",function(e){e.stopPropagation(),p.docked()?p.window.trigger("navdockout"):p.window.trigger("navdockin")}),K=' '+u.i18n("calc"),G="",J=!0;this.evUpdate=y,(this.navbar=$)._show=N,this.resize="resize."+u.namespace,this.info=e("
").addClass(k).append(P).append(R),this.autoPlay=function(){return!!p.opened()&&!!p.options[p.docked()?"dockAutoplay":"autoplay"]},this.preview=e('
').on("change",function(){N(),$.attr("style",G),p.docked()&&$.hide(),p.preview.attr("style","").removeClass("elfinder-overflow-auto"),p.info.attr("style","").hide(),P.removeAttr("class").attr("style",""),R.html("")}).on(y,function(t){var n,i,a=p.fm,r=(p.preview,t.file),s='{value}
',c=function(){var c=p.window.css("overflow","hidden");i=a.escape(r.i18||r.name),!r.read&&t.stopImmediatePropagation(),p.window.data("hash",r.hash),p.preview.off("changesize").trigger("change").children().remove(),F.html(i),W.css("visibility",""),B.css("visibility",""),r.hash===a.cwdId2Hash(o.find("[id]:not(.elfinder-cwd-parent):first").attr("id"))&&W.css("visibility","hidden"),r.hash===a.cwdId2Hash(o.find("[id]:last").attr("id"))&&B.css("visibility","hidden"),"directory"===r.mime?d=[r.hash]:"group"===r.mime&&r.getSize&&(d=r.files),R.html(s.replace(/\{value\}/,i)+s.replace(/\{value\}/,a.mime2kind(r))+s.replace(/\{value\}/,d.length?K:a.formatSize(r.size))+s.replace(/\{value\}/,a.i18n("modify")+": "+a.formatDate(r))),d.length&&(l=a.getSize(d).done(function(e){R.find("span.elfinder-info-spinner").parent().html(e.formated)}).fail(function(){R.find("span.elfinder-info-spinner").parent().html(a.i18n("unknown"))}).always(function(){l=null}),l._hash=r.hash),P.addClass("elfinder-cwd-icon ui-corner-all "+a.mime2class(r.mime)),r.icon&&P.css(a.getIconStyle(r,!0)),p.info.attr("class",k),r.csscls&&p.info.addClass(r.csscls),r.read&&(n=a.tmb(r))&&e(" ").hide().appendTo(p.preview).on("load",function(){P.addClass(n.className).css("background-image","url('"+n.url+"')"),e(this).remove()}).attr("src",n.url),p.info.delay(100).fadeIn(10),p.window.hasClass(x)&&H.trigger("mousemove"),c.css("overflow","")},d=[];r&&!Object.keys(r).length&&(r=a.cwd()),r&&l&&"pending"===l.state()&&l._hash!==r.hash&&l.reject(),r&&(t.forceUpdate||p.window.data("hash")!==r.hash)?c():t.stopImmediatePropagation()}),this.window=e('
').hide().addClass(u.UA.Touch?"elfinder-touch":"").on("click",function(e){e.stopPropagation()}).append(e('
').append(F,e(' ').append(V,X)),this.preview,p.info.hide(),H.hide(),$).draggable({handle:"div.elfinder-quicklook-titlebar"}).on("open",function(t,n){var i=p.window,a=p.value,o=u.getUI("cwd"),s=function(e){b=e,p.update(1,p.value),p.change(),i.trigger("resize."+u.namespace)};J||b!==h?b===v&&(u.getUI("navdock").data("addNode")(c),s(g),p.preview.trigger("changesize"),u.storage("previewDocked","1")):(a&&a.hash!==r&&(o=e("#"+u.cwdHash2Id(a.hash.split("/",2)[0]))),G="",$.attr("style",""),b=f,o.trigger("scrolltoview"),L(),i.css(n||T(o)).show().animate(z(),550,function(){s(m),N()}))}).on("close",function(e,t){var n,i=p.window,a=p.preview.trigger("change"),r=(p.value,(i.data("hash")||"").split("/",2)[0]),s=function(e,n){b=e,n&&i.hide(),a.children().remove(),p.update(0,p.value),i.data("hash",""),t&&t.resolve()};p.opened()&&(l&&"pending"===l.state()&&l.reject(),p.docked()?(c=u.getUI("navdock").data("removeNode")(p.window.attr("id"),"detach"),s(v),u.storage("previewDocked","2")):(b=f,i.hasClass(x)&&q.click(),r&&(n=o.find("#"+r)).length?i.animate(T(n),500,function(){s(h,!0)}):s(h,!0)))}).on("navdockin",function(e,t){var n=p.window,a=u.getUI("navdock"),o=s||a.width(),r=t||{};J&&(r.init=!0),b=g,i=n.attr("style"),n.toggleClass("ui-front").removeClass("ui-widget").draggable("disable").resizable("disable").removeAttr("style").css({width:"100%",height:o,boxSizing:"border-box",paddingBottom:0,zIndex:"unset"}),$.hide(),X.toggleClass("ui-icon-plusthick ui-icon-minusthick elfinder-icon-full elfinder-icon-minimize"),a.data("addNode")(n,r),p.preview.trigger("changesize"),u.storage("previewDocked","1")}).on("navdockout",function(t){var n=p.window,a=u.getUI("navdock"),o=(e.Deferred(),T(p.preview));s=n.outerHeight(),a.data("removeNode")(n.attr("id"),u.getUI()),n.toggleClass("ui-front").addClass("ui-widget").draggable("enable").resizable("enable").attr("style",i),X.toggleClass("ui-icon-plusthick ui-icon-minusthick elfinder-icon-full elfinder-icon-minimize"),b=h,n.trigger("open",o),u.storage("previewDocked","0")}).on("resize."+u.namespace,function(){p.preview.trigger("changesize")}),this.alwaysEnabled=!0,this.value=null,this.handlers={select:function(e,t){d&&clearTimeout(d),e.data&&e.data.selected&&e.data.selected.length?p.opened()&&_():d=setTimeout(function(){p.opened()&&_()},0)},error:function(){p.window.is(":visible")&&p.window.trigger("close")},"searchshow searchhide":function(){this.opened()&&this.window.trigger("close")},navbarshow:function(){setTimeout(function(){p.docked()&&p.preview.trigger("changesize")},0)},destroy:function(){p.window.remove()}},this.shortcuts=[{pattern:"space"}],this.support={audio:{ogg:I('audio/ogg; codecs="vorbis"')||I('audio/ogg; codecs="flac"'),mp3:I("audio/mpeg;"),wav:I('audio/wav; codecs="1"'),m4a:I("audio/mp4;")||I("audio/x-m4a;")||I("audio/aac;"),flac:I("audio/flac;")},video:{ogg:I('video/ogg; codecs="theora"'),webm:I('video/webm; codecs="vp8, vorbis"')||I('video/webm; codecs="vp9"'),mp4:I('video/mp4; codecs="avc1.42E01E"')||I('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'),m3u8:I("application/x-mpegURL","video")||I("application/vnd.apple.mpegURL","video"),mpd:I("application/dash+xml","video")}},this.closed=function(){return b==h||b==v},this.opened=function(){return b==m||b==g},this.docked=function(){return b==g},this.init=function(){var i,l=this.options,c=this.window,d=this.preview;t=l.width>0?parseInt(l.width):450,n=l.height>0?parseInt(l.height):300,"auto"!==l.dockHeight&&(s=parseInt(l.dockHeight),s||(s=void 0)),u.one("load",function(){A=u.getUI("navdock").data("dockEnabled"),!A&&X.hide(),a=u.getUI(),o=u.getUI("cwd"),u.zIndex&&c.css("z-index",u.zIndex+1),c.appendTo(a),e(document).on("keydown."+u.namespace,function(t){t.keyCode==e.ui.keyCode.ESCAPE&&p.opened()&&!p.docked()&&c.trigger("close")}),c.resizable({handles:"se",minWidth:350,minHeight:120,resize:function(){d.trigger("changesize")}}),p.change(function(){p.opened()&&p.value&&(p.value.tmb&&1==p.value.tmb&&(p.value=Object.assign({},u.file(p.value.hash))),d.trigger(e.Event(y,{file:p.value})))}),d.on(y,function(e){var t,n,a;if(t=e.file){if(n=t.hash,a=u.searchStatus.mixed&&u.searchStatus.state>1,"directory"!==t.mime)if(parseInt(t.size)||t.mime.match(l.mimeRegexNotEmptyCheck)){if(p.dispInlineRegex=i,a||u.optionsByHashes[n])try{p.dispInlineRegex=new RegExp(u.option("dispInlineRegex",n),"i")}catch(e){try{p.dispInlineRegex=new RegExp(u.isRoot(t)?u.options.dispInlineRegex:u.option("dispInlineRegex",t.phash),"i")}catch(e){p.dispInlineRegex=/^$/}}}else e.stopImmediatePropagation();else p.dispInlineRegex=/^$/;p.info.show()}else e.stopImmediatePropagation()}),e.each(u.commands.quicklook.plugins||[],function(e,t){"function"==typeof t&&new t(p)})}).one("open",function(){var e,t=Number(u.storage("previewDocked")||l.docked);A&&t>=1&&(e=p.window,p.exec(),e.trigger("navdockin",{init:!0}),2===t?e.trigger("close"):(p.update(void 0,u.cwd()),p.change())),J=!1}).bind("open",function(){r=u.cwd().hash,p.value=u.cwd();try{i=new RegExp(u.option("dispInlineRegex"),"i")}catch(e){i=/^$/}}).bind("change",function(t){t.data&&t.data.changed&&p.opened()&&e.each(t.data.changed,function(){if(p.window.data("hash")===this.hash)return p.window.data("hash",null),p.preview.trigger(y),!1})}).bind("navdockresizestart navdockresizestop",function(e){H["navdockresizestart"===e.type?"show":"hide"]()})},this.getstate=function(){return p.opened()?1:0},this.exec=function(){return p.closed()&&_(),p.enabled()&&p.window.trigger(p.opened()?"close":"open"),e.Deferred().resolve()},this.hideinfo=function(){this.info.stop(!0,!0).hide()}}).prototype={forceLoad:!0},i.prototype.commands.quicklook.plugins=[function(t){var n,i,a=["image/jpeg","image/png","image/gif","image/svg+xml","image/x-ms-bmp"],o=t.preview;n=new Image,n.onload=n.onerror=function(){2==n.height&&a.push("image/webp")},n.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA",e.each(navigator.mimeTypes,function(t,n){var i=n.type;0===i.indexOf("image/")&&e.inArray(i,a)&&a.push(i)}),o.on(t.evUpdate,function(n){var r,s,l,c=t.fm,d=n.file,p=!1,u=null,h=function(e){var t=c.file(d.hash);t.width=e[0],t.height=e[1]},f=function(){var e,t,n,i,a;u&&u.state&&"pending"===u.state()&&u.reject(),p||(p=!0,e=s.get(0),t=d.width&&d.height?{w:d.width,h:d.height}:e.naturalWidth?null:{w:s.width(),h:s.height()},t&&s.removeAttr("width").removeAttr("height"),n=d.width||e.naturalWidth||e.width||s.width(),i=d.height||e.naturalHeight||e.height||s.height(),d.width&&d.height||h([n,i]),t&&s.width(t.w).height(t.h),a=(n/i).toFixed(2),o.on("changesize",function(){var e,t,n=parseInt(o.width()),i=parseInt(o.height());a<(n/i).toFixed(2)?(t=i,e=Math.floor(t*a)):(e=n,t=Math.floor(e/a)),s.width(e).height(t).css("margin-top",t '+c.i18n("nowLoading")+'').appendTo(t.info.find(".elfinder-quicklook-info")),r=c.openUrl(d.hash),s=e(" ").hide().appendTo(o).on("load",function(){m(),f()}).on("error",function(){l.remove()}).attr("src",r),d.width&&d.height?f():d.size>(t.options.getDimThreshold||0)&&(u=c.request({data:{cmd:"dim",target:d.hash},preventDefault:!0}).done(function(e){if(e.dim){var t=e.dim.split("x");d.width=t[0],d.height=t[1],h(t),f()}})))})},function(t){var n,i=t.fm,a=i.arrayFlip(["image/vnd.adobe.photoshop","image/x-photoshop"]),o=t.preview,r=function(e,a,r){try{i.replaceXhrSend(),n.fromURL(e).then(function(e){var n;a.attr("src",e.image.toBase64()),setTimeout(function(){n=(a.width()/a.height()).toFixed(2),o.on("changesize",function(){var e,t,i=parseInt(o.width()),r=parseInt(o.height());n<(i/r).toFixed(2)?(t=r,e=Math.floor(t*n)):(e=i,t=Math.floor(e/n)),a.width(e).height(t).css("margin-top",t '+i.i18n("nowLoading")+'').appendTo(t.info.find(".elfinder-quicklook-info")),l=i.openUrl(h.hash),i.isSameOrigin(l)||(l=i.openUrl(h.hash,!0)),c=e(" ").hide().appendTo(o),n?r(l,c,d):(p=window.define,u=window.require,window.require=null,window.define=null,i.loadScript([i.options.cdns.psd],function(){n=require("psd"),p?window.define=p:delete window.define,u?window.require=u:delete window.require,r(l,c,d)})))})},function(t){var n=t.fm,i=n.arrayFlip(["text/html","application/xhtml+xml"]),a=t.preview;a.on(t.evUpdate,function(o){var r,s,l=o.file;i[l.mime]&&t.dispInlineRegex.test(l.mime)&&(!t.options.getSizeMax||l.size<=t.options.getSizeMax)&&(o.stopImmediatePropagation(),s=e(' '+n.i18n("nowLoading")+'
').appendTo(t.info.find(".elfinder-quicklook-info")),a.one("change",function(){"pending"==r.state()&&r.reject()}).addClass("elfinder-overflow-auto"),r=n.request({data:{cmd:"get",target:l.hash,conv:1,_t:l.ts},options:{type:"get",cache:!0},preventDefault:!0}).done(function(n){t.hideinfo();var i=e('').appendTo(a)[0].contentWindow.document;i.open(),i.write(n.content),i.close()}).always(function(){s.remove()}))})},function(t){var n=t.fm,i=n.arrayFlip(["text/x-markdown"]),a=t.preview,o=null,r=function(n,i){t.hideinfo();var r=e('').appendTo(a)[0].contentWindow.document;r.open(),r.write(o(n.content)),r.close(),i.remove()},s=function(e){o=!1,e.remove()};a.on(t.evUpdate,function(l){var c,d,p=l.file;i[p.mime]&&n.options.cdns.marked&&o!==!1&&t.dispInlineRegex.test(p.mime)&&(!t.options.getSizeMax||p.size<=t.options.getSizeMax)&&(l.stopImmediatePropagation(),d=e(' '+n.i18n("nowLoading")+'
').appendTo(t.info.find(".elfinder-quicklook-info")),a.one("change",function(){"pending"==c.state()&&c.reject()}).addClass("elfinder-overflow-auto"),c=n.request({data:{cmd:"get",target:p.hash,conv:1,_t:p.ts},options:{type:"get",cache:!0},preventDefault:!0}).done(function(e){o||window.marked?(o||(o=window.marked),r(e,d)):n.loadScript([n.options.cdns.marked],function(t){o=t||window.marked||!1,delete window.marked,o?r(e,d):s(d)},{tryRequire:!0,error:function(){s(d)}})}).fail(function(){s(d)}))})},function(t){var n=t.fm,i=t.preview,a=parseInt(t.options.textMaxlen)||2e3,o=function(){n.options.cdns.prettify?(n.loadScript([n.options.cdns.prettify+(n.options.cdns.prettify.match(/\?/)?"&":"?")+"autorun=false"]),o=function(){return!0}):o=function(){return!1}},r=function(e,t){o()&&("undefined"==typeof window.PR&&t--?setTimeout(function(){r(e,t)},100):"object"==typeof window.PR?(e.css("cursor","wait"),setTimeout(function(){PR.prettyPrint&&PR.prettyPrint(null,e.get(0)),e.css("cursor","")},0)):o=function(){return!1})};i.on(t.evUpdate,function(s){var l,c,d=s.file;d.mime;n.mimeIsText(d.mime)&&(!t.options.getSizeMax||d.size<=t.options.getSizeMax)&&(s.stopImmediatePropagation(),"undefined"==typeof window.PR&&o(),c=e(' '+n.i18n("nowLoading")+'
').appendTo(t.info.find(".elfinder-quicklook-info")),i.one("change",function(){"pending"==l.state()&&l.reject()}),l=n.request({data:{cmd:"get",target:d.hash,conv:1,_t:d.ts},options:{type:"get",cache:!0},preventDefault:!0}).done(function(o){var s,l,c,p,u=new RegExp("^(data:"+d.mime.replace(/([.+])/g,"\\$1")+";base64,)","i"),h=o.content;t.hideinfo(),window.atob&&(p=h.match(u))&&(h=atob(h.substr(p[1].length))),l=h.length-a,l>100?s=h.substr(0,a)+"...":l=0,c=e(''),l&&c.append(e('
'+n.i18n("charsLeft",n.toLocaleString(l))+"
").on("click",function(){var t=c.scrollTop();e(this).remove(),c.children("pre").removeClass("prettyprinted").text(h).scrollTop(t),r(c,100)})),c.children("pre").text(s||h),c.on("touchstart",function(t){e(this)["scroll"+("ltr"===n.direction?"Right":"Left")]()>5&&(t.originalEvent._preventSwipeX=!0)}).appendTo(i),r(c,100)}).always(function(){c.remove()}))})},function(t){var n=t.fm,i="application/pdf",a=t.preview,o=!1;n.UA.Safari&&"mac"===n.OS&&!n.UA.iOS||n.UA.IE?o=!0:e.each(navigator.plugins,function(t,n){e.each(n,function(e,t){if(t.type===i)return!(o=!0)})}),o&&a.on(t.evUpdate,function(o){var r,s=o.file;s.mime===i&&t.dispInlineRegex.test(s.mime)&&(o.stopImmediatePropagation(),t.hideinfo(),r=e(' ').appendTo(a))})},function(t){var n=t.fm,i="application/x-shockwave-flash",a=t.preview,o=!1;e.each(navigator.plugins,function(t,n){e.each(n,function(e,t){if(t.type===i)return!(o=!0)})}),o&&a.on(t.evUpdate,function(o){var r,s=o.file;s.mime===i&&t.dispInlineRegex.test(s.mime)&&(o.stopImmediatePropagation(),t.hideinfo(),r=e(' ').appendTo(a))})},function(t){var n,i=t.preview,a={"audio/mpeg":"mp3","audio/mpeg3":"mp3","audio/mp3":"mp3","audio/x-mpeg3":"mp3","audio/x-mp3":"mp3","audio/x-wav":"wav","audio/wav":"wav","audio/x-m4a":"m4a","audio/aac":"m4a","audio/mp4":"m4a","audio/x-mp4":"m4a","audio/ogg":"ogg","audio/flac":"flac","audio/x-flac":"flac"},o=t.window,r=t.navbar;i.on(t.evUpdate,function(s){var l=s.file,c=a[l.mime],d=t.autoPlay(),p=function(){r.css("bottom",o.hasClass("elfinder-quicklook-fullscreen")?"50px":"")};t.dispInlineRegex.test(l.mime)&&t.support.audio[c]&&(s.stopImmediatePropagation(),n=e(' ').on("change",function(e){e.stopPropagation()}).appendTo(i),d&&n[0].play(),o.on("viewchange.audio",p),p())}).on("change",function(){if(n&&n.parent().length){var e=n[0];o.off("viewchange.audio");try{e.pause(),e.src="",e.load()}catch(t){}n.remove(),n=null}})},function(t){var n,i,a,o=t.fm,r=t.preview,s={"video/mp4":"mp4","video/x-m4v":"mp4","video/quicktime":"mp4","video/ogg":"ogg","application/ogg":"ogg","video/webm":"webm","application/vnd.apple.mpegurl":"m3u8","application/x-mpegurl":"m3u8","application/dash+xml":"mpd"},l=t.window,c=t.navbar;r.on(t.evUpdate,function(d){var p=d.file,u=t.autoPlay(),h=s[p.mime.toLowerCase()],f=function(){o.UA.iOS?l.hasClass("elfinder-quicklook-fullscreen")?(r.css("height","-webkit-calc(100% - 50px)"),c._show()):r.css("height",""):c.css("bottom",l.hasClass("elfinder-quicklook-fullscreen")?"50px":"")},m=function(i){i=i||{},t.hideinfo(),n=e(' ').on("change",function(e){e.stopPropagation()}),i.src&&n.append(' '),n.appendTo(r),l.on("viewchange.video",f),f()},g=function(){var e;m(),e=new i,e.loadSource(o.openUrl(p.hash)),e.attachMedia(n[0]),u&&e.on(i.Events.MANIFEST_PARSED,function(){n[0].play()})},v=function(){var e;m(),e=a.MediaPlayer().create(),e.initialize(n[0],o.openUrl(p.hash),u)};!t.dispInlineRegex.test(p.mime)||("m3u8"!==h&&"mpd"!==h||o.UA.ltIE10)&&!t.support.video[h]||(t.support.video[h]&&("m3u8"!==h||o.UA.Safari)?(d.stopImmediatePropagation(),m({src:o.openUrl(p.hash)}),u&&n[0].play()):o.options.cdns.hls&&"m3u8"===h?(d.stopImmediatePropagation(),i?g():o.loadScript([o.options.cdns.hls],function(e){i=e||window.Hls,g()},{tryRequire:!0})):o.options.cdns.dash&&"mpd"===h&&(d.stopImmediatePropagation(),a?v():o.loadScript([o.options.cdns.dash],function(){a=window.dashjs,v()},{tryRequire:!0})))}).on("change",function(){if(n&&n.parent().length){var e=n[0];l.off("viewchange.video");try{e.pause(),e.src="",e.load()}catch(t){}n.remove(),n=null}})},function(t){var n,i=t.preview,a=[],o=t.window,r=t.navbar;e.each(navigator.plugins,function(t,n){e.each(n,function(e,t){(0===t.type.indexOf("audio/")||0===t.type.indexOf("video/"))&&a.push(t.type)})}),a=t.fm.arrayFlip(a),i.on(t.evUpdate,function(s){var l,c=s.file,d=c.mime,p=function(){r.css("bottom",o.hasClass("elfinder-quicklook-fullscreen")?"50px":"")};a[c.mime]&&t.dispInlineRegex.test(c.mime)&&(s.stopImmediatePropagation(),(l=0===d.indexOf("video/"))&&t.hideinfo(),n=e(' ').appendTo(i),o.on("viewchange.embed",p),p())}).on("change",function(){n&&n.parent().length&&(o.off("viewchange.embed"),n.remove(),n=null)})},function(t){var n,i=t.fm,a=i.arrayFlip(["application/zip","application/x-gzip","application/x-tar"]),o=t.preview,r=function(){var e,t,n,a=[];for(this.Y(),n=this.i,e=0,t=n.length;e"+i.escape(c.mime)+" ("+i.formatSize(c.size)+") ",r=e(''+a+'
'+i.escape(n.join("\n"))+" ").on("touchstart",function(t){e(this)["scroll"+("ltr"===i.direction?"Right":"Left")]()>5&&(t.originalEvent._preventSwipeX=!0)}).appendTo(o),t.hideinfo())};l.stopImmediatePropagation(),u=e(' '+i.i18n("nowLoading")+'
').appendTo(t.info.find(".elfinder-quicklook-info")),o.one("change",function(){"pending"===p.state()&&p.reject(),u.remove()}),n?m():(window.Zlib&&(f=window.Zlib,delete window.Zlib),i.loadScript([i.options.cdns.zlibUnzip,i.options.cdns.zlibGunzip],function(){window.Zlib&&(n=window.Zlib)?(f?window.Zlib=f:delete window.Zlib,m()):error()}))}})},function(t){var n,i=t.fm,a=i.arrayFlip(["application/x-rar"]),o=t.preview;window.DataView&&o.on(t.evUpdate,function(r){var s=r.file;if(a[s.mime]&&i.options.cdns.rar&&n!==!1){var l,c,d,p,u,h=function(a){if(p)return void l.remove();try{d=n({file:a,type:2,xhrHeaders:i.customHeaders,xhrFields:i.xhrFields},function(n){l.remove();var a,r,c=[];return p||n?void(n&&i.debug("error",n)):(e.each(d.entries,function(){c.push(this.path+(this.size?" ("+i.formatSize(this.size)+")":""))}),void(c.length&&(c=e.map(c,function(e){return i.decodeRawString(e)}),c.sort(),a=""+i.escape(s.mime)+" ("+i.formatSize(s.size)+") ",r=e(''+a+'
'+i.escape(c.join("\n"))+" ").on("touchstart",function(t){e(this)["scroll"+("ltr"===i.direction?"Right":"Left")]()>5&&(t.originalEvent._preventSwipeX=!0)}).appendTo(o),t.hideinfo())))})}catch(r){l.remove()}},f=function(){n=!1,l.remove()};r.stopImmediatePropagation(),l=e(' '+i.i18n("nowLoading")+'
').appendTo(t.info.find(".elfinder-quicklook-info")),o.one("change",function(){d&&(d.abort=!0),l.remove(),p=!0}),c=i.openUrl(s.hash),i.isSameOrigin(c)||(c=i.openUrl(s.hash,!0)),n?h(c):(window.RarArchive&&(u=window.RarArchive,delete window.RarArchive),i.loadScript([i.options.cdns.rar],function(){i.hasRequire?require(["rar"],function(e){n=e,h(c)},f):(n=window.RarArchive)?(u?window.RarArchive=u:delete window.RarArchive,h(c)):f()},{tryRequire:!0,error:f}))}})},function(t){var n,i=t.fm,a=i.arrayFlip(t.options.googleDocsMimes||[]),o=t.preview,r=(t.window,t.navbar);o.on(t.evUpdate,function(s){var l=s.file;if(a[l.mime]){var c,d=t.window,p=function(){r.css("bottom",d.hasClass("elfinder-quicklook-fullscreen")?"56px":"")};"1"==l.url&&(o.hide(),e(''+i.i18n("getLink")+"
").appendTo(t.info.find(".elfinder-quicklook-info")).on("click",function(){var n=e(this);n.html(''),i.request({data:{cmd:"url",target:l.hash},preventDefault:!0}).always(function(){n.html("")}).done(function(e){var n=i.file(l.hash);l.url=n.url=e.url||"",l.url&&o.trigger({type:t.evUpdate,file:l,forceUpdate:!0})})})),""!==l.url&&"1"!=l.url&&(s.stopImmediatePropagation(),o.one("change",function(){d.off("viewchange.googledocs"),c.remove(),n.off("load").remove(),n=null}).addClass("elfinder-overflow-auto"),c=e(' '+i.i18n("nowLoading")+'
').appendTo(t.info.find(".elfinder-quicklook-info")),n=e('').css("background-color","transparent").appendTo(o).on("load",function(){t.hideinfo(),c.remove(),t.preview.after(t.info),e(this).css("background-color","#fff").show()}).on("error",function(){c.remove(),t.preview.after(t.info)}).attr("src","//docs.google.com/gview?embedded=true&url="+encodeURIComponent(i.convAbsUrl(i.url(l.hash)))),d.on("viewchange.googledocs",p),p(),t.info.after(t.preview))}})}],(i.prototype.commands.reload=function(){var t=this,n=!1;this.alwaysEnabled=!0,this.updateOnSelect=!0,this.shortcuts=[{pattern:"ctrl+shift+r f5"}],this.getstate=function(){return 0},this.init=function(){this.fm.bind("search searchend",function(){n="search"==this.type})},this.fm.bind("contextmenu",function(){var n=t.fm;n.options.sync>=1e3&&(t.extra={icon:"accept",node:e(" ").attr({title:n.i18n("autoSync")}).on("click touchstart",function(t){"touchstart"===t.type&&t.originalEvent.touches.length>1||(t.stopPropagation(),t.preventDefault(),e(this).parent().toggleClass("ui-state-disabled",n.options.syncStart).parent().removeClass("ui-state-hover"),n.options.syncStart=!n.options.syncStart,n.autoSync(n.options.syncStart?null:"stop"))}).on("ready",function(){e(this).parent().toggleClass("ui-state-disabled",!n.options.syncStart).css("pointer-events","auto")})})}),this.exec=function(){var t=this.fm;if(!n){var i=t.sync(),a=setTimeout(function(){t.notify({type:"reload",cnt:1,hideCnt:!0}),i.always(function(){t.notify({type:"reload",cnt:-1})})},t.notifyDelay);return i.always(function(){clearTimeout(a),t.trigger("reload")})}e("div.elfinder-toolbar > div."+t.res("class","searchbtn")+" > span.ui-icon-search").click()}}).prototype={forceLoad:!0},i.prototype.commands.rename=function(){this.alwaysEnabled=!0;var t=this,n=t.fm,i=function(e,t,i,a){var o,r=t?t.length:0,s=t?[i.hash].concat(t):[i.hash],l={};if(n.lockfiles({files:s}),n.isRoot(i)){if((o=n.storage("rootNames"))||(o={}),""===a){if(!o[i.hash])return e&&e.reject(),void n.unlockfiles({files:s}).trigger("selectfiles",{files:s});i.name=i._name,i.i18=i._i18,delete o[i.hash],delete i._name,delete i._i18}else"undefined"==typeof i._name&&(i._name=i.name,i._i18=i.i18),i.name=o[i.hash]=a,delete i.i18;return n.storage("rootNames",o),l={changed:[i]},n.updateCache(l),n.change(l),e&&e.resolve(l),void n.unlockfiles({files:s}).trigger("selectfiles",{files:s})}l={cmd:"rename",name:a,target:i.hash},r>0&&(l.targets=t,a.match(/\*/)&&(l.q=a)),n.request({data:l,notify:{type:"rename",cnt:r},navigate:{}}).fail(function(t){e&&e.reject(),t&&Array.isArray(t)&&"errRename"===t[0]||n.sync()}).done(function(t){t.added&&t.added.length&&1===r&&(t.undo={cmd:"rename",callback:function(){return n.request({data:{cmd:"rename",target:t.added[0].hash,name:i.name},notify:{type:"undo",cnt:1}})}},t.redo={cmd:"rename",callback:function(){return n.request({data:{cmd:"rename",target:i.hash,name:a},notify:{type:"rename",cnt:1}})}}),e&&e.resolve(t),n.cwd().hash===i.hash&&n.exec("open",t.added[0].hash)}).always(function(){n.unlockfiles({files:s}).trigger("selectfiles",{files:s})})},a=function(e,t){var i,a,o,r=t||n.selected(),s=n.splitFileExtention(e),l=n.file(r[0]),c=n.file(r[1]);return i=s[1]?"."+s[1]:"",s[1]&&"*"===s[0]?(a='"'+n.splitFileExtention(l.name)[0]+i+'", ',a+='"'+n.splitFileExtention(c.name)[0]+i+'"'):s[0].length>1&&("*"===s[0].substr(-1)?(o=s[0].substr(0,s[0].length-1),a='"'+o+l.name+'", ',a+='"'+o+c.name+'"'):"*"===s[0].substr(0,1)&&(o=s[0].substr(1),a='"'+n.splitFileExtention(l.name)[0]+o+i+'", ',a+='"'+n.splitFileExtention(c.name)[0]+o+i+'"')),a||(a='"'+s[0]+"1"+i+'", "'+s[0]+"2"+i+'"'),r.length>2&&(a+=" ..."),a},o=function(){var t,o=n.selected(),r=' ',s=function(t,i){return e(''+n.i18n(i)+" ").prepend(t)},l=e(' '),c=e(r),d=e(r),p=e(r),u=e(r),h=e("
").append(s(c,"plusNumber"),s(d,"asPrefix"),s(p,"asSuffix"),s(u,"changeExtention")),f=e('
'),m=e('
').append(e('
').append(l),e('
').append(h),f),g={title:n.i18n("batchRename"),modal:!0,destroyOnClose:!0,width:Math.min(380,n.getUI().width()-20),buttons:{},open:function(){l.on("input",b).trigger("focus")}},v=function(){var e=l.val(),t=n.splitFileExtention(n.file(o[0]).name)[1];return(""!==e||c.is(":checked"))&&(d.is(":checked")?e+="*":p.is(":checked")?e="*"+e+"."+t:u.is(":checked")?e="*."+e:t&&(e+="."+t)),e},b=function(){var e=v();""!==e?f.html(n.i18n(["renameMultiple",o.length,a(e)])):f.empty()},y=h.find("input:radio").on("change",b);g.buttons[n.i18n("btnApply")]=function(){var e,a,r=v();""!==r&&(t.elfinderdialog("close"),a=o,e=n.file(a.shift()),i(void 0,a,e,r))},g.buttons[n.i18n("btnCancel")]=function(){t.elfinderdialog("close")},e.fn.checkboxradio?y.checkboxradio({create:function(e,t){this===c.get(0)&&c.prop("checked",!0).change()}}):h.buttonset({create:function(e,t){c.prop("checked",!0).change()}}),t=n.dialog(m,g)};this.noChangeDirOnRemovedCwd=!0,this.shortcuts=[{pattern:"f2"+("mac"==n.OS?" enter":"")},{pattern:"shift+f2",description:"batchRename",callback:function(){n.selected().length>1&&o()}}],this.getstate=function(i){var a,r,s,l,c,d,p=this.files(i),u=p.length;return u?(u>1&&p[0].phash&&(a=p[0].phash,r=n.splitFileExtention(p[0].name)[1].toLowerCase(),s=p[0].mime),1===u&&(d=n.isRoot(p[0])),c=1===u&&(d||!p[0].locked)||n.api>2.103&&u===e.grep(p,function(e){return!(l||e.locked||e.phash!==a||n.isRoot(e)||s!==e.mime&&r!==n.splitFileExtention(e.name)[1].toLowerCase())||(l&&(l=!0),!1)}).length?0:-1,!d&&0===c&&n.option("disabledFlip",p[0].hash).rename&&(c=-1),c!==-1&&u>1?t.extra={icon:"preference",node:e(" ").attr({title:n.i18n("batchRename")}).on("click touchstart",function(e){"touchstart"===e.type&&e.originalEvent.touches.length>1||(e.stopPropagation(),e.preventDefault(),n.getUI().trigger("click"),o())})}:delete t.extra,c):-1},this.exec=function(t,o){var r,s=(n.getUI("cwd"),t||!!n.selected().length&&n.selected()||[n.cwd().hash]),l=s.length,c=n.file(s.shift()),d=".elfinder-cwd-filename",p=o||{},u=n.cwd().hash==c.hash,h="navbar"===p._currentType||"files"===p._currentType?p._currentType:u?"navbar":"files",f="files"!==h,m=e("#"+n[f?"navHash2Id":"cwdHash2Id"](c.hash)),g=!f&&"list"!=n.storage("view"),v=function(){setTimeout(function(){x&&x.trigger("blur")},50)},b=function(){z.is(":hidden")||z.elfinderoverlay("hide").off("click",I),T.removeClass("ui-front").css("position","").off("unselect."+n.namespace,v),g?C&&C.css("max-height",""):f||T.css("width","").parent("td").css("overflow","")},y=e.Deferred().fail(function(e){var t=x.parent(),i=n.escape(c.i18||c.name);x.off(),g&&(i=i.replace(/([_.])/g,"$1")),setTimeout(function(){f?x.replaceWith(i):t.length?(x.remove(),t.html(i)):m.find(d).html(i)},0),e&&n.error(e)}).always(function(){b(),n.unbind("resize",S),n.enable()}),w=function(t){var o=e.trim(x.val()),r=(n.splitFileExtention(o),!0),d=function(){x.off(),b(),f?x.replaceWith(n.escape(o)):C.html(n.escape(o)),i(y,s,c,o)};if(z.is(":hidden")||T.css("z-index",""),""===o){if(!n.isRoot(c))return I();f?x.replaceWith(n.escape(c.name)):C.html(n.escape(c.name))}if(!A&&T.length){if(x.off("blur"),1===l&&o===c.name)return y.reject();if(n.options.validName&&n.options.validName.test)try{r=n.options.validName.test(o)}catch(t){r=!1}if("."===o||".."===o||!r)return A=!0,n.error("directory"===c.mime?"errInvDirname":"errInvName",{modal:!0,close:function(){setTimeout(k,120)}}),!1;if(1===l&&n.fileByName(o,c.phash))return A=!0,n.error(["errExists",o],{modal:!0,close:function(){setTimeout(k,120)}}),!1;1===l?d():(n.confirm({title:"cmdrename",text:["renameMultiple",l,a(o,[c.hash].concat(s))],accept:{label:"btnYes",callback:d},cancel:{label:"btnCancel",callback:function(){setTimeout(function(){A=!0,k()},120)}}}),setTimeout(function(){n.trigger("unselectfiles",{files:n.selected()}).trigger("selectfiles",{files:[c.hash].concat(s)})},120))}},x=e(g?"":' ').on("keyup text",function(){g?(this.style.height="1px",this.style.height=this.scrollHeight+"px"):r&&(this.style.width=r+"px",this.scrollWidth>r&&(this.style.width=this.scrollWidth+10+"px"))}).on("keydown",function(t){t.stopImmediatePropagation(),t.keyCode==e.ui.keyCode.ESCAPE?y.reject():t.keyCode==e.ui.keyCode.ENTER&&(t.preventDefault(),x.trigger("blur"))}).on("mousedown click dblclick",function(e){e.stopPropagation(),"dblclick"===e.type&&e.preventDefault()}).on("blur",w),k=function(){var e=n.splitFileExtention(x.val())[0];A||!n.UA.Mobile||n.UA.iOS||(z.on("click",I).elfinderoverlay("show"),T.css("z-index",z.css("z-index")+1)),!n.enabled()&&n.enable(),A&&(A=!1,x.on("blur",w)),x.trigger("focus").trigger("select"),x[0].setSelectionRange&&x[0].setSelectionRange(0,e.length)},C=f?m.contents().filter(function(){return 3==this.nodeType&&e(this).parent().attr("id")===n.navHash2Id(c.hash)}):m.find(d),T=C.parent(),z=n.getUI("overlay"),I=function(e){z.is(":hidden")||T.css("z-index",""),A||(y.reject(),e&&(e.stopPropagation(),e.preventDefault()))},S=function(){m.trigger("scrolltoview",{blink:!1})},A=!1;return n.UA.iOS&&x.css("font-size","16px"),T.addClass("ui-front").css("position","relative").on("unselect."+n.namespace,v),n.bind("resize",S),f?C.replaceWith(x.val(c.name)):(g?C.css("max-height","none"):f||(r=T.width(),T.width(r-15).parent("td").css("overflow","visible")),C.empty().append(x.val(c.name))),l>1&&n.api<=2.103?y.reject():c&&C.length?c.locked&&!n.isRoot(c)?y.reject(["errLocked",c.name]):(n.one("select",function(){x.parent().length&&c&&e.inArray(c.hash,n.selected())===-1&&x.trigger("blur")}),x.trigger("keyup"),k(),y):y.reject("errCmdParams",this.title)},n.remove(function(t){var i;t.data&&t.data.removed&&(i=n.storage("rootNames"))&&(e.each(t.data.removed,function(e,t){i[t]&&delete i[t]}),n.storage("rootNames",i))})},i.prototype.commands.resize=function(){"use strict";var t=0,n=function(t,n,i){var a=[{x:t/2,y:n/2},{x:-t/2,y:n/2},{x:-t/2,y:-n/2},{x:t/2,y:-n/2}],o=[],r={x:Number.MAX_VALUE,y:Number.MAX_VALUE},s={x:Number.MIN_VALUE,y:Number.MIN_VALUE};return e.each(a,function(e,t){o.push({x:t.x*Math.cos(i)-t.y*Math.sin(i),y:t.x*Math.sin(i)+t.y*Math.cos(i)})}),e.each(o,function(e,t){r.x=Math.min(r.x,t.x),r.y=Math.min(r.y,t.y),s.x=Math.max(s.x,t.x),s.y=Math.max(s.y,t.y)}),{width:s.x-r.x,height:s.y-r.y}};this.updateOnSelect=!1,this.getstate=function(){var e=this.fm.selectedFiles();return 1==e.length&&e[0].read&&e[0].write&&e[0].mime.indexOf("image/")!==-1?0:-1},this.resizeRequest=function(t,n,i){var a=this.fm,o=n||a.file(t.target),r=(o?o.tmb:null,a.isCommandEnabled("resize",t.target));if(r&&(!o||o&&o.read&&o.write&&o.mime.indexOf("image/")!==-1))return a.request({data:Object.assign(t,{cmd:"resize"}),notify:{type:"resize",cnt:1}}).fail(function(e){i&&i.reject(e)}).done(function(){t.quality&&a.storage("jpgQuality",t.quality===a.option("jpgQuality")?null:t.quality),i&&i.resolve()});var s;return s=o?o.mime.indexOf("image/")===-1?["errResize",o.name,"errUsupportType"]:["errResize",o.name,"errPerm"]:["errResize",t.target,"errPerm"],i?i.reject(s):a.error(s),e.Deferred().reject(s)},this.exec=function(i){var a,o,r=this,s=this.fm,l=this.files(i),c=e.Deferred(),d=s.api>1,p=this.options,u=650,h=s.getUI(),f=e().controlgroup?"controlgroup":"buttonset",m="undefined"==typeof p.grid8px||"disable"!==p.grid8px,g=Array.isArray(p.presetSize)?p.presetSize:[],v="elfinder-dialog-resize",b="elfinder-dialog-active",y=s.res("class","editing"),w=function(i,a){var o,l,w,x,k,C="image/jpeg"===i.mime,T=e('
'),z=' ',I='
',S='
',A=null,O=!1,j=function(){O=!0},D=function(){O&&(O=!1,M.trigger("change"))},M=e('
').on("focus","input[type=text],input[type=number]",function(){e(this).trigger("select")}).on("change",function(){A&&clearTimeout(A),A=setTimeout(function(){var e,t,i,a,o,r,l,c,d,p,u,h;it&&!O&&(i=it.data("canvas"))&&(e=M.children("div.elfinder-resize-control-panel:visible"),t=e.find("input.elfinder-resize-quality"),t.is(":visible")&&(a=it.data("ctx"),o=it.get(0),e.hasClass("elfinder-resize-uiresize")?(c=i.width=V.val(),d=i.height=X.val(),a.drawImage(o,0,0,c,d)):e.hasClass("elfinder-resize-uicrop")?(r=K.val(),l=G.val(),c=J.val(),d=Y.val(),i.width=c,i.height=d,a.drawImage(o,r,l,c,d,0,0,c,d)):(p=Z.val(),u=Z.val()*Math.PI/180,h=n(ue,he,u),c=i.width=h.width,d=i.height=h.height,a.save(),p%90!==0&&(a.fillStyle=le.val()||"#FFF",a.fillRect(0,0,c,d)),a.translate(c/2,d/2),a.rotate(u),a.drawImage(o,-o.width/2,-o.height/2,ue,he),a.restore()),i.toBlob(function(e){e&&t.next("span").text(" ("+s.formatSize(e.size)+")")},"image/jpeg",Math.max(Math.min(t.val(),100),1)/100)))},60)}).on("mouseup","input",function(t){e(t.target).trigger("change")}),U=e('
').on("touchmove",function(t){e(t.target).hasClass("touch-punch")&&(t.stopPropagation(),t.preventDefault())}),E=e(''+s.i18n("ntfloadimg")+"
"),F=e('
'),P=e('
'),R=e('
'),H=e('
'),q=e('
'),_=e(" ").attr("title",s.i18n("rotate-cw")).append(e(' ')),N=e(" ").attr("title",s.i18n("rotate-ccw")).append(e(' ')),L=e(" "),W=e('').text(s.i18n("reset")).on("click",function(){Ne()}).button({icons:{primary:"ui-icon-arrowrefresh-1-n"},text:!1}),B=e('
').append(''+s.i18n("resize")+" ",''+s.i18n("crop")+" ",''+s.i18n("rotate")+" "),$="resize",V=(B[f]()[f]("disable").find("input").on("change",function(){$=e(this).val(),Ne(),$e(!0),Ve(!0),Xe(!0),"resize"==$?(R.show(),q.hide(),H.hide(),$e(),C&&Te.insertAfter(R.find(".elfinder-resize-grid8"))):"crop"==$?(q.hide(),R.hide(),H.show(),Ve(),C&&Te.insertAfter(H.find(".elfinder-resize-grid8"))):"rotate"==$&&(R.hide(),H.hide(),q.show(),Xe())}),e(z).on("change",function(){var e=_e(parseInt(V.val())),t=_e(fe?e/de:parseInt(X.val()));e>0&&t>0&&(Le.updateView(e,t),V.val(e),X.val(t))})),X=e(z).on("change",function(){var e=_e(parseInt(X.val())),t=_e(fe?e*de:parseInt(V.val()));t>0&&e>0&&(Le.updateView(t,e),V.val(t),X.val(e))}),K=e(z).on("change",function(){We.updateView()}),G=e(z).on("change",function(){We.updateView()}),J=e(z).on("change",function(){We.updateView("w")}),Y=e(z).on("change",function(){We.updateView("h")}),Q=C&&d?e(z).val(s.storage("jpgQuality")>0?s.storage("jpgQuality"):s.option("jpgQuality")).addClass("elfinder-resize-quality").attr("min","1").attr("max","100").attr("title","1 - 100").on("blur",function(){var e=Math.min(100,Math.max(1,parseInt(this.value)));M.find("input.elfinder-resize-quality").val(e)}):null,Z=e(' ').on("change",function(){Be.update()}),ee=e('
').slider({min:0,max:360,value:Z.val(),animate:!0,start:j,stop:D,change:function(e,t){t.value!=ee.slider("value")&&Be.update(t.value)},slide:function(e,t){Be.update(t.value,!1)}}).find(".ui-slider-handle").addClass("elfinder-tabstop").off("keydown").on("keydown",function(t){t.keyCode!=e.ui.keyCode.LEFT&&t.keyCode!=e.ui.keyCode.RIGHT||(t.stopPropagation(),t.preventDefault(),Be.update(Number(Z.val())+(t.keyCode==e.ui.keyCode.RIGHT?1:-1),!1))}).end(),te={},ne=function(e){var t,n,i,a,o,r,s;try{t=te[Math.round(e.offsetX)][Math.round(e.offsetY)]}catch(e){}t&&(n=t[0],i=t[1],a=t[2],o=t[3],r=t[4],s=t[5],ae(n,i,a,"click"===e.type))},ie=function(t){ae(e(this).css("backgroundColor"),"","","click"===t.type)},ae=function(t,n,i,a){var o,r,s;"string"==typeof t&&(n="",t&&(o=e("").css("backgroundColor",t).css("backgroundColor"))&&(r=o.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i))&&(t=Number(r[1]),
n=Number(r[2]),i=Number(r[3]))),s=""===n?t:"#"+oe(t,n,i),le.val(s).css({backgroundColor:s,backgroundImage:"none",color:t+n+i<384?"#fff":"#000"}),U.css("backgroundColor",s),a&&(qe.off(".picker").removeClass("elfinder-resize-picking"),ce.off(".picker").removeClass("elfinder-resize-picking"))},oe=function(t,n,i){return e.map([t,n,i],function(e){return("0"+parseInt(e).toString(16)).slice(-2)}).join("")},re=e("").text(s.i18n("colorPicker")).on("click",function(){qe.on("mousemove.picker click.picker",ne).addClass("elfinder-resize-picking"),ce.on("mousemove.picker click.picker","span",ie).addClass("elfinder-resize-picking")}).button({icons:{primary:"ui-icon-pin-s"},text:!1}),se=e("").text(s.i18n("reset")).on("click",function(){ae("","","",!0)}).button({icons:{primary:"ui-icon-arrowrefresh-1-n"},text:!1}),le=e(' ').on("focus",function(){e(this).attr("style","")}).on("blur",function(){ae(e(this).val())}),ce=e('').on("click","span",function(){ae(e(this).css("backgroundColor"))}),de=1,pe=1,ue=0,he=0,fe=!0,me=!1,ge=0,ve=0,be=0,ye=0,we=0,xe=!!C&&m,ke=e("
").html(s.i18n("aspectRatio")).on("click",function(){fe=!fe,ke.button("option",{icons:{primary:fe?"ui-icon-locked":"ui-icon-unlocked"}}),Le.fixHeight(),F.resizable("option","aspectRatio",fe).data("uiResizable")._aspectRatio=fe}).button({icons:{primary:fe?"ui-icon-locked":"ui-icon-unlocked"},text:!1}),Ce=e("").html(s.i18n("aspectRatio")).on("click",function(){me=!me,Ce.button("option",{icons:{primary:me?"ui-icon-locked":"ui-icon-unlocked"}}),P.resizable("option","aspectRatio",me).data("uiResizable")._aspectRatio=me}).button({icons:{primary:me?"ui-icon-locked":"ui-icon-unlocked"},text:!1}),Te=e("").html(s.i18n(xe?"enabled":"disabled")).toggleClass("ui-state-active",xe).on("click",function(){xe=!xe,Te.html(s.i18n(xe?"enabled":"disabled")).toggleClass("ui-state-active",xe),ze()}).button(),ze=function(){var t=xe?8:1;e.each([V,X,J,Y,K,G],function(){this.attr("step",t)}),xe&&(V.val(_e(V.val())),X.val(_e(X.val())),J.val(_e(J.val())),Y.val(_e(Y.val())),K.val(_e(K.val())),G.val(_e(G.val())),R.is(":visible")?Le.updateView(V.val(),X.val()):H.is(":visible")&&We.updateView())},Ie=function(){var t,n=function(){le.parent().hide(),ce.hide()};t=Math.min(ge,ve)/Math.sqrt(Math.pow(ue,2)+Math.pow(he,2)),be=Math.ceil(ue*t),ye=Math.ceil(he*t),qe.width(be).height(ye).css("margin-top",(ve-ye)/2+"px").css("margin-left",(ge-be)/2+"px"),qe.is(":visible")&&le.is(":visible")&&("image/png"!==i.mime?(U.css("backgroundColor",le.val()),o=e(" "),s.isCORS&&o.attr("crossorigin","use-credentials"),o.on("load",function(){l&&l.width!==be&&Ae()}).on("error",n).attr("src",nt)):n())},Se=function(){Le.updateView(ue,he),Ie(),Pe.width(Fe.width()).height(Fe.height()),Re.width(Fe.width()).height(Fe.height()),We.updateView(),at()},Ae=function(){if(w){var t,n,i,a,r,s,c,d,p,u,h,f,m,g,v,b,y,x,k,C={},T=[],z=function(e,t,n){var i,a,o,r=Math.max(Math.max(e,t),n),s=Math.min(Math.min(e,t),n);return r===s?i=0:e===r?i=((t-n)/(r-s)*60+360)%360:t===r?i=(n-e)/(r-s)*60+120:n===r&&(i=(e-t)/(r-s)*60+240),a=(r-s)/r,o=(.3*e+.59*t+.11*n)/255,[i,a,o,"hsl"]},I=function(e){return 8*Math.round(e/8)};e:try{n=l.width=qe.width(),i=l.height=qe.height(),m=n/ue,w.scale(m,m),w.drawImage(o.get(0),0,0),f=w.getImageData(0,0,n,i).data,g=.1*n,v=.9*n,b=.1*i,y=.9*i;for(var S=0;Sv)&&(Sy)&&(x=I(a)+","+I(r)+","+I(s),C[x]?++C[x]:C[x]=1)}ce.children(":first").length||(k=1,e.each(C,function(e,t){T.push({c:e,v:t})}),e.each(T.sort(function(e,t){return e.v>t.v?-1:1}),function(){return!(this.v<2||k>10)&&(ce.append(e('')),void++k)}))}catch(O){re.hide(),ce.hide()}}},Oe=function(){try{l=document.createElement("canvas"),w=l.getContext("2d")}catch(e){re.hide(),ce.hide()}},je=function(){rt.on("click","span.elfinder-resize-preset",function(){var t=e(this),n=t.data("s")[0],i=t.data("s")[1],a=ue/he;t.data("s",[i,n]).text(i+"x"+n),ue>n||he>i?ue<=n?n=_e(i*a):he<=i?i=_e(n/a):ue-n>he-i?i=_e(n/a):n=_e(i*a):(n=ue,i=he),V.val(n),X.val(i),Le.updateView(n,i),at()}),st.on("click","span.elfinder-resize-preset",function(){var t=e(this),n=t.data("s")[0],i=t.data("s")[1],a=K.val(),o=G.val();t.data("s",[i,n]).text(i+"x"+n),ue>=n&&he>=i&&(ue-n-a<0&&(a=ue-n),he-i-o<0&&(o=he-i),K.val(a),G.val(o),J.val(n),Y.val(i),We.updateView(),at())}),st.children("span.elfinder-resize-preset").each(function(){var t=e(this),n=t.data("s")[0],i=t.data("s")[1];t[ue>=n&&he>=i?"show":"hide"]()})},De=null,Me=!1,Ue=function(e){var t=s.file(i.hash);t.width=e[0],t.height=e[1]},Ee=function(){var n,a,o,r;Me||(Me=!0,De&&De.state&&"pending"===De.state()&&De.reject(),s.api>=2.103?0===t&&s.request({data:{cmd:"resize",target:i.hash,degree:0,mode:"rotate"},preventDefault:!0}).done(function(e){t=e.losslessRotate?1:-1,1===t&&Z.val()%90===0&&q.children("div.elfinder-resize-quality").hide()}).fail(function(){t=-1}):t=-1,n=Fe.get(0),a=i.width&&i.height?{w:i.width,h:i.height}:n.naturalWidth?null:{w:Fe.width(),h:Fe.height()},a&&Fe.removeAttr("width").removeAttr("height"),ue=i.width||n.naturalWidth||n.width||Fe.width(),he=i.height||n.naturalHeight||n.height||Fe.height(),i.width&&i.height||Ue([ue,he]),a&&Fe.width(a.w).height(a.h),x.show(),r=he/ue,r<1&&U.height()>U.width()*r&&U.height(U.width()*r),U.height()>Fe.height()+20&&U.height(Fe.height()+20),ve=U.height()-(F.outerHeight()-F.height()),E.remove(),de=ue/he,F.append(Fe.show()).show(),V.val(ue),X.val(he),Oe(),je(),Se(),B[f]("enable"),o=M.find("input,select").prop("disabled",!1).filter(":text").on("keydown",function(t){var n;if(t.keyCode==e.ui.keyCode.ENTER)return t.stopPropagation(),t.preventDefault(),n={title:e("input:checked",B).val(),text:"confirmReq",accept:{label:"btnApply",callback:function(){Ge()}},cancel:{label:"btnCancel",callback:function(){e(this).trigger("focus")}}},lt&&(n.buttons=[{label:"btnSaveAs",callback:function(){setTimeout(Je,10)}}]),void s.confirm(n)}).on("keyup",function(){var t=e(this);t.hasClass("elfinder-resize-bg")||setTimeout(function(){t.val(t.val().replace(/[^0-9]/g,""))},10)}).filter(":first"),ze(),!s.UA.Mobile&&o.trigger("focus"),$e())},Fe=e(" ").on("load",Ee).on("error",function(){E.text("Unable to load image").css("background","transparent")}),Pe=e("
"),Re=e(" "),He=e("
"),qe=e(' '),_e=function(e,t){return e=xe?8*Math.round(e/8):Math.round(e),e=Math.max(0,e),t&&e>t&&(e=xe?8*Math.floor(t/8):t),e},Ne=function(){V.val(ue),X.val(he),Le.updateView(ue,he),K.val(0),G.val(0),J.val(ue),Y.val(he),We.updateView(),at()},Le={update:function(){V.val(_e(Fe.width()/pe)),X.val(_e(Fe.height()/pe)),at()},updateView:function(e,t){e>ge||t>ve?e/ge>t/ve?(pe=ge/e,Fe.width(ge).height(_e(t*pe))):(pe=ve/t,Fe.height(ve).width(_e(e*pe))):Fe.width(_e(e)).height(_e(t)),pe=Fe.width()/e,L.text("1 : "+(1/pe).toFixed(2)),Le.updateHandle()},updateHandle:function(){F.width(Fe.width()).height(Fe.height())},fixHeight:function(){var e,t;fe&&(e=V.val(),t=_e(e/de),Le.updateView(e,t),X.val(t))}},We={update:function(e){K.val(_e((P.data("x")||P.position().left)/pe,ue)),G.val(_e((P.data("y")||P.position().top)/pe,he)),"xy"!==e&&(J.val(_e((P.data("w")||P.width())/pe,ue-K.val())),Y.val(_e((P.data("h")||P.height())/pe,he-G.val()))),at()},updateView:function(e){var t,n,i,a,o;K.val(_e(K.val(),ue-(xe?8:1))),G.val(_e(G.val(),he-(xe?8:1))),J.val(_e(J.val(),ue-K.val())),Y.val(_e(Y.val(),he-G.val())),me&&(t=He.width()/He.height(),"w"===e?Y.val(_e(parseInt(J.val())/t)):"h"===e&&J.val(_e(parseInt(Y.val())*t))),n=Math.round(parseInt(K.val())*pe),i=Math.round(parseInt(G.val())*pe),"xy"!==e?(a=Math.round(parseInt(J.val())*pe),o=Math.round(parseInt(Y.val())*pe)):(a=P.data("w"),o=P.data("h")),P.data({x:n,y:i,w:a,h:o}).width(a).height(o).css({left:n,top:i}),He.width(a).height(o)},resize_update:function(e,t){P.data({x:t.position.left,y:t.position.top,w:t.size.width,h:t.size.height}),We.update(),We.updateView()},drag_update:function(e,t){P.data({x:t.position.left,y:t.position.top}),We.update("xy")}},Be={mouseStartAngle:0,imageStartAngle:0,imageBeingRotated:!1,setQuality:function(){q.children("div.elfinder-resize-quality")[t>0&&Z.val()%90===0?"hide":"show"]()},update:function(e,t){"undefined"==typeof e&&(we=e=parseInt(Z.val())),"undefined"==typeof t&&(t=!0),!t||s.UA.Opera||s.UA.ltIE8?qe.rotate(e):qe.animate({rotate:e+"deg"}),e%=360,e<0&&(e+=360),Z.val(parseInt(e)),ee.slider("value",Z.val()),Be.setQuality()},execute:function(e){if(Be.imageBeingRotated){var t=Be.getCenter(qe),n=e.originalEvent.touches?e.originalEvent.touches[0]:e,i=n.pageX-t[0],a=n.pageY-t[1],o=Math.atan2(a,i),r=o-Be.mouseStartAngle+Be.imageStartAngle;return r=Math.round(180*parseFloat(r)/Math.PI),e.shiftKey&&(r=15*Math.round((r+6)/15)),qe.rotate(r),r%=360,r<0&&(r+=360),Z.val(r),ee.slider("value",Z.val()),Be.setQuality(),!1}},start:function(t){if(!qe.hasClass("elfinder-resize-picking")){j(),Be.imageBeingRotated=!0;var n=Be.getCenter(qe),i=t.originalEvent.touches?t.originalEvent.touches[0]:t,a=i.pageX-n[0],o=i.pageY-n[1];return Be.mouseStartAngle=Math.atan2(o,a),Be.imageStartAngle=parseFloat(qe.rotate())*Math.PI/180,e(document).on("mousemove",Be.execute),qe.on("touchmove",Be.execute),!1}},stop:function(t){if(Be.imageBeingRotated)return e(document).off("mousemove",Be.execute),qe.off("touchmove",Be.execute),setTimeout(function(){Be.imageBeingRotated=!1},10),D(),!1},getCenter:function(e){var t=qe.rotate();qe.rotate(0);var n=qe.offset(),i=n.left+qe.width()/2,a=n.top+qe.height()/2;return qe.rotate(t),Array(i,a)}},$e=function(e){e?(F.filter(":ui-resizable").resizable("destroy"),F.hide()):(F.show(),F.resizable({alsoResize:Fe,aspectRatio:fe,resize:Le.update,start:j,stop:function(e){Le.fixHeight,Le.updateView(V.val(),X.val()),D()}}),ot())},Ve=function(e){e?(P.filter(":ui-resizable").resizable("destroy").filter(":ui-draggable").draggable("destroy"),Pe.hide()):(Pe.show(),P.resizable({containment:Pe,aspectRatio:me,resize:We.resize_update,start:j,stop:D,handles:"all"}).draggable({handle:He,containment:Re,drag:We.drag_update,start:j,stop:function(){We.updateView("xy"),D()}}),ot(),We.update())},Xe=function(e){e?qe.hide():(qe.show(),ot())},Ke=function(){var e,t,n,i,a,o,r="";if("resize"==$)e=parseInt(V.val())||0,t=parseInt(X.val())||0;else if("crop"==$)e=parseInt(J.val())||0,t=parseInt(Y.val())||0,n=parseInt(K.val())||0,i=parseInt(G.val())||0;else if("rotate"==$){if(e=ue,t=he,a=parseInt(Z.val())||0,a<0||a>360)return s.error("Invalid rotate degree"),!1;if(0==a||360==a)return s.error("errResizeNoChange"),!1;r=le.val()}if(o=Q?parseInt(Q.val()):0,"rotate"!=$){if(e<=0||t<=0)return s.error("Invalid image size"),!1;if(e==ue&&t==he)return s.error("errResizeNoChange"),!1}return{w:e,h:t,x:n,y:i,d:a,q:o,b:r}},Ge=function(){var e;(e=Ke())&&(T.elfinderdialog("close"),r.resizeRequest({target:i.hash,width:e.w,height:e.h,x:e.x,y:e.y,degree:e.d,quality:e.q,bg:e.b,mode:$},i,c))},Je=function(){var t,n=function(){t.addClass(y).fadeIn(function(){k.addClass(b)}),s.disable()},a=function(){r.mime=i.mime,r.prefix=i.name.replace(/ \d+(\.[^.]+)?$/,"$1"),r.requestCmd="mkfile",r.nextAction={},r.data={target:i.phash},e.proxy(s.res("mixin","make"),r)().done(function(a){var o,r;a.added&&a.added.length?(o=a.added[0].hash,r=s.api<2.1032?s.url(i.hash,{async:!0,temporary:!0}):null,e.when(r).done(function(e){s.request({options:{type:"post"},data:{cmd:"put",target:o,encoding:r?"scheme":"hash",content:r?s.convAbsUrl(e):i.hash},notify:{type:"copy",cnt:1},syncOnFail:!0}).fail(n).done(function(e){e=s.normalize(e),s.updateCache(e),i=s.file(o),e.changed&&e.changed.length&&s.change(e),k.show().find(".elfinder-dialog-title").html(s.escape(i.name)),Ge(),t.fadeIn()})}).fail(n)):n()}).fail(n).always(function(){delete r.mime,delete r.prefix,delete r.nextAction,delete r.data}),s.trigger("unselectfiles",{files:[i.hash]})},o=null;Ke()&&(t=h.children("."+v+":visible").removeClass(y).fadeOut(),k.removeClass(b),s.enable(),s.searchStatus.state<2&&i.phash!==s.cwd().hash&&(o=s.exec("open",[i.phash],{thash:i.phash})),e.when([o]).done(function(){o?s.one("cwdrender",a):a()}).fail(n))},Ye={},Qe="elfinder-resize-handle-hline",Ze="elfinder-resize-handle-vline",et="elfinder-resize-handle-point",tt=s.openUrl(i.hash),nt=s.openUrl(i.hash,!s.isSameOrigin(tt)),it=Q?e(" ").attr("crossorigin",s.isCORS?"use-credentials":"").attr("src",nt).on("load",function(){try{var e=document.createElement("canvas");it.data("canvas",e).data("ctx",e.getContext("2d")),at()}catch(t){it.removeData("canvas").removeData("ctx")}}):null,at=function(){M.find("input.elfinder-resize-quality:visible").trigger("change")},ot=function(t){if(!k.hasClass("elfinder-dialog-minimized")&&!k.is(":hidden")){rt.hide(),st.hide();var n,i,a,o=s.options.dialogContained?h:e(window),r=o.height(),l=o.width(),c="auto",d=!0;k.width(Math.min(u,l-30)),U.attr("style",""),ue&&he&&(ge=U.width()-(F.outerWidth()-F.width()),ve=U.height()-(F.outerHeight()-F.height()),Le.updateView(ue,he)),i=T.find("div.elfinder-resize-control").width(),a=U.width(),n=T.width()-20,a>n?(U.width(n),d=!1):n-ar?U.width(n-i-20):(U.css({"float":"none",marginLeft:"auto",marginRight:"auto"}),d=!1)),d&&(c=i),ge=U.width()-(F.outerWidth()-F.width()),h.hasClass("elfinder-fullscreen")?k.height()>r&&(r-=2,U.height(r-k.height()+U.height()),k.css("top",0-h.offset().top)):(r-=30,U.height()>r&&U.height(r)),ve=U.height()-(F.outerHeight()-F.height()),ue&&he&&Se(),Fe.height()&&U.height()>Fe.height()+20&&(U.height(Fe.height()+20),ve=U.height()-(F.outerHeight()-F.height()),Ie()),rt.css("width",c).show(),st.css("width",c).show(),st.children("span.elfinder-resize-preset:visible").length||st.hide()}},rt=function(){var t,n=e('').append(e("").html(s.i18n("presets"))).hide();return e.each(g,function(i,a){2===a.length&&(t=!0,n.append(e(' ').data("s",a).text(a[0]+"x"+a[1]).button()))}),t?n:e()}(),st=rt.clone(!0),lt=s.uploadMimeCheck(i.mime,i.phash);R.append(e(I).append(e(S).text(s.i18n("width")),V),e(I).append(e(S).text(s.i18n("height")),X,e('').append(ke,W)),Q?e(I).append(e(S).text(s.i18n("quality")),Q,e("
")):e(),C?e(I).append(e(S).text(s.i18n("8pxgrid")).addClass("elfinder-resize-grid8"),Te):e(),e(I).append(e(S).text(s.i18n("scale")),L),e(I).append(rt)),d&&(H.append(e(I).append(e(S).text("X"),K),e(I).append(e(S).text("Y")).append(G),e(I).append(e(S).text(s.i18n("width")),J),e(I).append(e(S).text(s.i18n("height")),Y,e('
').append(Ce,W.clone(!0))),Q?e(I).append(e(S).text(s.i18n("quality")),Q.clone(!0),e("
")):e(),C?e(I).append(e(S).text(s.i18n("8pxgrid")).addClass("elfinder-resize-grid8")):e(),e(I).append(st)),q.append(e(I).addClass("elfinder-resize-degree").append(e(S).text(s.i18n("rotate")),Z,e("
").text(s.i18n("degree")),e("
").append(_,N)[f]()),e(I).css("height","20px").append(ee),Q?e(I)[t<1?"show":"hide"]().addClass("elfinder-resize-quality").append(e(S).text(s.i18n("quality")),Q.clone(!0),e("
")):e(),e(I).append(e(S).text(s.i18n("bgcolor")),le,re,se),e(I).css("height","20px").append(ce)),_.on("click",function(){we-=90,Be.update(we)}),N.on("click",function(){we+=90,Be.update(we)})),T.append(B).on("resize",function(e){e.stopPropagation()}),d?M.append(R,H.hide(),q.hide()):M.append(R),F.append('
','
','
','
','
','
','
'),U.append(E).append(F.hide()).append(Fe.hide()),d&&(P.css("position","absolute").append('
','
','
','
','
','
','
','
','
','
','
','
'),U.append(Pe.css("position","absolute").hide().append(Re,P.append(He))),U.append(qe.hide())),U.css("overflow","hidden"),T.append(U,M),Ye[s.i18n("btnApply")]=Ge,lt&&(Ye[s.i18n("btnSaveAs")]=function(){setTimeout(Je,10)}),Ye[s.i18n("btnCancel")]=function(){T.elfinderdialog("close")},T.find("input,button").addClass("elfinder-tabstop"),k=s.dialog(T,{title:s.escape(i.name),width:u,resizable:!1,buttons:Ye,open:function(){var t=!!(s.option("substituteImg",i.hash)&&i.size>p.dimSubImgSize),n=!(!i.width||!i.height);if(T.parent().css("overflow","hidden"),x=k.find(".ui-dialog-titlebar .elfinder-titlebar-minimize").hide(),s.bind("resize",ot),Fe.attr("src",tt),Re.attr("src",tt),qe.attr("src",tt),d&&(qe.on("mousedown touchstart",Be.start).on("touchend",Be.stop),e(document).on("mouseup",Be.stop)),n&&!t)return Ee();if(i.size>(p.getDimThreshold||0))De=s.request({data:{cmd:"dim",target:i.hash,substitute:t?400:""},preventDefault:!0}).done(function(e){if(e.dim){var t=e.dim.split("x");return i.width=t[0],i.height=t[1],Ue(t),e.url&&(Fe.attr("src",e.url),Re.attr("src",e.url),qe.attr("src",e.url)),Ee()}});else if(n)return Ee()},close:function(){d&&(qe.off("mousedown touchstart",Be.start).off("touchend",Be.stop),e(document).off("mouseup",Be.stop)),s.unbind("resize",ot),e(this).elfinderdialog("destroy")},resize:function(e,t){t&&"off"===t.minimize&&ot()}}).attr("id",a).closest(".ui-dialog").addClass(v+" "+y),s.UA.ltIE8&&e(".elfinder-dialog").css("filter",""),He.css({opacity:.2,"background-color":"#fff",position:"absolute"}),P.css("cursor","move"),P.find(".elfinder-resize-handle-point").css({"background-color":"#fff",opacity:.5,"border-color":"#000"}),d||B.find(".api2").remove(),M.find("input,select").prop("disabled",!0),M.find("input.elfinder-resize-quality").next("span").addClass("elfinder-resize-jpgsize").attr("title",s.i18n("roughFileSize"))};return l.length&&l[0].mime.indexOf("image/")!==-1?(a="resize-"+s.namespace+"-"+l[0].hash,o=h.find("#"+a),o.length?(o.elfinderdialog("toTop"),c.resolve()):(w(l[0],a),c)):c.reject()}},function(e){var t=function(e,t){var n=0;for(n in t)if("undefined"!=typeof e[t[n]])return t[n];return e[t[n]]="",t[n]};if(e.cssHooks.rotate={get:function(t,n,i){return e(t).rotate()},set:function(t,n){return e(t).rotate(n),n}},e.cssHooks.transform={get:function(e,n,i){var a=t(e.style,["WebkitTransform","MozTransform","OTransform","msTransform","transform"]);return e.style[a]},set:function(e,n){var i=t(e.style,["WebkitTransform","MozTransform","OTransform","msTransform","transform"]);return e.style[i]=n,n}},e.fn.rotate=function(e){var t;return"undefined"==typeof e?window.opera?(t=this.css("transform").match(/rotate\((.*?)\)/),t&&t[1]?Math.round(180*parseFloat(t[1])/Math.PI):0):(t=this.css("transform").match(/rotate\((.*?)\)/),t&&t[1]?parseInt(t[1]):0):(this.css("transform",this.css("transform").replace(/none|rotate\(.*?\)/,"")+"rotate("+parseInt(e)+"deg)"),this)},e.fx.step.rotate=function(t){0==t.state&&(t.start=e(t.elem).rotate(),t.now=t.start),e(t.elem).rotate(t.now)},"undefined"==typeof window.addEventListener&&"undefined"==typeof document.getElementsByClassName){var n=function(e){for(var t=e,n=t.offsetLeft,i=t.offsetTop;t.offsetParent&&(t=t.offsetParent,t==document.body||"static"==t.currentStyle.position);)t!=document.body&&t!=document.documentElement&&(n-=t.scrollLeft,i-=t.scrollTop),n+=t.offsetLeft,i+=t.offsetTop;return{x:n,y:i}},i=function(e){if("static"==e.currentStyle.position){var t=n(e);e.style.position="absolute",e.style.left=t.x+"px",e.style.top=t.y+"px"}},a=function(e,t){var n,a=1,o=1,r=1,s=1;if("undefined"!=typeof e.style.msTransform)return!0;i(e),n=t.match(/rotate\((.*?)\)/);var l=n&&n[1]?parseInt(n[1]):0;l%=360,l<0&&(l=360+l);var c=l*Math.PI/180,d=Math.cos(c),p=Math.sin(c);a*=d,o*=-p,r*=p,s*=d,e.style.filter=(e.style.filter||"").replace(/progid:DXImageTransform\.Microsoft\.Matrix\([^)]*\)/,"")+("progid:DXImageTransform.Microsoft.Matrix(M11="+a+",M12="+o+",M21="+r+",M22="+s+",FilterType='bilinear',sizingMethod='auto expand')");var u=parseInt(e.style.width||e.width||0),h=parseInt(e.style.height||e.height||0);c=l*Math.PI/180;var f=Math.abs(Math.cos(c)),m=Math.abs(Math.sin(c)),g=(u-(u*f+h*m))/2,v=(h-(u*m+h*f))/2;return e.style.marginLeft=Math.floor(g)+"px",e.style.marginTop=Math.floor(v)+"px",!0},o=e.cssHooks.transform.set;e.cssHooks.transform.set=function(e,t){return o.apply(this,[e,t]),a(e,t),t}}}(jQuery),(i.prototype.commands.restore=function(){"use strict";var t=this,n=this.fm,i=0,a=function(t){var o,r=e.Deferred(),s=[],l=[],c=[],d=[];return r._xhrReject=function(){e.each(c,function(){this&&this.reject&&this.reject()}),o&&o._xhrReject()},e.each(t,function(e,t){"directory"===t.mime?s.push(t):l.push(t)}),s.length?(e.each(s,function(e,t){c.push(n.request({data:{cmd:"open",target:t.hash},preventDefault:!0,asNotOpen:!0})),d[e]=t.hash}),e.when.apply(e,c).fail(function(){r.reject()}).done(function(){var t=[];e.each(arguments,function(e,n){n.files&&(n.files.length?t=t.concat(n.files):t.push({hash:"fakefile_"+i++,phash:d[e],mime:"fakefile",name:"fakefile",ts:0}))}),n.cache(t),o=a(t).done(function(e){l=l.concat(e),r.resolve(l)})})):r.resolve(l),r},o=function(o,r,s,l){var c,d,p={},u=[],h=!1,f=[],m=l||{},g=+new Date;n.lockfiles({files:s}),f=e.map(r,function(e){return"directory"===e.mime?e.hash:null}),o.done(function(){f&&n.exec("rm",f,{forceRm:!0,quiet:!0})}).always(function(){n.unlockfiles({files:s})}),c=setTimeout(function(){n.notify({type:"search",id:g,cnt:1,hideCnt:!0,cancel:function(){d&&d._xhrReject(),o.reject()}})},n.notifyDelay),i=0,d=a(r).always(function(){c&&clearTimeout(c),n.notify({type:"search",id:g,cnt:-1,hideCnt:!0})}).fail(function(){o.reject("errRestore","errFileNotFound")}).done(function(i){var a=["errRestore","errFolderNotFound"],r="";i.length?(e.each(i,function(t,i){for(var a,o,s,l=i.phash;l;){if(o=n.trashes[l]){if(!p[o]){if(h)return u.push(i.hash),null;p[o]={},h=!0}s=n.path(i.hash).substr(n.path(l).length).replace(/\\/g,"/"),s=s.replace(/\/[^\/]+?$/,""),""===s&&(s="/"),p[o][s]||(p[o][s]=[]),"fakefile"===i.mime?n.updateCache({removed:[i.hash]}):p[o][s].push(i.hash),(!r||r.length>s.length)&&(r=s);break}a=n.file(l),a?l=a.phash:(l=!1,e.each(n.trashes,function(e){var t=n.file(e),a=n.path(e);if((!t.volumeid||0===i.hash.indexOf(t.volumeid))&&0===n.path(i.hash).indexOf(a))return l=e,!1}))}}),h?e.each(p,function(i,l){var c=Object.keys(l),d=c.length;n.request({data:{cmd:"mkdir",target:i,dirs:c},notify:{type:"chkdir",cnt:d},preventFail:!0}).fail(function(e){o.reject(e),n.unlockfiles({files:s})}).done(function(i){var s,c;(c=i.hashes)?(s=n.getCommand("paste"),s?n.one("mkdirdone",function(){var i=!1;e.each(l,function(e,l){c[e]&&(l.length?n.file(c[e])?(n.clipboard(l,!0),s.exec([c[e]],{_cmd:"restore",noToast:m.noToast||e!==r}).done(function(e){e&&(e.error||e.warning)&&(i=!0)}).fail(function(){i=!0}).always(function(){--d<1&&(o[i?"reject":"resolve"](),u.length&&t.exec(u))})):o.reject(a):--d<1&&(o.resolve(),u.length&&t.exec(u)))})}):o.reject(["errRestore","errCmdNoSupport","(paste)"])):o.reject(a)})}):o.reject(a)):(o.reject("errFileNotFound"),f&&n.exec("rm",f,{forceRm:!0,quiet:!0}))})};this.linkedCmds=["copy","paste","mkdir","rm"],this.updateOnSelect=!1,this.getstate=function(t,i){return t=t||n.selected(),t.length&&e.grep(t,function(e){var t=n.file(e);return!(!t||t.locked||n.isRoot(t))}).length==t.length?0:-1},this.exec=function(i,a){var r=e.Deferred().fail(function(e){e&&n.error(e)}),s=t.files(i);return s.length?(e.each(s,function(e,t){return n.isRoot(t)?!r.reject(["errRestore",t.name]):t.locked?!r.reject(["errLocked",t.name]):void 0}),"pending"===r.state()&&o(r,s,i,a),r):r.reject()}}).prototype={forceLoad:!0},i.prototype.commands.rm=function(){"use strict";var t=this,n=this.fm,i='
',a=function(a,s,c,d,p){var u,h,f,m,g,v,b=s.length,y=n.cwd().hash,w=[],x='
'+n.i18n("calc");b>1?(m=0,e.each(c,function(e,t){if(!t.size||"unknown"==t.size||"directory"===t.mime)return m="unknown",!1;var n=parseInt(t.size);n>=0&&m>=0&&(m+=n)}),l="unknown"===m,w.push(n.i18n("size")+": "+(l?x:n.formatSize(m))),h=[e(i.replace("{class}","elfinder-cwd-icon-group").replace("{title}","
"+n.i18n("items")+": "+b+" ").replace("{desc}",w.join("
")))]):(g=c[0],f=n.tmb(g),l="directory"===g.mime,w.push(n.i18n("size")+": "+(l?x:n.formatSize(g.size))),w.push(n.i18n("modify")+": "+n.formatDate(g)),v=n.escape(g.i18||g.name).replace(/([_.])/g,"$1"),h=[e(i.replace("{class}",n.mime2class(g.mime)).replace("{title}","
"+v+" ").replace("{desc}",w.join("
")))]),p&&(h=h.concat(p)),h.push(d?"confirmTrash":"confirmRm"),u=n.confirm({title:t.title,text:h,accept:{label:"btnRm",callback:function(){d?o(a,s,d):r(a,s)}},cancel:{label:"btnCancel",callback:function(){n.unlockfiles({files:s}),1===s.length&&n.file(s[0]).phash!==y?n.select({selected:s}):n.selectfiles({files:s}),a.reject()}}}),f&&e("
").on("load",function(){u.find(".elfinder-cwd-icon").addClass(f.className).css("background-image","url('"+f.url+"')")}).attr("src",f.url),l&&(l=n.getSize(e.map(c,function(e){return"directory"===e.mime?e.hash:null})).done(function(e){u.find("span.elfinder-info-spinner").parent().html(n.i18n("size")+": "+e.formated)}).fail(function(){u.find("span.elfinder-info-spinner").parent().html(n.i18n("size")+": "+n.i18n("unknown"))}).always(function(){l=!1}))},o=function(i,o,r){var s,l,c,d={},p=o.length,u=t.options.toTrashMaxItems,h=[],f=e.Deferred();return p>u?void a(i,o,t.files(o),null,[n.i18n("tooManyToTrash")]):(e.each(o,function(e,t){var i=n.file(t),a=n.path(t).replace(/\\/g,"/"),o=a.match(/^[^\/]+?(\/(?:[^\/]+?\/)*)[^\/]+?$/);i&&(o&&(o[1]=o[1].replace(/(^\/.*?)\/?$/,"$1"),d[o[1]]||(d[o[1]]=[]),d[o[1]].push(t)),"directory"===i.mime&&h.push(t))}),h.length?(s=n.request({data:{cmd:"size",targets:h},notify:{type:"readdir",cnt:1,hideCnt:!0},preventDefault:!0}).done(function(e){var t=0;e.fileCnt&&(t+=parseInt(e.fileCnt)),e.dirCnt&&(t+=parseInt(e.dirCnt)),f[t>u?"reject":"resolve"]()}).fail(function(){f.reject()}),setTimeout(function(){var e=s&&s.xhr?s.xhr:null;e&&"pending"==e.state()&&(s.syncOnFail(!1),s.reject(),f.reject())},1e3*t.options.infoCheckWait)):f.resolve(),void f.done(function(){l=Object.keys(d),c=l.length,c?n.request({data:{cmd:"mkdir",target:r,dirs:l},notify:{type:"chkdir",cnt:c},preventFail:!0}).fail(function(e){i.reject(e),n.unlockfiles({files:o})}).done(function(a){var r,s,l,p,u=function(t,i,a){var r,s,l,c;e.each(t,function(e,t){Array.isArray(t)&&(f[e]?f[e]=f[e].concat(t):f[e]=t)}),t.sync&&(f.sync=1),t.added&&t.added.length&&(r=function(){var i=[],a=n.getCommand("restore"),o=e.map(t.added,function(e){return"directory"===e.mime?e.hash:null});return e.each(t.added,function(t,n){e.inArray(n.phash,o)===-1&&i.push(n.hash)}),a.exec(i,{noToast:!0})},l=function(){return n.request({data:a,notify:{type:"redo",cnt:o.length}})},f.undo?(s=f.undo,f.undo=function(){r(),s()}):f.undo=r,f.redo?(c=f.redo,f.redo=function(){l(),c()}):f.redo=l)},h=["errTrash"],f={},m=function(){return n.ui.notify.children(".elfinder-notify-trash").length};(r=a.hashes)?(l=1/c*100,p=1===c?100:5,s=setTimeout(function(){n.notify({type:"trash",cnt:1,hideCnt:!0,progress:p})},n.notifyDelay),e.each(d,function(a,d){var g;r[a]&&(g={cmd:"paste",dst:r[a],targets:d,cut:1},n.request({data:g,preventDefault:!0}).fail(function(e){e&&(h=h.concat(e))}).done(function(e){var t=n.file(d[0]).phash;e=n.normalize(e),n.updateCache(e),u(e,t,g),e.warning&&(h=h.concat(e.warning),delete e.warning),e.removed&&e.removed.length&&n.remove(e),e.added&&e.added.length&&n.add(e),e.changed&&e.changed.length&&n.change(e),n.trigger("paste",e),n.trigger("pastedone"),e.sync&&n.sync()}).always(function(){var a,r=2;m()?n.notify({type:"trash",cnt:0,hideCnt:!0,progress:l}):p+=l,--c<1&&(s&&clearTimeout(s),m()&&n.notify({type:"trash",cnt:-1}),n.unlockfiles({files:o}),Object.keys(f).length?(h.length>1&&((f.removed||f.removed.length)&&(a=e.grep(o,function(t){return e.inArray(t,f.removed)===-1})),a.length?(h>r&&(r=(n.messages[h[r-1]]||"").indexOf("$")===-1?r:r+1),t.exec(a,{addTexts:h.slice(0,r),forceRm:!0})):n.error(h)),f._noSound=!0,f.undo&&f.redo&&(f.undo={cmd:"trash",callback:f.undo},f.redo={cmd:"trash",callback:f.redo}),i.resolve(f)):i.reject(h))}))})):(i.reject("errFolderNotFound"),n.unlockfiles({files:o}))}):(i.reject(["error","The folder hierarchy to be deleting can not be determined."]),n.unlockfiles({files:o}))}).fail(function(){a(i,o,t.files(o),null,[n.i18n("tooManyToTrash")])}))},r=function(e,t,i){var a=i?{}:{type:"rm",cnt:t.length};n.request({data:{cmd:"rm",targets:t},notify:a,preventFail:!0}).fail(function(t){e.reject(t)}).done(function(t){(t.error||t.warning)&&(t.sync=!0),e.resolve(t)}).always(function(){n.unlockfiles({files:t})})},s=function(t){var i,a=null;return t&&t.length&&(t.length>1&&2===n.searchStatus.state?(i=n.file(n.root(t[0])).volumeid,e.grep(t,function(e){return 0!==e.indexOf(i)}).length||(a=n.option("trashHash",t[0]))):a=n.option("trashHash",t[0])),a},l=!1;this.syncTitleOnChange=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"delete ctrl+backspace shift+delete"}],this.handlers={select:function(e){var i=e.data&&e.data.selected&&e.data.selected.length?e.data.selected:null;t.update(void 0,(i?s(i):n.option("trashHash"))?"trash":"rm")}},this.value="rm",this.init=function(){t.change(function(){var i;delete t.extra,t.title=n.i18n("cmd"+t.value),t.className=t.value,t.button&&t.button.children("span.elfinder-button-icon")["trash"===t.value?"addClass":"removeClass"]("elfinder-button-icon-trash"),"trash"===t.value&&(t.extra={icon:"rm",node:e("
").attr({title:n.i18n("cmdrm")}).on("ready",function(e,t){i=t.targets}).on("click touchstart",function(e){"touchstart"===e.type&&e.originalEvent.touches.length>1||(e.stopPropagation(),e.preventDefault(),n.getUI().trigger("click"),n.exec("rm",i,{_userAction:!0,forceRm:!0}))})})})},this.getstate=function(t){var i=this.hashes(t);return i.length&&e.grep(i,function(e){var t=n.file(e);return!(!t||t.locked||n.isRoot(t))}).length==i.length?0:-1},this.exec=function(i,c){var d,p=c||{},u=e.Deferred().always(function(){l&&l.state&&"pending"===l.state()&&l.reject()}).fail(function(e){e&&n.error(e)}).done(function(e){!p.quiet&&!e._noSound&&e.removed&&e.removed.length&&n.trigger("playsound",{soundFile:"rm.wav"})}),h=t.files(i),f=h.length,m=null,g=p.addTexts?p.addTexts:null,v=p.forceRm,b=p.quiet;return f?(e.each(h,function(e,t){return n.isRoot(t)?!u.reject(["errRm",t.name,"errPerm"]):t.locked?!u.reject(["errLocked",t.name]):void 0}),"pending"===u.state()&&(d=t.hashes(i),f=h.length,(v||t.event&&t.event.originalEvent&&t.event.originalEvent.shiftKey)&&(m="",t.title=n.i18n("cmdrm")),null===m&&(m=s(d)),n.lockfiles({files:d}),m&&t.options.quickTrash?o(u,d,m):b?r(u,d,b):a(u,d,h,m,g)),u):u.reject()}},i.prototype.commands.search=function(){"use strict";this.title="Find files",this.options={ui:"searchbutton"},this.alwaysEnabled=!0,this.updateOnSelect=!1,this.getstate=function(){return 0},this.exec=function(t,n,i){var a,o=this.fm,r=[],s=o.options.onlyMimes,l=[];return"string"==typeof t&&t?("object"==typeof n&&(i=n.mime||"",n=n.target||""),n=n?n:"",i?(i=e.trim(i).replace(","," ").split(" "),s.length&&(i=e.map(i,function(t){return t=e.trim(t),t&&(e.inArray(t,s)!==-1||e.grep(s,function(e){return 0===t.indexOf(e)}).length)?t:null}))):i=[].concat(s),o.trigger("searchstart",{query:t,target:n,mimes:i}),!s.length||i.length?""===n&&o.api>=2.1?e.each(o.roots,function(e,n){
r.push(o.request({data:{cmd:"search",q:t,target:n,mimes:i},notify:{type:"search",cnt:1,hideCnt:!r.length},cancel:!0,preventDone:!0}))}):(r.push(o.request({data:{cmd:"search",q:t,target:n,mimes:i},notify:{type:"search",cnt:1,hideCnt:!0},cancel:!0,preventDone:!0})),""!==n&&o.api>=2.1&&Object.keys(o.leafRoots).length&&e.each(o.leafRoots,function(s,c){for(a=s;a;)n===a&&e.each(c,function(){var e=o.file(this);e&&e.volumeid&&l.push(e.volumeid),r.push(o.request({data:{cmd:"search",q:t,target:this,mimes:i},notify:{type:"search",cnt:1,hideCnt:!1},cancel:!0,preventDone:!0}))}),a=(o.file(a)||{}).phash})):r=[e.Deferred().resolve({files:[]})],o.searchStatus.mixed=r.length>1&&l,e.when.apply(e,r).done(function(e){var t,n=arguments.length;if(e.warning&&o.error(e.warning),n>1)for(e.files=e.files||[],t=1;t
':"")+" "+n.i18n("sort"+i)])}}),t.variants.push("|"),t.variants.push([{type:n.sortType,order:n.sortOrder,stick:!n.sortStickFolders,tree:n.sortAlsoTreeview},(n.sortStickFolders?' ':"")+" "+n.i18n("sortFoldersFirst")]),n.ui.tree&&(t.variants.push("|"),t.variants.push([{type:n.sortType,order:n.sortOrder,stick:n.sortStickFolders,tree:!n.sortAlsoTreeview},(n.sortAlsoTreeview?' ':"")+" "+n.i18n("sortAlsoTreeview")]))};this.options={ui:"sortbutton"},n.bind("open sortchange",i).bind("open",function(){n.unbind("add",i).one("add",i),n.getUI("toolbar").find(".elfiner-button-sort .elfinder-button-menu .elfinder-button-menu-item").each(function(){var t=e(this),i=t.attr("rel");t.toggle(!i||e.inArray(i,n.sorters)!==-1)})}).bind("cwdrender",function(){var i=e(n.cwd).find("div.elfinder-cwd-wrapper-list table");i.length&&e.each(n.sortRules,function(a,o){var r=i.find("thead tr td.elfinder-cwd-view-th-"+a);if(r.length){var s,l=a==n.sortType,c={type:a,order:l?"asc"==n.sortOrder?"desc":"asc":n.sortOrder};l&&(r.addClass("ui-state-active"),s="asc"==n.sortOrder?"n":"s",e(' ').appendTo(r)),e(r).on("click",function(i){e(this).data("dragging")||(i.stopPropagation(),n.getUI("cwd").data("longtap")||t.exec([],c))}).on("mouseenter mouseleave",function(t){e(this).toggleClass("ui-state-hover","mouseenter"===t.type)})}})}),this.getstate=function(){return 0},this.exec=function(e,t){var n=this.fm,i=Object.assign({type:n.sortType,order:n.sortOrder,stick:n.sortStickFolders,tree:n.sortAlsoTreeview},t);return n.lazy(function(){n.setSort(i.type,i.order,i.stick,i.tree),this.resolve()})}},i.prototype.commands.undo=function(){"use strict";var t=this,n=this.fm,i=function(e){e?(t.title=n.i18n("cmdundo")+" "+n.i18n("cmd"+e.cmd),t.state=0):(t.title=n.i18n("cmdundo"),t.state=-1),t.change()},a=[];this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+z"}],this.syncTitleOnChange=!0,this.getstate=function(){return this.state},this.setUndo=function(t,o){var r={};t&&e.isPlainObject(t)&&t.cmd&&t.callback&&(Object.assign(r,t),o?(delete o.undo,r.redo=o):n.getCommand("redo").setRedo(null),a.push(r),i(r))},this.exec=function(){var t,o,r=n.getCommand("redo"),s=e.Deferred(),l={};return a.length?(t=a.pop(),t.redo?(Object.assign(l,t.redo),delete t.redo):l=null,s.done(function(){l&&r.setRedo(l,t)}),i(a.length?a[a.length-1]:void 0),o=t.callback(),o&&o.done?o.done(function(){s.resolve()}).fail(function(){s.reject()}):s.resolve(),a.length?this.update(0,a[a.length-1].name):this.update(-1,"")):s.reject(),s},n.bind("exec",function(e){var n=e.data||{};n.opts&&n.opts._userAction&&n.dfrd&&n.dfrd.done&&n.dfrd.done(function(e){e&&e.undo&&e.redo&&(e.undo.redo=e.redo,t.setUndo(e.undo))})})},i.prototype.commands.redo=function(){"use strict";var t=this,n=this.fm,i=function(e){e&&e.callback?(t.title=n.i18n("cmdredo")+" "+n.i18n("cmd"+e.cmd),t.state=0):(t.title=n.i18n("cmdredo"),t.state=-1),t.change()},a=[];this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"shift+ctrl+z ctrl+y"}],this.syncTitleOnChange=!0,this.getstate=function(){return this.state},this.setRedo=function(e,t){null===e?(a=[],i()):e&&e.cmd&&e.callback&&(t&&(e.undo=t),a.push(e),i(e))},this.exec=function(){var t,o,r=n.getCommand("undo"),s=e.Deferred(),l={},c={};return a.length?(t=a.pop(),t.undo&&(Object.assign(l,t.undo),Object.assign(c,t),delete c.undo,s.done(function(){r.setUndo(l,c)})),i(a.length?a[a.length-1]:void 0),o=t.callback(),o&&o.done?o.done(function(){s.resolve()}).fail(function(){s.reject()}):s.resolve(),s):s.reject()}},(i.prototype.commands.up=function(){"use strict";this.alwaysEnabled=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+up"}],this.getstate=function(){return this.fm.cwd().phash?0:-1},this.exec=function(){var t=this.fm,n=t.cwd().hash;return this.fm.cwd().phash?this.fm.exec("open",this.fm.cwd().phash).done(function(){t.one("opendone",function(){t.selectfiles({files:[n]})})}):e.Deferred().reject()}}).prototype={forceLoad:!0},i.prototype.commands.upload=function(){"use strict";var t=this.fm.res("class","hover");this.disableOnSearch=!0,this.updateOnSelect=!1,this.shortcuts=[{pattern:"ctrl+u"}],this.getstate=function(e){var t,n=this.fm,i=e||[n.cwd().hash];return this._disabled||1!=i.length||(t=n.file(i[0])),t&&"directory"==t.mime&&t.write?0:-1},this.exec=function(n){var i,a,o,r,s,l,c,d=this.fm,p=d.cwd().hash,u=function(){var e,t=n&&n instanceof Array?n:null;return n||(t=t||1!==(e=d.selected()).length||"directory"!==d.file(e[0]).mime?[p]:e),t},h=u(),f=h?h[0]:n&&n.target?n.target:null,m=f?d.file(f):d.cwd(),g=function(t){d.upload(t).fail(function(e){w.reject(e)}).done(function(t){var n;d.getUI("cwd");if(w.resolve(t),t&&t.added&&t.added[0]&&!d.ui.notify.children(".elfinder-notify-upload").length){var i=d.findCwdNodes(t.added);i.length?i.trigger("scrolltoview"):(m.hash!==p?n=e("
").append(e(''+d.i18n("cmdopendir")+" ").on("mouseenter mouseleave",function(t){e(this).toggleClass("ui-state-hover","mouseenter"==t.type)}).on("click",function(){d.exec("open",f).done(function(){d.one("opendone",function(){d.trigger("selectfiles",{files:e.map(t.added,function(e){return e.hash})})})})})):d.trigger("selectfiles",{files:e.map(t.added,function(e){return e.hash})}),d.toast({msg:d.i18n(["complete",d.i18n("cmdupload")]),extNode:n}))}})},v=function(e){i.elfinderdialog("close"),h&&(e.target=h[0]),g(e)},b=function(){var t=m.hash,n=e.map(d.files(t),function(e){return"directory"===e.mime&&e.write?e:null});return n.length?e('
').on("click",function(t){t.stopPropagation(),t.preventDefault(),n=d.sortFiles(n);var a=e(this),o=(d.cwd(),i.closest("div.ui-dialog")),r=function(e,t){return{label:d.escape(e.i18||e.name),icon:t,remain:!1,callback:function(){var t=o.children(".ui-dialog-titlebar:first").find("span.elfinder-upload-target");h=[e.hash],t.html(" - "+d.escape(e.i18||e.name)),a.trigger("focus")},options:{className:h&&h.length&&e.hash===h[0]?"ui-state-active":"",iconClass:e.csscls||"",iconImg:e.icon||""}}},s=[r(m,"opendir"),"|"];e.each(n,function(e,t){s.push(r(t,"dir"))}),a.trigger("blur"),d.trigger("contextmenu",{raw:s,x:t.pageX||e(this).offset().left,y:t.pageY||e(this).offset().top,prevNode:o,fitHeight:!0})}).append(' '):e()},y=function(n,i){var a=e(' ").on("change",function(){v({input:a.get(0),type:"files"})}).on("dragover",function(e){e.originalEvent.dataTransfer.dropEffect="copy"});return e(''+d.i18n(i)+"
").append(e("").append(a)).on("click",function(e){e.target===this&&(e.stopPropagation(),e.preventDefault(),a.click())}).on("mouseenter mouseleave",function(n){e(this).toggleClass(t,"mouseenter"===n.type)})},w=e.Deferred();return r=function(t){t.stopPropagation(),t.preventDefault();var n,i=!1,a="",o=null,r="",s=null,l=t._target||null,c=t.dataTransfer||null,p=c.items&&c.items.length&&c.items[0].kind?c.items[0].kind:"";if(c){try{if(o=c.getData("elfinderfrom"),o&&(r=window.location.href+d.cwd().hash,!l&&o===r||l===r))return void w.reject()}catch(t){}if("file"===p&&(c.items[0].getAsEntry||c.items[0].webkitGetAsEntry))i=c,a="data";else if("string"!==p&&c.files&&c.files.length&&e.inArray("Text",c.types)===-1)i=c.files,a="files";else{try{(s=c.getData("text/html"))&&s.match(/<(?:img|a)/i)&&(i=[s],a="html")}catch(t){}!i&&(s=c.getData("text"))&&(i=[s],a="text")}}i?g({files:i,type:a,target:l,dropEvt:t}):(n=["errUploadNoFiles"],"file"===p&&n.push("errFolderUpload"),d.error(n),w.reject())},!h&&n?(n.input||n.files?(n.type="files",g(n)):n.dropEvt&&r(n.dropEvt),w):(s=function(t){var n,i=t.originalEvent||t,a=[],o=[];if(i.clipboardData){if(i.clipboardData.items&&i.clipboardData.items.length){o=i.clipboardData.items;for(var r=0;r ').append(y("multiple","selectForUpload")),!d.UA.Mobile&&function(e){return"undefined"!=typeof e.webkitdirectory||"undefined"!=typeof e.directory}(document.createElement("input"))&&i.append(y("multiple webkitdirectory directory","selectFolder")),m.dirs&&(m.hash===p||e("#"+d.navHash2Id(m.hash)).hasClass("elfinder-subtree-loaded")?b().appendTo(i):(l=e('
').append(' ').appendTo(i),d.request({cmd:"tree",target:m.hash}).done(function(){d.one("treedone",function(){l.replaceWith(b()),c.elfinderdialog("tabstopsInit")})}).fail(function(){l.remove()}))),d.dragUpload?a=e('
').on("paste",function(e){s(e)}).on("mousedown click",function(){e(this).trigger("focus")}).on("focus",function(){this.innerHTML=""}).on("mouseover",function(){e(this).addClass(t)}).on("mouseout",function(){e(this).removeClass(t)}).on("dragenter",function(n){n.stopPropagation(),n.preventDefault(),e(this).addClass(t)}).on("dragleave",function(n){n.stopPropagation(),n.preventDefault(),e(this).removeClass(t)}).on("dragover",function(n){n.stopPropagation(),n.preventDefault(),n.originalEvent.dataTransfer.dropEffect="copy",e(this).addClass(t)}).on("drop",function(e){i.elfinderdialog("close"),h&&(e.originalEvent._target=h[0]),r(e.originalEvent)}).prependTo(i).after(''+d.i18n("or")+"
")[0]:o=e(''+d.i18n("dropFilesBrowser")+"
").on("paste drop",function(e){s(e)}).on("mousedown click",function(){e(this).trigger("focus")}).on("focus",function(){this.innerHTML=""}).on("dragenter mouseover",function(){e(this).addClass(t)}).on("dragleave mouseout",function(){e(this).removeClass(t)}).prependTo(i).after(''+d.i18n("or")+"
")[0],c=d.dialog(i,{title:this.title+''+(m?" - "+d.escape(m.i18||m.name):"")+" ",modal:!0,resizable:!1,destroyOnClose:!0,close:function(){var e=d.getUI("contextmenu");e.is(":visible")&&e.click()}}),w)}},i.prototype.commands.view=function(){"use strict";var e=this.fm;this.value=e.viewType,this.alwaysEnabled=!0,this.updateOnSelect=!1,this.options={ui:"viewbutton"},this.getstate=function(){return 0},this.exec=function(){var t=this,n=e.storage("view","list"==this.value?"icons":"list");return e.lazy(function(){e.viewchange(),t.update(void 0,n),this.resolve()})}},i});PK NQnLPV' V' js/proxy/elFinderSupportVer1.jsnu W+A /**
* elFinder transport to support old protocol.
*
* @example
* $('selector').elfinder({
* ....
* transport : new elFinderSupportVer1()
* })
*
* @author Dmitry (dio) Levashov
**/
window.elFinderSupportVer1 = function(upload) {
"use strict";
var self = this,
dateObj, today, yesterday,
getDateString = function(date) {
return date.replace('Today', today).replace('Yesterday', yesterday);
};
dateObj = new Date();
today = dateObj.getFullYear() + '/' + (dateObj.getMonth() + 1) + '/' + dateObj.getDate();
dateObj = new Date(Date.now() - 86400000);
yesterday = dateObj.getFullYear() + '/' + (dateObj.getMonth() + 1) + '/' + dateObj.getDate();
this.upload = upload || 'auto';
this.init = function(fm) {
this.fm = fm;
this.fm.parseUploadData = function(text) {
var data;
if (!$.trim(text)) {
return {error : ['errResponse', 'errDataEmpty']};
}
try {
data = JSON.parse(text);
} catch (e) {
return {error : ['errResponse', 'errDataNotJSON']};
}
return self.normalize('upload', data);
};
};
this.send = function(opts) {
var self = this,
fm = this.fm,
dfrd = $.Deferred(),
cmd = opts.data.cmd,
args = [],
_opts = {},
data,
xhr;
dfrd.abort = function() {
if (xhr.state() == 'pending') {
xhr.quiet = true;
xhr.abort();
}
};
switch (cmd) {
case 'open':
opts.data.tree = 1;
break;
case 'parents':
case 'tree':
return dfrd.resolve({tree : []});
case 'get':
opts.data.cmd = 'read';
opts.data.current = fm.file(opts.data.target).phash;
break;
case 'put':
opts.data.cmd = 'edit';
opts.data.current = fm.file(opts.data.target).phash;
break;
case 'archive':
case 'rm':
opts.data.current = fm.file(opts.data.targets[0]).phash;
break;
case 'extract':
case 'rename':
case 'resize':
opts.data.current = fm.file(opts.data.target).phash;
break;
case 'duplicate':
_opts = $.extend(true, {}, opts);
$.each(opts.data.targets, function(i, hash) {
$.ajax(Object.assign(_opts, {data : {cmd : 'duplicate', target : hash, current : fm.file(hash).phash}}))
.fail(function(error) {
fm.error(fm.res('error', 'connect'));
})
.done(function(data) {
data = self.normalize('duplicate', data);
if (data.error) {
fm.error(data.error);
} else if (data.added) {
fm.trigger('add', {added : data.added});
}
});
});
return dfrd.resolve({});
case 'mkdir':
case 'mkfile':
opts.data.current = opts.data.target;
break;
case 'paste':
opts.data.current = opts.data.dst;
if (! opts.data.tree) {
$.each(opts.data.targets, function(i, h) {
if (fm.file(h) && fm.file(h).mime === 'directory') {
opts.data.tree = '1';
return false;
}
});
}
break;
case 'size':
return dfrd.resolve({error : fm.res('error', 'cmdsupport')});
case 'search':
return dfrd.resolve({error : fm.res('error', 'cmdsupport')});
case 'file':
opts.data.cmd = 'open';
opts.data.current = fm.file(opts.data.target).phash;
break;
}
// cmd = opts.data.cmd
xhr = $.ajax(opts)
.fail(function(error) {
dfrd.reject(error);
})
.done(function(raw) {
data = self.normalize(cmd, raw);
dfrd.resolve(data);
});
return dfrd;
};
// fix old connectors errors messages as possible
// this.errors = {
// 'Unknown command' : 'Unknown command.',
// 'Invalid backend configuration' : 'Invalid backend configuration.',
// 'Access denied' : 'Access denied.',
// 'PHP JSON module not installed' : 'PHP JSON module not installed.',
// 'File not found' : 'File not found.',
// 'Invalid name' : 'Invalid file name.',
// 'File or folder with the same name already exists' : 'File named "$1" already exists in this location.',
// 'Not allowed file type' : 'Not allowed file type.',
// 'File exceeds the maximum allowed filesize' : 'File exceeds maximum allowed size.',
// 'Unable to copy into itself' : 'Unable to copy "$1" into itself.',
// 'Unable to create archive' : 'Unable to create archive.',
// 'Unable to extract files from archive' : 'Unable to extract files from "$1".'
// }
this.normalize = function(cmd, data) {
var self = this,
fm = this.fm,
files = {},
filter = function(file) { return file && file.hash && file.name && file.mime ? file : null; },
getDirs = function(items) {
return $.grep(items, function(i) {
return i && i.mime && i.mime === 'directory'? true : false;
});
},
getTreeDiff = function(files) {
var dirs = getDirs(files);
treeDiff = fm.diff(dirs, null, ['date', 'ts']);
if (treeDiff.added.length) {
treeDiff.added = getDirs(treeDiff.added);
}
if (treeDiff.changed.length) {
treeDiff.changed = getDirs(treeDiff.changed);
}
if (treeDiff.removed.length) {
var removed = [];
$.each(treeDiff.removed, function(i, h) {
var item;
if ((item = fm.file(h)) && item.mime === 'directory') {
removed.push(h);
}
});
treeDiff.removed = removed;
}
return treeDiff;
},
phash, diff, isCwd, treeDiff;
if ((cmd == 'tmb' || cmd == 'get')) {
return data;
}
// if (data.error) {
// $.each(data.error, function(i, msg) {
// if (self.errors[msg]) {
// data.error[i] = self.errors[msg];
// }
// });
// }
if (cmd == 'upload' && data.error && data.cwd) {
data.warning = Object.assign({}, data.error);
data.error = false;
}
if (data.error) {
return data;
}
if (cmd == 'put') {
phash = fm.file(data.target.hash).phash;
return {changed : [this.normalizeFile(data.target, phash)]};
}
phash = data.cwd.hash;
isCwd = (phash == fm.cwd().hash);
if (data.tree) {
$.each(this.normalizeTree(data.tree), function(i, file) {
files[file.hash] = file;
});
}
$.each(data.cdc||[], function(i, file) {
var hash = file.hash,
mcts;
if (files[hash]) {
if (file.date) {
mcts = Date.parse(getDateString(file.date));
if (mcts && !isNaN(mcts)) {
files[hash].ts = Math.floor(mcts / 1000);
} else {
files[hash].date = file.date || fm.formatDate(file);
}
}
files[hash].locked = file.hash == phash ? true : file.rm === void(0) ? false : !file.rm;
} else {
files[hash] = self.normalizeFile(file, phash, data.tmb);
}
});
if (!data.tree) {
$.each(fm.files(), function(hash, file) {
if (!files[hash] && file.phash != phash && file.mime == 'directory') {
files[hash] = file;
}
});
}
if (cmd == 'open') {
return {
cwd : files[phash] || this.normalizeFile(data.cwd),
files : $.map(files, function(f) { return f; }),
options : self.normalizeOptions(data),
init : !!data.params,
debug : data.debug
};
}
if (isCwd) {
diff = fm.diff($.map(files, filter));
} else {
if (data.tree) {
diff = getTreeDiff(files);
} else {
diff = {
added : [],
removed : [],
changed : []
};
}
if (cmd === 'paste') {
diff.sync = true;
}
}
return Object.assign({
current : data.cwd.hash,
error : data.error,
warning : data.warning,
options : {tmb : !!data.tmb}
}, diff);
};
/**
* Convert old api tree into plain array of dirs
*
* @param Object root dir
* @return Array
*/
this.normalizeTree = function(root) {
var self = this,
result = [],
traverse = function(dirs, phash) {
var i, dir;
for (i = 0; i < dirs.length; i++) {
dir = dirs[i];
result.push(self.normalizeFile(dir, phash));
dir.dirs.length && traverse(dir.dirs, dir.hash);
}
};
traverse([root]);
return result;
};
/**
* Convert file info from old api format into new one
*
* @param Object file
* @param String parent dir hash
* @return Object
*/
this.normalizeFile = function(file, phash, tmb) {
var mime = file.mime || 'directory',
size = mime == 'directory' && !file.linkTo ? 0 : file.size,
mcts = file.date? Date.parse(getDateString(file.date)) : void 0,
info = {
url : file.url,
hash : file.hash,
phash : phash,
name : file.name,
mime : mime,
ts : file.ts,
size : size,
read : file.read,
write : file.write,
locked : !phash ? true : file.rm === void(0) ? false : !file.rm
};
if (! info.ts) {
if (mcts && !isNaN(mcts)) {
info.ts = Math.floor(mcts / 1000);
} else {
info.date = file.date || this.fm.formatDate(file);
}
}
if (file.mime == 'application/x-empty' || file.mime == 'inode/x-empty') {
info.mime = 'text/plain';
}
if (file.linkTo) {
info.alias = file.linkTo;
}
if (file.linkTo) {
info.linkTo = file.linkTo;
}
if (file.tmb) {
info.tmb = file.tmb;
} else if (info.mime.indexOf('image/') === 0 && tmb) {
info.tmb = 1;
}
if (file.dirs && file.dirs.length) {
info.dirs = true;
}
if (file.dim) {
info.dim = file.dim;
}
if (file.resize) {
info.resize = file.resize;
}
return info;
};
this.normalizeOptions = function(data) {
var opts = {
path : data.cwd.rel,
disabled : $.merge((data.disabled || []), [ 'search', 'netmount', 'zipdl' ]),
tmb : !!data.tmb,
copyOverwrite : true
};
if (data.params) {
opts.api = 1;
opts.url = data.params.url;
opts.archivers = {
create : data.params.archives || [],
extract : data.params.extract || []
};
}
if (opts.path.indexOf('/') !== -1) {
opts.separator = '/';
} else if (opts.path.indexOf('\\') !== -1) {
opts.separator = '\\';
}
return opts;
};
};
PK NQnLi:3
3
js/elfinder.full.jsnu W+A /*!
* elFinder - file manager for web
* Version 2.1.33 (2018-03-14)
* http://elfinder.org
*
* Copyright 2009-2018, Studio 42
* Licensed under a 3-clauses BSD license
*/
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery','jquery-ui'], factory);
} else if (typeof exports !== 'undefined') {
// CommonJS
var $, ui;
try {
$ = require('jquery');
ui = require('jquery-ui');
} catch (e) {}
module.exports = factory($, ui);
} else {
// Browser globals (Note: root is window)
factory(root.jQuery, root.jQuery.ui, true);
}
}(this, function($, _ui, toGlobal) {
toGlobal = toGlobal || false;
/*
* File: /js/elFinder.js
*/
/**
* @class elFinder - file manager for web
*
* @author Dmitry (dio) Levashov
**/
var elFinder = function(elm, opts, bootCallback) {
//this.time('load');
var self = this,
/**
* Objects array of jQuery.Deferred that calls before elFinder boot up
*
* @type Array
*/
dfrdsBeforeBootup = [],
/**
* Plugin name to check for conflicts with bootstrap etc
*
* @type Array
**/
conflictChecks = ['button'],
/**
* Node on which elfinder creating
*
* @type jQuery
**/
node = $(elm),
/**
* Object of events originally registered in this node
*
* @type Object
*/
prevEvents = $.extend(true, {}, $._data(node.get(0), 'events')),
/**
* Store node contents.
*
* @see this.destroy
* @type jQuery
**/
prevContent = $('
').append(node.contents()).attr('class', node.attr('class') || '').attr('style', node.attr('style') || ''),
/**
* Instance ID. Required to get/set cookie
*
* @type String
**/
id = node.attr('id') || '',
/**
* Events namespace
*
* @type String
**/
namespace = 'elfinder-' + (id ? id : Math.random().toString().substr(2, 7)),
/**
* Mousedown event
*
* @type String
**/
mousedown = 'mousedown.'+namespace,
/**
* Keydown event
*
* @type String
**/
keydown = 'keydown.'+namespace,
/**
* Keypress event
*
* @type String
**/
keypress = 'keypress.'+namespace,
/**
* Is shortcuts/commands enabled
*
* @type Boolean
**/
enabled = false,
/**
* Store enabled value before ajax request
*
* @type Boolean
**/
prevEnabled = false,
/**
* List of build-in events which mapped into methods with same names
*
* @type Array
**/
events = ['enable', 'disable', 'load', 'open', 'reload', 'select', 'add', 'remove', 'change', 'dblclick', 'getfile', 'lockfiles', 'unlockfiles', 'selectfiles', 'unselectfiles', 'dragstart', 'dragstop', 'search', 'searchend', 'viewchange'],
/**
* Rules to validate data from backend
*
* @type Object
**/
rules = {},
/**
* Current working directory hash
*
* @type String
**/
cwd = '',
/**
* Current working directory options default
*
* @type Object
**/
cwdOptionsDefault = {
path : '',
url : '',
tmbUrl : '',
disabled : [],
separator : '/',
archives : [],
extract : [],
copyOverwrite : true,
uploadOverwrite : true,
uploadMaxSize : 0,
jpgQuality : 100,
tmbCrop : false,
tmb : false // old API
},
/**
* Current working directory options
*
* @type Object
**/
cwdOptions = {},
/**
* Files/dirs cache
*
* @type Object
**/
files = {},
/**
* Files/dirs hash cache of each dirs
*
* @type Object
**/
ownFiles = {},
/**
* Selected files hashes
*
* @type Array
**/
selected = [],
/**
* Events listeners
*
* @type Object
**/
listeners = {},
/**
* Shortcuts
*
* @type Object
**/
shortcuts = {},
/**
* Buffer for copied files
*
* @type Array
**/
clipboard = [],
/**
* Copied/cuted files hashes
* Prevent from remove its from cache.
* Required for dispaly correct files names in error messages
*
* @type Object
**/
remember = {},
/**
* Queue for 'open' requests
*
* @type Array
**/
queue = [],
/**
* Queue for only cwd requests e.g. `tmb`
*
* @type Array
**/
cwdQueue = [],
/**
* Commands prototype
*
* @type Object
**/
base = new self.command(self),
/**
* elFinder node width
*
* @type String
* @default "auto"
**/
width = 'auto',
/**
* elFinder node height
* Number: pixcel or String: Number + "%"
*
* @type Number | String
* @default 400
**/
height = 400,
/**
* Base node object or selector
* Element which is the reference of the height percentage
*
* @type Object|String
* @default null | $(window) (if height is percentage)
**/
heightBase = null,
/**
* MIME type list(Associative array) handled as a text file
*
* @type Object|null
*/
textMimes = null,
/**
* elfinder path for sound played on remove
* @type String
* @default ./sounds/
**/
soundPath = './sounds/',
beeper = $(document.createElement('audio')).hide().appendTo('body')[0],
syncInterval,
autoSyncStop = 0,
uiCmdMapPrev = '',
gcJobRes = null,
open = function(data) {
// NOTES: Do not touch data object
var volumeid, contextmenu, emptyDirs = {}, stayDirs = {},
rmClass, hashes, calc, gc, collapsed, prevcwd;
if (self.api >= 2.1) {
// support volume driver option `uiCmdMap`
self.commandMap = (data.options.uiCmdMap && Object.keys(data.options.uiCmdMap).length)? data.options.uiCmdMap : {};
if (uiCmdMapPrev !== JSON.stringify(self.commandMap)) {
uiCmdMapPrev = JSON.stringify(self.commandMap);
}
} else {
self.options.sync = 0;
}
if (data.init) {
// init - reset cache
files = {};
ownFiles = {};
} else {
// remove only files from prev cwd
// and collapsed directory (included 100+ directories) to empty for perfomance tune in DnD
prevcwd = cwd;
rmClass = 'elfinder-subtree-loaded ' + self.res('class', 'navexpand');
collapsed = self.res('class', 'navcollapse');
hashes = Object.keys(files);
calc = function(i) {
if (!files[i]) {
return true;
}
var isDir = (files[i].mime === 'directory'),
phash = files[i].phash,
pnav;
if (
(!isDir
|| emptyDirs[phash]
|| (!stayDirs[phash]
&& $('#'+self.navHash2Id(files[i].hash)).is(':hidden')
&& $('#'+self.navHash2Id(phash)).next('.elfinder-navbar-subtree').children().length > 100
)
)
&& (isDir || phash !== cwd)
&& ! remember[i]
) {
if (isDir && !emptyDirs[phash]) {
emptyDirs[phash] = true;
$('#'+self.navHash2Id(phash))
.removeClass(rmClass)
.next('.elfinder-navbar-subtree').empty();
}
deleteCache(files[i]);
} else if (isDir) {
stayDirs[phash] = true;
}
};
gc = function() {
if (hashes.length) {
gcJobRes && gcJobRes._abort();
gcJobRes = self.asyncJob(calc, hashes, {
interval : 20,
numPerOnce : 100
});
}
};
self.trigger('filesgc').one('filesgc', function() {
hashes = [];
});
self.one('opendone', function() {
if (prevcwd !== cwd) {
if (! node.data('lazycnt')) {
gc();
} else {
self.one('lazydone', gc);
}
}
});
}
self.sorters = [];
cwd = data.cwd.hash;
cache(data.files);
if (!files[cwd]) {
cache([data.cwd]);
}
self.lastDir(cwd);
self.autoSync();
},
/**
* Store info about files/dirs in "files" object.
*
* @param Array files
* @param String data type
* @return void
**/
cache = function(data, type) {
var defsorter = { name: true, perm: true, date: true, size: true, kind: true },
sorterChk = (self.sorters.length === 0),
l = data.length,
setSorter = function(file) {
var f = file || {};
self.sorters = [];
$.each(self.sortRules, function(key) {
if (defsorter[key] || typeof f[key] !== 'undefined' || (key === 'mode' && typeof f.perm !== 'undefined')) {
self.sorters.push(key);
}
});
},
keeps = ['sizeInfo'],
changedParents = {},
f, i, keepProp, parents;
for (i = 0; i < l; i++) {
f = Object.assign({}, data[i]);
if (f.name && f.hash && f.mime) {
if (sorterChk && f.phash === cwd) {
setSorter(f);
sorterChk = false;
}
if (f.phash && (type === 'add' || type === 'change')) {
if (parents = self.parents(f.phash)) {
$.each(parents, function() {
changedParents[this] = true;
});
}
}
if (files[f.hash]) {
$.each(keeps, function() {
if(files[f.hash][this] && ! f[this]) {
f[this] = files[f.hash][this];
}
});
if (f.sizeInfo && !f.size) {
f.size = f.sizeInfo.size;
}
deleteCache(files[f.hash], true);
}
files[f.hash] = f;
if (f.mime === 'directory' && !ownFiles[f.hash]) {
ownFiles[f.hash] = {};
}
if (f.phash) {
if (!ownFiles[f.phash]) {
ownFiles[f.phash] = {};
}
ownFiles[f.phash][f.hash] = true;
}
}
}
// delete sizeInfo cache
$.each(Object.keys(changedParents), function() {
var target = files[this];
if (target && target.sizeInfo) {
delete target.sizeInfo;
}
});
// for empty folder
sorterChk && setSorter();
},
/**
* Delete file object from files caches
*
* @param Array removed hashes
* @return void
*/
remove = function(removed) {
var l = removed.length,
roots = {},
rm = function(hash) {
var file = files[hash], i;
if (file) {
if (file.mime === 'directory') {
if (roots[hash]) {
delete self.roots[roots[hash]];
}
// restore stats of deleted root parent directory
$.each(self.leafRoots, function(phash, roots) {
var idx, pdir;
if ((idx = $.inArray(hash, roots))!== -1) {
if (roots.length === 1) {
if ((pdir = Object.assign({}, files[phash])) && pdir._realStats) {
$.each(pdir._realStats, function(k, v) {
pdir[k] = v;
});
remove(files[phash]._realStats);
self.change({ changed: [pdir] });
}
delete self.leafRoots[phash];
} else {
self.leafRoots[phash].splice(idx, 1);
}
}
});
if (self.searchStatus.state < 2) {
$.each(files, function(h, f) {
f.phash == hash && rm(h);
});
}
}
if (file.phash) {
if (parents = self.parents(file.phash)) {
$.each(parents, function() {
changedParents[this] = true;
});
}
}
deleteCache(files[hash]);
}
},
changedParents = {},
parents;
$.each(self.roots, function(k, v) {
roots[v] = k;
});
while (l--) {
rm(removed[l]);
}
// delete sizeInfo cache
$.each(Object.keys(changedParents), function() {
var target = files[this];
if (target && target.sizeInfo) {
delete target.sizeInfo;
}
});
},
/**
* Update file object in files caches
*
* @param Array changed file objects
* @return void
*/
change = function(changed) {
$.each(changed, function(i, file) {
var hash = file.hash;
if (files[hash]) {
$.each(Object.keys(files[hash]), function(i, v){
if (typeof file[v] === 'undefined') {
delete files[hash][v];
}
});
}
files[hash] = files[hash] ? Object.assign(files[hash], file) : file;
});
},
/**
* Delete cache data of files, ownFiles and self.optionsByHashes
*
* @param Object file
* @param Boolean update
* @return void
*/
deleteCache = function(file, update) {
var hash = file.hash,
phash = file.phash;
if (phash && ownFiles[phash]) {
delete ownFiles[phash][hash];
}
if (!update) {
ownFiles[hash] && delete ownFiles[hash];
self.optionsByHashes[hash] && delete self.optionsByHashes[hash];
}
delete files[hash];
},
/**
* Maximum number of concurrent connections on request
*
* @type Number
*/
requestMaxConn,
/**
* Current number of connections
*
* @type Number
*/
requestCnt = 0,
/**
* Queue waiting for connection
*
* @type Array
*/
requestQueue = [],
/**
* Flag to cancel the `open` command waiting for connection
*
* @type Boolean
*/
requestQueueSkipOpen = false,
/**
* Exec shortcut
*
* @param jQuery.Event keydown/keypress event
* @return void
*/
execShortcut = function(e) {
var code = e.keyCode,
ctrlKey = !!(e.ctrlKey || e.metaKey),
ddm;
if (enabled) {
$.each(shortcuts, function(i, shortcut) {
if (shortcut.type == e.type
&& shortcut.keyCode == code
&& shortcut.shiftKey == e.shiftKey
&& shortcut.ctrlKey == ctrlKey
&& shortcut.altKey == e.altKey) {
e.preventDefault();
e.stopPropagation();
shortcut.callback(e, self);
self.debug('shortcut-exec', i+' : '+shortcut.description);
}
});
// prevent tab out of elfinder
if (code == $.ui.keyCode.TAB && !$(e.target).is(':input')) {
e.preventDefault();
}
// cancel any actions by [Esc] key
if (e.type === 'keydown' && code == $.ui.keyCode.ESCAPE) {
// copy or cut
if (! node.find('.ui-widget:visible').length) {
self.clipboard().length && self.clipboard([]);
}
// dragging
if ($.ui.ddmanager) {
ddm = $.ui.ddmanager.current;
ddm && ddm.helper && ddm.cancel();
}
// button menus
node.find('.ui-widget.elfinder-button-menu').hide();
// trigger keydownEsc
self.trigger('keydownEsc', e);
}
}
},
date = new Date(),
utc,
i18n,
inFrame = (window.parent !== window),
parentIframe = (function() {
var pifm, ifms;
if (inFrame) {
try {
ifms = $('iframe', window.parent.document);
if (ifms.length) {
$.each(ifms, function(i, ifm) {
if (ifm.contentWindow === window) {
pifm = $(ifm);
return false;
}
});
}
} catch(e) {}
}
return pifm;
})(),
/**
* elFinder boot up function
*
* @type Function
*/
bootUp,
/**
* Original function of XMLHttpRequest.prototype.send
*
* @type Function
*/
savedXhrSend;
// opts must be an object
if (!opts) {
opts = {};
}
// set UA.Angle, UA.Rotated for mobile devices
if (self.UA.Mobile) {
$(window).on('orientationchange.'+namespace, function() {
var a = ((screen && screen.orientation && screen.orientation.angle) || window.orientation || 0) + 0;
if (a === -90) {
a = 270;
}
self.UA.Angle = a;
self.UA.Rotated = a % 180 === 0? false : true;
}).trigger('orientationchange.'+namespace);
}
// check opt.bootCallback
if (opts.bootCallback && typeof opts.bootCallback === 'function') {
(function() {
var func = bootCallback,
opFunc = opts.bootCallback;
bootCallback = function(fm, extraObj) {
func && typeof func === 'function' && func.call(this, fm, extraObj);
opFunc.call(this, fm, extraObj);
};
})();
}
delete opts.bootCallback;
/**
* Protocol version
*
* @type String
**/
this.api = null;
/**
* elFinder use new api
*
* @type Boolean
**/
this.newAPI = false;
/**
* elFinder use old api
*
* @type Boolean
**/
this.oldAPI = false;
/**
* Net drivers names
*
* @type Array
**/
this.netDrivers = [];
/**
* Base URL of elfFinder library starting from Manager HTML
*
* @type String
*/
this.baseUrl = '';
/**
* Is elFinder CSS loaded
*
* @type Boolean
*/
this.cssloaded = false;
/**
* Callback function at boot up that option specified at elFinder starting
*
* @type Function
*/
this.bootCallback;
/**
* Configuration options
*
* @type Object
**/
//this.options = $.extend(true, {}, this._options, opts);
this.options = Object.assign({}, this._options);
// for old type configuration
if (opts.uiOptions) {
if (opts.uiOptions.toolbar && Array.isArray(opts.uiOptions.toolbar)) {
if ($.isPlainObject(opts.uiOptions.toolbar[opts.uiOptions.toolbar.length - 1])) {
self.options.uiOptions.toolbarExtra = Object.assign(self.options.uiOptions.toolbarExtra || {}, opts.uiOptions.toolbar.pop());
}
}
}
// Overwrite if opts value is an array
(function() {
var arrOv = function(obj, base) {
if ($.isPlainObject(obj)) {
$.each(obj, function(k, v) {
if ($.isPlainObject(v)) {
if (!base[k]) {
base[k] = {};
}
arrOv(v, base[k]);
} else {
base[k] = v;
}
});
}
};
arrOv(opts, self.options);
})();
// join toolbarExtra to toolbar
this.options.uiOptions.toolbar.push(this.options.uiOptions.toolbarExtra);
delete this.options.uiOptions.toolbarExtra;
// set fm.baseUrl
this.baseUrl = (function() {
var myTag, myCss, base, baseUrl;
if (self.options.baseUrl) {
return self.options.baseUrl;
} else {
baseUrl = '';
myTag = $('head > script[src$="js/elfinder.min.js"],script[src$="js/elfinder.full.js"]:first');
if (myTag.length) {
myCss = $('head > link[href$="css/elfinder.min.css"],link[href$="css/elfinder.full.css"]:first').length;
if (! myCss) {
// to request CSS auto loading
self.cssloaded = null;
}
baseUrl = myTag.attr('src').replace(/js\/[^\/]+$/, '');
if (! baseUrl.match(/^(https?\/\/|\/)/)) {
// check tag
if (base = $('head > base[href]').attr('href')) {
baseUrl = base.replace(/\/$/, '') + '/' + baseUrl;
}
}
}
if (baseUrl !== '') {
self.options.baseUrl = baseUrl;
} else {
if (! self.options.baseUrl) {
self.options.baseUrl = './';
}
baseUrl = self.options.baseUrl;
}
return baseUrl;
}
})();
// set dispInlineRegex
cwdOptionsDefault['dispInlineRegex'] = this.options.dispInlineRegex;
// auto load required CSS
if (this.options.cssAutoLoad) {
(function() {
var baseUrl = self.baseUrl;
if (self.cssloaded === null) {
// hide elFinder node while css loading
node.data('cssautoloadHide', $(''));
$('head').append(node.data('cssautoloadHide'));
// load CSS
self.loadCss([baseUrl+'css/elfinder.min.css', baseUrl+'css/theme.css']);
// additional CSS files
if (Array.isArray(self.options.cssAutoLoad)) {
self.loadCss(self.options.cssAutoLoad);
}
}
self.options.cssAutoLoad = false;
})();
}
/**
* Volume option to set the properties of the root Stat
*
* @type Object
*/
this.optionProperties = {
icon: void(0),
csscls: void(0),
tmbUrl: void(0),
uiCmdMap: {},
netkey: void(0),
disabled: []
};
if (! inFrame && ! this.options.enableAlways && $('body').children().length === 2) { // only node and beeper
this.options.enableAlways = true;
}
if (this.baseUrl === '') {
this.baseUrl = this.options.baseUrl? this.options.baseUrl : '';
}
// make options.debug
if (this.options.debug === true) {
this.options.debug = 'all';
} else if (Array.isArray(this.options.debug)) {
(function() {
var d = {};
$.each(self.options.debug, function() {
d[this] = true;
});
self.options.debug = d;
})();
} else {
this.options.debug = false;
}
/**
* Original functions evacuated by conflict check
*
* @type Object
*/
this.noConflicts = {};
/**
* Check and save conflicts with bootstrap etc
*
* @type Function
*/
this.noConflict = function() {
$.each(conflictChecks, function(i, p) {
if ($.fn[p] && typeof $.fn[p].noConflict === 'function') {
self.noConflicts[p] = $.fn[p].noConflict();
}
});
};
// do check conflict
this.noConflict();
/**
* Is elFinder over CORS
*
* @type Boolean
**/
this.isCORS = false;
// configure for CORS
(function(){
if (typeof self.options.cors !== 'undefined' && self.options.cors !== null) {
self.isCORS = self.options.cors? true : false;
} else {
var parseUrl = document.createElement('a'),
parseUploadUrl,
selfProtocol = window.location.protocol,
portReg = function(protocol) {
protocol = (!protocol || protocol === ':')? selfProtocol : protocol;
return protocol === 'https:'? /\:443$/ : /\:80$/;
},
selfHost = window.location.host.replace(portReg(selfProtocol), '');
parseUrl.href = opts.url;
if (opts.urlUpload && (opts.urlUpload !== opts.url)) {
parseUploadUrl = document.createElement('a');
parseUploadUrl.href = opts.urlUpload;
}
if (selfHost !== parseUrl.host.replace(portReg(parseUrl.protocol), '')
|| (parseUrl.protocol !== ':'&& parseUrl.protocol !== '' && (selfProtocol !== parseUrl.protocol))
|| (parseUploadUrl &&
(selfHost !== parseUploadUrl.host.replace(portReg(parseUploadUrl.protocol), '')
|| (parseUploadUrl.protocol !== ':' && parseUploadUrl.protocol !== '' && (selfProtocol !== parseUploadUrl.protocol))
)
)
) {
self.isCORS = true;
}
}
if (self.isCORS) {
if (!$.isPlainObject(self.options.customHeaders)) {
self.options.customHeaders = {};
}
if (!$.isPlainObject(self.options.xhrFields)) {
self.options.xhrFields = {};
}
self.options.requestType = 'post';
self.options.customHeaders['X-Requested-With'] = 'XMLHttpRequest';
self.options.xhrFields['withCredentials'] = true;
}
})();
/**
* Ajax request type
*
* @type String
* @default "get"
**/
this.requestType = /^(get|post)$/i.test(this.options.requestType) ? this.options.requestType.toLowerCase() : 'get';
// set `requestMaxConn` by option
requestMaxConn = Math.max(parseInt(this.options.requestMaxConn), 1);
/**
* Custom data that given as options
*
* @type Object
* @default {}
*/
this.optsCustomData = $.isPlainObject(this.options.customData) ? this.options.customData : {};
/**
* Any data to send across every ajax request
*
* @type Object
* @default {}
**/
this.customData = Object.assign({}, this.optsCustomData);
/**
* Previous custom data from connector
*
* @type Object|null
*/
this.prevCustomData = null;
/**
* Any custom headers to send across every ajax request
*
* @type Object
* @default {}
*/
this.customHeaders = $.isPlainObject(this.options.customHeaders) ? this.options.customHeaders : {};
/**
* Any custom xhrFields to send across every ajax request
*
* @type Object
* @default {}
*/
this.xhrFields = $.isPlainObject(this.options.xhrFields) ? this.options.xhrFields : {};
/**
* Replace XMLHttpRequest.prototype.send to extended function for 3rd party libs XHR request etc.
*
* @type Function
*/
this.replaceXhrSend = function() {
if (! savedXhrSend) {
savedXhrSend = XMLHttpRequest.prototype.send;
}
XMLHttpRequest.prototype.send = function() {
var xhr = this;
// set request headers
if (self.customHeaders) {
$.each(self.customHeaders, function(key) {
xhr.setRequestHeader(key, this);
});
}
// set xhrFields
if (self.xhrFields) {
$.each(self.xhrFields, function(key) {
if (key in xhr) {
xhr[key] = this;
}
});
}
return savedXhrSend.apply(this, arguments);
};
};
/**
* Restore saved original XMLHttpRequest.prototype.send
*
* @type Function
*/
this.restoreXhrSend = function() {
savedXhrSend && (XMLHttpRequest.prototype.send = savedXhrSend);
};
/**
* command names for into queue for only cwd requests
* these commands aborts before `open` request
*
* @type Array
* @default ['tmb', 'parents']
*/
this.abortCmdsOnOpen = this.options.abortCmdsOnOpen || ['tmb', 'parents'];
/**
* ID. Required to create unique cookie name
*
* @type String
**/
this.id = id;
/**
* ui.nav id prefix
*
* @type String
*/
this.navPrefix = 'nav' + (elFinder.prototype.uniqueid? elFinder.prototype.uniqueid : '') + '-';
/**
* ui.cwd id prefix
*
* @type String
*/
this.cwdPrefix = elFinder.prototype.uniqueid? ('cwd' + elFinder.prototype.uniqueid + '-') : '';
// Increment elFinder.prototype.uniqueid
++elFinder.prototype.uniqueid;
/**
* URL to upload files
*
* @type String
**/
this.uploadURL = opts.urlUpload || opts.url;
/**
* Events namespace
*
* @type String
**/
this.namespace = namespace;
/**
* Today timestamp
*
* @type Number
**/
this.today = (new Date(date.getFullYear(), date.getMonth(), date.getDate())).getTime()/1000;
/**
* Yesterday timestamp
*
* @type Number
**/
this.yesterday = this.today - 86400;
utc = this.options.UTCDate ? 'UTC' : '';
this.getHours = 'get'+utc+'Hours';
this.getMinutes = 'get'+utc+'Minutes';
this.getSeconds = 'get'+utc+'Seconds';
this.getDate = 'get'+utc+'Date';
this.getDay = 'get'+utc+'Day';
this.getMonth = 'get'+utc+'Month';
this.getFullYear = 'get'+utc+'FullYear';
/**
* elFinder node z-index (auto detect on elFinder load)
*
* @type null | Number
**/
this.zIndex;
/**
* Current search status
*
* @type Object
*/
this.searchStatus = {
state : 0, // 0: search ended, 1: search started, 2: in search result
query : '',
target : '',
mime : '',
mixed : false, // in multi volumes search: false or Array that target volume ids
ininc : false // in incremental search
};
/**
* Method to store/fetch data
*
* @type Function
**/
this.storage = (function() {
try {
if ('localStorage' in window && window['localStorage'] !== null) {
if (self.UA.Safari) {
// check for Mac/iOS safari private browsing mode
window.localStorage.setItem('elfstoragecheck', 1);
window.localStorage.removeItem('elfstoragecheck');
}
return self.localStorage;
} else {
return self.cookie;
}
} catch (e) {
return self.cookie;
}
})();
/**
* Interface language
*
* @type String
* @default "en"
**/
this.lang = this.storage('lang') || this.options.lang;
if (this.lang === 'jp') {
this.lang = this.options.lang = 'ja';
}
this.viewType = this.storage('view') || this.options.defaultView || 'icons';
this.sortType = this.storage('sortType') || this.options.sortType || 'name';
this.sortOrder = this.storage('sortOrder') || this.options.sortOrder || 'asc';
this.sortStickFolders = this.storage('sortStickFolders');
if (this.sortStickFolders === null) {
this.sortStickFolders = !!this.options.sortStickFolders;
} else {
this.sortStickFolders = !!this.sortStickFolders;
}
this.sortAlsoTreeview = this.storage('sortAlsoTreeview');
if (this.sortAlsoTreeview === null) {
this.sortAlsoTreeview = !!this.options.sortAlsoTreeview;
} else {
this.sortAlsoTreeview = !!this.sortAlsoTreeview;
}
this.sortRules = $.extend(true, {}, this._sortRules, this.options.sortRules);
$.each(this.sortRules, function(name, method) {
if (typeof method != 'function') {
delete self.sortRules[name];
}
});
this.compare = $.proxy(this.compare, this);
/**
* Delay in ms before open notification dialog
*
* @type Number
* @default 500
**/
this.notifyDelay = this.options.notifyDelay > 0 ? parseInt(this.options.notifyDelay) : 500;
/**
* Dragging UI Helper object
*
* @type jQuery | null
**/
this.draggingUiHelper = null;
/**
* Base droppable options
*
* @type Object
**/
this.droppable = {
greedy : true,
tolerance : 'pointer',
accept : '.elfinder-cwd-file-wrapper,.elfinder-navbar-dir,.elfinder-cwd-file,.elfinder-cwd-filename',
hoverClass : this.res('class', 'adroppable'),
classes : { // Deprecated hoverClass jQueryUI>=1.12.0
'ui-droppable-hover': this.res('class', 'adroppable')
},
autoDisable: true, // elFinder original, see jquery.elfinder.js
drop : function(e, ui) {
var dst = $(this),
targets = $.grep(ui.helper.data('files')||[], function(h) { return h? true : false; }),
result = [],
dups = [],
faults = [],
isCopy = ui.helper.hasClass('elfinder-drag-helper-plus'),
c = 'class',
cnt, hash, i, h;
if (typeof e.button === 'undefined' || ui.helper.data('namespace') !== namespace || ! self.insideWorkzone(e.pageX, e.pageY)) {
return false;
}
if (dst.hasClass(self.res(c, 'cwdfile'))) {
hash = self.cwdId2Hash(dst.attr('id'));
} else if (dst.hasClass(self.res(c, 'navdir'))) {
hash = self.navId2Hash(dst.attr('id'));
} else {
hash = cwd;
}
cnt = targets.length;
while (cnt--) {
h = targets[cnt];
// ignore drop into itself or in own location
if (h != hash && files[h].phash != hash) {
result.push(h);
} else {
((isCopy && h !== hash && files[hash].write)? dups : faults).push(h);
}
}
if (faults.length) {
return false;
}
ui.helper.data('droped', true);
if (dups.length) {
ui.helper.hide();
self.exec('duplicate', dups, {_userAction: true});
}
if (result.length) {
ui.helper.hide();
self.clipboard(result, !isCopy);
self.exec('paste', hash, {_userAction: true}, hash).always(function(){
self.clipboard([]);
self.trigger('unlockfiles', {files : targets});
});
self.trigger('drop', {files : targets});
}
}
};
/**
* Return true if filemanager is active
*
* @return Boolean
**/
this.enabled = function() {
return enabled && this.visible();
};
/**
* Return true if filemanager is visible
*
* @return Boolean
**/
this.visible = function() {
return node[0].elfinder && node.is(':visible');
};
/**
* Return file is root?
*
* @param Object target file object
* @return Boolean
*/
this.isRoot = function(file) {
return (file.isroot || ! file.phash)? true : false;
};
/**
* Return root dir hash for current working directory
*
* @param String target hash
* @param Boolean include fake parent (optional)
* @return String
*/
this.root = function(hash, fake) {
hash = hash || cwd;
var dir, i;
if (! fake) {
$.each(self.roots, function(id, rhash) {
if (hash.indexOf(id) === 0) {
dir = rhash;
return false;
}
});
if (dir) {
return dir;
}
}
dir = files[hash];
while (dir && dir.phash && (fake || ! dir.isroot)) {
dir = files[dir.phash];
}
if (dir) {
return dir.hash;
}
while (i in files && files.hasOwnProperty(i)) {
dir = files[i];
if (dir.mime === 'directory' && !dir.phash && dir.read) {
return dir.hash;
}
}
return '';
};
/**
* Return current working directory info
*
* @return Object
*/
this.cwd = function() {
return files[cwd] || {};
};
/**
* Return required cwd option
*
* @param String option name
* @param String target hash (optional)
* @return mixed
*/
this.option = function(name, target) {
var res, item;
target = target || cwd;
if (self.optionsByHashes[target] && typeof self.optionsByHashes[target][name] !== 'undefined') {
return self.optionsByHashes[target][name];
}
if (self.hasVolOptions && cwd !== target && (!(item = self.file(target)) || item.phash !== cwd)) {
res = '';
$.each(self.volOptions, function(id, opt) {
if (target.indexOf(id) === 0) {
res = opt[name] || '';
return false;
}
});
return res;
} else {
return cwdOptions[name] || '';
}
};
/**
* Return disabled commands by each folder
*
* @param Array target hashes
* @return Array
*/
this.getDisabledCmds = function(targets, flip) {
var disabled = {'hidden': true};
if (! Array.isArray(targets)) {
targets = [ targets ];
}
$.each(targets, function(i, h) {
var disCmds = self.option('disabledFlip', h);
if (disCmds) {
Object.assign(disabled, disCmds);
}
});
return flip? disabled : Object.keys(disabled);
};
/**
* Return file data from current dir or tree by it's hash
*
* @param String file hash
* @return Object
*/
this.file = function(hash) {
return hash? files[hash] : void(0);
};
/**
* Return all cached files
*
* @param String parent hash
* @return Object
*/
this.files = function(phash) {
var items = {};
if (phash) {
if (!ownFiles[phash]) {
return {};
}
$.each(ownFiles[phash], function(h) {
if (files[h]) {
items[h] = files[h];
} else {
delete ownFiles[phash][h];
}
});
return Object.assign({}, items);
}
return Object.assign({}, files);
};
/**
* Return list of file parents hashes include file hash
*
* @param String file hash
* @return Array
*/
this.parents = function(hash) {
var parents = [],
dir;
while (hash && (dir = this.file(hash))) {
parents.unshift(dir.hash);
hash = dir.phash;
}
return parents;
};
this.path2array = function(hash, i18) {
var file,
path = [];
while (hash) {
if ((file = files[hash]) && file.hash) {
path.unshift(i18 && file.i18 ? file.i18 : file.name);
hash = file.isroot? null : file.phash;
} else {
path = [];
break;
}
}
return path;
};
/**
* Return file path or Get path async with jQuery.Deferred
*
* @param Object file
* @param Boolean i18
* @param Object asyncOpt
* @return String|jQuery.Deferred
*/
this.path = function(hash, i18, asyncOpt) {
var path = files[hash] && files[hash].path
? files[hash].path
: this.path2array(hash, i18).join(cwdOptions.separator);
if (! asyncOpt || ! files[hash]) {
return path;
} else {
asyncOpt = Object.assign({notify: {type : 'parents', cnt : 1, hideCnt : true}}, asyncOpt);
var dfd = $.Deferred(),
notify = asyncOpt.notify,
noreq = false,
req = function() {
self.request({
data : {cmd : 'parents', target : files[hash].phash},
notify : notify,
preventFail : true
})
.done(done)
.fail(function() {
dfd.reject();
});
},
done = function() {
self.one('parentsdone', function() {
path = self.path(hash, i18);
if (path === '' && noreq) {
//retry with request
noreq = false;
req();
} else {
if (notify) {
clearTimeout(ntftm);
notify.cnt = -(parseInt(notify.cnt || 0));
self.notify(notify);
}
dfd.resolve(path);
}
});
},
ntftm;
if (path) {
return dfd.resolve(path);
} else {
if (self.ui['tree']) {
// try as no request
if (notify) {
ntftm = setTimeout(function() {
self.notify(notify);
}, self.notifyDelay);
}
noreq = true;
done(true);
} else {
req();
}
return dfd;
}
}
};
/**
* Return file url if set
*
* @param String file hash
* @param Object Options
* @return String
*/
this.url = function(hash, o) {
var file = files[hash],
opts = o || {},
async = opts.async || false,
temp = opts.temporary || false,
dfrd = async? $.Deferred() : null,
getUrl = function(url) {
if (url) {
return url;
}
if (file.url) {
return file.url;
}
baseUrl = self.option('url', file.phash || file.hash);
if (baseUrl) {
return baseUrl + $.map(self.path2array(hash), function(n) { return encodeURIComponent(n); }).slice(1).join('/');
}
var params = Object.assign({}, self.customData, {
cmd: 'file',
target: file.hash
});
if (self.oldAPI) {
params.cmd = 'open';
params.current = file.phash;
}
return self.options.url + (self.options.url.indexOf('?') === -1 ? '?' : '&') + $.param(params, true);
},
baseUrl, res;
if (!file || !file.read) {
return async? dfrd.resolve('') : '';
}
if (file.url == '1') {
this.request({
data : { cmd : 'url', target : hash, options : { temporary: temp? 1 : 0 } },
preventDefault : true,
options: {async: async},
notify: async? {type : temp? 'file' : 'url', cnt : 1, hideCnt : true} : {}
})
.done(function(data) {
file.url = data.url || '';
})
.fail(function() {
file.url = '';
})
.always(function() {
var url;
if (file.url && temp) {
url = file.url;
file.url = '1'; // restore
}
if (async) {
dfrd.resolve(getUrl(url));
} else {
return getUrl(url);
}
});
} else {
if (async) {
dfrd.resolve(getUrl());
} else {
return getUrl();
}
}
if (async) {
return dfrd;
}
};
/**
* Return file url for open in elFinder
*
* @param String file hash
* @param Boolean for download link
* @return String
*/
this.openUrl = function(hash, download) {
var file = files[hash],
url = '';
if (!file || !file.read) {
return '';
}
if (!download) {
if (file.url) {
if (file.url != 1) {
url = file.url;
}
} else if (cwdOptions.url && file.hash.indexOf(self.cwd().volumeid) === 0) {
url = cwdOptions.url + $.map(this.path2array(hash), function(n) { return encodeURIComponent(n); }).slice(1).join('/');
}
if (url) {
url += (url.match(/\?/)? '&' : '?') + '_'.repeat((url.match(/[\?&](_+)t=/g) || ['&t=']).sort().shift().match(/[\?&](_*)t=/)[1].length + 1) + 't=' + (file.ts || parseInt(+new Date()/1000));
return url;
}
}
url = this.options.url;
url = url + (url.indexOf('?') === -1 ? '?' : '&')
+ (this.oldAPI ? 'cmd=open¤t='+file.phash : 'cmd=file')
+ '&target=' + file.hash
+ '&_t=' + (file.ts || parseInt(+new Date()/1000));
if (download) {
url += '&download=1';
}
$.each(this.customData, function(key, val) {
url += '&' + encodeURIComponent(key) + '=' + encodeURIComponent(val);
});
return url;
};
/**
* Return thumbnail url
*
* @param Object file object
* @return String
*/
this.tmb = function(file) {
var tmbUrl, tmbCrop,
cls = 'elfinder-cwd-bgurl',
url = '';
if ($.isPlainObject(file)) {
if (self.searchStatus.state && file.hash.indexOf(self.cwd().volumeid) !== 0) {
tmbUrl = self.option('tmbUrl', file.hash);
tmbCrop = self.option('tmbCrop', file.hash);
} else {
tmbUrl = cwdOptions['tmbUrl'];
tmbCrop = cwdOptions['tmbCrop'];
}
if (tmbCrop) {
cls += ' elfinder-cwd-bgurl-crop';
}
if (tmbUrl === 'self' && file.mime.indexOf('image/') === 0) {
url = self.openUrl(file.hash);
cls += ' elfinder-cwd-bgself';
} else if ((self.oldAPI || tmbUrl) && file && file.tmb && file.tmb != 1) {
url = tmbUrl + file.tmb;
} else if (self.newAPI && file && file.tmb && file.tmb != 1) {
url = file.tmb;
}
if (url) {
if (file.ts) {
url += (url.match(/\?/)? '&' : '?') + '_t=' + file.ts;
}
return { url: url, className: cls };
}
}
return false;
};
/**
* Return selected files hashes
*
* @return Array
**/
this.selected = function() {
return selected.slice(0);
};
/**
* Return selected files info
*
* @return Array
*/
this.selectedFiles = function() {
return $.map(selected, function(hash) { return files[hash] ? Object.assign({}, files[hash]) : null; });
};
/**
* Return true if file with required name existsin required folder
*
* @param String file name
* @param String parent folder hash
* @return Boolean
*/
this.fileByName = function(name, phash) {
var hash;
for (hash in files) {
if (files.hasOwnProperty(hash) && files[hash].phash == phash && files[hash].name == name) {
return files[hash];
}
}
};
/**
* Valid data for required command based on rules
*
* @param String command name
* @param Object cammand's data
* @return Boolean
*/
this.validResponse = function(cmd, data) {
return data.error || this.rules[this.rules[cmd] ? cmd : 'defaults'](data);
};
/**
* Return bytes from ini formated size
*
* @param String ini formated size
* @return Integer
*/
this.returnBytes = function(val) {
var last;
if (isNaN(val)) {
if (! val) {
val = '';
}
// for ex. 1mb, 1KB
val = val.replace(/b$/i, '');
last = val.charAt(val.length - 1).toLowerCase();
val = val.replace(/[tgmk]$/i, '');
if (last == 't') {
val = val * 1024 * 1024 * 1024 * 1024;
} else if (last == 'g') {
val = val * 1024 * 1024 * 1024;
} else if (last == 'm') {
val = val * 1024 * 1024;
} else if (last == 'k') {
val = val * 1024;
}
val = isNaN(val)? 0 : parseInt(val);
} else {
val = parseInt(val);
if (val < 1) val = 0;
}
return val;
};
/**
* Process ajax request.
* Fired events :
* @todo
* @example
* @todo
* @return $.Deferred
*/
this.request = function(opts) {
var self = this,
o = this.options,
dfrd = $.Deferred(),
// request ID
reqId = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16),
// request data
data = Object.assign({}, self.customData, {mimes : o.onlyMimes}, opts.data || opts),
// command name
cmd = data.cmd,
// request type is binary
isBinary = (opts.options || {}).dataType === 'binary',
// current cmd is "open"
isOpen = (!opts.asNotOpen && cmd === 'open'),
// call default fail callback (display error dialog) ?
deffail = !(isBinary || opts.preventDefault || opts.preventFail),
// call default success callback ?
defdone = !(isBinary || opts.preventDefault || opts.preventDone),
// options for notify dialog
notify = Object.assign({}, opts.notify),
// make cancel button
cancel = !!opts.cancel,
// do not normalize data - return as is
raw = isBinary || !!opts.raw,
// sync files on request fail
syncOnFail = opts.syncOnFail,
// use lazy()
lazy = !!opts.lazy,
// prepare function before done()
prepare = opts.prepare,
// navigate option object when cmd done
navigate = opts.navigate,
// open notify dialog timeout
timeout,
// use browser cache
useCache = (opts.options || {}).cache,
// request options
options = Object.assign({
url : o.url,
async : true,
type : this.requestType,
dataType : 'json',
cache : (self.api >= 2.1029), // api >= 2.1029 has unique request ID
data : data,
headers : this.customHeaders,
xhrFields: this.xhrFields
}, opts.options || {}),
/**
* Default success handler.
* Call default data handlers and fire event with command name.
*
* @param Object normalized response data
* @return void
**/
done = function(data) {
data.warning && self.error(data.warning);
if (isOpen) {
open(data);
} else {
self.updateCache(data);
}
data.changed && data.changed.length && change(data.changed);
self.lazy(function() {
// fire some event to update cache/ui
data.removed && data.removed.length && self.remove(data);
data.added && data.added.length && self.add(data);
data.changed && data.changed.length && self.change(data);
}).then(function() {
// fire event with command name
return self.lazy(function() {
self.trigger(cmd, data, false);
});
}).then(function() {
// fire event with command name + 'done'
return self.lazy(function() {
self.trigger(cmd + 'done');
});
}).then(function() {
// force update content
data.sync && self.sync();
});
},
/**
* Request error handler. Reject dfrd with correct error message.
*
* @param jqxhr request object
* @param String request status
* @return void
**/
error = function(xhr, status) {
var error, data,
d = self.options.debug;
switch (status) {
case 'abort':
error = xhr.quiet ? '' : ['errConnect', 'errAbort'];
break;
case 'timeout':
error = ['errConnect', 'errTimeout'];
break;
case 'parsererror':
error = ['errResponse', 'errDataNotJSON'];
if (xhr.responseText) {
if (! cwd || (d && (d === 'all' || d['backend-error']))) {
error.push(xhr.responseText);
}
}
break;
default:
if (xhr.responseText) {
// check responseText, Is that JSON?
try {
data = JSON.parse(xhr.responseText);
if (data && data.error) {
error = data.error;
}
} catch(e) {}
}
if (! error) {
if (xhr.status == 403) {
error = ['errConnect', 'errAccess', 'HTTP error ' + xhr.status];
} else if (xhr.status == 404) {
error = ['errConnect', 'errNotFound', 'HTTP error ' + xhr.status];
} else if (xhr.status >= 500) {
error = ['errResponse', 'errServerError', 'HTTP error ' + xhr.status];
} else {
if (xhr.status == 414 && options.type === 'get') {
// retry by POST method
options.type = 'post';
self.abortXHR(xhr);
dfrd.xhr = xhr = self.transport.send(options).fail(error).done(success);
return;
}
error = xhr.quiet ? '' : ['errConnect', 'HTTP error ' + xhr.status];
}
}
}
self.trigger(cmd + 'done');
dfrd.reject(error, xhr, status);
},
/**
* Request success handler. Valid response data and reject/resolve dfrd.
*
* @param Object response data
* @param String request status
* @return void
**/
success = function(response) {
var d = self.options.debug;
// Set currrent request command name
self.currentReqCmd = cmd;
if (response.debug && (!d || d !== 'all')) {
if (!d) {
d = self.options.debug = {};
}
d['backend-error'] = true;
d['warning'] = true;
}
if (raw) {
self.abortXHR(xhr);
response && response.debug && self.debug('backend-debug', response);
return dfrd.resolve(response);
}
if (!response) {
return dfrd.reject(['errResponse', 'errDataEmpty'], xhr, response);
} else if (!$.isPlainObject(response)) {
return dfrd.reject(['errResponse', 'errDataNotJSON'], xhr, response);
} else if (response.error) {
if (isOpen) {
// check leafRoots
$.each(self.leafRoots, function(phash, roots) {
self.leafRoots[phash] = $.grep(roots, function(h) { return h !== data.target; });
});
}
return dfrd.reject(response.error, xhr, response);
}
var resolve = function() {
var pushLeafRoots = function(name) {
if (self.leafRoots[data.target] && response[name]) {
$.each(self.leafRoots[data.target], function(i, h) {
var root;
if (root = self.file(h)) {
response[name].push(root);
}
});
}
},
setTextMimes = function() {
self.textMimes = {};
$.each(self.resources.mimes.text, function() {
self.textMimes[this] = true;
});
},
actionTarget;
if (isOpen) {
pushLeafRoots('files');
} else if (cmd === 'tree') {
pushLeafRoots('tree');
}
response = self.normalize(response);
if (!self.validResponse(cmd, response)) {
return dfrd.reject((response.norError || 'errResponse'), xhr, response);
}
if (!self.api) {
self.api = response.api || 1;
if (self.api == '2.0' && typeof response.options.uploadMaxSize !== 'undefined') {
self.api = '2.1';
}
self.newAPI = self.api >= 2;
self.oldAPI = !self.newAPI;
}
if (response.textMimes && Array.isArray(response.textMimes)) {
self.resources.mimes.text = response.textMimes;
setTextMimes();
}
!self.textMimes && setTextMimes();
if (response.options) {
cwdOptions = Object.assign({}, cwdOptionsDefault, response.options);
}
if (response.netDrivers) {
self.netDrivers = response.netDrivers;
}
if (response.maxTargets) {
self.maxTargets = response.maxTargets;
}
if (isOpen && !!data.init) {
self.uplMaxSize = self.returnBytes(response.uplMaxSize);
self.uplMaxFile = !!response.uplMaxFile? parseInt(response.uplMaxFile) : 20;
}
if (typeof prepare === 'function') {
prepare(response);
}
if (navigate) {
actionTarget = navigate.target || 'added';
if (response[actionTarget] && response[actionTarget].length) {
self.one(cmd + 'done', function() {
var targets = response[actionTarget],
newItems = self.findCwdNodes(targets),
inCwdHashes = function() {
var cwdHash = self.cwd().hash;
return $.map(targets, function(f) { return (f.phash && cwdHash === f.phash)? f.hash : null; });
},
hashes = inCwdHashes(),
makeToast = function(t) {
var node = void(0),
data = t.action? t.action.data : void(0),
cmd, msg, done;
if ((data || hashes.length) && t.action && (msg = t.action.msg) && (cmd = t.action.cmd) && (!t.action.cwdNot || t.action.cwdNot !== self.cwd().hash)) {
done = t.action.done;
data = t.action.data;
node = $('
')
.append(
$(''
+self.i18n(msg)
+' ')
.on('mouseenter mouseleave', function(e) {
$(this).toggleClass('ui-state-hover', e.type == 'mouseenter');
})
.on('click', function() {
self.exec(cmd, data || hashes, {_userAction: true, _currentType: 'toast', _currentNode: $(this) });
if (done) {
self.one(cmd+'done', function() {
if (typeof done === 'function') {
done();
} else if (done === 'select') {
self.trigger('selectfiles', {files : inCwdHashes()});
}
});
}
})
);
}
delete t.action;
t.extNode = node;
return t;
};
if (! navigate.toast) {
navigate.toast = {};
}
!navigate.noselect && self.trigger('selectfiles', {files : self.searchStatus.state > 1 ? $.map(targets, function(f) { return f.hash; }) : hashes});
if (newItems.length) {
if (!navigate.noscroll) {
newItems.first().trigger('scrolltoview', {blink : false});
self.resources.blink(newItems, 'lookme');
}
if ($.isPlainObject(navigate.toast.incwd)) {
self.toast(makeToast(navigate.toast.incwd));
}
} else {
if ($.isPlainObject(navigate.toast.inbuffer)) {
self.toast(makeToast(navigate.toast.inbuffer));
}
}
});
}
}
dfrd.resolve(response);
response.debug && self.debug('backend-debug', response);
};
self.abortXHR(xhr);
lazy? self.lazy(resolve) : resolve();
},
xhr, _xhr,
xhrAbort = function(e) {
if (xhr && xhr.state() === 'pending') {
self.abortXHR(xhr, { quiet: true , abort: true });
if (!e || (e.type !== 'unload' && e.type !== 'destroy')) {
self.autoSync();
}
}
},
abort = function(e){
self.trigger(cmd + 'done');
if (e.type == 'autosync') {
if (e.data.action != 'stop') return;
} else if (e.type != 'unload' && e.type != 'destroy' && e.type != 'openxhrabort') {
if (!e.data.added || !e.data.added.length) {
return;
}
}
xhrAbort(e);
},
request = function(mode) {
var queueAbort = function() {
syncOnFail = false;
dfrd.reject();
};
if (mode) {
if (mode === 'cmd') {
return cmd;
}
}
if (isOpen) {
if (requestQueueSkipOpen) {
return dfrd.reject();
}
requestQueueSkipOpen = true;
}
requestCnt++;
dfrd.always(function() {
delete options.headers['X-elFinderReqid'];
}).fail(function(error, xhr, response) {
// unset this cmd queue when user canceling
if (error === 0) {
if (requestQueue.length) {
requestQueue = $.grep(requestQueue, function(req) {
return (req('cmd') === cmd) ? false : true;
});
}
}
xhrAbort();
self.trigger(cmd + 'fail', response);
if (error) {
deffail ? self.error(error) : self.debug('error', self.i18n(error));
}
syncOnFail && self.sync();
});
if (!cmd) {
syncOnFail = false;
return dfrd.reject('errCmdReq');
}
if (self.maxTargets && data.targets && data.targets.length > self.maxTargets) {
syncOnFail = false;
return dfrd.reject(['errMaxTargets', self.maxTargets]);
}
defdone && dfrd.done(done);
// quiet abort not completed "open" requests
if (isOpen) {
while ((_xhr = queue.pop())) {
_xhr.queueAbort();
}
if (cwd !== data.target) {
while ((_xhr = cwdQueue.pop())) {
_xhr.queueAbort();
}
}
}
// trigger abort autoSync for commands to add the item
if ($.inArray(cmd, (self.cmdsToAdd + ' autosync').split(' ')) !== -1) {
if (cmd !== 'autosync') {
self.autoSync('stop');
dfrd.always(function() {
self.autoSync();
});
}
self.trigger('openxhrabort');
}
delete options.preventFail;
if (self.api >= 2.1029) {
if (useCache) {
options.headers['X-elFinderReqid'] = reqId;
} else {
Object.assign(options.data, { reqid : reqId });
}
}
// function for set value of this syncOnFail
dfrd.syncOnFail = function(state) {
syncOnFail = !!state;
};
dfrd.xhr = xhr = self.transport.send(options).always(function() {
--requestCnt;
if (requestQueue.length) {
requestQueue.shift()();
} else {
requestQueueSkipOpen = false;
}
}).fail(error).done(success);
if (self.api >= 2.1029) {
xhr._requestId = reqId;
}
if (isOpen || (data.compare && cmd === 'info')) {
// regist function queueAbort
xhr.queueAbort = queueAbort;
// add autoSync xhr into queue
queue.unshift(xhr);
// bind abort()
data.compare && self.bind(self.cmdsToAdd + ' autosync openxhrabort', abort);
dfrd.always(function() {
var ndx = $.inArray(xhr, queue);
data.compare && self.unbind(self.cmdsToAdd + ' autosync openxhrabort', abort);
ndx !== -1 && queue.splice(ndx, 1);
});
} else if ($.inArray(cmd, self.abortCmdsOnOpen) !== -1) {
// regist function queueAbort
xhr.queueAbort = queueAbort;
// add "open" xhr, only cwd xhr into queue
cwdQueue.unshift(xhr);
dfrd.always(function() {
var ndx = $.inArray(xhr, cwdQueue);
ndx !== -1 && cwdQueue.splice(ndx, 1);
});
}
// abort pending xhr on window unload or elFinder destroy
self.bind('unload destroy', abort);
dfrd.always(function() {
self.unbind('unload destroy', abort);
});
return dfrd;
},
queueingRequest = function() {
// show notify
if (notify.type && notify.cnt) {
if (cancel) {
notify.cancel = dfrd;
opts.eachCancel && (notify.id = +new Date());
}
timeout = setTimeout(function() {
self.notify(notify);
dfrd.always(function() {
notify.cnt = -(parseInt(notify.cnt)||0);
self.notify(notify);
});
}, self.notifyDelay);
dfrd.always(function() {
clearTimeout(timeout);
});
}
// queueing
if (isOpen) {
requestQueueSkipOpen = false;
}
if (requestCnt < requestMaxConn) {
// do request
return request();
} else {
if (isOpen) {
requestQueue.unshift(request);
} else {
requestQueue.push(request);
}
return dfrd;
}
},
bindData = {opts: opts, result: true};
// prevent request initial request is completed
if (!self.api && !data.init) {
syncOnFail = false;
return dfrd.reject();
}
// trigger "request.cmd" that callback be able to cancel request by substituting "false" for "event.data.result"
self.trigger('request.' + cmd, bindData, true);
if (! bindData.result) {
self.trigger(cmd + 'done');
return dfrd.reject();
} else if (typeof bindData.result === 'object' && bindData.result.promise) {
bindData.result
.done(queueingRequest)
.fail(function() {
self.trigger(cmd + 'done');
dfrd.reject();
});
return dfrd;
}
return queueingRequest();
};
/**
* Call cache()
* Store info about files/dirs in "files" object.
*
* @param Array files
* @return void
*/
this.cache = function(dataArray) {
if (! Array.isArray(dataArray)) {
dataArray = [ dataArray ];
}
cache(dataArray);
};
/**
* Update file object caches by respose data object
*
* @param Object respose data object
* @return void
*/
this.updateCache = function(data) {
if ($.isPlainObject(data)) {
data.files && data.files.length && cache(data.files, 'files');
data.tree && data.tree.length && cache(data.tree, 'tree');
data.removed && data.removed.length && remove(data.removed);
data.added && data.added.length && cache(data.added, 'add');
data.changed && data.changed.length && change(data.changed, 'change');
}
};
/**
* Compare current files cache with new files and return diff
*
* @param Array new files
* @param String target folder hash
* @param Array exclude properties to compare
* @return Object
*/
this.diff = function(incoming, onlydir, excludeProps) {
var raw = {},
added = [],
removed = [],
changed = [],
excludes = null,
isChanged = function(hash) {
var l = changed.length;
while (l--) {
if (changed[l].hash == hash) {
return true;
}
}
};
$.each(incoming, function(i, f) {
raw[f.hash] = f;
});
// make excludes object
if (excludeProps && excludeProps.length) {
excludes = {};
$.each(excludeProps, function() {
excludes[this] = true;
});
}
// find removed
$.each(files, function(hash, f) {
if (! raw[hash] && (! onlydir || f.phash === onlydir)) {
removed.push(hash);
}
});
// compare files
$.each(raw, function(hash, file) {
var origin = files[hash],
orgKeys = {},
chkKeyLen;
if (!origin) {
added.push(file);
} else {
// make orgKeys object
$.each(Object.keys(origin), function() {
orgKeys[this] = true;
});
$.each(file, function(prop) {
delete orgKeys[prop];
if (! excludes || ! excludes[prop]) {
if (file[prop] !== origin[prop]) {
changed.push(file);
orgKeys = {};
return false;
}
}
});
chkKeyLen = Object.keys(orgKeys).length;
if (chkKeyLen !== 0) {
if (excludes) {
$.each(orgKeys, function(prop) {
if (excludes[prop]) {
--chkKeyLen;
}
});
}
(chkKeyLen !== 0) && changed.push(file);
}
}
});
// parents of removed dirs mark as changed (required for tree correct work)
$.each(removed, function(i, hash) {
var file = files[hash],
phash = file.phash;
if (phash
&& file.mime == 'directory'
&& $.inArray(phash, removed) === -1
&& raw[phash]
&& !isChanged(phash)) {
changed.push(raw[phash]);
}
});
return {
added : added,
removed : removed,
changed : changed
};
};
/**
* Sync content
*
* @return jQuery.Deferred
*/
this.sync = function(onlydir, polling) {
this.autoSync('stop');
var self = this,
compare = function(){
var c = '', cnt = 0, mtime = 0;
if (onlydir && polling) {
$.each(files, function(h, f) {
if (f.phash && f.phash === onlydir) {
++cnt;
mtime = Math.max(mtime, f.ts);
}
c = cnt+':'+mtime;
});
}
return c;
},
comp = compare(),
dfrd = $.Deferred().done(function() { self.trigger('sync'); }),
opts = [this.request({
data : {cmd : 'open', reload : 1, target : cwd, tree : (! onlydir && this.ui.tree) ? 1 : 0, compare : comp},
preventDefault : true
})],
exParents = function() {
var parents = [],
curRoot = self.file(self.root(cwd)),
curId = curRoot? curRoot.volumeid : null,
phash = self.cwd().phash,
isroot,pdir;
while(phash) {
if (pdir = self.file(phash)) {
if (phash.indexOf(curId) !== 0) {
parents.push( {target: phash, cmd: 'tree'} );
if (! self.isRoot(pdir)) {
parents.push( {target: phash, cmd: 'parents'} );
}
curRoot = self.file(self.root(phash));
curId = curRoot? curRoot.volumeid : null;
}
phash = pdir.phash;
} else {
phash = null;
}
}
return parents;
};
if (! onlydir && self.api >= 2) {
(cwd !== this.root()) && opts.push(this.request({
data : {cmd : 'parents', target : cwd},
preventDefault : true
}));
$.each(exParents(), function(i, data) {
opts.push(self.request({
data : {cmd : data.cmd, target : data.target},
preventDefault : true
}));
});
}
$.when.apply($, opts)
.fail(function(error, xhr) {
if (! polling || $.inArray('errOpen', error) !== -1) {
dfrd.reject(error);
error && self.request({
data : {cmd : 'open', target : (self.lastDir('') || self.root()), tree : 1, init : 1},
notify : {type : 'open', cnt : 1, hideCnt : true}
});
} else {
dfrd.reject((error && xhr.status != 0)? error : void 0);
}
})
.done(function(odata) {
var pdata, argLen, i;
if (odata.cwd.compare) {
if (comp === odata.cwd.compare) {
return dfrd.reject();
}
}
// for 2nd and more requests
pdata = {tree : []};
// results marge of 2nd and more requests
argLen = arguments.length;
if (argLen > 1) {
for(i = 1; i < argLen; i++) {
if (arguments[i].tree && arguments[i].tree.length) {
pdata.tree.push.apply(pdata.tree, arguments[i].tree);
}
}
}
if (self.api < 2.1) {
if (! pdata.tree) {
pdata.tree = [];
}
pdata.tree.push(odata.cwd);
}
// data normalize
odata = self.normalize(odata);
if (!self.validResponse('open', odata)) {
return dfrd.reject((odata.norError || 'errResponse'));
}
pdata = self.normalize(pdata);
if (!self.validResponse('tree', pdata)) {
return dfrd.reject((pdata.norError || 'errResponse'));
}
var diff = self.diff(odata.files.concat(pdata && pdata.tree ? pdata.tree : []), onlydir);
diff.added.push(odata.cwd);
self.updateCache(diff);
// trigger events
diff.removed.length && self.remove(diff);
diff.added.length && self.add(diff);
diff.changed.length && self.change(diff);
return dfrd.resolve(diff);
})
.always(function() {
self.autoSync();
});
return dfrd;
};
this.upload = function(files) {
return this.transport.upload(files, this);
};
/**
* Arrays that has to unbind events
*
* @type Object
*/
this.toUnbindEvents = {};
/**
* Attach listener to events
* To bind to multiply events at once, separate events names by space
*
* @param String event(s) name(s)
* @param Object event handler
* @return elFinder
*/
this.bind = function(event, callback) {
var i, len;
if (typeof(callback) == 'function') {
event = ('' + event).toLowerCase().replace(/^\s+|\s+$/g, '').split(/\s+/);
len = event.length;
for (i = 0; i < len; i++) {
if (listeners[event[i]] === void(0)) {
listeners[event[i]] = [];
}
listeners[event[i]].push(callback);
}
}
return this;
};
/**
* Remove event listener if exists
* To un-bind to multiply events at once, separate events names by space
*
* @param String event(s) name(s)
* @param Function callback
* @return elFinder
*/
this.unbind = function(event, callback) {
var i, len, l, ci;
event = ('' + event).toLowerCase().split(/\s+/);
len = event.length;
for (i = 0; i < len; i++) {
if (l = listeners[event[i]]) {
ci = $.inArray(callback, l);
ci > -1 && l.splice(ci, 1);
}
}
callback = null;
return this;
};
/**
* Fire event - send notification to all event listeners
* In the callback `this` becames an event object
*
* @param String event type
* @param Object data to send across event
* @param Boolean allow modify data (call by reference of data) default: true
* @return elFinder
*/
this.trigger = function(evType, data, allowModify) {
var type = evType.toLowerCase(),
isopen = (type === 'open'),
dataIsObj = (typeof data === 'object'),
handlers = listeners[type] || [], i, l, jst, event;
this.debug('event-'+type, data);
if (! dataIsObj || typeof allowModify === 'undefined') {
allowModify = true;
}
if (l = handlers.length) {
event = $.Event(type);
if (allowModify) {
event.data = data;
}
for (i = 0; i < l; i++) {
if (! handlers[i]) {
// probably un-binded this handler
continue;
}
// set `event.data` only callback has argument
if (handlers[i].length) {
if (!allowModify) {
// to avoid data modifications. remember about "sharing" passing arguments in js :)
if (typeof jst === 'undefined') {
try {
jst = JSON.stringify(data);
} catch(e) {
jst = false;
}
}
event.data = jst? JSON.parse(jst) : data;
}
}
try {
if (handlers[i].call(event, event, this) === false
|| event.isDefaultPrevented()) {
this.debug('event-stoped', event.type);
break;
}
} catch (ex) {
window.console && window.console.log && window.console.log(ex);
}
}
if (this.toUnbindEvents[type] && this.toUnbindEvents[type].length) {
$.each(this.toUnbindEvents[type], function(i, v) {
self.unbind(v.type, v.callback);
});
delete this.toUnbindEvents[type];
}
}
return this;
};
/**
* Get event listeners
*
* @param String event type
* @return Array listed event functions
*/
this.getListeners = function(event) {
return event? listeners[event.toLowerCase()] : listeners;
};
/**
* Bind keybord shortcut to keydown event
*
* @example
* elfinder.shortcut({
* pattern : 'ctrl+a',
* description : 'Select all files',
* callback : function(e) { ... },
* keypress : true|false (bind to keypress instead of keydown)
* })
*
* @param Object shortcut config
* @return elFinder
*/
this.shortcut = function(s) {
var patterns, pattern, code, i, parts;
if (this.options.allowShortcuts && s.pattern && $.isFunction(s.callback)) {
patterns = s.pattern.toUpperCase().split(/\s+/);
for (i= 0; i < patterns.length; i++) {
pattern = patterns[i];
parts = pattern.split('+');
code = (code = parts.pop()).length == 1
? code > 0 ? code : code.charCodeAt(0)
: (code > 0 ? code : $.ui.keyCode[code]);
if (code && !shortcuts[pattern]) {
shortcuts[pattern] = {
keyCode : code,
altKey : $.inArray('ALT', parts) != -1,
ctrlKey : $.inArray('CTRL', parts) != -1,
shiftKey : $.inArray('SHIFT', parts) != -1,
type : s.type || 'keydown',
callback : s.callback,
description : s.description,
pattern : pattern
};
}
}
}
return this;
};
/**
* Registered shortcuts
*
* @type Object
**/
this.shortcuts = function() {
var ret = [];
$.each(shortcuts, function(i, s) {
ret.push([s.pattern, self.i18n(s.description)]);
});
return ret;
};
/**
* Get/set clipboard content.
* Return new clipboard content.
*
* @example
* this.clipboard([]) - clean clipboard
* this.clipboard([{...}, {...}], true) - put 2 files in clipboard and mark it as cutted
*
* @param Array new files hashes
* @param Boolean cut files?
* @return Array
*/
this.clipboard = function(hashes, cut) {
var map = function() { return $.map(clipboard, function(f) { return f.hash; }); };
if (hashes !== void(0)) {
clipboard.length && this.trigger('unlockfiles', {files : map()});
remember = {};
clipboard = $.map(hashes||[], function(hash) {
var file = files[hash];
if (file) {
remember[hash] = true;
return {
hash : hash,
phash : file.phash,
name : file.name,
mime : file.mime,
read : file.read,
locked : file.locked,
cut : !!cut
};
}
return null;
});
this.trigger('changeclipboard', {clipboard : clipboard.slice(0, clipboard.length)});
cut && this.trigger('lockfiles', {files : map()});
}
// return copy of clipboard instead of refrence
return clipboard.slice(0, clipboard.length);
};
/**
* Return true if command enabled
*
* @param String command name
* @param String|void hash for check of own volume's disabled cmds
* @return Boolean
*/
this.isCommandEnabled = function(name, dstHash) {
var disabled, cmd,
cvid = self.cwd().volumeid || '';
// In serach results use selected item hash to check
if (!dstHash && self.searchStatus.state > 1 && self.selected().length) {
dstHash = self.selected()[0];
}
if (dstHash && (! cvid || dstHash.indexOf(cvid) !== 0)) {
disabled = self.option('disabledFlip', dstHash);
//if (! disabled) {
// disabled = {};
//}
} else {
disabled = cwdOptions.disabledFlip/* || {}*/;
}
cmd = this._commands[name];
return cmd ? (cmd.alwaysEnabled || !disabled[name]) : false;
};
/**
* Exec command and return result;
*
* @param String command name
* @param String|Array usualy files hashes
* @param String|Array command options
* @param String|void hash for enabled check of own volume's disabled cmds
* @return $.Deferred
*/
this.exec = function(cmd, files, opts, dstHash) {
var dfrd, resType;
if (cmd === 'open') {
if (this.searchStatus.state || this.searchStatus.ininc) {
this.trigger('searchend', { noupdate: true });
}
this.autoSync('stop');
}
if (!dstHash && files) {
if ($.isArray(files)) {
if (files.length) {
dstHash = files[0];
}
} else {
dstHash = files;
}
}
dfrd = this._commands[cmd] && this.isCommandEnabled(cmd, dstHash)
? this._commands[cmd].exec(files, opts)
: $.Deferred().reject('No such command');
resType = typeof dfrd;
if (!(resType === 'object' && dfrd.promise)) {
self.debug('warning', '"cmd.exec()" should be returned "$.Deferred" but cmd "' + cmd + '" returned "' + resType + '"');
dfrd = $.Deferred().resolve();
}
this.trigger('exec', { dfrd : dfrd, cmd : cmd, files : files, opts : opts, dstHash : dstHash });
return dfrd;
};
/**
* Create and return dialog.
*
* @param String|DOMElement dialog content
* @param Object dialog options
* @return jQuery
*/
this.dialog = function(content, options) {
var dialog = $('
').append(content).appendTo(node).elfinderdialog(options, this),
dnode = dialog.closest('.ui-dialog'),
resize = function(){
! dialog.data('draged') && dialog.is(':visible') && dialog.elfinderdialog('posInit');
};
if (dnode.length) {
self.bind('resize', resize);
dnode.on('remove', function() {
self.unbind('resize', resize);
});
}
return dialog;
};
/**
* Create and return toast.
*
* @param Object toast options - see ui/toast.js
* @return jQuery
*/
this.toast = function(options) {
return $('
').appendTo(this.ui.toast).elfindertoast(options || {}, this);
};
/**
* Return UI widget or node
*
* @param String ui name
* @return jQuery
*/
this.getUI = function(ui) {
return this.ui[ui] || (ui? $() : node);
};
/**
* Return elFinder.command instance or instances array
*
* @param String command name
* @return Object | Array
*/
this.getCommand = function(name) {
return name === void(0) ? this._commands : this._commands[name];
};
/**
* Resize elfinder node
*
* @param String|Number width
* @param String|Number height
* @return void
*/
this.resize = function(w, h) {
var getMargin = function() {
var m = node.outerHeight(true) - node.innerHeight(),
p = node;
while(p.get(0) !== heightBase.get(0)) {
p = p.parent();
m += p.outerHeight(true) - p.innerHeight();
if (! p.parent().length) {
// reached the document
break;
}
}
return m;
},
fit = ! node.hasClass('ui-resizable'),
prv = node.data('resizeSize') || {w: 0, h: 0},
mt, size = {};
if (heightBase && heightBase.data('resizeTm')) {
clearTimeout(heightBase.data('resizeTm'));
}
if (typeof h === 'string') {
if (mt = h.match(/^([0-9.]+)%$/)) {
// setup heightBase
if (! heightBase || ! heightBase.length) {
heightBase = $(window);
}
if (! heightBase.data('marginToMyNode')) {
heightBase.data('marginToMyNode', getMargin());
}
if (! heightBase.data('fitToBaseFunc')) {
heightBase.data('fitToBaseFunc', function(e) {
var tm = heightBase.data('resizeTm');
e.preventDefault();
e.stopPropagation();
tm && clearTimeout(tm);
if (! node.hasClass('elfinder-fullscreen') && (!self.UA.Mobile || heightBase.data('rotated') !== self.UA.Rotated)) {
heightBase.data('rotated', self.UA.Rotated);
heightBase.data('resizeTm', setTimeout(function() {
self.restoreSize();
}, 50));
}
});
}
if (typeof heightBase.data('rotated') === 'undefined') {
heightBase.data('rotated', self.UA.Rotated);
}
h = heightBase.height() * (mt[1] / 100) - heightBase.data('marginToMyNode');
heightBase.off('resize.' + self.namespace, heightBase.data('fitToBaseFunc'));
fit && heightBase.on('resize.' + self.namespace, heightBase.data('fitToBaseFunc'));
}
}
node.css({ width : w, height : parseInt(h) });
size.w = Math.round(node.width());
size.h = Math.round(node.height());
node.data('resizeSize', size);
if (size.w !== prv.w || size.h !== prv.h) {
node.trigger('resize');
this.trigger('resize', {width : size.w, height : size.h});
}
};
/**
* Restore elfinder node size
*
* @return elFinder
*/
this.restoreSize = function() {
this.resize(width, height);
};
this.show = function() {
node.show();
this.enable().trigger('show');
};
this.hide = function() {
if (this.options.enableAlways) {
prevEnabled = enabled;
enabled = false;
}
this.disable().trigger('hide');
node.hide();
};
/**
* Lazy execution function
*
* @param Object function
* @param Number delay
* @param Object options
* @return Object jQuery.Deferred
*/
this.lazy = function(func, delay, opts) {
var busy = function(state) {
var cnt = node.data('lazycnt'),
repaint;
if (state) {
repaint = node.data('lazyrepaint')? false : opts.repaint;
if (! cnt) {
node.data('lazycnt', 1)
.addClass('elfinder-processing');
} else {
node.data('lazycnt', ++cnt);
}
if (repaint) {
node.data('lazyrepaint', true).css('display'); // force repaint
}
} else {
if (cnt && cnt > 1) {
node.data('lazycnt', --cnt);
} else {
repaint = node.data('lazyrepaint');
node.data('lazycnt', 0)
.removeData('lazyrepaint')
.removeClass('elfinder-processing');
repaint && node.css('display'); // force repaint;
self.trigger('lazydone');
}
}
},
dfd = $.Deferred();
delay = delay || 0;
opts = opts || {};
busy(true);
setTimeout(function() {
dfd.resolve(func.call(dfd));
busy(false);
}, delay);
return dfd;
};
/**
* Destroy this elFinder instance
*
* @return void
**/
this.destroy = function() {
if (node && node[0].elfinder) {
node.hasClass('elfinder-fullscreen') && self.toggleFullscreen(node);
this.options.syncStart = false;
this.autoSync('forcestop');
this.trigger('destroy').disable();
clipboard = [];
selected = [];
listeners = {};
shortcuts = {};
$(window).off('.' + namespace);
$(document).off('.' + namespace);
self.trigger = function(){};
$(beeper).remove();
node.off()
.removeData()
.empty()
.append(prevContent.contents())
.attr('class', prevContent.attr('class'))
.attr('style', prevContent.attr('style'));
delete node[0].elfinder;
// restore kept events
$.each(prevEvents, function(n, arr) {
$.each(arr, function(i, o) {
node.on(o.type + (o.namespace? '.'+o.namespace : ''), o.selector, o.handler);
});
});
}
};
/**
* Start or stop auto sync
*
* @param String|Bool stop
* @return void
*/
this.autoSync = function(mode) {
var sync;
if (self.options.sync >= 1000) {
if (syncInterval) {
clearTimeout(syncInterval);
syncInterval = null;
self.trigger('autosync', {action : 'stop'});
}
if (mode === 'stop') {
++autoSyncStop;
} else {
autoSyncStop = Math.max(0, --autoSyncStop);
}
if (autoSyncStop || mode === 'forcestop' || ! self.options.syncStart) {
return;
}
// run interval sync
sync = function(start){
var timeout;
if (cwdOptions.syncMinMs && (start || syncInterval)) {
start && self.trigger('autosync', {action : 'start'});
timeout = Math.max(self.options.sync, cwdOptions.syncMinMs);
syncInterval && clearTimeout(syncInterval);
syncInterval = setTimeout(function() {
var dosync = true, hash = cwd, cts;
if (cwdOptions.syncChkAsTs && files[hash] && (cts = files[hash].ts)) {
self.request({
data : {cmd : 'info', targets : [hash], compare : cts, reload : 1},
preventDefault : true
})
.done(function(data){
var ts;
dosync = true;
if (data.compare) {
ts = data.compare;
if (ts == cts) {
dosync = false;
}
}
if (dosync) {
self.sync(hash).always(function(){
if (ts) {
// update ts for cache clear etc.
files[hash].ts = ts;
}
sync();
});
} else {
sync();
}
})
.fail(function(error, xhr){
if (error && xhr.status != 0) {
self.error(error);
if ($.inArray('errOpen', error) !== -1) {
self.request({
data : {cmd : 'open', target : (self.lastDir('') || self.root()), tree : 1, init : 1},
notify : {type : 'open', cnt : 1, hideCnt : true}
});
}
} else {
syncInterval = setTimeout(function() {
sync();
}, timeout);
}
});
} else {
self.sync(cwd, true).always(function(){
sync();
});
}
}, timeout);
}
};
sync(true);
}
};
/**
* Return bool is inside work zone of specific point
*
* @param Number event.pageX
* @param Number event.pageY
* @return Bool
*/
this.insideWorkzone = function(x, y, margin) {
var rectangle = this.getUI('workzone').data('rectangle');
margin = margin || 1;
if (x < rectangle.left + margin
|| x > rectangle.left + rectangle.width + margin
|| y < rectangle.top + margin
|| y > rectangle.top + rectangle.height + margin) {
return false;
}
return true;
};
/**
* Target ui node move to last of children of elFinder node fot to show front
*
* @param Object target Target jQuery node object
*/
this.toFront = function(target) {
var lastnode = node.children('.ui-front:last');
target = $(target);
/*if (lastnode.get(0) !== target.get(0)) {
target.trigger('beforedommove')
.insertAfter(lastnode)
.trigger('dommove');
}*/
node.children().css('z-index', '');
target.css('z-index', lastnode.css('z-index') + 1);
};
/**
* Return css object for maximize
*
* @return Object
*/
this.getMaximizeCss = function() {
return {
width : '100%',
height : '100%',
margin : 0,
padding : 0,
top : 0,
left : 0,
display : 'block',
position: 'fixed',
zIndex : Math.max(self.zIndex? (self.zIndex + 1) : 0 , 1000),
maxWidth : '',
maxHeight: ''
};
};
// Closure for togglefullscreen
(function() {
// check is in iframe
if (inFrame && self.UA.Fullscreen) {
self.UA.Fullscreen = false;
if (parentIframe && typeof parentIframe.attr('allowfullscreen') !== 'undefined') {
self.UA.Fullscreen = true;
}
}
var orgStyle, bodyOvf, resizeTm, fullElm, exitFull, toFull,
cls = 'elfinder-fullscreen',
clsN = 'elfinder-fullscreen-native',
checkDialog = function() {
var t = 0,
l = 0;
$.each(node.children('.ui-dialog,.ui-draggable'), function(i, d) {
var $d = $(d),
pos = $d.position();
if (pos.top < 0) {
$d.css('top', t);
t += 20;
}
if (pos.left < 0) {
$d.css('left', l);
l += 20;
}
});
},
funcObj = self.UA.Fullscreen? {
// native full screen mode
fullElm: function() {
return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement || null;
},
exitFull: function() {
if (document.exitFullscreen) {
return document.exitFullscreen();
} else if (document.webkitExitFullscreen) {
return document.webkitExitFullscreen();
} else if (document.mozCancelFullScreen) {
return document.mozCancelFullScreen();
} else if (document.msExitFullscreen) {
return document.msExitFullscreen();
}
},
toFull: function(elem) {
if (elem.requestFullscreen) {
return elem.requestFullscreen();
} else if (elem.webkitRequestFullscreen) {
return elem.webkitRequestFullscreen();
} else if (elem.mozRequestFullScreen) {
return elem.mozRequestFullScreen();
} else if (elem.msRequestFullscreen) {
return elem.msRequestFullscreen();
}
return false;
}
} : {
// node element maximize mode
fullElm: function() {
var full;
if (node.hasClass(cls)) {
return node.get(0);
} else {
full = node.find('.' + cls);
if (full.length) {
return full.get(0);
}
}
return null;
},
exitFull: function() {
var elm;
$(window).off('resize.' + namespace, resize);
if (bodyOvf !== void(0)) {
$('body').css('overflow', bodyOvf);
}
bodyOvf = void(0);
if (orgStyle) {
elm = orgStyle.elm;
restoreStyle(elm);
$(elm).trigger('resize', {fullscreen: 'off'});
}
$(window).trigger('resize');
},
toFull: function(elem) {
bodyOvf = $('body').css('overflow') || '';
$('body').css('overflow', 'hidden');
$(elem).css(self.getMaximizeCss())
.addClass(cls)
.trigger('resize', {fullscreen: 'on'});
checkDialog();
$(window).on('resize.' + namespace, resize).trigger('resize');
return true;
}
},
restoreStyle = function(elem) {
if (orgStyle && orgStyle.elm == elem) {
$(elem).removeClass(cls + ' ' + clsN).attr('style', orgStyle.style);
orgStyle = null;
}
},
resize = function(e) {
var elm;
if (e.target === window) {
resizeTm && clearTimeout(resizeTm);
resizeTm = setTimeout(function() {
if (elm = funcObj.fullElm()) {
$(elm).trigger('resize', {fullscreen: 'on'});
}
}, 100);
}
};
$(document).on('fullscreenchange.' + namespace + ' webkitfullscreenchange.' + namespace + ' mozfullscreenchange.' + namespace + ' MSFullscreenChange.' + namespace, function(e){
if (self.UA.Fullscreen) {
var elm = funcObj.fullElm(),
win = $(window);
resizeTm && clearTimeout(resizeTm);
if (elm === null) {
win.off('resize.' + namespace, resize);
if (orgStyle) {
elm = orgStyle.elm;
restoreStyle(elm);
$(elm).trigger('resize', {fullscreen: 'off'});
}
} else {
$(elm).addClass(cls + ' ' + clsN)
.attr('style', 'width:100%; height:100%; margin:0; padding:0;')
.trigger('resize', {fullscreen: 'on'});
win.on('resize.' + namespace, resize);
checkDialog();
}
win.trigger('resize');
}
});
/**
* Toggle Full Scrren Mode
*
* @param Object target
* @param Bool full
* @return Object | Null DOM node object of current full scrren
*/
self.toggleFullscreen = function(target, full) {
var elm = $(target).get(0),
curElm = null;
curElm = funcObj.fullElm();
if (curElm) {
if (curElm == elm) {
if (full === true) {
return curElm;
}
} else {
if (full === false) {
return curElm;
}
}
funcObj.exitFull();
return null;
} else {
if (full === false) {
return null;
}
}
orgStyle = {elm: elm, style: $(elm).attr('style')};
if (funcObj.toFull(elm) !== false) {
return elm;
} else {
orgStyle = null;
return null;
}
};
})();
// Closure for toggleMaximize
(function(){
var cls = 'elfinder-maximized',
resizeTm,
resize = function(e) {
if (e.target === window && e.data && e.data.elm) {
var elm = e.data.elm;
resizeTm && clearTimeout(resizeTm);
resizeTm = setTimeout(function() {
elm.trigger('resize', {maximize: 'on'});
}, 100);
}
},
exitMax = function(elm) {
$(window).off('resize.' + namespace, resize);
$('body').css('overflow', elm.data('bodyOvf'));
elm.removeClass(cls)
.attr('style', elm.data('orgStyle'))
.removeData('bodyOvf')
.removeData('orgStyle');
elm.trigger('resize', {maximize: 'off'});
},
toMax = function(elm) {
elm.data('bodyOvf', $('body').css('overflow') || '')
.data('orgStyle', elm.attr('style'))
.addClass(cls)
.css(self.getMaximizeCss());
$('body').css('overflow', 'hidden');
$(window).on('resize.' + namespace, {elm: elm}, resize);
elm.trigger('resize', {maximize: 'on'});
};
/**
* Toggle Maximize target node
*
* @param Object target
* @param Bool max
* @return void
*/
self.toggleMaximize = function(target, max) {
var elm = $(target),
maximized = elm.hasClass(cls);
if (maximized) {
if (max === true) {
return;
}
exitMax(elm);
} else {
if (max === false) {
return;
}
toMax(elm);
}
};
})();
/************* init stuffs ****************/
Object.assign($.ui.keyCode, {
'F1' : 112,
'F2' : 113,
'F3' : 114,
'F4' : 115,
'F5' : 116,
'F6' : 117,
'F7' : 118,
'F8' : 119,
'F9' : 120,
'F10' : 121,
'F11' : 122,
'F12' : 123,
'DIG0' : 48,
'DIG1' : 49,
'DIG2' : 50,
'DIG3' : 51,
'DIG4' : 52,
'DIG5' : 53,
'DIG6' : 54,
'DIG7' : 55,
'DIG8' : 56,
'DIG9' : 57,
'NUM0' : 96,
'NUM1' : 97,
'NUM2' : 98,
'NUM3' : 99,
'NUM4' : 100,
'NUM5' : 101,
'NUM6' : 102,
'NUM7' : 103,
'NUM8' : 104,
'NUM9' : 105,
'CONTEXTMENU' : 93
});
this.dragUpload = false;
this.xhrUpload = (typeof XMLHttpRequestUpload != 'undefined' || typeof XMLHttpRequestEventTarget != 'undefined') && typeof File != 'undefined' && typeof FormData != 'undefined';
// configure transport object
this.transport = {};
if (typeof(this.options.transport) == 'object') {
this.transport = this.options.transport;
if (typeof(this.transport.init) == 'function') {
this.transport.init(this);
}
}
if (typeof(this.transport.send) != 'function') {
this.transport.send = function(opts) { return $.ajax(opts); };
}
if (this.transport.upload == 'iframe') {
this.transport.upload = $.proxy(this.uploads.iframe, this);
} else if (typeof(this.transport.upload) == 'function') {
this.dragUpload = !!this.options.dragUploadAllow;
} else if (this.xhrUpload && !!this.options.dragUploadAllow) {
this.transport.upload = $.proxy(this.uploads.xhr, this);
this.dragUpload = true;
} else {
this.transport.upload = $.proxy(this.uploads.iframe, this);
}
/**
* Decoding 'raw' string converted to unicode
*
* @param String str
* @return String
*/
this.decodeRawString = function(str) {
var charCodes = function(str) {
var i, len, arr;
for (i=0,len=str.length,arr=[]; i= 0xd800 && c <= 0xdbff) {
scalars.push((c & 1023) + 64 << 10 | arr[++i] & 1023);
} else {
scalars.push(c);
}
}
return scalars;
},
decodeUTF8 = function(arr) {
var i, len, c, str, char = String.fromCharCode;
for (i=0,len=arr.length,str=""; c=arr[i],i= 0xc2) {
str += char((c&31)<<6 | arr[++i]&63);
} else if (c <= 0xef && c >= 0xe0) {
str += char((c&15)<<12 | (arr[++i]&63)<<6 | arr[++i]&63);
} else if (c <= 0xf7 && c >= 0xf0) {
str += char(
0xd800 | ((c&7)<<8 | (arr[++i]&63)<<2 | arr[++i]>>>4&3) - 64,
0xdc00 | (arr[i++]&15)<<6 | arr[i]&63
);
} else {
str += char(0xfffd);
}
}
return str;
};
return decodeUTF8(scalarValues(str));
};
/**
* Gets target file contents by file.hash
*
* @param String hash The hash
* @param String responseType 'blob' or 'arraybuffer' (default)
* @return arraybuffer|blob The contents.
*/
this.getContents = function(hash, responseType) {
var self = this,
dfd = $.Deferred(),
type = responseType || 'arraybuffer',
url, req;
dfd.fail(function() {
req && req.state() === 'pending' && req.reject();
});
url = self.openUrl(hash);
if (!self.isSameOrigin(url)) {
url = self.openUrl(hash, true);
}
req = self.request({
data : {cmd : 'get'},
options : {
url: url,
type: 'get',
cache : true,
dataType : 'binary',
responseType : type,
processData: false
}
})
.fail(function() {
dfd.reject();
})
.done(function(data) {
dfd.resolve(data);
});
return dfd;
};
/**
* Supported check hash algorisms
*
* @type Array
*/
self.hashCheckers = [];
/**
* Closure of getContentsHashes()
*/
(function(self) {
var hashLibs = {
check : true
},
md5Calc = function(arr) {
var spark = new hashLibs.SparkMD5.ArrayBuffer(),
job;
job = self.asyncJob(function(buf) {
spark.append(buf);
}, arr).done(function() {
job._md5 = spark.end();
});
return job;
},
shaCalc = function(arr, length) {
var sha, job;
try {
sha = new hashLibs.jsSHA('SHA' + (length.substr(0, 1) === '3'? length : ('-' + length)), 'ARRAYBUFFER');
job = self.asyncJob(function(buf) {
sha.update(buf);
}, arr).done(function() {
job._sha = sha.getHash('HEX');
});
} catch(e) {
job = $.Deferred.reject();
}
return job;
};
// make fm.hashCheckers
if (self.options.cdns.sparkmd5) {
self.hashCheckers.push('md5');
}
if (self.options.cdns.jssha) {
self.hashCheckers = self.hashCheckers.concat(['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512', 'shake128', 'shake256']);
}
/**
* Gets the contents hashes.
*
* @param String target target file.hash
* @param Object needHashes need hash lib names
* @return Object hashes with lib name as key
*/
self.getContentsHashes = function(target, needHashes) {
var dfd = $.Deferred(),
needs = self.arrayFlip(needHashes || ['md5'], true),
libs = [],
jobs = [],
res = {},
req;
dfd.fail(function() {
req && req.reject();
});
if (hashLibs.check) {
delete hashLibs.check;
// load SparkMD5
var libsmd5 = $.Deferred();
if (window.ArrayBuffer && self.options.cdns.sparkmd5) {
libs.push(libsmd5);
self.loadScript([self.options.cdns.sparkmd5],
function(res) {
var SparkMD5 = res || window.SparkMD5;
window.SparkMD5 && delete window.SparkMD5;
libsmd5.resolve();
if (SparkMD5) {
hashLibs.SparkMD5 = SparkMD5;
}
},
{
tryRequire: true,
error: function() {
libsmd5.reject();
}
}
);
}
// load jsSha
var libssha = $.Deferred();
if (window.ArrayBuffer && self.options.cdns.jssha) {
libs.push(libssha);
self.loadScript([self.options.cdns.jssha],
function(res) {
var jsSHA = res || window.jsSHA;
window.jsSHA && delete window.jsSHA;
libssha.resolve();
if (jsSHA) {
hashLibs.jsSHA = jsSHA;
}
},
{
tryRequire: true,
error: function() {
libssha.reject();
}
}
);
}
}
$.when.apply(null, libs).always(function() {
if (Object.keys(hashLibs).length) {
req = self.getContents(target).done(function(arrayBuffer) {
var arr = (arrayBuffer instanceof ArrayBuffer && arrayBuffer.byteLength > 0)? self.sliceArrayBuffer(arrayBuffer, 1048576) : false,
i;
if (needs.md5 && hashLibs.SparkMD5) {
jobs.push(function() {
var job = md5Calc(arr).done(function() {
var f;
res.md5 = job._md5;
if (f = self.file(target)) {
f.md5 = job._md5;
}
dfd.notify(res);
});
dfd.fail(function() {
job.reject();
});
return job;
});
}
if (hashLibs.jsSHA) {
$.each(['1', '224', '256', '384', '512', '3-224', '3-256', '3-384', '3-512', 'ke128', 'ke256'], function(i, v) {
if (needs['sha' + v]) {
jobs.push(function() {
var job = shaCalc(arr, v).done(function() {
var f;
res['sha' + v] = job._sha;
if (f = self.file(target)) {
f['sha' + v] = job._sha;
}
dfd.notify(res);
});
return job;
});
}
});
}
if (jobs.length) {
self.sequence(jobs).always(function() {
dfd.resolve(res);
});
} else {
dfd.reject();
}
}).fail(function() {
dfd.reject();
});
} else {
dfd.reject();
}
});
return dfd;
};
})(this);
/**
* Alias for this.trigger('error', {error : 'message'})
*
* @param String error message
* @return elFinder
**/
this.error = function() {
var arg = arguments[0],
opts = arguments[1] || null;
return arguments.length == 1 && typeof(arg) == 'function'
? self.bind('error', arg)
: (arg === true? this : self.trigger('error', {error : arg, opts : opts}));
};
// create bind/trigger aliases for build-in events
$.each(events, function(i, name) {
self[name] = function() {
var arg = arguments[0];
return arguments.length == 1 && typeof(arg) == 'function'
? self.bind(name, arg)
: self.trigger(name, $.isPlainObject(arg) ? arg : {});
};
});
// bind core event handlers
this
.enable(function() {
if (!enabled && self.api && self.visible() && self.ui.overlay.is(':hidden') && ! node.children('.elfinder-dialog.' + self.res('class', 'editing') + ':visible').length) {
enabled = true;
document.activeElement && document.activeElement.blur();
node.removeClass('elfinder-disabled');
}
})
.disable(function() {
prevEnabled = enabled;
enabled = false;
node.addClass('elfinder-disabled');
})
.open(function() {
selected = [];
})
.select(function(e) {
var cnt = 0,
unselects = [];
selected = $.grep(e.data.selected || e.data.value|| [], function(hash) {
if (unselects.length || (self.maxTargets && ++cnt > self.maxTargets)) {
unselects.push(hash);
return false;
} else {
return files[hash] ? true : false;
}
});
if (unselects.length) {
self.trigger('unselectfiles', {files: unselects, inselect: true});
self.toast({mode: 'warning', msg: self.i18n(['errMaxTargets', self.maxTargets])});
}
})
.error(function(e) {
var opts = {
cssClass : 'elfinder-dialog-error',
title : self.i18n(self.i18n('error')),
resizable : false,
destroyOnClose : true,
buttons : {}
};
opts.buttons[self.i18n(self.i18n('btnClose'))] = function() { $(this).elfinderdialog('close'); };
if (e.data.opts && $.isPlainObject(e.data.opts)) {
Object.assign(opts, e.data.opts);
}
self.dialog(' '+self.i18n(e.data.error), opts);
})
.bind('tmb', function(e) {
$.each(e.data.images||[], function(hash, tmb) {
if (files[hash]) {
files[hash].tmb = tmb;
}
});
})
.bind('searchstart', function(e) {
Object.assign(self.searchStatus, e.data);
self.searchStatus.state = 1;
})
.bind('search', function(e) {
self.searchStatus.state = 2;
})
.bind('searchend', function() {
self.searchStatus.state = 0;
self.searchStatus.ininc = false;
self.searchStatus.mixed = false;
})
;
// We listen and emit a sound on delete according to option
if (true === this.options.sound) {
this.bind('playsound', function(e) {
var play = beeper.canPlayType && beeper.canPlayType('audio/wav; codecs="1"'),
file = e.data && e.data.soundFile;
play && file && play != '' && play != 'no' && $(beeper).html('')[0].play();
});
}
// bind external event handlers
$.each(this.options.handlers, function(event, callback) {
self.bind(event, callback);
});
/**
* History object. Store visited folders
*
* @type Object
**/
this.history = new this.history(this);
/**
* Root hashed
*
* @type Object
*/
this.roots = {};
/**
* leaf roots
*
* @type Object
*/
this.leafRoots = {};
/**
* Loaded commands
*
* @type Object
**/
this._commands = {};
if (!Array.isArray(this.options.commands)) {
this.options.commands = [];
}
if ($.inArray('*', this.options.commands) !== -1) {
this.options.commands = Object.keys(this.commands);
}
/**
* UI command map of cwd volume ( That volume driver option `uiCmdMap` )
*
* @type Object
**/
this.commandMap = {};
/**
* cwd options of each volume
* key: volumeid
* val: options object
*
* @type Object
*/
this.volOptions = {};
/**
* Has volOptions data
*
* @type Boolean
*/
this.hasVolOptions = false;
/**
* Hash of trash holders
* key: trash folder hash
* val: source volume hash
*
* @type Object
*/
this.trashes = {};
/**
* cwd options of each folder/file
* key: hash
* val: options object
*
* @type Object
*/
this.optionsByHashes = {};
/**
* UI Auto Hide Functions
* Each auto hide function mast be call to `fm.trigger('uiautohide')` at end of process
*
* @type Array
**/
this.uiAutoHide = [];
// trigger `uiautohide`
this.one('open', function() {
if (self.uiAutoHide.length) {
setTimeout(function() {
self.trigger('uiautohide');
}, 500);
}
});
// Auto Hide Functions sequential processing start
this.bind('uiautohide', function() {
if (self.uiAutoHide.length) {
self.uiAutoHide.shift()();
}
});
if (this.options.width) {
width = this.options.width;
}
if (this.options.height) {
height = this.options.height;
}
if (this.options.heightBase) {
heightBase = $(this.options.heightBase);
}
if (this.options.soundPath) {
soundPath = this.options.soundPath.replace(/\/+$/, '') + '/';
}
self.one('opendone', function() {
var tm;
// attach events to document
$(document)
// disable elfinder on click outside elfinder
.on('click.'+namespace, function(e) { enabled && ! self.options.enableAlways && !$(e.target).closest(node).length && self.disable(); })
// exec shortcuts
.on(keydown+' '+keypress, execShortcut);
// attach events to window
self.options.useBrowserHistory && $(window)
.on('popstate.' + namespace, function(ev) {
var target = ev.originalEvent.state && ev.originalEvent.state.thash;
target && !$.isEmptyObject(self.files()) && self.request({
data : {cmd : 'open', target : target, onhistory : 1},
notify : {type : 'open', cnt : 1, hideCnt : true},
syncOnFail : true
});
});
$(window).on('resize.' + namespace, function(e){
if (e.target === this) {
tm && clearTimeout(tm);
tm = setTimeout(function() {
self.trigger('resize', {width : node.width(), height : node.height()});
}, 100);
}
})
.on('beforeunload.' + namespace,function(e){
var msg, cnt;
if (node.is(':visible')) {
if (self.ui.notify.children().length && $.inArray('hasNotifyDialog', self.options.windowCloseConfirm) !== -1) {
msg = self.i18n('ntfsmth');
} else if (node.find('.'+self.res('class', 'editing')).length && $.inArray('editingFile', self.options.windowCloseConfirm) !== -1) {
msg = self.i18n('editingFile');
} else if ((cnt = Object.keys(self.selected()).length) && $.inArray('hasSelectedItem', self.options.windowCloseConfirm) !== -1) {
msg = self.i18n('hasSelected', ''+cnt);
} else if ((cnt = Object.keys(self.clipboard()).length) && $.inArray('hasClipboardData', self.options.windowCloseConfirm) !== -1) {
msg = self.i18n('hasClipboard', ''+cnt);
}
if (msg) {
e.returnValue = msg;
return msg;
}
}
self.trigger('unload');
});
// bind window onmessage for CORS
$(window).on('message.' + namespace, function(e){
var res = e.originalEvent || null,
obj, data;
if (res && self.uploadURL.indexOf(res.origin) === 0) {
try {
obj = JSON.parse(res.data);
data = obj.data || null;
if (data) {
if (data.error) {
if (obj.bind) {
self.trigger(obj.bind+'fail', data);
}
self.error(data.error);
} else {
data.warning && self.error(data.warning);
self.updateCache(data);
data.removed && data.removed.length && self.remove(data);
data.added && data.added.length && self.add(data);
data.changed && data.changed.length && self.change(data);
if (obj.bind) {
self.trigger(obj.bind, data);
self.trigger(obj.bind+'done');
}
data.sync && self.sync();
}
}
} catch (e) {
self.sync();
}
}
});
// elFinder enable always
if (self.options.enableAlways) {
$(window).on('focus.' + namespace, function(e){
(e.target === this) && self.enable();
});
if (inFrame) {
$(window.top).on('focus.' + namespace, function() {
if (self.enable() && (! parentIframe || parentIframe.is(':visible'))) {
setTimeout(function() {
$(window).trigger('focus');
}, 10);
}
});
}
} else if (inFrame) {
$(window).on('blur.' + namespace, function(e){
enabled && e.target === this && self.disable();
});
}
// return focus to the window on click (elFInder in the frame)
if (inFrame) {
node.on('click', function(e) {
$(window).trigger('focus');
});
}
// elFinder to enable by mouse over
if (self.options.enableByMouseOver) {
node.on('mouseenter touchstart', function(e) {
(inFrame) && $(window).trigger('focus');
! self.enabled() && self.enable();
});
}
});
// store instance in node
node[0].elfinder = this;
// auto load language file
dfrdsBeforeBootup.push((function() {
var lang = self.lang,
langJs = self.baseUrl + 'js/i18n/elfinder.' + lang + '.js',
dfd = $.Deferred().done(function() {
if (self.i18[lang]) {
self.lang = lang;
}
self.trigger('i18load');
i18n = self.lang === 'en'
? self.i18['en']
: $.extend(true, {}, self.i18['en'], self.i18[self.lang]);
});
if (!self.i18[lang]) {
self.lang = 'en';
if (self.hasRequire) {
require([langJs], function() {
dfd.resolve();
}, function() {
dfd.resolve();
});
} else {
self.loadScript([langJs], function() {
dfd.resolve();
}, {
loadType: 'tag',
error : function() {
dfd.resolve();
}
});
}
} else {
dfd.resolve();
}
return dfd;
})());
// elFinder boot up function
bootUp = function() {
var columnNames;
/**
* i18 messages
*
* @type Object
**/
self.messages = i18n.messages;
// check jquery ui
if (!($.fn.selectable && $.fn.draggable && $.fn.droppable && $.fn.resizable)) {
return alert(self.i18n('errJqui'));
}
// check node
if (!node.length) {
return alert(self.i18n('errNode'));
}
// check connector url
if (!self.options.url) {
return alert(self.i18n('errURL'));
}
// column key/name map for fm.getColumnName()
columnNames = Object.assign({
name : self.i18n('name'),
perm : self.i18n('perms'),
date : self.i18n('modify'),
size : self.i18n('size'),
kind : self.i18n('kind'),
modestr : self.i18n('mode'),
modeoct : self.i18n('mode'),
modeboth : self.i18n('mode')
}, self.options.uiOptions.cwd.listView.columnsCustomName);
/**
* Gets the column name of cwd list view
*
* @param String key The key
* @return String The column name.
*/
self.getColumnName = function(key) {
return columnNames[key] || self.i18n(key);
};
/**
* Interface direction
*
* @type String
* @default "ltr"
**/
self.direction = i18n.direction;
/**
* Date/time format
*
* @type String
* @default "m.d.Y"
**/
self.dateFormat = self.options.dateFormat || i18n.dateFormat;
/**
* Date format like "Yesterday 10:20:12"
*
* @type String
* @default "{day} {time}"
**/
self.fancyFormat = self.options.fancyDateFormat || i18n.fancyDateFormat;
/**
* Date format for if upload file has not original unique name
* e.g. Clipboard image data, Image data taken with iOS
*
* @type String
* @default "ymd-His"
**/
self.nonameDateFormat = (self.options.nonameDateFormat || i18n.nonameDateFormat).replace(/[\/\\]/g, '_');
/**
* Css classes
*
* @type String
**/
self.cssClass = 'ui-helper-reset ui-helper-clearfix ui-widget ui-widget-content ui-corner-all elfinder elfinder-'
+(self.direction == 'rtl' ? 'rtl' : 'ltr')
+(self.UA.Touch? (' elfinder-touch' + (self.options.resizable ? ' touch-punch' : '')) : '')
+(self.UA.Mobile? ' elfinder-mobile' : '')
+' '+self.options.cssClass;
// prepare node
node.addClass(self.cssClass)
.on(mousedown, function() {
!enabled && self.enable();
});
// draggable closure
(function() {
var ltr, wzRect, wzBottom, wzBottom2, nodeStyle,
keyEvt = keydown + 'draggable' + ' keyup.' + namespace + 'draggable';
/**
* Base draggable options
*
* @type Object
**/
self.draggable = {
appendTo : node,
addClasses : false,
distance : 4,
revert : true,
refreshPositions : false,
cursor : 'crosshair',
cursorAt : {left : 50, top : 47},
scroll : false,
start : function(e, ui) {
var helper = ui.helper,
targets = $.grep(helper.data('files')||[], function(h) {
if (h) {
remember[h] = true;
return true;
}
return false;
}),
locked = false,
cnt, h;
// fix node size
nodeStyle = node.attr('style');
node.width(node.width()).height(node.height());
// set var for drag()
ltr = (self.direction === 'ltr');
wzRect = self.getUI('workzone').data('rectangle');
wzBottom = wzRect.top + wzRect.height;
wzBottom2 = wzBottom - self.getUI('navdock').outerHeight(true);
self.draggingUiHelper = helper;
cnt = targets.length;
while (cnt--) {
h = targets[cnt];
if (files[h].locked) {
locked = true;
helper.data('locked', true);
break;
}
}
!locked && self.trigger('lockfiles', {files : targets});
helper.data('autoScrTm', setInterval(function() {
if (helper.data('autoScr')) {
self.autoScroll[helper.data('autoScr')](helper.data('autoScrVal'));
}
}, 50));
},
drag : function(e, ui) {
var helper = ui.helper,
autoScr, autoUp, bottom;
if ((autoUp = wzRect.top > e.pageY) || wzBottom2 < e.pageY) {
if (wzRect.cwdEdge > e.pageX) {
autoScr = (ltr? 'navbar' : 'cwd') + (autoUp? 'Up' : 'Down');
} else {
autoScr = (ltr? 'cwd' : 'navbar') + (autoUp? 'Up' : 'Down');
}
if (!autoUp) {
if (autoScr.substr(0, 3) === 'cwd') {
if (wzBottom < e.pageY) {
bottom = wzBottom;
} else {
autoScr = null;
}
} else {
bottom = wzBottom2;
}
}
if (autoScr) {
helper.data('autoScr', autoScr);
helper.data('autoScrVal', Math.pow((autoUp? wzRect.top - e.pageY : e.pageY - bottom), 1.3));
}
}
if (! autoScr) {
if (helper.data('autoScr')) {
helper.data('refreshPositions', 1).data('autoScr', null);
}
}
if (helper.data('refreshPositions') && $(this).elfUiWidgetInstance('draggable')) {
if (helper.data('refreshPositions') > 0) {
$(this).draggable('option', { refreshPositions : true, elfRefresh : true });
helper.data('refreshPositions', -1);
} else {
$(this).draggable('option', { refreshPositions : false, elfRefresh : false });
helper.data('refreshPositions', null);
}
}
},
stop : function(e, ui) {
var helper = ui.helper,
files;
$(document).off(keyEvt);
$(this).elfUiWidgetInstance('draggable') && $(this).draggable('option', { refreshPositions : false });
self.draggingUiHelper = null;
self.trigger('focus').trigger('dragstop');
if (! helper.data('droped')) {
files = $.grep(helper.data('files')||[], function(h) { return h? true : false ;});
self.trigger('unlockfiles', {files : files});
self.trigger('selectfiles', {files : files});
}
self.enable();
// restore node style
node.attr('style', nodeStyle);
helper.data('autoScrTm') && clearInterval(helper.data('autoScrTm'));
},
helper : function(e, ui) {
var element = this.id ? $(this) : $(this).parents('[id]:first'),
helper = $('
'),
icon = function(f) {
var mime = f.mime, i, tmb = self.tmb(f);
i = '
';
if (tmb) {
i = $(i).addClass(tmb.className).css('background-image', "url('"+tmb.url+"')").get(0).outerHTML;
}
return i;
},
hashes, l, ctr;
self.draggingUiHelper && self.draggingUiHelper.stop(true, true);
self.trigger('dragstart', {target : element[0], originalEvent : e}, true);
hashes = element.hasClass(self.res('class', 'cwdfile'))
? self.selected()
: [self.navId2Hash(element.attr('id'))];
helper.append(icon(files[hashes[0]])).data('files', hashes).data('locked', false).data('droped', false).data('namespace', namespace).data('dropover', 0);
if ((l = hashes.length) > 1) {
helper.append(icon(files[hashes[l-1]]) + ''+l+' ');
}
$(document).on(keyEvt, function(e){
var chk = (e.shiftKey||e.ctrlKey||e.metaKey);
if (ctr !== chk) {
ctr = chk;
if (helper.is(':visible') && helper.data('dropover') && ! helper.data('droped')) {
helper.toggleClass('elfinder-drag-helper-plus', helper.data('locked')? true : ctr);
self.trigger(ctr? 'unlockfiles' : 'lockfiles', {files : hashes, helper: helper});
}
}
});
return helper;
}
};
})();
// in getFileCallback set - change default actions on double click/enter/ctrl+enter
if (self.commands.getfile) {
if (typeof(self.options.getFileCallback) == 'function') {
self.bind('dblclick', function(e) {
e.preventDefault();
self.exec('getfile').fail(function() {
self.exec('open', e.data && e.data.file? [ e.data.file ]: void(0));
});
});
self.shortcut({
pattern : 'enter',
description : self.i18n('cmdgetfile'),
callback : function() { self.exec('getfile').fail(function() { self.exec(self.OS == 'mac' ? 'rename' : 'open'); }); }
})
.shortcut({
pattern : 'ctrl+enter',
description : self.i18n(self.OS == 'mac' ? 'cmdrename' : 'cmdopen'),
callback : function() { self.exec(self.OS == 'mac' ? 'rename' : 'open'); }
});
} else {
self.options.getFileCallback = null;
}
}
// load commands
$.each(self.commands, function(name, cmd) {
var proto = Object.assign({}, cmd.prototype),
extendsCmd, opts;
if ($.isFunction(cmd) && !self._commands[name] && (cmd.prototype.forceLoad || $.inArray(name, self.options.commands) !== -1)) {
extendsCmd = cmd.prototype.extendsCmd || '';
if (extendsCmd) {
if ($.isFunction(self.commands[extendsCmd])) {
cmd.prototype = Object.assign({}, base, new self.commands[extendsCmd](), cmd.prototype);
} else {
return true;
}
} else {
cmd.prototype = Object.assign({}, base, cmd.prototype);
}
self._commands[name] = new cmd();
cmd.prototype = proto;
opts = self.options.commandsOptions[name] || {};
if (extendsCmd && self.options.commandsOptions[extendsCmd]) {
opts = $.extend(true, {}, self.options.commandsOptions[extendsCmd], opts);
}
self._commands[name].setup(name, opts);
// setup linked commands
if (self._commands[name].linkedCmds.length) {
$.each(self._commands[name].linkedCmds, function(i, n) {
var lcmd = self.commands[n];
if ($.isFunction(lcmd) && !self._commands[n]) {
lcmd.prototype = base;
self._commands[n] = new lcmd();
self._commands[n].setup(n, self.options.commandsOptions[n]||{});
}
});
}
}
});
/**
* UI nodes
*
* @type Object
**/
self.ui = {
// container for nav panel and current folder container
workzone : $('
').appendTo(node).elfinderworkzone(self),
// container for folders tree / places
navbar : $('
').appendTo(node).elfindernavbar(self, self.options.uiOptions.navbar || {}),
// container for for preview etc at below the navbar
navdock : $('
').appendTo(node).elfindernavdock(self, self.options.uiOptions.navdock || {}),
// contextmenu
contextmenu : $('
').appendTo(node).elfindercontextmenu(self),
// overlay
overlay : $('
').appendTo(node).elfinderoverlay({
show : function() { self.disable(); },
hide : function() { prevEnabled && self.enable(); }
}),
// current folder container
cwd : $('
').appendTo(node).elfindercwd(self, self.options.uiOptions.cwd || {}),
// notification dialog window
notify : self.dialog('', {
cssClass : 'elfinder-dialog-notify',
position : self.options.notifyDialog.position,
absolute : true,
resizable : false,
autoOpen : false,
closeOnEscape : false,
title : ' ',
width : parseInt(self.options.notifyDialog.width)
}),
statusbar : $('').hide().appendTo(node),
toast : $('
').appendTo(node),
bottomtray : $('').appendTo(node)
};
// load required ui
$.each(self.options.ui || [], function(i, ui) {
var name = 'elfinder'+ui,
opts = self.options.uiOptions[ui] || {};
if (!self.ui[ui] && $.fn[name]) {
// regist to self.ui before make instance
self.ui[ui] = $('<'+(opts.tag || 'div')+'/>').appendTo(node);
self.ui[ui][name](self, opts);
}
});
// update size
self.resize(width, height);
// make node resizable
if (self.options.resizable) {
node.resizable({
resize : function(e, ui) {
self.resize(ui.size.width, ui.size.height);
},
handles : 'se',
minWidth : 300,
minHeight : 200
});
if (self.UA.Touch) {
node.addClass('touch-punch');
}
}
(function() {
var navbar = self.getUI('navbar'),
cwd = self.getUI('cwd').parent();
self.autoScroll = {
navbarUp : function(v) {
navbar.scrollTop(Math.max(0, navbar.scrollTop() - v));
},
navbarDown : function(v) {
navbar.scrollTop(navbar.scrollTop() + v);
},
cwdUp : function(v) {
cwd.scrollTop(Math.max(0, cwd.scrollTop() - v));
},
cwdDown : function(v) {
cwd.scrollTop(cwd.scrollTop() + v);
}
};
})();
// Swipe on the touch devices to show/hide of toolbar or navbar
if (self.UA.Touch) {
(function() {
var lastX, lastY, nodeOffset, nodeWidth, nodeTop, navbarW, toolbarH,
navbar = self.getUI('navbar'),
toolbar = self.getUI('toolbar'),
moveEv = 'touchmove.stopscroll',
moveTm,
moveUpOn = function(e) {
var touches = e.originalEvent.touches || [{}],
y = touches[0].pageY || null;
if (!lastY || y < lastY) {
e.preventDefault();
moveTm && clearTimeout(moveTm);
}
},
moveDownOn = function(e) {
e.preventDefault();
moveTm && clearTimeout(moveTm);
},
moveOff = function() {
moveTm = setTimeout(function() {
node.off(moveEv);
}, 100);
},
handleW, handleH = 50;
navbar = navbar.children().length? navbar : null;
toolbar = toolbar.length? toolbar : null;
node.on('touchstart touchmove touchend', function(e) {
if (e.type === 'touchend') {
lastX = false;
lastY = false;
moveOff();
return;
}
var touches = e.originalEvent.touches || [{}],
x = touches[0].pageX || null,
y = touches[0].pageY || null,
ltr = (self.direction === 'ltr'),
navbarMode, treeWidth, swipeX, moveX, toolbarT, mode;
if (x === null || y === null || (e.type === 'touchstart' && touches.length > 1)) {
return;
}
if (e.type === 'touchstart') {
nodeOffset = node.offset();
nodeWidth = node.width();
if (navbar) {
lastX = false;
if (navbar.is(':hidden')) {
if (! handleW) {
handleW = Math.max(50, nodeWidth / 10);
}
if ((ltr? (x - nodeOffset.left) : (nodeWidth + nodeOffset.left - x)) < handleW) {
lastX = x;
}
} else if (! e.originalEvent._preventSwipeX) {
navbarW = navbar.width();
if (ltr) {
swipeX = (x < nodeOffset.left + navbarW);
} else {
swipeX = (x > nodeOffset.left + nodeWidth - navbarW);
}
if (swipeX) {
handleW = Math.max(50, nodeWidth / 10);
lastX = x;
} else {
lastX = false;
}
}
}
if (toolbar) {
lastY = false;
if (! e.originalEvent._preventSwipeY) {
toolbarH = toolbar.height();
nodeTop = nodeOffset.top;
if (y - nodeTop < (toolbar.is(':hidden')? handleH : (toolbarH + 30))) {
lastY = y;
node.on(moveEv, toolbar.is(':hidden')? moveDownOn: moveUpOn);
}
}
}
} else {
if (navbar && lastX !== false) {
navbarMode = (ltr? (lastX > x) : (lastX < x))? 'navhide' : 'navshow';
moveX = Math.abs(lastX - x);
if (navbarMode === 'navhide' && moveX > navbarW * 0.6
|| (moveX > (navbarMode === 'navhide'? navbarW / 3 : 45)
&& (navbarMode === 'navshow'
|| (ltr? x < nodeOffset.left + 20 : x > nodeOffset.left + nodeWidth - 20)
))
) {
self.getUI('navbar').trigger(navbarMode, {handleW: handleW});
lastX = false;
}
}
if (toolbar && lastY !== false ) {
toolbarT = toolbar.offset().top;
if (Math.abs(lastY - y) > Math.min(45, toolbarH / 3)) {
mode = (lastY > y)? 'slideUp' : 'slideDown';
if (mode === 'slideDown' || toolbarT + 20 > y) {
if (toolbar.is(mode === 'slideDown' ? ':hidden' : ':visible')) {
toolbar.stop(true, true).trigger('toggle', {duration: 100, handleH: handleH});
}
lastY = false;
}
}
}
}
});
})();
}
if (self.dragUpload) {
// add event listener for HTML5 DnD upload
(function() {
var isin = function(e) {
return (e.target.nodeName !== 'TEXTAREA' && e.target.nodeName !== 'INPUT' && $(e.target).closest('div.ui-dialog-content').length === 0);
},
ent = 'native-drag-enter',
disable = 'native-drag-disable',
c = 'class',
navdir = self.res(c, 'navdir'),
droppable = self.res(c, 'droppable'),
dropover = self.res(c, 'adroppable'),
arrow = self.res(c, 'navarrow'),
clDropActive = self.res(c, 'adroppable'),
wz = self.getUI('workzone'),
ltr = (self.direction === 'ltr'),
clearTm = function() {
autoScrTm && clearTimeout(autoScrTm);
autoScrTm = null;
},
wzRect, autoScrFn, autoScrTm;
node.on('dragenter', function(e) {
clearTm();
if (isin(e)) {
e.preventDefault();
e.stopPropagation();
wzRect = wz.data('rectangle');
}
})
.on('dragleave', function(e) {
clearTm();
if (isin(e)) {
e.preventDefault();
e.stopPropagation();
}
})
.on('dragover', function(e) {
var autoUp;
if (isin(e)) {
e.preventDefault();
e.stopPropagation();
e.originalEvent.dataTransfer.dropEffect = 'none';
if (! autoScrTm) {
autoScrTm = setTimeout(function() {
var wzBottom = wzRect.top + wzRect.height,
wzBottom2 = wzBottom - self.getUI('navdock').outerHeight(true),
fn;
if ((autoUp = e.pageY < wzRect.top) || e.pageY > wzBottom2 ) {
if (wzRect.cwdEdge > e.pageX) {
fn = (ltr? 'navbar' : 'cwd') + (autoUp? 'Up' : 'Down');
} else {
fn = (ltr? 'cwd' : 'navbar') + (autoUp? 'Up' : 'Down');
}
if (!autoUp) {
if (fn.substr(0, 3) === 'cwd') {
if (wzBottom < e.pageY) {
wzBottom2 = wzBottom;
} else {
fn = '';
}
}
}
fn && self.autoScroll[fn](Math.pow((autoUp? wzRect.top - e.pageY : e.pageY - wzBottom2), 1.3));
}
autoScrTm = null;
}, 20);
}
} else {
clearTm();
}
})
.on('drop', function(e) {
clearTm();
if (isin(e)) {
e.stopPropagation();
e.preventDefault();
}
});
node.on('dragenter', '.native-droppable', function(e){
if (e.originalEvent.dataTransfer) {
var $elm = $(e.currentTarget),
id = e.currentTarget.id || null,
cwd = null,
elfFrom;
if (!id) { // target is cwd
cwd = self.cwd();
$elm.data(disable, false);
try {
$.each(e.originalEvent.dataTransfer.types, function(i, v){
if (v.substr(0, 13) === 'elfinderfrom:') {
elfFrom = v.substr(13).toLowerCase();
}
});
} catch(e) {}
}
if (!cwd || (cwd.write && (!elfFrom || elfFrom !== (window.location.href + cwd.hash).toLowerCase()))) {
e.preventDefault();
e.stopPropagation();
$elm.data(ent, true);
$elm.addClass(clDropActive);
} else {
$elm.data(disable, true);
}
}
})
.on('dragleave', '.native-droppable', function(e){
if (e.originalEvent.dataTransfer) {
var $elm = $(e.currentTarget);
e.preventDefault();
e.stopPropagation();
if ($elm.data(ent)) {
$elm.data(ent, false);
} else {
$elm.removeClass(clDropActive);
}
}
})
.on('dragover', '.native-droppable', function(e){
if (e.originalEvent.dataTransfer) {
var $elm = $(e.currentTarget);
e.preventDefault();
e.stopPropagation();
e.originalEvent.dataTransfer.dropEffect = $elm.data(disable)? 'none' : 'copy';
$elm.data(ent, false);
}
})
.on('drop', '.native-droppable', function(e){
if (e.originalEvent && e.originalEvent.dataTransfer) {
var $elm = $(e.currentTarget),
id;
e.preventDefault();
e.stopPropagation();
$elm.removeClass(clDropActive);
if (e.currentTarget.id) {
id = $elm.hasClass(navdir)? self.navId2Hash(e.currentTarget.id) : self.cwdId2Hash(e.currentTarget.id);
} else {
id = self.cwd().hash;
}
e.originalEvent._target = id;
self.exec('upload', {dropEvt: e.originalEvent, target: id}, void 0, id);
}
});
})();
}
// trigger event cssloaded if cddAutoLoad disabled
if (self.cssloaded === null) {
// check css loaded and remove hide
(function() {
var loaded = function() {
node.data('cssautoloadHide').remove();
node.removeData('cssautoloadHide');
self.cssloaded = true;
self.trigger('cssloaded');
},
cnt, fi;
if (node.css('visibility') === 'hidden') {
cnt = 1000; // timeout 10 secs
fi = setInterval(function() {
if (--cnt < 0 || node.css('visibility') !== 'hidden') {
clearInterval(fi);
loaded();
}
}, 10);
} else {
loaded();
}
})();
} else {
self.cssloaded = true;
self.trigger('cssloaded');
}
// calculate elFinder node z-index
self.zIndexCalc();
// send initial request and start to pray >_<
self.trigger('init')
.request({
data : {cmd : 'open', target : self.startDir(), init : 1, tree : 1},
preventDone : true,
notify : {type : 'open', cnt : 1, hideCnt : true},
freeze : true
})
.fail(function() {
self.trigger('fail').disable().lastDir('');
listeners = {};
shortcuts = {};
$(document).add(node).off('.'+namespace);
self.trigger = function() { };
})
.done(function(data) {
var trashDisable = function(th) {
var src = self.file(self.trashes[th]),
d = self.options.debug,
error;
if (src && src.volumeid) {
delete self.volOptions[src.volumeid].trashHash;
}
self.trashes[th] = false;
self.debug('backend-error', 'Trash hash "'+th+'" was not found or not writable.');
},
toChkTh = {};
// regist rawStringDecoder
if (self.options.rawStringDecoder) {
self.registRawStringDecoder(self.options.rawStringDecoder);
}
// re-calculate elFinder node z-index
self.zIndexCalc();
self.load().debug('api', self.api);
// update ui's size after init
node.trigger('resize');
// initial open
open(data);
self.trigger('open', data, false);
self.trigger('opendone');
if (inFrame && self.options.enableAlways) {
$(window).trigger('focus');
}
// check self.trashes
$.each(self.trashes, function(th) {
var dir = self.file(th),
src;
if (! dir) {
toChkTh[th] = true;
} else if (dir.mime !== 'directory' || ! dir.write) {
trashDisable(th);
}
});
if (Object.keys(toChkTh).length) {
self.request({
data : {cmd : 'info', targets : Object.keys(toChkTh)},
preventDefault : true
}).done(function(data) {
if (data && data.files) {
$.each(data.files, function(i, dir) {
if (dir.mime === 'directory' && dir.write) {
delete toChkTh[dir.hash];
}
});
}
}).always(function() {
$.each(toChkTh, trashDisable);
});
}
// to enable / disable
self[self.options.enableAlways? 'enable' : 'disable']();
});
// self.timeEnd('load');
// End of bootUp()
};
// call bootCallback function with elFinder instance, extraObject - { dfrdsBeforeBootup: dfrdsBeforeBootup }
if (bootCallback && typeof bootCallback === 'function') {
self.bootCallback = bootCallback;
bootCallback.call(node.get(0), self, { dfrdsBeforeBootup: dfrdsBeforeBootup });
}
// call dfrdsBeforeBootup functions then boot up elFinder
$.when.apply(null, dfrdsBeforeBootup).done(function() {
bootUp();
}).fail(function(error) {
self.error(error);
});
};
//register elFinder to global scope
if (typeof toGlobal === 'undefined' || toGlobal) {
window.elFinder = elFinder;
}
/**
* Prototype
*
* @type Object
*/
elFinder.prototype = {
uniqueid : 0,
res : function(type, id) {
return this.resources[type] && this.resources[type][id];
},
/**
* User os. Required to bind native shortcuts for open/rename
*
* @type String
**/
OS : navigator.userAgent.indexOf('Mac') !== -1 ? 'mac' : navigator.userAgent.indexOf('Win') !== -1 ? 'win' : 'other',
/**
* User browser UA.
* jQuery.browser: version deprecated: 1.3, removed: 1.9
*
* @type Object
**/
UA : (function(){
var self = this,
webkit = !document.unqueID && !window.opera && !window.sidebar && window.localStorage && 'WebkitAppearance' in document.documentElement.style,
/*setRotated = function() {
var a = ((screen && screen.orientation && screen.orientation.angle) || window.orientation || 0) + 0;
if (a === -90) {
a = 270;
}
UA.Angle = a;
UA.Rotated = a % 180 === 0? false : true;
},*/
UA = {
// Browser IE <= IE 6
ltIE6 : typeof window.addEventListener == "undefined" && typeof document.documentElement.style.maxHeight == "undefined",
// Browser IE <= IE 7
ltIE7 : typeof window.addEventListener == "undefined" && typeof document.querySelectorAll == "undefined",
// Browser IE <= IE 8
ltIE8 : typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined",
// Browser IE <= IE 9
ltIE9 : document.uniqueID && document.documentMode <= 9,
// Browser IE <= IE 10
ltIE10 : document.uniqueID && document.documentMode <= 10,
// Browser IE >= IE 11
gtIE11 : document.uniqueID && document.documentMode >= 11,
IE : document.uniqueID,
Firefox : window.sidebar,
Opera : window.opera,
Webkit : webkit,
Chrome : webkit && window.chrome,
Safari : webkit && !window.chrome,
Mobile : typeof window.orientation != "undefined",
Touch : typeof window.ontouchstart != "undefined",
iOS : navigator.platform.match(/^iP(?:[ao]d|hone)/),
Fullscreen : (typeof (document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen) !== 'undefined'),
Angle : 0,
Rotated : false
};
return UA;
})(),
/**
* Has RequireJS?
*
* @type Boolean
*/
hasRequire : (typeof define === 'function' && define.amd),
/**
* Current request command
*
* @type String
*/
currentReqCmd : '',
/**
* Internationalization object
*
* @type Object
*/
i18 : {
en : {
translator : '',
language : 'English',
direction : 'ltr',
dateFormat : 'd.m.Y H:i',
fancyDateFormat : '$1 H:i',
nonameDateFormat : 'ymd-His',
messages : {}
},
months : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
monthsShort : ['msJan', 'msFeb', 'msMar', 'msApr', 'msMay', 'msJun', 'msJul', 'msAug', 'msSep', 'msOct', 'msNov', 'msDec'],
days : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
daysShort : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
},
/**
* File mimetype to kind mapping
*
* @type Object
*/
kinds : {
'unknown' : 'Unknown',
'directory' : 'Folder',
'group' : 'Selects',
'symlink' : 'Alias',
'symlink-broken' : 'AliasBroken',
'application/x-empty' : 'TextPlain',
'application/postscript' : 'Postscript',
'application/vnd.ms-office' : 'MsOffice',
'application/msword' : 'MsWord',
'application/vnd.ms-word' : 'MsWord',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document' : 'MsWord',
'application/vnd.ms-word.document.macroEnabled.12' : 'MsWord',
'application/vnd.openxmlformats-officedocument.wordprocessingml.template' : 'MsWord',
'application/vnd.ms-word.template.macroEnabled.12' : 'MsWord',
'application/vnd.ms-excel' : 'MsExcel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' : 'MsExcel',
'application/vnd.ms-excel.sheet.macroEnabled.12' : 'MsExcel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.template' : 'MsExcel',
'application/vnd.ms-excel.template.macroEnabled.12' : 'MsExcel',
'application/vnd.ms-excel.sheet.binary.macroEnabled.12' : 'MsExcel',
'application/vnd.ms-excel.addin.macroEnabled.12' : 'MsExcel',
'application/vnd.ms-powerpoint' : 'MsPP',
'application/vnd.openxmlformats-officedocument.presentationml.presentation' : 'MsPP',
'application/vnd.ms-powerpoint.presentation.macroEnabled.12' : 'MsPP',
'application/vnd.openxmlformats-officedocument.presentationml.slideshow' : 'MsPP',
'application/vnd.ms-powerpoint.slideshow.macroEnabled.12' : 'MsPP',
'application/vnd.openxmlformats-officedocument.presentationml.template' : 'MsPP',
'application/vnd.ms-powerpoint.template.macroEnabled.12' : 'MsPP',
'application/vnd.ms-powerpoint.addin.macroEnabled.12' : 'MsPP',
'application/vnd.openxmlformats-officedocument.presentationml.slide' : 'MsPP',
'application/vnd.ms-powerpoint.slide.macroEnabled.12' : 'MsPP',
'application/pdf' : 'PDF',
'application/xml' : 'XML',
'application/vnd.oasis.opendocument.text' : 'OO',
'application/vnd.oasis.opendocument.text-template' : 'OO',
'application/vnd.oasis.opendocument.text-web' : 'OO',
'application/vnd.oasis.opendocument.text-master' : 'OO',
'application/vnd.oasis.opendocument.graphics' : 'OO',
'application/vnd.oasis.opendocument.graphics-template' : 'OO',
'application/vnd.oasis.opendocument.presentation' : 'OO',
'application/vnd.oasis.opendocument.presentation-template' : 'OO',
'application/vnd.oasis.opendocument.spreadsheet' : 'OO',
'application/vnd.oasis.opendocument.spreadsheet-template' : 'OO',
'application/vnd.oasis.opendocument.chart' : 'OO',
'application/vnd.oasis.opendocument.formula' : 'OO',
'application/vnd.oasis.opendocument.database' : 'OO',
'application/vnd.oasis.opendocument.image' : 'OO',
'application/vnd.openofficeorg.extension' : 'OO',
'application/x-shockwave-flash' : 'AppFlash',
'application/flash-video' : 'Flash video',
'application/x-bittorrent' : 'Torrent',
'application/javascript' : 'JS',
'application/rtf' : 'RTF',
'application/rtfd' : 'RTF',
'application/x-font-ttf' : 'TTF',
'application/x-font-otf' : 'OTF',
'application/x-rpm' : 'RPM',
'application/x-web-config' : 'TextPlain',
'application/xhtml+xml' : 'HTML',
'application/docbook+xml' : 'DOCBOOK',
'application/x-awk' : 'AWK',
'application/x-gzip' : 'GZIP',
'application/x-bzip2' : 'BZIP',
'application/x-xz' : 'XZ',
'application/zip' : 'ZIP',
'application/x-zip' : 'ZIP',
'application/x-rar' : 'RAR',
'application/x-tar' : 'TAR',
'application/x-7z-compressed' : '7z',
'application/x-jar' : 'JAR',
'text/plain' : 'TextPlain',
'text/x-php' : 'PHP',
'text/html' : 'HTML',
'text/javascript' : 'JS',
'text/css' : 'CSS',
'text/rtf' : 'RTF',
'text/rtfd' : 'RTF',
'text/x-c' : 'C',
'text/x-csrc' : 'C',
'text/x-chdr' : 'CHeader',
'text/x-c++' : 'CPP',
'text/x-c++src' : 'CPP',
'text/x-c++hdr' : 'CPPHeader',
'text/x-shellscript' : 'Shell',
'application/x-csh' : 'Shell',
'text/x-python' : 'Python',
'text/x-java' : 'Java',
'text/x-java-source' : 'Java',
'text/x-ruby' : 'Ruby',
'text/x-perl' : 'Perl',
'text/x-sql' : 'SQL',
'text/xml' : 'XML',
'text/x-comma-separated-values' : 'CSV',
'text/x-markdown' : 'Markdown',
'image/x-ms-bmp' : 'BMP',
'image/jpeg' : 'JPEG',
'image/gif' : 'GIF',
'image/png' : 'PNG',
'image/tiff' : 'TIFF',
'image/x-targa' : 'TGA',
'image/vnd.adobe.photoshop' : 'PSD',
'image/xbm' : 'XBITMAP',
'image/pxm' : 'PXM',
'audio/mpeg' : 'AudioMPEG',
'audio/midi' : 'AudioMIDI',
'audio/ogg' : 'AudioOGG',
'audio/mp4' : 'AudioMPEG4',
'audio/x-m4a' : 'AudioMPEG4',
'audio/wav' : 'AudioWAV',
'audio/x-mp3-playlist' : 'AudioPlaylist',
'video/x-dv' : 'VideoDV',
'video/mp4' : 'VideoMPEG4',
'video/mpeg' : 'VideoMPEG',
'video/x-msvideo' : 'VideoAVI',
'video/quicktime' : 'VideoMOV',
'video/x-ms-wmv' : 'VideoWM',
'video/x-flv' : 'VideoFlash',
'video/x-matroska' : 'VideoMKV',
'video/ogg' : 'VideoOGG'
},
/**
* File mimetype to file extention mapping
*
* @type Object
* @see elFinder.mimetypes.js
*/
mimeTypes : {},
/**
* Ajax request data validation rules
*
* @type Object
*/
rules : {
defaults : function(data) {
if (!data
|| (data.added && !Array.isArray(data.added))
|| (data.removed && !Array.isArray(data.removed))
|| (data.changed && !Array.isArray(data.changed))) {
return false;
}
return true;
},
open : function(data) { return data && data.cwd && data.files && $.isPlainObject(data.cwd) && Array.isArray(data.files); },
tree : function(data) { return data && data.tree && Array.isArray(data.tree); },
parents : function(data) { return data && data.tree && Array.isArray(data.tree); },
tmb : function(data) { return data && data.images && ($.isPlainObject(data.images) || Array.isArray(data.images)); },
upload : function(data) { return data && ($.isPlainObject(data.added) || Array.isArray(data.added));},
search : function(data) { return data && data.files && Array.isArray(data.files); }
},
/**
* Commands costructors
*
* @type Object
*/
commands : {},
/**
* Commands to add the item (space delimited)
*
* @type String
*/
cmdsToAdd : 'archive duplicate extract mkdir mkfile paste rm upload',
parseUploadData : function(text) {
var self = this,
data;
if (!$.trim(text)) {
return {error : ['errResponse', 'errDataEmpty']};
}
try {
data = JSON.parse(text);
} catch (e) {
return {error : ['errResponse', 'errDataNotJSON']};
}
data = self.normalize(data);
if (!self.validResponse('upload', data)) {
return {error : (response.norError || ['errResponse'])};
}
data.removed = $.merge((data.removed || []), $.map(data.added || [], function(f) { return self.file(f.hash)? f.hash : null; }));
return data;
},
iframeCnt : 0,
uploads : {
// xhr muiti uploading flag
xhrUploading: false,
// Timer of request fail to sync
failSyncTm: null,
// current chunkfail requesting chunk
chunkfailReq: {},
// check file/dir exists
checkExists: function(files, target, fm, isDir) {
var dfrd = $.Deferred(),
names, renames = [], hashes = {}, chkFiles = [],
cancel = function() {
var i = files.length;
while (--i > -1) {
files[i]._remove = true;
}
},
resolve = function() {
dfrd.resolve(renames, hashes);
},
check = function() {
var existed = [], exists = [], i, c,
pathStr = target !== fm.cwd().hash? fm.path(target, true) + fm.option('separator', target) : '',
confirm = function(ndx) {
var last = ndx == exists.length-1,
opts = {
cssClass : 'elfinder-confirm-upload',
title : fm.i18n('cmdupload'),
text : ['errExists', pathStr + exists[ndx].name, 'confirmRepl'],
all : !last,
accept : {
label : 'btnYes',
callback : function(all) {
!last && !all
? confirm(++ndx)
: resolve();
}
},
reject : {
label : 'btnNo',
callback : function(all) {
var i;
if (all) {
i = exists.length;
while (ndx < i--) {
files[exists[i].i]._remove = true;
}
} else {
files[exists[ndx].i]._remove = true;
}
!last && !all
? confirm(++ndx)
: resolve();
}
},
cancel : {
label : 'btnCancel',
callback : function() {
cancel();
resolve();
}
},
buttons : [
{
label : 'btnBackup',
cssClass : 'elfinder-confirm-btn-backup',
callback : function(all) {
var i;
if (all) {
i = exists.length;
while (ndx < i--) {
renames.push(exists[i].name);
}
} else {
renames.push(exists[ndx].name);
}
!last && !all
? confirm(++ndx)
: resolve();
}
}
]
};
if (!isDir) {
opts.buttons.push({
label : 'btnRename' + (last? '' : 'All'),
cssClass : 'elfinder-confirm-btn-rename',
callback : function() {
renames = null;
resolve();
}
});
}
if (fm.iframeCnt > 0) {
delete opts.reject;
}
fm.confirm(opts);
};
if (! fm.file(target).read) {
// for dropbox type
resolve();
return;
}
names = $.map(files, function(file, i) { return file.name && (!fm.UA.iOS || file.name !== 'image.jpg')? {i: i, name: file.name} : null ;});
fm.request({
data : {cmd : 'ls', target : target, intersect : $.map(names, function(item) { return item.name;})},
notify : {type : 'preupload', cnt : 1, hideCnt : true},
preventDefault : true
})
.done(function(data) {
var existedArr, cwdItems;
if (data) {
if (data.error) {
cancel();
} else {
if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
if (data.list) {
if (Array.isArray(data.list)) {
existed = data.list || [];
} else {
existedArr = [];
existed = $.map(data.list, function(n) {
if (typeof n === 'string') {
return n;
} else {
// support to >=2.1.11 plugin Normalizer, Sanitizer
existedArr = existedArr.concat(n);
return false;
}
});
if (existedArr.length) {
existed = existed.concat(existedArr);
}
hashes = data.list;
}
exists = $.grep(names, function(name){
return $.inArray(name.name, existed) !== -1 ? true : false ;
});
if (exists.length && existed.length && target == fm.cwd().hash) {
cwdItems = $.map(fm.files(target), function(file) { return file.name; } );
if ($.grep(existed, function(n) {
return $.inArray(n, cwdItems) === -1? true : false;
}).length){
fm.sync();
}
}
}
}
}
}
if (exists.length > 0) {
confirm(0);
} else {
resolve();
}
})
.fail(function(error) {
cancel();
resolve();
error && fm.error(error);
});
};
if (fm.api >= 2.1 && typeof files[0] == 'object') {
check();
} else {
resolve();
}
return dfrd;
},
// check droped contents
checkFile : function(data, fm, target) {
if (!!data.checked || data.type == 'files') {
return data.files;
} else if (data.type == 'data') {
var dfrd = $.Deferred(),
files = [],
paths = [],
dirctorys = [],
entries = [],
processing = 0,
items,
mkdirs = [],
cancel = false,
toArray = function(list) {
return Array.prototype.slice.call(list || [], 0);
},
doScan = function(items) {
var dirReader, entry, readEntries,
entries = [],
excludes = fm.options.folderUploadExclude[fm.OS] || null,
length = items.length;
for (var i = 0; i < length; i++) {
if (cancel) {
break;
}
entry = items[i];
if (entry) {
if (entry.isFile) {
processing++;
entry.file(function (file) {
if (! excludes || ! file.name.match(excludes)) {
paths.push(entry.fullPath || '');
files.push(file);
}
processing--;
});
} else if (entry.isDirectory) {
if (fm.api >= 2.1) {
processing++;
mkdirs.push(entry.fullPath);
dirReader = entry.createReader();
entries = [];
// Call the reader.readEntries() until no more results are returned.
readEntries = function() {
dirReader.readEntries(function(results) {
if (cancel || !results.length) {
for (var i = 0; i < entries.length; i++) {
if (cancel) {
break;
}
doScan([entries[i]]);
}
processing--;
} else {
entries = entries.concat(toArray(results));
readEntries();
}
}, function(){
processing--;
});
};
readEntries(); // Start reading dirs.
}
}
}
}
}, hasDirs;
items = $.map(data.files.items, function(item){
return item.getAsEntry? item.getAsEntry() : item.webkitGetAsEntry();
});
$.each(items, function(i, item) {
if (item.isDirectory) {
hasDirs = true;
return false;
}
});
if (items.length > 0) {
fm.uploads.checkExists(items, target, fm, hasDirs).done(function(renames, hashes){
var dfds = [];
if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
if (renames === null) {
data.overwrite = 0;
renames = [];
}
items = $.grep(items, function(item){
var i, bak, hash, dfd, hi;
if (item.isDirectory && renames.length) {
i = $.inArray(item.name, renames);
if (i !== -1) {
renames.splice(i, 1);
bak = fm.uniqueName(item.name + fm.options.backupSuffix , null, '');
$.each(hashes, function(h, name) {
if (item.name == name) {
hash = h;
return false;
}
});
if (! hash) {
hash = fm.fileByName(item.name, target).hash;
}
fm.lockfiles({files : [hash]});
dfd = fm.request({
data : {cmd : 'rename', target : hash, name : bak},
notify : {type : 'rename', cnt : 1}
})
.fail(function(error) {
item._remove = true;
fm.sync();
})
.always(function() {
fm.unlockfiles({files : [hash]});
});
dfds.push(dfd);
}
}
return !item._remove? true : false;
});
}
$.when.apply($, dfds).done(function(){
var notifyto, msg,
id = +new Date(),
wait = function() {
if (!cancel && processing > 0) {
setTimeout(wait, 10);
} else {
notifyto && clearTimeout(notifyto);
fm.notify({type : 'readdir', id: id, cnt : -1});
if (cancel) {
dfrd.reject();
} else {
dfrd.resolve([files, paths, renames, hashes, mkdirs]);
}
}
};
if (items.length > 0) {
msg = fm.escape(items[0].name);
if (items.length > 1) {
msg += ' ... ' + items.length + fm.i18n('items');
}
notifyto = setTimeout(function() {
fm.notify({
type : 'readdir',
id : id,
cnt : 1,
hideCnt: true,
msg : fm.i18n('ntfreaddir') + ' (' + msg + ')',
cancel: function() {
cancel = true;
}
});
}, fm.options.notifyDelay);
doScan(items);
setTimeout(wait, 10);
} else {
dfrd.reject();
}
});
});
return dfrd.promise();
} else {
return dfrd.reject();
}
} else {
var ret = [];
var check = [];
var str = data.files[0];
if (data.type == 'html') {
var tmp = $("
").append($.parseHTML(str.replace(/ src=/ig, ' _elfsrc='))),
atag;
$('img[_elfsrc]', tmp).each(function(){
var url, purl,
self = $(this),
pa = self.closest('a');
if (pa && pa.attr('href') && pa.attr('href').match(/\.(?:jpe?g|gif|bmp|png)/i)) {
purl = pa.attr('href');
}
url = self.attr('_elfsrc');
if (url) {
if (purl) {
$.inArray(purl, ret) == -1 && ret.push(purl);
$.inArray(url, check) == -1 && check.push(url);
} else {
$.inArray(url, ret) == -1 && ret.push(url);
}
}
// Probably it's clipboard data
if (ret.length === 1 && ret[0].match(/^data:image\/png/)) {
data.clipdata = true;
}
});
atag = $('a[href]', tmp);
atag.each(function(){
var loc,
parseUrl = function(url) {
var a = document.createElement('a');
a.href = url;
return a;
};
if ($(this).text()) {
loc = parseUrl($(this).attr('href'));
if (loc.href && (atag.length === 1 || ! loc.pathname.match(/(?:\.html?|\/[^\/.]*)$/i))) {
if ($.inArray(loc.href, ret) == -1 && $.inArray(loc.href, check) == -1) ret.push(loc.href);
}
}
});
} else {
var regex, m, url;
regex = /(http[^<>"{}|\\^\[\]`\s]+)/ig;
while (m = regex.exec(str)) {
url = m[1].replace(/&/g, '&');
if ($.inArray(url, ret) == -1) ret.push(url);
}
}
return ret;
}
},
// upload transport using XMLHttpRequest
xhr : function(data, fm) {
var self = fm ? fm : this,
node = self.getUI(),
xhr = new XMLHttpRequest(),
notifyto = null, notifyto2 = null,
dataChecked = data.checked,
isDataType = (data.isDataType || data.type == 'data'),
target = (data.target || self.cwd().hash),
dropEvt = (data.dropEvt || null),
chunkEnable = (self.option('uploadMaxConn', target) != -1),
multiMax = Math.min(5, Math.max(1, self.option('uploadMaxConn', target))),
retryWait = 10000, // 10 sec
retryMax = 30, // 10 sec * 30 = 300 secs (Max 5 mins)
retry = 0,
getFile = function(files) {
var dfd = $.Deferred(),
file;
if (files.promise) {
files.always(function(f) {
dfd.resolve(Array.isArray(f) && f.length? (isDataType? f[0][0] : f[0]) : {});
});
} else {
dfd.resolve(files.length? (isDataType? files[0][0] : files[0]) : {});
}
return dfd;
},
dfrd = $.Deferred()
.fail(function(error) {
var userAbort;
if (error === 'userabort') {
userAbort = true;
error = void 0;
}
if (files && (self.uploads.xhrUploading || userAbort)) {
// send request om fail
getFile(files).done(function(file) {
if (! file._cid) {
// send sync request
self.uploads.failSyncTm && clearTimeout(self.uploads.failSyncTm);
self.uploads.failSyncTm = setTimeout(function() {
self.sync(target);
}, 1000);
} else if (! self.uploads.chunkfailReq[file._cid]) {
// send chunkfail request
self.uploads.chunkfailReq[file._cid] = true;
setTimeout(function() {
fm.request({
data : {
cmd: 'upload',
target: target,
chunk: file._chunk,
cid: file._cid,
upload: ['chunkfail'],
mimes: 'chunkfail'
},
options : {
type: 'post',
url: self.uploadURL
},
preventDefault: true
}).always(function() {
delete self.uploads.chunkfailReq[file._chunk];
});
}, 1000);
}
});
}
!userAbort && self.sync();
self.uploads.xhrUploading = false;
files = null;
error && self.error(error);
})
.done(function(data) {
self.uploads.xhrUploading = false;
files = null;
if (data) {
self.currentReqCmd = 'upload';
data.warning && self.error(data.warning);
self.updateCache(data);
data.removed && data.removed.length && self.remove(data);
data.added && data.added.length && self.add(data);
data.changed && data.changed.length && self.change(data);
self.trigger('upload', data, false);
self.trigger('uploaddone');
data.sync && self.sync();
data.debug && fm.debug('backend-debug', data);
}
})
.always(function() {
self.abortXHR(xhr);
// unregist fnAbort function
node.off('uploadabort', fnAbort);
$(window).off('unload', fnAbort);
notifyto && clearTimeout(notifyto);
notifyto2 && clearTimeout(notifyto2);
dataChecked && !data.multiupload && checkNotify() && self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0});
chunkMerge && notifyElm.children('.elfinder-notify-chunkmerge').length && self.notify({type : 'chunkmerge', cnt : -1});
}),
formData = new FormData(),
files = data.input ? data.input.files : self.uploads.checkFile(data, self, target),
cnt = data.checked? (isDataType? files[0].length : files.length) : files.length,
loaded = 0,
prev = 0,
filesize = 0,
notify = false,
notifyElm = self.ui.notify,
cancelBtn = true,
abort = false,
checkNotify = function() {
return (notify = notify || notifyElm.children('.elfinder-notify-upload').length);
},
fnAbort = function(e, error) {
abort = true;
self.abortXHR(xhr, { quiet: true, abort: true });
dfrd.reject(error);
if (checkNotify()) {
self.notify({type : 'upload', cnt : notifyElm.children('.elfinder-notify-upload').data('cnt') * -1, progress : 0, size : 0});
}
},
cancelToggle = function(show) {
notifyElm.children('.elfinder-notify-upload').children('.elfinder-notify-cancel')[show? 'show':'hide']();
},
startNotify = function(size) {
if (!size) size = filesize;
return setTimeout(function() {
notify = true;
self.notify({type : 'upload', cnt : cnt, progress : loaded - prev, size : size,
cancel: function() {
node.trigger('uploadabort', 'userabort');
}
});
prev = loaded;
if (data.multiupload) {
cancelBtn && cancelToggle(true);
} else {
cancelToggle(cancelBtn && loaded < size);
}
}, self.options.notifyDelay);
},
doRetry = function() {
if (retry++ <= retryMax) {
if (checkNotify() && prev) {
self.notify({type : 'upload', cnt : 0, progress : 0, size : prev});
}
self.abortXHR(xhr, { quiet: true });
prev = loaded = 0;
setTimeout(function() {
var reqId;
if (! abort) {
xhr.open('POST', self.uploadURL, true);
if (self.api >= 2.1029) {
reqId = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16);
(typeof formData['delete'] === 'function') && formData['delete']('reqid');
formData.append('reqid', reqId);
xhr._requestId = reqId;
}
xhr.send(formData);
}
}, retryWait);
} else {
node.trigger('uploadabort', ['errAbort', 'errTimeout']);
}
},
renames = (data.renames || null),
hashes = (data.hashes || null),
chunkMerge = false;
// regist fnAbort function
node.one('uploadabort', fnAbort);
$(window).one('unload.' + fm.namespace, fnAbort);
!chunkMerge && (prev = loaded);
if (!isDataType && !cnt) {
return dfrd.reject(['errUploadNoFiles']);
}
xhr.addEventListener('error', function() {
if (xhr.status == 0) {
if (abort) {
dfrd.reject();
} else {
// ff bug while send zero sized file
// for safari - send directory
if (!isDataType && data.files && $.grep(data.files, function(f){return ! f.type && f.size === (self.UA.Safari? 1802 : 0)? true : false;}).length) {
errors.push('errFolderUpload');
dfrd.reject(['errAbort', 'errFolderUpload']);
} else if (data.input && $.grep(data.input.files, function(f){return ! f.type && f.size === (self.UA.Safari? 1802 : 0)? true : false;}).length) {
dfrd.reject(['errUploadNoFiles']);
} else {
doRetry();
}
}
} else {
node.trigger('uploadabort', 'errConnect');
}
}, false);
xhr.addEventListener('load', function(e) {
var status = xhr.status, res, curr = 0, error = '';
if (status >= 400) {
if (status > 500) {
error = 'errResponse';
} else {
error = ['errResponse', 'errServerError'];
}
} else {
if (!xhr.responseText) {
error = ['errResponse', 'errDataEmpty'];
}
}
if (error) {
node.trigger('uploadabort');
getFile(files).done(function(file) {
return dfrd.reject(file._cid? null : error);
});
}
loaded = filesize;
if (checkNotify() && (curr = loaded - prev)) {
self.notify({type : 'upload', cnt : 0, progress : curr, size : 0});
}
res = self.parseUploadData(xhr.responseText);
// chunked upload commit
if (res._chunkmerged) {
formData = new FormData();
var _file = [{_chunkmerged: res._chunkmerged, _name: res._name, _mtime: res._mtime}];
chunkMerge = true;
node.off('uploadabort', fnAbort);
notifyto2 = setTimeout(function() {
self.notify({type : 'chunkmerge', cnt : 1});
}, self.options.notifyDelay);
isDataType? send(_file, files[1]) : send(_file);
return;
}
res._multiupload = data.multiupload? true : false;
if (res.error) {
self.trigger('uploadfail', res);
if (res._chunkfailure || res._multiupload) {
abort = true;
self.uploads.xhrUploading = false;
notifyto && clearTimeout(notifyto);
if (notifyElm.children('.elfinder-notify-upload').length) {
self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0});
dfrd.reject(res.error);
} else {
// for multi connection
dfrd.reject();
}
} else {
dfrd.reject(res.error);
}
} else {
dfrd.resolve(res);
}
}, false);
xhr.upload.addEventListener('loadstart', function(e) {
if (!chunkMerge && e.lengthComputable) {
loaded = e.loaded;
retry && (loaded = 0);
filesize = e.total;
if (!loaded) {
loaded = parseInt(filesize * 0.05);
}
if (checkNotify()) {
self.notify({type : 'upload', cnt : 0, progress : loaded - prev, size : data.multiupload? 0 : filesize});
prev = loaded;
}
}
}, false);
xhr.upload.addEventListener('progress', function(e) {
var curr;
if (e.lengthComputable && !chunkMerge && xhr.readyState < 2) {
loaded = e.loaded;
// to avoid strange bug in safari (not in chrome) with drag&drop.
// bug: macos finder opened in any folder,
// reset safari cache (option+command+e), reload elfinder page,
// drop file from finder
// on first attempt request starts (progress callback called ones) but never ends.
// any next drop - successfull.
if (!data.checked && loaded > 0 && !notifyto) {
notifyto = startNotify(xhr._totalSize - loaded);
}
if (!filesize) {
filesize = e.total;
if (!loaded) {
loaded = parseInt(filesize * 0.05);
}
}
curr = loaded - prev;
if (checkNotify() && (curr/e.total) >= 0.05) {
self.notify({type : 'upload', cnt : 0, progress : curr, size : 0});
prev = loaded;
}
if (! data.multiupload && loaded >= filesize) {
cancelBtn = false;
cancelToggle(false);
}
}
}, false);
var send = function(files, paths){
var size = 0,
fcnt = 1,
sfiles = [],
c = 0,
total = cnt,
maxFileSize,
totalSize = 0,
chunked = [],
chunkID = new Date().getTime().toString().substr(-9), // for take care of the 32bit backend system
BYTES_PER_CHUNK = Math.min((fm.uplMaxSize? fm.uplMaxSize : 2097152) - 8190, fm.options.uploadMaxChunkSize), // uplMaxSize margin 8kb or options.uploadMaxChunkSize
blobSlice = chunkEnable? false : '',
blobSize, blobMtime, i, start, end, chunks, blob, chunk, added, done, last, failChunk,
multi = function(files, num){
var sfiles = [], cid, sfilesLen = 0, cancelChk;
if (!abort) {
while(files.length && sfiles.length < num) {
sfiles.push(files.shift());
}
sfilesLen = sfiles.length;
if (sfilesLen) {
cancelChk = sfilesLen;
for (var i=0; i < sfilesLen; i++) {
if (abort) {
break;
}
cid = isDataType? (sfiles[i][0][0]._cid || null) : (sfiles[i][0]._cid || null);
if (!!failChunk[cid]) {
last--;
continue;
}
fm.exec('upload', {
type: data.type,
isDataType: isDataType,
files: sfiles[i],
checked: true,
target: target,
dropEvt: dropEvt,
renames: renames,
hashes: hashes,
multiupload: true,
overwrite: data.overwrite === 0? 0 : void 0
}, void 0, target)
.fail(function(error) {
if (error && error === 'No such command') {
abort = true;
fm.error(['errUpload', 'errPerm']);
}
if (cid) {
failChunk[cid] = true;
}
})
.always(function(e) {
if (e && e.added) added = $.merge(added, e.added);
if (last <= ++done) {
fm.trigger('multiupload', {added: added});
notifyto && clearTimeout(notifyto);
if (checkNotify()) {
self.notify({type : 'upload', cnt : -cnt, progress : 0, size : 0});
}
}
if (files.length) {
multi(files, 1); // Next one
} else {
if (--cancelChk <= 1) {
cancelBtn = false;
cancelToggle(false);
}
}
});
}
}
}
if (sfiles.length < 1 || abort) {
if (abort) {
notifyto && clearTimeout(notifyto);
if (cid) {
failChunk[cid] = true;
}
dfrd.reject();
} else {
dfrd.resolve();
self.uploads.xhrUploading = false;
}
}
},
check = function(){
if (!self.uploads.xhrUploading) {
self.uploads.xhrUploading = true;
multi(sfiles, multiMax); // Max connection: 3
} else {
setTimeout(function(){ check(); }, 100);
}
},
reqId;
if (! dataChecked && (isDataType || data.type == 'files')) {
if (! (maxFileSize = fm.option('uploadMaxSize', target))) {
maxFileSize = 0;
}
for (i=0; i < files.length; i++) {
try {
blob = files[i];
blobSize = blob.size;
if (blobSlice === false) {
blobSlice = '';
if (self.api >= 2.1) {
if ('slice' in blob) {
blobSlice = 'slice';
} else if ('mozSlice' in blob) {
blobSlice = 'mozSlice';
} else if ('webkitSlice' in blob) {
blobSlice = 'webkitSlice';
}
}
}
} catch(e) {
cnt--;
total--;
continue;
}
// file size check
if ((maxFileSize && blobSize > maxFileSize) || (!blobSlice && fm.uplMaxSize && blobSize > fm.uplMaxSize)) {
self.error(self.i18n('errUploadFile', blob.name) + ' ' + self.i18n('errUploadFileSize'));
cnt--;
total--;
continue;
}
// file mime check
if (blob.type && ! self.uploadMimeCheck(blob.type, target)) {
self.error(self.i18n('errUploadFile', blob.name) + ' ' + self.i18n('errUploadMime') + ' (' + self.escape(blob.type) + ')');
cnt--;
total--;
continue;
}
if (blobSlice && blobSize > BYTES_PER_CHUNK) {
start = 0;
end = BYTES_PER_CHUNK;
chunks = -1;
total = Math.floor(blobSize / BYTES_PER_CHUNK);
blobMtime = blob.lastModified? Math.round(blob.lastModified/1000) : 0;
totalSize += blobSize;
chunked[chunkID] = 0;
while(start <= blobSize) {
chunk = blob[blobSlice](start, end);
chunk._chunk = blob.name + '.' + (++chunks) + '_' + total + '.part';
chunk._cid = chunkID;
chunk._range = start + ',' + chunk.size + ',' + blobSize;
chunk._mtime = blobMtime;
chunked[chunkID]++;
if (size) {
c++;
}
if (typeof sfiles[c] == 'undefined') {
sfiles[c] = [];
if (isDataType) {
sfiles[c][0] = [];
sfiles[c][1] = [];
}
}
size = BYTES_PER_CHUNK;
fcnt = 1;
if (isDataType) {
sfiles[c][0].push(chunk);
sfiles[c][1].push(paths[i]);
} else {
sfiles[c].push(chunk);
}
start = end;
end = start + BYTES_PER_CHUNK;
}
if (chunk == null) {
self.error(self.i18n('errUploadFile', blob.name) + ' ' + self.i18n('errUploadFileSize'));
cnt--;
total--;
} else {
total += chunks;
size = 0;
fcnt = 1;
c++;
}
continue;
}
if ((fm.uplMaxSize && size + blobSize >= fm.uplMaxSize) || fcnt > fm.uplMaxFile) {
size = 0;
fcnt = 1;
c++;
}
if (typeof sfiles[c] == 'undefined') {
sfiles[c] = [];
if (isDataType) {
sfiles[c][0] = [];
sfiles[c][1] = [];
}
}
if (isDataType) {
sfiles[c][0].push(blob);
sfiles[c][1].push(paths[i]);
} else {
sfiles[c].push(blob);
}
size += blobSize;
totalSize += blobSize;
fcnt++;
}
if (sfiles.length == 0) {
// no data
data.checked = true;
return false;
}
if (sfiles.length > 1) {
// multi upload
notifyto = startNotify(totalSize);
added = [];
done = 0;
last = sfiles.length;
failChunk = [];
check();
return true;
}
// single upload
if (isDataType) {
files = sfiles[0][0];
paths = sfiles[0][1];
} else {
files = sfiles[0];
}
}
if (!dataChecked) {
if (!fm.UA.Safari || !data.files) {
notifyto = startNotify(totalSize);
} else {
xhr._totalSize = totalSize;
}
}
dataChecked = true;
if (! files.length) {
dfrd.reject(['errUploadNoFiles']);
}
xhr.open('POST', self.uploadURL, true);
// set request headers
if (fm.customHeaders) {
$.each(fm.customHeaders, function(key) {
xhr.setRequestHeader(key, this);
});
}
// set xhrFields
if (fm.xhrFields) {
$.each(fm.xhrFields, function(key) {
if (key in xhr) {
xhr[key] = this;
}
});
}
if (self.api >= 2.1029) {
// request ID
reqId = (+ new Date()).toString(16) + Math.floor(1000 * Math.random()).toString(16);
formData.append('reqid', reqId);
xhr._requestId = reqId;
}
formData.append('cmd', 'upload');
formData.append(self.newAPI ? 'target' : 'current', target);
if (renames && renames.length) {
$.each(renames, function(i, v) {
formData.append('renames[]', v);
});
formData.append('suffix', fm.options.backupSuffix);
}
if (hashes) {
$.each(hashes, function(i, v) {
formData.append('hashes['+ i +']', v);
});
}
$.each(self.customData, function(key, val) {
formData.append(key, val);
});
$.each(self.options.onlyMimes, function(i, mime) {
formData.append('mimes[]', mime);
});
$.each(files, function(i, file) {
if (file._chunkmerged) {
formData.append('chunk', file._chunkmerged);
formData.append('upload[]', file._name);
formData.append('mtime[]', file._mtime);
} else {
if (file._chunkfail) {
formData.append('upload[]', 'chunkfail');
formData.append('mimes', 'chunkfail');
} else {
formData.append('upload[]', file);
if (data.clipdata) {
data.overwrite = 0;
formData.append('name[]', fm.date(fm.nonameDateFormat) + '.png');
}
if (fm.UA.iOS) {
if (file.name.match(/^image\.jpe?g$/i)) {
data.overwrite = 0;
formData.append('name[]', fm.date(fm.nonameDateFormat) + '.jpg');
} else if (file.name.match(/^capturedvideo\.mov$/i)) {
data.overwrite = 0;
formData.append('name[]', fm.date(fm.nonameDateFormat) + '.mov');
}
}
}
if (file._chunk) {
formData.append('chunk', file._chunk);
formData.append('cid' , file._cid);
formData.append('range', file._range);
formData.append('mtime[]', file._mtime);
} else {
formData.append('mtime[]', file.lastModified? Math.round(file.lastModified/1000) : 0);
}
}
});
if (isDataType) {
$.each(paths, function(i, path) {
formData.append('upload_path[]', path);
});
}
if (data.overwrite === 0) {
formData.append('overwrite', 0);
}
// send int value that which meta key was pressed when dropped as `dropWith`
if (dropEvt) {
formData.append('dropWith', parseInt(
(dropEvt.altKey ? '1' : '0')+
(dropEvt.ctrlKey ? '1' : '0')+
(dropEvt.metaKey ? '1' : '0')+
(dropEvt.shiftKey? '1' : '0'), 2));
}
xhr.send(formData);
return true;
};
if (! isDataType) {
if (files.length > 0) {
if (! data.clipdata && renames == null) {
var mkdirs = [],
paths = [],
excludes = fm.options.folderUploadExclude[fm.OS] || null;
$.each(files, function(i, file) {
var relPath = file.webkitRelativePath || file.relativePath || '',
idx, rootDir;
if (! relPath) {
return false;
}
if (excludes && file.name.match(excludes)) {
file._remove = true;
relPath = void(0);
} else {
relPath = relPath.replace(/\/[^\/]*$/, '');
if (relPath && $.inArray(relPath, mkdirs) === -1) {
mkdirs.push(relPath);
// checking the root directory to supports see #2378
idx = relPath.indexOf('/');
if (idx !== -1 && (rootDir = relPath.substr(0, idx)) && $.inArray(rootDir, mkdirs) === -1) {
mkdirs.unshift(rootDir);
}
}
}
paths.push(relPath);
});
renames = [];
hashes = {};
if (mkdirs.length) {
(function() {
var checkDirs = $.map(mkdirs, function(name) { return name.indexOf('/') === -1 ? {name: name} : null;}),
cancelDirs = [];
fm.uploads.checkExists(checkDirs, target, fm, true).done(
function(res, res2) {
var dfds = [], dfd, bak, hash;
if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
cancelDirs = $.map(checkDirs, function(dir) { return dir._remove? dir.name : null ;} );
checkDirs = $.grep(checkDirs, function(dir) { return !dir._remove? true : false ;} );
}
if (cancelDirs.length) {
$.each(paths.concat(), function(i, path) {
if ($.inArray(path, cancelDirs) === 0) {
files[i]._remove = true;
delete paths[i];
}
});
}
files = $.grep(files, function(file) { return file._remove? false : true; });
paths = $.grep(paths, function(path) { return path === void 0 ? false : true; });
if (checkDirs.length) {
dfd = $.Deferred();
if (res.length) {
$.each(res, function(i, existName) {
// backup
bak = fm.uniqueName(existName + fm.options.backupSuffix , null, '');
$.each(res2, function(h, name) {
if (res[0] == name) {
hash = h;
return false;
}
});
if (! hash) {
hash = fm.fileByName(res[0], target).hash;
}
fm.lockfiles({files : [hash]});
dfds.push(
fm.request({
data : {cmd : 'rename', target : hash, name : bak},
notify : {type : 'rename', cnt : 1}
})
.fail(function(error) {
dfrd.reject(error);
fm.sync();
})
.always(function() {
fm.unlockfiles({files : [hash]});
})
);
});
} else {
dfds.push(null);
}
$.when.apply($, dfds).done(function() {
// ensure directories
fm.request({
data : {cmd : 'mkdir', target : target, dirs : mkdirs},
notify : {type : 'mkdir', cnt : mkdirs.length},
preventFail: true
})
.fail(function(error) {
error = error || ['errUnknown'];
if (error[0] === 'errCmdParams') {
multiMax = 1;
} else {
multiMax = 0;
dfrd.reject(error);
}
})
.done(function(data) {
if (data.hashes) {
paths = $.map(paths.concat(), function(p) {
if (p === '') {
return target;
} else {
return data.hashes['/' + p];
}
});
}
})
.always(function(data) {
if (multiMax) {
isDataType = true;
if (! send(files, paths)) {
dfrd.reject();
}
}
});
});
} else {
dfrd.reject();
}
}
);
})();
} else {
fm.uploads.checkExists(files, target, fm).done(
function(res, res2){
if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
hashes = res2;
if (res === null) {
data.overwrite = 0;
} else {
renames = res;
}
files = $.grep(files, function(file){return !file._remove? true : false ;});
}
cnt = files.length;
if (cnt > 0) {
if (! send(files)) {
dfrd.reject();
}
} else {
dfrd.reject();
}
}
);
}
} else {
if (! send(files)) {
dfrd.reject();
}
}
} else {
dfrd.reject();
}
} else {
if (dataChecked) {
send(files[0], files[1]);
} else {
files.done(function(result) { // result: [files, paths, renames, hashes, mkdirs]
renames = [];
cnt = result[0].length;
if (cnt) {
if (result[4] && result[4].length) {
// ensure directories
fm.request({
data : {cmd : 'mkdir', target : target, dirs : result[4]},
notify : {type : 'mkdir', cnt : result[4].length},
preventFail: true
})
.fail(function(error) {
error = error || ['errUnknown'];
if (error[0] === 'errCmdParams') {
multiMax = 1;
} else {
multiMax = 0;
dfrd.reject(error);
}
})
.done(function(data) {
if (data.hashes) {
result[1] = $.map(result[1], function(p) {
p = p.replace(/\/[^\/]*$/, '');
if (p === '') {
return target;
} else {
return data.hashes[p];
}
});
}
})
.always(function(data) {
if (multiMax) {
renames = result[2];
hashes = result[3];
send(result[0], result[1]);
}
});
return;
} else {
result[1] = $.map(result[1], function() { return target; });
}
renames = result[2];
hashes = result[3];
send(result[0], result[1]);
} else {
dfrd.reject(['errUploadNoFiles']);
}
}).fail(function(){
dfrd.reject();
});
}
}
return dfrd;
},
// upload transport using iframe
iframe : function(data, fm) {
var self = fm ? fm : this,
input = data.input? data.input : false,
files = !input ? self.uploads.checkFile(data, self) : false,
dfrd = $.Deferred()
.fail(function(error) {
error && self.error(error);
}),
name = 'iframe-'+fm.namespace+(++self.iframeCnt),
form = $(''),
msie = this.UA.IE,
// clear timeouts, close notification dialog, remove form/iframe
onload = function() {
abortto && clearTimeout(abortto);
notifyto && clearTimeout(notifyto);
notify && self.notify({type : 'upload', cnt : -cnt});
setTimeout(function() {
msie && $('').appendTo(form);
form.remove();
iframe.remove();
}, 100);
},
iframe = $('')
.on('load', function() {
iframe.off('load')
.on('load', function() {
onload();
// data will be processed in callback response or window onmessage
dfrd.resolve();
});
// notify dialog
notifyto = setTimeout(function() {
notify = true;
self.notify({type : 'upload', cnt : cnt});
}, self.options.notifyDelay);
// emulate abort on timeout
if (self.options.iframeTimeout > 0) {
abortto = setTimeout(function() {
onload();
dfrd.reject([errors.connect, errors.timeout]);
}, self.options.iframeTimeout);
}
form.submit();
}),
target = (data.target || self.cwd().hash),
names = [],
dfds = [],
renames = [],
hashes = {},
cnt, notify, notifyto, abortto;
if (files && files.length) {
$.each(files, function(i, val) {
form.append(' ');
});
cnt = 1;
} else if (input && $(input).is(':file') && $(input).val()) {
if (fm.options.overwriteUploadConfirm && fm.option('uploadOverwrite', target)) {
names = input.files? input.files : [{ name: $(input).val().replace(/^(?:.+[\\\/])?([^\\\/]+)$/, '$1') }];
//names = $.map(names, function(file){return file.name? { name: file.name } : null ;});
dfds.push(self.uploads.checkExists(names, target, self).done(
function(res, res2){
hashes = res2;
if (res === null) {
data.overwrite = 0;
} else{
renames = res;
cnt = $.grep(names, function(file){return !file._remove? true : false ;}).length;
if (cnt != names.length) {
cnt = 0;
}
}
}
));
}
cnt = input.files ? input.files.length : 1;
form.append(input);
} else {
return dfrd.reject();
}
$.when.apply($, dfds).done(function() {
if (cnt < 1) {
return dfrd.reject();
}
form.append(' ')
.append(' ')
.append(' ')
.append($(input).attr('name', 'upload[]'));
if (renames.length > 0) {
$.each(renames, function(i, rename) {
form.append(' ');
});
form.append(' ');
}
if (hashes) {
$.each(renames, function(i, v) {
form.append(' ');
});
}
if (data.overwrite === 0) {
form.append(' ');
}
$.each(self.options.onlyMimes||[], function(i, mime) {
form.append(' ');
});
$.each(self.customData, function(key, val) {
form.append(' ');
});
form.appendTo('body');
iframe.appendTo('body');
});
return dfrd;
}
},
/**
* Bind callback to event(s) The callback is executed at most once per event.
* To bind to multiply events at once, separate events names by space
*
* @param String event name
* @param Function callback
* @return elFinder
*/
one : function(ev, callback) {
var self = this,
event = ev.toLowerCase(),
h = function(e, f) {
if (!self.toUnbindEvents[event]) {
self.toUnbindEvents[event] = [];
}
self.toUnbindEvents[event].push({
type: event,
callback: h
});
return callback.apply(this, arguments);
};
return this.bind(event, h);
},
/**
* Set/get data into/from localStorage
*
* @param String key
* @param String|void value
* @return String|null
*/
localStorage : function(key, val) {
var self = this,
s = window.localStorage,
oldkey = 'elfinder-'+(key || '')+this.id, // old key of elFinder < 2.1.6
prefix = window.location.pathname+'-elfinder-',
suffix = this.id,
clrs = [],
retval, oldval, t, precnt, sufcnt;
// reset this node data
if (typeof(key) === 'undefined') {
precnt = prefix.length;
sufcnt = suffix.length * -1;
$.each(s, function(key) {
if (key.substr(0, precnt) === prefix && key.substr(sufcnt) === suffix) {
clrs.push(key);
}
});
$.each(clrs, function(i, key) {
s.removeItem(key);
});
return true;
}
// new key of elFinder >= 2.1.6
key = prefix+key+suffix;
if (val === null) {
return s.removeItem(key);
}
if (val === void(0) && !(retval = s.getItem(key)) && (oldval = s.getItem(oldkey))) {
val = oldval;
s.removeItem(oldkey);
}
if (val !== void(0)) {
t = typeof val;
if (t !== 'string' && t !== 'number') {
val = JSON.stringify(val);
}
try {
s.setItem(key, val);
} catch (e) {
try {
s.clear();
s.setItem(key, val);
} catch (e) {
self.debug('error', e.toString());
}
}
retval = s.getItem(key);
}
if (retval && (retval.substr(0,1) === '{' || retval.substr(0,1) === '[')) {
try {
return JSON.parse(retval);
} catch(e) {}
}
return retval;
},
/**
* Get/set cookie
*
* @param String cookie name
* @param String|void cookie value
* @return String|null
*/
cookie : function(name, value) {
var d, o, c, i, retval, t;
name = 'elfinder-'+name+this.id;
if (value === void(0)) {
if (document.cookie && document.cookie != '') {
c = document.cookie.split(';');
name += '=';
for (i=0; i '),
/**
* Replace not html-safe symbols to html entities
*
* @param String text to escape
* @return String
*/
escape : function(name) {
return this._node.text(name).html().replace(/"/g, '"').replace(/'/g, ''');
},
/**
* Cleanup ajax data.
* For old api convert data into new api format
*
* @param String command name
* @param Object data from backend
* @return Object
*/
normalize : function(data) {
var self = this,
fileFilter = (function() {
var func, filter;
if (filter = self.options.fileFilter) {
if (typeof filter === 'function') {
func = function(file) {
return filter.call(self, file);
};
} else if (filter instanceof RegExp) {
func = function(file) {
return filter.test(file.name);
};
}
}
return func? func : null;
})(),
chkCmdMap = function(opts) {
// Disable command to replace with other command
var disabled;
if (opts.uiCmdMap) {
if ($.isPlainObject(opts.uiCmdMap) && Object.keys(opts.uiCmdMap).length) {
if (!opts.disabledFlip) {
opts.disabledFlip = {};
}
disabled = opts.disabledFlip;
$.each(opts.uiCmdMap, function(f, t) {
if (t === 'hidden' && !disabled[f]) {
opts.disabled.push(f);
opts.disabledFlip[f] = true;
}
});
} else {
delete opts.uiCmdMap;
}
}
},
normalizeOptions = function(opts) {
var getType = function(v) {
var type = typeof v;
if (type === 'object' && Array.isArray(v)) {
type = 'array';
}
return type;
};
$.each(self.optionProperties, function(k, empty) {
if (empty !== void(0)) {
if (opts[k] && getType(opts[k]) !== getType(empty)) {
opts[k] = empty;
}
}
});
if (opts['disabled']) {
opts['disabledFlip'] = self.arrayFlip(opts['disabled'], true);
} else {
opts['disabledFlip'] = {};
}
return opts;
},
filter = function(file, asMap, type) {
var res = asMap? file : true,
ign = asMap? null : false,
vid, targetOptions, isRoot, rootNames;
if (file && file.hash && file.name && file.mime) {
if (file.mime === 'application/x-empty') {
file.mime = 'text/plain';
}
isRoot = self.isRoot(file);
if (isRoot && ! file.volumeid) {
self.debug('warning', 'The volume root statuses requires `volumeid` property.');
}
if (isRoot || file.mime === 'directory') {
// Prevention of circular reference
if (file.phash) {
if (file.phash === file.hash) {
error = error.concat(['Parent folder of "$1" is itself.', file.name]);
return ign;
}
if (isRoot && file.volumeid && file.phash.indexOf(file.volumeid) === 0) {
error = error.concat(['Parent folder of "$1" is inner itself.', file.name]);
return ign;
}
}
// set options, tmbUrls for each volume
if (file.volumeid) {
vid = file.volumeid;
if (isRoot) {
// make or update of leaf roots cache
if (file.phash) {
if (! self.leafRoots[file.phash]) {
self.leafRoots[file.phash] = [ file.hash ];
} else {
if ($.inArray(file.hash, self.leafRoots[file.phash]) === -1) {
self.leafRoots[file.phash].push(file.hash);
}
}
}
self.hasVolOptions = true;
if (! self.volOptions[vid]) {
self.volOptions[vid] = {
// set dispInlineRegex
dispInlineRegex: self.options.dispInlineRegex
};
}
targetOptions = self.volOptions[vid];
if (file.options) {
// >= v.2.1.14 has file.options
Object.assign(targetOptions, file.options);
}
// for compat <= v2.1.13
if (file.disabled) {
targetOptions.disabled = file.disabled;
targetOptions.disabledFlip = self.arrayFlip(file.disabled, true);
}
if (file.tmbUrl) {
targetOptions.tmbUrl = file.tmbUrl;
}
// '/' required at the end of url
if (targetOptions.url && targetOptions.url.substr(-1) !== '/') {
targetOptions.url += '/';
}
// check uiCmdMap
chkCmdMap(targetOptions);
// check trash bin hash
if (targetOptions.trashHash) {
if (self.trashes[targetOptions.trashHash] === false) {
delete targetOptions.trashHash;
} else {
self.trashes[targetOptions.trashHash] = file.hash;
}
}
// set immediate properties
$.each(self.optionProperties, function(k) {
if (targetOptions[k]) {
file[k] = targetOptions[k];
}
});
// regist fm.roots
if (type !== 'cwd') {
self.roots[vid] = file.hash;
}
}
if (prevId !== vid) {
prevId = vid;
i18nFolderName = self.option('i18nFolderName', vid);
}
}
// volume root i18n name
if (isRoot && ! file.i18) {
name = 'volume_' + file.name,
i18 = self.i18n(false, name);
if (name !== i18) {
file.i18 = i18;
}
}
// i18nFolderName
if (i18nFolderName && ! file.i18) {
name = 'folder_' + file.name,
i18 = self.i18n(false, name);
if (name !== i18) {
file.i18 = i18;
}
}
if (isRoot) {
if (rootNames = self.storage('rootNames')) {
if (rootNames[file.hash]) {
file._name = file.name;
file._i18 = file.i18;
file.name = rootNames[file.hash] = rootNames[file.hash];
delete file.i18;
}
self.storage('rootNames', rootNames);
}
}
// lock trash bins holder
if (self.trashes[file.hash]) {
file.locked = true;
}
} else if (fileFilter) {
try {
if (! fileFilter(file)) {
return ign;
}
} catch(e) {
self.debug(e);
}
}
if (file.options) {
self.optionsByHashes[file.hash] = normalizeOptions(file.options);
}
delete file.options;
return res;
}
return ign;
},
getDescendants = function(hashes) {
var res = [];
$.each(self.files(), function(h, f) {
$.each(self.parents(h), function(i, ph) {
if ($.inArray(ph, hashes) !== -1 && $.inArray(h, hashes) === -1) {
res.push(h);
return false;
}
});
});
return res;
},
applyLeafRootStats = function(dataArr, type) {
$.each(dataArr, function(i, f) {
var pfile, done;
if (self.leafRoots[f.hash]) {
self.applyLeafRootStats(f);
}
// update leaf root parent stat
if (type !== 'change' && f.phash && self.isRoot(f) && (pfile = self.file(f.phash))) {
self.applyLeafRootStats(pfile);
// add to data.changed
if (!data.changed) {
data.changed = [pfile];
} else {
$.each(data.changed, function(i, f) {
if (f.hash === pfile.hash) {
data.changed[i] = pfile;
done = true;
return false;
}
});
if (!done) {
data.changed.push(pfile);
}
}
}
});
},
error = [],
name, i18, i18nFolderName, prevId, cData;
// set cunstom data
if (data.customData && data.customData !== self.prevCustomData) {
self.prevCustomData = data.customData;
try {
cData = JSON.parse(data.customData);
if ($.isPlainObject(cData)) {
self.prevCustomData = cData;
$.each(Object.keys(cData), function(i, key) {
if (cData[key] === null) {
delete cData[key];
delete self.optsCustomData[key];
}
});
self.customData = Object.assign({}, self.optsCustomData, cData);
}
} catch(e) {}
}
if (data.options) {
normalizeOptions(data.options);
}
if (data.cwd) {
if (data.cwd.volumeid && data.options && Object.keys(data.options).length && self.isRoot(data.cwd)) {
self.hasVolOptions = true;
self.volOptions[data.cwd.volumeid] = data.options;
}
data.cwd = filter(data.cwd, true, 'cwd');
}
if (data.files) {
data.files = $.grep(data.files, filter);
}
if (data.tree) {
data.tree = $.grep(data.tree, filter);
}
if (data.added) {
data.added = $.grep(data.added, filter);
}
if (data.changed) {
data.changed = $.grep(data.changed, filter);
}
if (data.removed && data.removed.length && self.searchStatus.state === 2) {
data.removed = data.removed.concat(getDescendants(data.removed));
}
if (data.api) {
data.init = true;
}
if (Object.keys(self.leafRoots).length) {
data.files && applyLeafRootStats(data.files);
data.tree && applyLeafRootStats(data.tree);
data.added && applyLeafRootStats(data.added);
data.changed && applyLeafRootStats(data.changed, 'change');
}
// merge options that apply only to cwd
if (data.cwd && data.cwd.options && data.options) {
Object.assign(data.options, normalizeOptions(data.cwd.options));
}
// '/' required at the end of url
if (data.options && data.options.url && data.options.url.substr(-1) !== '/') {
data.options.url += '/';
}
// check error
if (error.length) {
data.norError = ['errResponse'].concat(error);
}
return data;
},
/**
* Update sort options
*
* @param {String} sort type
* @param {String} sort order
* @param {Boolean} show folder first
*/
setSort : function(type, order, stickFolders, alsoTreeview) {
this.storage('sortType', (this.sortType = this.sortRules[type] ? type : 'name'));
this.storage('sortOrder', (this.sortOrder = /asc|desc/.test(order) ? order : 'asc'));
this.storage('sortStickFolders', (this.sortStickFolders = !!stickFolders) ? 1 : '');
this.storage('sortAlsoTreeview', (this.sortAlsoTreeview = !!alsoTreeview) ? 1 : '');
this.trigger('sortchange');
},
_sortRules : {
name : function(file1, file2) {
return elFinder.prototype.naturalCompare(file1.i18 || file1.name, file2.i18 || file2.name);
},
size : function(file1, file2) {
var size1 = parseInt(file1.size) || 0,
size2 = parseInt(file2.size) || 0;
return size1 === size2 ? 0 : size1 > size2 ? 1 : -1;
},
kind : function(file1, file2) {
return elFinder.prototype.naturalCompare(file1.mime, file2.mime);
},
date : function(file1, file2) {
var date1 = file1.ts || file1.date || 0,
date2 = file2.ts || file2.date || 0;
return date1 === date2 ? 0 : date1 > date2 ? 1 : -1;
},
perm : function(file1, file2) {
var val = function(file) { return (file.write? 2 : 0) + (file.read? 1 : 0); },
v1 = val(file1),
v2 = val(file2);
return v1 === v2 ? 0 : v1 > v2 ? 1 : -1;
},
mode : function(file1, file2) {
var v1 = file1.mode || (file1.perm || ''),
v2 = file2.mode || (file2.perm || '');
return elFinder.prototype.naturalCompare(v1, v2);
},
owner : function(file1, file2) {
var v1 = file1.owner || '',
v2 = file2.owner || '';
return elFinder.prototype.naturalCompare(v1, v2);
},
group : function(file1, file2) {
var v1 = file1.group || '',
v2 = file2.group || '';
return elFinder.prototype.naturalCompare(v1, v2);
}
},
/**
* Valid sort rule names
*
* @type Array
*/
sorters : [],
/**
* Compare strings for natural sort
*
* @param String
* @param String
* @return Number
*/
naturalCompare : function(a, b) {
var self = elFinder.prototype.naturalCompare;
if (typeof self.loc == 'undefined') {
self.loc = (navigator.userLanguage || navigator.browserLanguage || navigator.language || 'en-US');
}
if (typeof self.sort == 'undefined') {
if ('11'.localeCompare('2', self.loc, {numeric: true}) > 0) {
// Native support
if (window.Intl && window.Intl.Collator) {
self.sort = new Intl.Collator(self.loc, {numeric: true}).compare;
} else {
self.sort = function(a, b) {
return a.localeCompare(b, self.loc, {numeric: true});
};
}
} else {
/*
* Edited for elFinder (emulates localeCompare() by numeric) by Naoki Sawada aka nao-pon
*/
/*
* Huddle/javascript-natural-sort (https://github.com/Huddle/javascript-natural-sort)
*/
/*
* Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
* Author: Jim Palmer (based on chunking idea from Dave Koelle)
* http://opensource.org/licenses/mit-license.php
*/
self.sort = function(a, b) {
var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
sre = /(^[ ]*|[ ]*$)/g,
dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
hre = /^0x[0-9a-f]+$/i,
ore = /^0/,
syre = /^[\x01\x21-\x2f\x3a-\x40\x5b-\x60\x7b-\x7e]/, // symbol first - (Naoki Sawada)
i = function(s) { return self.sort.insensitive && (''+s).toLowerCase() || ''+s; },
// convert all to strings strip whitespace
// first character is "_", it's smallest - (Naoki Sawada)
x = i(a).replace(sre, '').replace(/^_/, "\x01") || '',
y = i(b).replace(sre, '').replace(/^_/, "\x01") || '',
// chunk/tokenize
xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
// numeric, hex or date detection
xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)),
yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null,
oFxNcL, oFyNcL,
locRes = 0;
// first try and sort Hex codes or Dates
if (yD) {
if ( xD < yD ) return -1;
else if ( xD > yD ) return 1;
}
// natural sorting through split numeric strings and default strings
for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
// find floats not starting with '0', string or 0 if not defined (Clint Priest)
oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
// handle numeric vs string comparison - number < string - (Kyle Adams)
// but symbol first < number - (Naoki Sawada)
if (isNaN(oFxNcL) !== isNaN(oFyNcL)) {
if (isNaN(oFxNcL) && (typeof oFxNcL !== 'string' || ! oFxNcL.match(syre))) {
return 1;
} else if (typeof oFyNcL !== 'string' || ! oFyNcL.match(syre)) {
return -1;
}
}
// use decimal number comparison if either value is string zero
if (parseInt(oFxNcL, 10) === 0) oFxNcL = 0;
if (parseInt(oFyNcL, 10) === 0) oFyNcL = 0;
// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
if (typeof oFxNcL !== typeof oFyNcL) {
oFxNcL += '';
oFyNcL += '';
}
// use locale sensitive sort for strings when case insensitive
// note: localeCompare interleaves uppercase with lowercase (e.g. A,a,B,b)
if (self.sort.insensitive && typeof oFxNcL === 'string' && typeof oFyNcL === 'string') {
locRes = oFxNcL.localeCompare(oFyNcL, self.loc);
if (locRes !== 0) return locRes;
}
if (oFxNcL < oFyNcL) return -1;
if (oFxNcL > oFyNcL) return 1;
}
return 0;
};
self.sort.insensitive = true;
}
}
return self.sort(a, b);
},
/**
* Compare files based on elFinder.sort
*
* @param Object file
* @param Object file
* @return Number
*/
compare : function(file1, file2) {
var self = this,
type = self.sortType,
asc = self.sortOrder == 'asc',
stick = self.sortStickFolders,
rules = self.sortRules,
sort = rules[type],
d1 = file1.mime == 'directory',
d2 = file2.mime == 'directory',
res;
if (stick) {
if (d1 && !d2) {
return -1;
} else if (!d1 && d2) {
return 1;
}
}
res = asc ? sort(file1, file2) : sort(file2, file1);
return type !== 'name' && res === 0
? res = asc ? rules.name(file1, file2) : rules.name(file2, file1)
: res;
},
/**
* Sort files based on config
*
* @param Array files
* @return Array
*/
sortFiles : function(files) {
return files.sort(this.compare);
},
/**
* Open notification dialog
* and append/update message for required notification type.
*
* @param Object options
* @example
* this.notify({
* type : 'copy',
* msg : 'Copy files', // not required for known types @see this.notifyType
* cnt : 3,
* hideCnt : false, // true for not show count
* progress : 10, // progress bar percents (use cnt : 0 to update progress bar)
* cancel : callback // callback function for cancel button
* })
* @return elFinder
*/
notify : function(opts) {
var type = opts.type,
id = opts.id? 'elfinder-notify-'+opts.id : '',
msg = this.i18n((typeof opts.msg !== 'undefined')? opts.msg : (this.messages['ntf'+type] ? 'ntf'+type : 'ntfsmth')),
ndialog = this.ui.notify,
notify = ndialog.children('.elfinder-notify-'+type+(id? ('.'+id) : '')),
button = notify.children('div.elfinder-notify-cancel').children('button'),
ntpl = '',
delta = opts.cnt,
size = (typeof opts.size != 'undefined')? parseInt(opts.size) : null,
progress = (typeof opts.progress != 'undefined' && opts.progress >= 0) ? opts.progress : null,
cancel = opts.cancel,
clhover = 'ui-state-hover',
close = function() {
notify._esc && $(document).off('keydown', notify._esc);
notify.remove();
!ndialog.children().length && ndialog.elfinderdialog('close');
},
cnt, total, prc;
if (!type) {
return this;
}
if (!notify.length) {
notify = $(ntpl.replace(/\{type\}/g, type).replace(/\{msg\}/g, msg))
.appendTo(ndialog)
.data('cnt', 0);
if (progress != null) {
notify.data({progress : 0, total : 0});
}
if (cancel) {
button = $(''+this.i18n('btnCancel')+' ')
.on('mouseenter mouseleave', function(e) {
$(this).toggleClass(clhover, e.type === 'mouseenter');
});
notify.children('div.elfinder-notify-cancel').append(button);
}
} else if (typeof opts.msg !== 'undefined') {
notify.children('span.elfinder-notify-msg').html(msg);
}
cnt = delta + parseInt(notify.data('cnt'));
if (cnt > 0) {
if (cancel && button.length) {
if ($.isFunction(cancel) || (typeof cancel === 'object' && cancel.promise)) {
notify._esc = function(e) {
if (e.type == 'keydown' && e.keyCode != $.ui.keyCode.ESCAPE) {
return;
}
e.preventDefault();
e.stopPropagation();
close();
if (cancel.promise) {
cancel.reject(0); // 0 is canceling flag
} else {
cancel(e);
}
};
button.on('click', function(e) {
notify._esc(e);
});
$(document).on('keydown.' + this.namespace, notify._esc);
}
}
!opts.hideCnt && notify.children('.elfinder-notify-cnt').text('('+cnt+')');
ndialog.is(':hidden') && ndialog.elfinderdialog('open', this).height('auto');
notify.data('cnt', cnt);
if ((progress != null)
&& (total = notify.data('total')) >= 0
&& (prc = notify.data('progress')) >= 0) {
total += size != null? size : delta;
prc += progress;
(size == null && delta < 0) && (prc += delta * 100);
notify.data({progress : prc, total : total});
if (size != null) {
prc *= 100;
total = Math.max(1, total);
}
progress = parseInt(prc/total);
notify.find('.elfinder-notify-progress')
.animate({
width : (progress < 100 ? progress : 100)+'%'
}, 20);
}
} else {
close();
}
return this;
},
/**
* Open confirmation dialog
*
* @param Object options
* @example
* this.confirm({
* cssClass : 'elfinder-confirm-mydialog',
* title : 'Remove files',
* text : 'Here is question text',
* accept : { // accept callback - required
* label : 'Continue',
* callback : function(applyToAll) { fm.log('Ok') }
* },
* cancel : { // cancel callback - required
* label : 'Cancel',
* callback : function() { fm.log('Cancel')}
* },
* reject : { // reject callback - optionally
* label : 'No',
* callback : function(applyToAll) { fm.log('No')}
* },
* buttons : [ // additional buttons callback - optionally
* {
* label : 'Btn1',
* callback : function(applyToAll) { fm.log('Btn1')}
* }
* ],
* all : true // display checkbox "Apply to all"
* })
* @return elFinder
*/
confirm : function(opts) {
var self = this,
complete = false,
options = {
cssClass : 'elfinder-dialog-confirm',
modal : true,
resizable : false,
title : this.i18n(opts.title || 'confirmReq'),
buttons : {},
close : function() {
!complete && opts.cancel.callback();
$(this).elfinderdialog('destroy');
}
},
apply = this.i18n('apllyAll'),
label, checkbox, btnNum;
if (opts.cssClass) {
options.cssClass += ' ' + opts.cssClass;
}
options.buttons[this.i18n(opts.accept.label)] = function() {
opts.accept.callback(!!(checkbox && checkbox.prop('checked')));
complete = true;
$(this).elfinderdialog('close');
};
options.buttons[this.i18n(opts.accept.label)]._cssClass = 'elfinder-confirm-accept';
if (opts.reject) {
options.buttons[this.i18n(opts.reject.label)] = function() {
opts.reject.callback(!!(checkbox && checkbox.prop('checked')));
complete = true;
$(this).elfinderdialog('close');
};
options.buttons[this.i18n(opts.reject.label)]._cssClass = 'elfinder-confirm-reject';
}
if (opts.buttons && opts.buttons.length > 0) {
btnNum = 1;
$.each(opts.buttons, function(i, v){
options.buttons[self.i18n(v.label)] = function() {
v.callback(!!(checkbox && checkbox.prop('checked')));
complete = true;
$(this).elfinderdialog('close');
};
options.buttons[self.i18n(v.label)]._cssClass = 'elfinder-confirm-extbtn' + (btnNum++);
if (v.cssClass) {
options.buttons[self.i18n(v.label)]._cssClass += ' ' + v.cssClass;
}
});
}
options.buttons[this.i18n(opts.cancel.label)] = function() {
$(this).elfinderdialog('close');
};
options.buttons[this.i18n(opts.cancel.label)]._cssClass = 'elfinder-confirm-cancel';
if (opts.all) {
options.create = function() {
var base = $('
');
checkbox = $(' ');
$(this).next().find('.ui-dialog-buttonset')
.prepend(base.append($(''+apply+' ').prepend(checkbox)));
};
}
if (opts.optionsCallback && $.isFunction(opts.optionsCallback)) {
opts.optionsCallback(options);
}
return this.dialog(' ' + this.i18n(opts.text), options);
},
/**
* Create unique file name in required dir
*
* @param String file name
* @param String parent dir hash
* @param String glue
* @return String
*/
uniqueName : function(prefix, phash, glue) {
var i = 0, ext = '', p, name;
prefix = this.i18n(false, prefix);
phash = phash || this.cwd().hash;
glue = (typeof glue === 'undefined')? ' ' : glue;
if (p = prefix.match(/^(.+)(\.[^.]+)$/)) {
ext = p[2];
prefix = p[1];
}
name = prefix+ext;
if (!this.fileByName(name, phash)) {
return name;
}
while (i < 10000) {
name = prefix + glue + (++i) + ext;
if (!this.fileByName(name, phash)) {
return name;
}
}
return prefix + Math.random() + ext;
},
/**
* Return message translated onto current language
* Allowed accept HTML element that was wrapped in jQuery object
* To be careful to XSS vulnerability of HTML element Ex. You should use `fm.escape(file.name)`
*
* @param String|Array message[s]|Object jQuery
* @return String
**/
i18n : function() {
var self = this,
messages = this.messages,
input = [],
ignore = [],
message = function(m) {
var file;
if (m.indexOf('#') === 0) {
if ((file = self.file(m.substr(1)))) {
return file.name;
}
}
return m;
},
i, j, m, escFunc, start = 0;
if (arguments.length && arguments[0] === false) {
escFunc = function(m){ return m; };
start = 1;
}
for (i = start; i< arguments.length; i++) {
m = arguments[i];
if (Array.isArray(m)) {
for (j = 0; j < m.length; j++) {
if (m[j] instanceof jQuery) {
// jQuery object is HTML element
input.push(m[j]);
} else if (typeof m[j] !== 'undefined'){
input.push(message('' + m[j]));
}
}
} else if (m instanceof jQuery) {
// jQuery object is HTML element
input.push(m[j]);
} else if (typeof m !== 'undefined'){
input.push(message('' + m));
}
}
for (i = 0; i < input.length; i++) {
// dont translate placeholders
if ($.inArray(i, ignore) !== -1) {
continue;
}
m = input[i];
if (typeof m == 'string') {
// translate message
m = messages[m] || (escFunc? escFunc(m) : self.escape(m));
// replace placeholders in message
m = m.replace(/\$(\d+)/g, function(match, placeholder) {
placeholder = i + parseInt(placeholder);
if (placeholder > 0 && input[placeholder]) {
ignore.push(placeholder);
}
return escFunc? escFunc(input[placeholder]) : self.escape(input[placeholder]);
});
} else {
// get HTML from jQuery object
m = m.get(0).outerHTML;
}
input[i] = m;
}
return $.grep(input, function(m, i) { return $.inArray(i, ignore) === -1 ? true : false; }).join(' ');
},
/**
* Get icon style from file.icon
*
* @param Object elFinder file object
* @return String|Object
*/
getIconStyle : function(file, asObject) {
var self = this,
template = {
'background' : 'url(\'{url}\') 0 0 no-repeat',
'background-size' : 'contain'
},
style = '',
cssObj = {},
i = 0;
if (file.icon) {
style = 'style="';
$.each(template, function(k, v) {
if (i++ === 0) {
v = v.replace('{url}', self.escape(file.icon));
}
if (asObject) {
cssObj[k] = v;
} else {
style += k+':'+v+';';
}
});
style += '"';
}
return asObject? cssObj : style;
},
/**
* Convert mimetype into css classes
*
* @param String file mimetype
* @return String
*/
mime2class : function(mimeType) {
var prefix = 'elfinder-cwd-icon-',
mime = mimeType.toLowerCase(),
isText = this.textMimes[mime];
mime = mime.split('/');
if (isText) {
mime[0] += ' ' + prefix + 'text';
}
return prefix + mime[0] + (mime[1] ? ' ' + prefix + mime[1].replace(/(\.|\+)/g, '-') : '');
},
/**
* Return localized kind of file
*
* @param Object|String file or file mimetype
* @return String
*/
mime2kind : function(f) {
var isObj = typeof(f) == 'object' ? true : false,
mime = isObj ? f.mime : f,
kind;
if (isObj && f.alias && mime != 'symlink-broken') {
kind = 'Alias';
} else if (this.kinds[mime]) {
if (isObj && mime === 'directory' && (! f.phash || f.isroot)) {
kind = 'Root';
} else {
kind = this.kinds[mime];
}
}
if (! kind) {
if (mime.indexOf('text') === 0) {
kind = 'Text';
} else if (mime.indexOf('image') === 0) {
kind = 'Image';
} else if (mime.indexOf('audio') === 0) {
kind = 'Audio';
} else if (mime.indexOf('video') === 0) {
kind = 'Video';
} else if (mime.indexOf('application') === 0) {
kind = 'App';
} else {
kind = mime;
}
}
return this.messages['kind'+kind] ? this.i18n('kind'+kind) : mime;
},
/**
* Return boolean Is mime-type text file
*
* @param String mime-type
* @return Boolean
*/
mimeIsText : function(mime) {
return (this.textMimes[mime] || (mime.indexOf('text/') === 0 && mime.substr(5, 3) !== 'rtf'))? true : false;
},
/**
* Returns a date string formatted according to the given format string
*
* @param String format string
* @param Object Date object
* @return String
*/
date : function(format, date) {
var self = this,
output, d, dw, m, y, h, g, i, s;
if (! date) {
date = new Date();
}
h = date[self.getHours]();
g = h > 12 ? h - 12 : h;
i = date[self.getMinutes]();
s = date[self.getSeconds]();
d = date[self.getDate]();
dw = date[self.getDay]();
m = date[self.getMonth]() + 1;
y = date[self.getFullYear]();
output = format.replace(/[a-z]/gi, function(val) {
switch (val) {
case 'd': return d > 9 ? d : '0'+d;
case 'j': return d;
case 'D': return self.i18n(self.i18.daysShort[dw]);
case 'l': return self.i18n(self.i18.days[dw]);
case 'm': return m > 9 ? m : '0'+m;
case 'n': return m;
case 'M': return self.i18n(self.i18.monthsShort[m-1]);
case 'F': return self.i18n(self.i18.months[m-1]);
case 'Y': return y;
case 'y': return (''+y).substr(2);
case 'H': return h > 9 ? h : '0'+h;
case 'G': return h;
case 'g': return g;
case 'h': return g > 9 ? g : '0'+g;
case 'a': return h >= 12 ? 'pm' : 'am';
case 'A': return h >= 12 ? 'PM' : 'AM';
case 'i': return i > 9 ? i : '0'+i;
case 's': return s > 9 ? s : '0'+s;
}
return val;
});
return output;
},
/**
* Return localized date
*
* @param Object file object
* @return String
*/
formatDate : function(file, t) {
var self = this,
ts = t || file.ts,
i18 = self.i18,
date, format, output, d, dw, m, y, h, g, i, s;
if (self.options.clientFormatDate && ts > 0) {
date = new Date(ts*1000);
format = ts >= this.yesterday
? this.fancyFormat
: this.dateFormat;
output = self.date(format, date);
return ts >= this.yesterday
? output.replace('$1', this.i18n(ts >= this.today ? 'Today' : 'Yesterday'))
: output;
} else if (file.date) {
return file.date.replace(/([a-z]+)\s/i, function(a1, a2) { return self.i18n(a2)+' '; });
}
return self.i18n('dateUnknown');
},
/**
* Return localized number string
*
* @param Number
* @return String
*/
toLocaleString : function(num) {
var v = new Number(num);
if (v) {
if (v.toLocaleString) {
return v.toLocaleString();
} else {
return String(num).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
}
}
return num;
},
/**
* Return css class marks file permissions
*
* @param Object file
* @return String
*/
perms2class : function(o) {
var c = '';
if (!o.read && !o.write) {
c = 'elfinder-na';
} else if (!o.read) {
c = 'elfinder-wo';
} else if (!o.write) {
c = 'elfinder-ro';
}
if (o.type) {
c += ' elfinder-' + this.escape(o.type);
}
return c;
},
/**
* Return localized string with file permissions
*
* @param Object file
* @return String
*/
formatPermissions : function(f) {
var p = [];
f.read && p.push(this.i18n('read'));
f.write && p.push(this.i18n('write'));
return p.length ? p.join(' '+this.i18n('and')+' ') : this.i18n('noaccess');
},
/**
* Return formated file size
*
* @param Number file size
* @return String
*/
formatSize : function(s) {
var n = 1, u = 'b';
if (s == 'unknown') {
return this.i18n('unknown');
}
if (s > 1073741824) {
n = 1073741824;
u = 'GB';
} else if (s > 1048576) {
n = 1048576;
u = 'MB';
} else if (s > 1024) {
n = 1024;
u = 'KB';
}
s = s/n;
return (s > 0 ? n >= 1048576 ? s.toFixed(2) : Math.round(s) : 0) +' '+u;
},
/**
* Return formated file mode by options.fileModeStyle
*
* @param String file mode
* @param String format style
* @return String
*/
formatFileMode : function(p, style) {
var i, o, s, b, sticy, suid, sgid, str, oct;
if (!style) {
style = this.options.fileModeStyle.toLowerCase();
}
p = $.trim(p);
if (p.match(/[rwxs-]{9}$/i)) {
str = p = p.substr(-9);
if (style == 'string') {
return str;
}
oct = '';
s = 0;
for (i=0; i<7; i=i+3) {
o = p.substr(i, 3);
b = 0;
if (o.match(/[r]/i)) {
b += 4;
}
if (o.match(/[w]/i)) {
b += 2;
}
if (o.match(/[xs]/i)) {
if (o.match(/[xs]/)) {
b += 1;
}
if (o.match(/[s]/i)) {
if (i == 0) {
s += 4;
} else if (i == 3) {
s += 2;
}
}
}
oct += b.toString(8);
}
if (s) {
oct = s.toString(8) + oct;
}
} else {
p = parseInt(p, 8);
oct = p? p.toString(8) : '';
if (!p || style == 'octal') {
return oct;
}
o = p.toString(8);
s = 0;
if (o.length > 3) {
o = o.substr(-4);
s = parseInt(o.substr(0, 1), 8);
o = o.substr(1);
}
sticy = ((s & 1) == 1); // not support
sgid = ((s & 2) == 2);
suid = ((s & 4) == 4);
str = '';
for(i=0; i<3; i++) {
if ((parseInt(o.substr(i, 1), 8) & 4) == 4) {
str += 'r';
} else {
str += '-';
}
if ((parseInt(o.substr(i, 1), 8) & 2) == 2) {
str += 'w';
} else {
str += '-';
}
if ((parseInt(o.substr(i, 1), 8) & 1) == 1) {
str += ((i==0 && suid)||(i==1 && sgid))? 's' : 'x';
} else {
str += '-';
}
}
}
if (style == 'both') {
return str + ' (' + oct + ')';
} else if (style == 'string') {
return str;
} else {
return oct;
}
},
/**
* Regist this.decodeRawString function
*
* @return void
*/
registRawStringDecoder : function(rawStringDecoder) {
if ($.isFunction(rawStringDecoder)) {
this.decodeRawString = this.options.rawStringDecoder = rawStringDecoder;
}
},
/**
* Return boolean that uploadable MIME type into target folder
*
* @param String mime MIME type
* @param String target target folder hash
* @return Bool
*/
uploadMimeCheck : function(mime, target) {
target = target || this.cwd().hash;
var res = true, // default is allow
mimeChecker = this.option('uploadMime', target),
allow,
deny,
check = function(checker) {
var ret = false;
if (typeof checker === 'string' && checker.toLowerCase() === 'all') {
ret = true;
} else if (Array.isArray(checker) && checker.length) {
$.each(checker, function(i, v) {
v = v.toLowerCase();
if (v === 'all' || mime.indexOf(v) === 0) {
ret = true;
return false;
}
});
}
return ret;
};
if (mime && $.isPlainObject(mimeChecker)) {
mime = mime.toLowerCase();
allow = check(mimeChecker.allow);
deny = check(mimeChecker.deny);
if (mimeChecker.firstOrder === 'allow') {
res = false; // default is deny
if (! deny && allow === true) { // match only allow
res = true;
}
} else {
res = true; // default is allow
if (deny === true && ! allow) { // match only deny
res = false;
}
}
}
return res;
},
/**
* call chained sequence of async deferred functions
*
* @param Array tasks async functions
* @return Object jQuery.Deferred
*/
sequence : function(tasks) {
var l = tasks.length,
chain = function(task, idx) {
++idx;
if (tasks[idx]) {
return chain(task.then(tasks[idx]), idx);
} else {
return task;
}
};
if (l > 1) {
return chain(tasks[0](), 0);
} else {
return tasks[0]();
}
},
/**
* Reload contents of target URL for clear browser cache
*
* @param String url target URL
* @return Object jQuery.Deferred
*/
reloadContents : function(url) {
var dfd = $.Deferred(),
ifm;
try {
ifm = $('