From 5ef3006f4f10b5ae36c41c6a958e5dda00244301 Mon Sep 17 00:00:00 2001 From: djmaze Date: Sat, 19 Sep 2020 11:21:11 +0200 Subject: [PATCH] Cleanup Jua code --- vendors/jua/jua.js | 263 +++++++++++++++++++---------------------- vendors/jua/jua.min.js | 2 +- 2 files changed, 122 insertions(+), 143 deletions(-) diff --git a/vendors/jua/jua.js b/vendors/jua/jua.js index 316e45a20..a04f38c9e 100644 --- a/vendors/jua/jua.js +++ b/vendors/jua/jua.js @@ -29,7 +29,7 @@ { if (!bUseLimit || 0 <= --iLimit) { - oFile = Utils.getDataFromFile(oItem); + oFile = getDataFromFile(oItem); oFile && fFileCallback(oFile); } else if (bUseLimit && !bCallLimit && 0 > iLimit && fLimitCallback) @@ -46,20 +46,11 @@ Object.entries(obj).forEach(([key, value]) => element.addEventListener(key, value)); }, - Utils = { - /** - * @param {Object} oValues - * @param {string} sKey - * @param {?} mDefault - * @return {?} - */ - getValue : (oValues, sKey, mDefault) => (!oValues || !sKey || !defined(oValues[sKey])) ? mDefault : oValues[sKey], - /** * @param {*} oFile * @return {Object} */ - getDataFromFile : oFile => + getDataFromFile = oFile => { let sFileName = defined(oFile.fileName) ? oFile.fileName : (defined(oFile.name) ? oFile.name : null), @@ -86,7 +77,7 @@ }; }, - eventContainsFiles : oEvent => + eventContainsFiles = oEvent => { if (oEvent.dataTransfer && oEvent.dataTransfer.types && oEvent.dataTransfer.types.length) { let index = oEvent.dataTransfer.types.length; @@ -97,8 +88,7 @@ } } return false; - } - }; + }; /** @@ -113,7 +103,12 @@ this.oXhrs = {}; this.oUids = {}; this.oJua = oJua; - this.oOptions = oOptions; + this.oOptions = Object.assign({ + action: '', + name: 'juaFile', + hidden: {}, + disableMultiple: false + }, oOptions); } /** @@ -143,8 +138,8 @@ self = this, oXhr = new XMLHttpRequest(), oFormData = new FormData(), - sAction = Utils.getValue(this.oOptions, 'action', ''), - aHidden = Utils.getValue(this.oOptions, 'hidden', {}), + sAction = this.oOptions.action, + aHidden = this.oOptions.hidden, fStartFunction = this.oJua.getEvent('onStart'), fCompleteFunction = this.oJua.getEvent('onComplete'), fProgressFunction = this.oJua.getEvent('onProgress') @@ -208,7 +203,7 @@ } oFormData.append('jua-post-type', 'ajax'); - oFormData.append(Utils.getValue(this.oOptions, 'name', 'juaFile'), oFileInfo['File']); + oFormData.append(this.oOptions.name, oFileInfo['File']); Object.entries(aHidden).forEach(([key, value]) => oFormData.append(key, (typeof value === "function" ? value(oFileInfo) : value).toString()) ); @@ -237,7 +232,7 @@ oInput.type = 'file'; oInput.tabIndex = -1; oInput.style.cssText = 'position:absolute;left:-9999px;'; - oInput.multiple = !Utils.getValue(self.oOptions, 'disableMultiple', false); + oInput.multiple = !self.oOptions.disableMultiple; oLabel.style.cssText = 'position:absolute;background-color:#fff;right:0;top:0;left:0;bottom:0;margin:0;padding:0;cursor:pointer;opacity:0'; @@ -252,7 +247,7 @@ }; if (oInput.files && oInput.files.length) { getDataFromFiles(oInput.files, fFileCallback, - Utils.getValue(self.oOptions, 'multipleSizeLimit', iDefLimit), + self.oOptions.multipleSizeLimit, self.oJua.getEvent('onLimitReached') ); } else { @@ -351,8 +346,6 @@ { constructor(oOptions) { - oOptions = defined(oOptions) ? oOptions : {}; - const self = this; self.oEvents = { @@ -367,25 +360,20 @@ onLimitReached: null }; - self.oOptions = { - action: '', - name: '', - hidden: {}, + oOptions = Object.assign({ queueSize: 10, - clickElement: false, - dragAndDropElement: false, - dragAndDropBodyElement: false, - disableMultiple: false, + clickElement: null, + dragAndDropElement: null, + dragAndDropBodyElement: null, disableDocumentDropPrevent: false, - multipleSizeLimit: 50 - }; - Object.entries(oOptions).forEach(([key, value]) => self.oOptions[key] = value); + multipleSizeLimit: iDefLimit + }, oOptions || {}); - self.oQueue = queue(parseInt(Utils.getValue(self.oOptions, 'queueSize', 10) || 0, 10)); + self.oQueue = queue(parseInt(oOptions.queueSize || 0, 10)); - self.oDriver = new AjaxDriver(self, self.oOptions); + self.oDriver = new AjaxDriver(self, oOptions); - const el = Utils.getValue(self.oOptions, 'clickElement', null); + let el = oOptions.clickElement; if (el) { el.style.position = 'relative'; el.style.overflow = 'hidden'; @@ -396,116 +384,112 @@ this.oDriver.generateNewInput(el); } - if (Utils.getValue(this.oOptions, 'dragAndDropElement', false)) + el = oOptions.dragAndDropElement; + if (el) { - let - oBigDropZone = Utils.getValue(self.oOptions, 'dragAndDropBodyElement', false) || doc, - oDragAndDropElement = Utils.getValue(self.oOptions, 'dragAndDropElement', false); + let oBigDropZone = oOptions.dragAndDropBodyElement || doc; - if (oDragAndDropElement) + if (!oOptions.disableDocumentDropPrevent) { - if (!Utils.getValue(self.oOptions, 'disableDocumentDropPrevent', false)) - { - doc.addEventListener('dragover', oEvent => { - if (Utils.eventContainsFiles(oEvent)) + doc.addEventListener('dragover', oEvent => { + if (eventContainsFiles(oEvent)) + { + try { - try - { - oEvent.dataTransfer.dropEffect = 'none'; - oEvent.preventDefault(); - } - catch (oExc) {} - } - }); - } - - if (oBigDropZone) - { - addEventListeners(oBigDropZone, { - dragover: () => self.docTimer.clear(), - dragenter: oEvent => { - if (Utils.eventContainsFiles(oEvent)) - { - self.docTimer.clear(); - oEvent.preventDefault(); - - self.runEvent('onBodyDragEnter', [oEvent]); - } - }, - dragleave: oEvent => - oEvent.dataTransfer && self.docTimer.start(() => self.runEvent('onBodyDragLeave', [oEvent])), - drop: oEvent => { - if (oEvent.dataTransfer) { - let bFiles = Utils.eventContainsFiles(oEvent); - bFiles && oEvent.preventDefault(); - - self.runEvent('onBodyDragLeave', [oEvent]); - - return !bFiles; - } - - return false; - } - }); - } - - addEventListeners(oDragAndDropElement, { - dragenter: oEvent => { - if (Utils.eventContainsFiles(oEvent)) { - self.docTimer.clear(); - + oEvent.dataTransfer.dropEffect = 'none'; oEvent.preventDefault(); - self.runEvent('onDragEnter', [oDragAndDropElement, oEvent]); } - }, - dragover: oEvent => { - if (Utils.eventContainsFiles(oEvent)) { - try - { - let sEffect = oEvent.dataTransfer.effectAllowed; - - self.docTimer.clear(); - - oEvent.dataTransfer.dropEffect = (sEffect === 'move' || sEffect === 'linkMove') ? 'move' : 'copy'; - - oEvent.stopPropagation(); - oEvent.preventDefault(); - - oBigDropZone && oBigDropZone.dispatchEvent(oEvent); - } - catch (oExc) {} - } - }, - dragleave: oEvent => { - if (oEvent.dataTransfer) { - let oRelatedTarget = doc.elementFromPoint(oEvent.clientX, oEvent.clientY); - if (!oRelatedTarget || !oDragAndDropElement.contains(oRelatedTarget)) { - self.docTimer.clear(); - self.runEvent('onDragLeave', [oDragAndDropElement, oEvent]); - } - } - }, - drop: oEvent => { - if (Utils.eventContainsFiles(oEvent)) { - oEvent.preventDefault(); - - getDataFromFiles( - Utils.getValue(oEvent, 'files', null) || Utils.getValue(oEvent.dataTransfer, 'files', null), - oFile => { - if (oFile) { - self.addNewFile(oFile); - self.docTimer.clear(); - } - }, - Utils.getValue(self.oOptions, 'multipleSizeLimit', iDefLimit), - self.getEvent('onLimitReached') - ); - } - - self.runEvent('onDragLeave', [oEvent]); + catch (oExc) {} } }); } + + if (oBigDropZone) + { + addEventListeners(oBigDropZone, { + dragover: () => self.docTimer.clear(), + dragenter: oEvent => { + if (eventContainsFiles(oEvent)) + { + self.docTimer.clear(); + oEvent.preventDefault(); + + self.runEvent('onBodyDragEnter', [oEvent]); + } + }, + dragleave: oEvent => + oEvent.dataTransfer && self.docTimer.start(() => self.runEvent('onBodyDragLeave', [oEvent])), + drop: oEvent => { + if (oEvent.dataTransfer) { + let bFiles = eventContainsFiles(oEvent); + bFiles && oEvent.preventDefault(); + + self.runEvent('onBodyDragLeave', [oEvent]); + + return !bFiles; + } + + return false; + } + }); + } + + addEventListeners(el, { + dragenter: oEvent => { + if (eventContainsFiles(oEvent)) { + self.docTimer.clear(); + + oEvent.preventDefault(); + self.runEvent('onDragEnter', [el, oEvent]); + } + }, + dragover: oEvent => { + if (eventContainsFiles(oEvent)) { + try + { + let sEffect = oEvent.dataTransfer.effectAllowed; + + self.docTimer.clear(); + + oEvent.dataTransfer.dropEffect = (sEffect === 'move' || sEffect === 'linkMove') ? 'move' : 'copy'; + + oEvent.stopPropagation(); + oEvent.preventDefault(); + + oBigDropZone && oBigDropZone.dispatchEvent(oEvent); + } + catch (oExc) {} + } + }, + dragleave: oEvent => { + if (oEvent.dataTransfer) { + let oRelatedTarget = doc.elementFromPoint(oEvent.clientX, oEvent.clientY); + if (!oRelatedTarget || !el.contains(oRelatedTarget)) { + self.docTimer.clear(); + self.runEvent('onDragLeave', [el, oEvent]); + } + } + }, + drop: oEvent => { + if (eventContainsFiles(oEvent)) { + oEvent.preventDefault(); + + getDataFromFiles( + oEvent.files || oEvent.dataTransfer.files, + oFile => { + if (oFile) { + self.addNewFile(oFile); + self.docTimer.clear(); + } + }, + oOptions.multipleSizeLimit, + self.getEvent('onLimitReached') + ); + } + + self.runEvent('onDragLeave', [oEvent]); + } + }); } } @@ -595,11 +579,6 @@ } }; - /** - * @type {Object} - */ - Jua.prototype.oOptions = {}; - /** * @type {Object} */ diff --git a/vendors/jua/jua.min.js b/vendors/jua/jua.min.js index 54fc3fef9..01d172516 100644 --- a/vendors/jua/jua.min.js +++ b/vendors/jua/jua.min.js @@ -1,2 +1,2 @@ /* RainLoop Webmail (c) RainLoop Team | MIT */ -(()=>{"use strict";const e=document,t=20,n=e=>void 0!==e,o=(e,o,l,i)=>{if(e&&e.length){let a=l=n(l)?parseInt(l||0,10):t,s=null,u=0{e&&(!u||0<=--l?(s=r.getDataFromFile(e))&&o(s):u&&!p&&0>l&&i&&(p=!0,i(a)))})}},l=(e,t)=>{Object.entries(t).forEach(([t,n])=>e.addEventListener(t,n))},r={getValue:(e,t,o)=>e&&t&&n(e[t])?e[t]:o,getDataFromFile:e=>{let t=n(e.fileName)?e.fileName:n(e.name)?e.name:null,o=n(e.fileSize)?e.fileSize:n(e.size)?e.size:null,l=n(e.type)?e.type:null;return"/"===t.charAt(0)&&(t=t.substr(1)),l||0!==o?{FileName:t,Size:o,Type:l,Folder:"",File:e}:null},eventContainsFiles:e=>{if(e.dataTransfer&&e.dataTransfer.types&&e.dataTransfer.types.length){let t=e.dataTransfer.types.length;for(;t--;)if("files"===e.dataTransfer.types[t].toLowerCase())return!0}return!1}};class i{constructor(e,t){this.oXhrs={},this.oUids={},this.oJua=e,this.oOptions=t}regTaskUid(e){this.oUids[e]=!0}uploadTask(e,t,o){if(!1===this.oUids[e]||!t||!t.File)return o(null,e),!1;try{const l=this,i=new XMLHttpRequest,a=new FormData,s=r.getValue(this.oOptions,"action",""),u=r.getValue(this.oOptions,"hidden",{}),p=this.oJua.getEvent("onStart"),d=this.oJua.getEvent("onComplete"),c=this.oJua.getEvent("onProgress");return i.open("POST",s,!0),c&&i.upload&&(i.upload.onprogress=function(t){t&&t.lengthComputable&&n(t.loaded)&&n(t.total)&&c(e,t.loaded,t.total)}),i.onreadystatechange=function(){if(4===i.readyState&&200===i.status){if(d){let t=!1,n=null;try{n=JSON.parse(i.responseText),t=!0}catch(e){n=null}d(e,t,n)}n(l.oXhrs[e])&&(l.oXhrs[e]=null),o(null,e)}else 4===i.readyState&&(d(e,!1,null),o(null,e))},p&&p(e),a.append("jua-post-type","ajax"),a.append(r.getValue(this.oOptions,"name","juaFile"),t.File),Object.entries(u).forEach(([e,n])=>a.append(e,("function"==typeof n?n(t):n).toString())),i.send(a),this.oXhrs[e]=i,!0}catch(e){}return o(null,e),!1}generateNewInput(n){if(n){const l=this,i=e.createElement("label"),a=i.appendChild(e.createElement("input"));a.type="file",a.tabIndex=-1,a.style.cssText="position:absolute;left:-9999px;",a.multiple=!r.getValue(l.oOptions,"disableMultiple",!1),i.style.cssText="position:absolute;background-color:#fff;right:0;top:0;left:0;bottom:0;margin:0;padding:0;cursor:pointer;opacity:0",n.append(i),a.addEventListener("input",()=>{const e=e=>{l.oJua.addNewFile(e),l.generateNewInput(n),setTimeout(()=>i.remove(),10)};a.files&&a.files.length?o(a.files,e,r.getValue(l.oOptions,"multipleSizeLimit",t),l.oJua.getEvent("onLimitReached")):e({FileName:a.value.split("\\").pop().split("/").pop(),Size:null,Type:null,Folder:"",File:null})})}}cancel(e){if(this.oUids[e]=!1,this.oXhrs[e]){try{this.oXhrs[e].abort&&this.oXhrs[e].abort()}catch(e){}this.oXhrs[e]=null}}}function a(e){let t,n,o={},l=0,r=0,i=-1,a=null,s=[],u=()=>{};return arguments.length<1&&(e=1/0),o.defer=function(){if(!a){let e=arguments;e.index=++i,n?(n.next=e,n=n.next):t=n=e,++r,function o(){if(t&&lu.oOptions[e]=t),u.oQueue=a(parseInt(r.getValue(u.oOptions,"queueSize",10)||0,10)),u.oDriver=new i(u,u.oOptions);const p=r.getValue(u.oOptions,"clickElement",null);if(p&&(p.style.position="relative",p.style.overflow="hidden","inline"===p.style.display&&(p.style.display="inline-block"),this.oDriver.generateNewInput(p)),r.getValue(this.oOptions,"dragAndDropElement",!1)){let n=r.getValue(u.oOptions,"dragAndDropBodyElement",!1)||e,i=r.getValue(u.oOptions,"dragAndDropElement",!1);i&&(r.getValue(u.oOptions,"disableDocumentDropPrevent",!1)||e.addEventListener("dragover",e=>{if(r.eventContainsFiles(e))try{e.dataTransfer.dropEffect="none",e.preventDefault()}catch(e){}}),n&&l(n,{dragover:()=>u.docTimer.clear(),dragenter:e=>{r.eventContainsFiles(e)&&(u.docTimer.clear(),e.preventDefault(),u.runEvent("onBodyDragEnter",[e]))},dragleave:e=>e.dataTransfer&&u.docTimer.start(()=>u.runEvent("onBodyDragLeave",[e])),drop:e=>{if(e.dataTransfer){let t=r.eventContainsFiles(e);return t&&e.preventDefault(),u.runEvent("onBodyDragLeave",[e]),!t}return!1}}),l(i,{dragenter:e=>{r.eventContainsFiles(e)&&(u.docTimer.clear(),e.preventDefault(),u.runEvent("onDragEnter",[i,e]))},dragover:e=>{if(r.eventContainsFiles(e))try{let t=e.dataTransfer.effectAllowed;u.docTimer.clear(),e.dataTransfer.dropEffect="move"===t||"linkMove"===t?"move":"copy",e.stopPropagation(),e.preventDefault(),n&&n.dispatchEvent(e)}catch(e){}},dragleave:t=>{if(t.dataTransfer){let n=e.elementFromPoint(t.clientX,t.clientY);n&&i.contains(n)||(u.docTimer.clear(),u.runEvent("onDragLeave",[i,t]))}},drop:e=>{r.eventContainsFiles(e)&&(e.preventDefault(),o(r.getValue(e,"files",null)||r.getValue(e.dataTransfer,"files",null),e=>{e&&(u.addNewFile(e),u.docTimer.clear())},r.getValue(u.oOptions,"multipleSizeLimit",t),u.getEvent("onLimitReached"))),u.runEvent("onDragLeave",[e])}}))}}on(e,t){return this.oEvents[e]=t,this}runEvent(e,t){this.oEvents[e]&&this.oEvents[e].apply(null,t||[])}getEvent(e){return this.oEvents[e]||null}cancel(e){this.oDriver.cancel(e)}addNewFile(e){let t=16,n="";for(;t--;)n+="0123456789abcdefghijklmnopqrstuvwxyz".substr(Math.round(36*Math.random()),1);this.addFile("jua-uid-"+n+"-"+(new Date).getTime().toString(),e)}addFile(e,t){const n=this.getEvent("onSelect");!t||n&&!1===n(e,t)?this.oDriver.cancel(e):(this.oDriver.regTaskUid(e),this.oQueue.defer((...e)=>this.oDriver.uploadTask(...e),e,t))}}s.prototype.docTimer={start:function(e){this.clear(),this.timer=setTimeout(e,200)},clear:function(){this.timer&&clearTimeout(this.timer),this.timer=0}},s.prototype.oOptions={},s.prototype.oEvents={},s.prototype.oQueue=null,s.prototype.oDriver=null,window.Jua=s})(); +(()=>{"use strict";const e=document,t=20,n=e=>void 0!==e,r=(e,r,o,i)=>{if(e&&e.length){let a=o=n(o)?parseInt(o||0,10):t,s=null,u=0{e&&(!u||0<=--o?(s=l(e))&&r(s):u&&!d&&0>o&&i&&(d=!0,i(a)))})}},o=(e,t)=>{Object.entries(t).forEach(([t,n])=>e.addEventListener(t,n))},l=e=>{let t=n(e.fileName)?e.fileName:n(e.name)?e.name:null,r=n(e.fileSize)?e.fileSize:n(e.size)?e.size:null,o=n(e.type)?e.type:null;return"/"===t.charAt(0)&&(t=t.substr(1)),o||0!==r?{FileName:t,Size:r,Type:o,Folder:"",File:e}:null},i=e=>{if(e.dataTransfer&&e.dataTransfer.types&&e.dataTransfer.types.length){let t=e.dataTransfer.types.length;for(;t--;)if("files"===e.dataTransfer.types[t].toLowerCase())return!0}return!1};class a{constructor(e,t){this.oXhrs={},this.oUids={},this.oJua=e,this.oOptions=Object.assign({action:"",name:"juaFile",hidden:{},disableMultiple:!1},t)}regTaskUid(e){this.oUids[e]=!0}uploadTask(e,t,r){if(!1===this.oUids[e]||!t||!t.File)return r(null,e),!1;try{const o=this,l=new XMLHttpRequest,i=new FormData,a=this.oOptions.action,s=this.oOptions.hidden,u=this.oJua.getEvent("onStart"),d=this.oJua.getEvent("onComplete"),p=this.oJua.getEvent("onProgress");return l.open("POST",a,!0),p&&l.upload&&(l.upload.onprogress=function(t){t&&t.lengthComputable&&n(t.loaded)&&n(t.total)&&p(e,t.loaded,t.total)}),l.onreadystatechange=function(){if(4===l.readyState&&200===l.status){if(d){let t=!1,n=null;try{n=JSON.parse(l.responseText),t=!0}catch(e){n=null}d(e,t,n)}n(o.oXhrs[e])&&(o.oXhrs[e]=null),r(null,e)}else 4===l.readyState&&(d(e,!1,null),r(null,e))},u&&u(e),i.append("jua-post-type","ajax"),i.append(this.oOptions.name,t.File),Object.entries(s).forEach(([e,n])=>i.append(e,("function"==typeof n?n(t):n).toString())),l.send(i),this.oXhrs[e]=l,!0}catch(e){}return r(null,e),!1}generateNewInput(t){if(t){const n=this,o=e.createElement("label"),l=o.appendChild(e.createElement("input"));l.type="file",l.tabIndex=-1,l.style.cssText="position:absolute;left:-9999px;",l.multiple=!n.oOptions.disableMultiple,o.style.cssText="position:absolute;background-color:#fff;right:0;top:0;left:0;bottom:0;margin:0;padding:0;cursor:pointer;opacity:0",t.append(o),l.addEventListener("input",()=>{const e=e=>{n.oJua.addNewFile(e),n.generateNewInput(t),setTimeout(()=>o.remove(),10)};l.files&&l.files.length?r(l.files,e,n.oOptions.multipleSizeLimit,n.oJua.getEvent("onLimitReached")):e({FileName:l.value.split("\\").pop().split("/").pop(),Size:null,Type:null,Folder:"",File:null})})}}cancel(e){if(this.oUids[e]=!1,this.oXhrs[e]){try{this.oXhrs[e].abort&&this.oXhrs[e].abort()}catch(e){}this.oXhrs[e]=null}}}function s(e){let t,n,r={},o=0,l=0,i=-1,a=null,s=[],u=()=>{};return arguments.length<1&&(e=1/0),r.defer=function(){if(!a){let e=arguments;e.index=++i,n?(n.next=e,n=n.next):t=n=e,++l,function r(){if(t&&o{if(i(e))try{e.dataTransfer.dropEffect="none",e.preventDefault()}catch(e){}}),t&&o(t,{dragover:()=>l.docTimer.clear(),dragenter:e=>{i(e)&&(l.docTimer.clear(),e.preventDefault(),l.runEvent("onBodyDragEnter",[e]))},dragleave:e=>e.dataTransfer&&l.docTimer.start(()=>l.runEvent("onBodyDragLeave",[e])),drop:e=>{if(e.dataTransfer){let t=i(e);return t&&e.preventDefault(),l.runEvent("onBodyDragLeave",[e]),!t}return!1}}),o(u,{dragenter:e=>{i(e)&&(l.docTimer.clear(),e.preventDefault(),l.runEvent("onDragEnter",[u,e]))},dragover:e=>{if(i(e))try{let n=e.dataTransfer.effectAllowed;l.docTimer.clear(),e.dataTransfer.dropEffect="move"===n||"linkMove"===n?"move":"copy",e.stopPropagation(),e.preventDefault(),t&&t.dispatchEvent(e)}catch(e){}},dragleave:t=>{if(t.dataTransfer){let n=e.elementFromPoint(t.clientX,t.clientY);n&&u.contains(n)||(l.docTimer.clear(),l.runEvent("onDragLeave",[u,t]))}},drop:e=>{i(e)&&(e.preventDefault(),r(e.files||e.dataTransfer.files,e=>{e&&(l.addNewFile(e),l.docTimer.clear())},n.multipleSizeLimit,l.getEvent("onLimitReached"))),l.runEvent("onDragLeave",[e])}})}}on(e,t){return this.oEvents[e]=t,this}runEvent(e,t){this.oEvents[e]&&this.oEvents[e].apply(null,t||[])}getEvent(e){return this.oEvents[e]||null}cancel(e){this.oDriver.cancel(e)}addNewFile(e){let t=16,n="";for(;t--;)n+="0123456789abcdefghijklmnopqrstuvwxyz".substr(Math.round(36*Math.random()),1);this.addFile("jua-uid-"+n+"-"+(new Date).getTime().toString(),e)}addFile(e,t){const n=this.getEvent("onSelect");!t||n&&!1===n(e,t)?this.oDriver.cancel(e):(this.oDriver.regTaskUid(e),this.oQueue.defer((...e)=>this.oDriver.uploadTask(...e),e,t))}}u.prototype.docTimer={start:function(e){this.clear(),this.timer=setTimeout(e,200)},clear:function(){this.timer&&clearTimeout(this.timer),this.timer=0}},u.prototype.oEvents={},u.prototype.oQueue=null,u.prototype.oDriver=null,window.Jua=u})();