-
Notifications
You must be signed in to change notification settings - Fork 61
/
Copy pathfiledrop-min.js
9 lines (8 loc) · 17.4 KB
/
filedrop-min.js
1
2
3
4
5
6
7
8
9
/*!
FileDrop Revamped - HTML5 & legacy file upload
in public domain | http://filedropjs.org
by Proger_XP | http://proger.me
Supports IE 6+, FF 3.6+, Chrome 7+, Safari 5+, Opera 11+.
Fork & report problems at https://github.com/ProgerXP/FileDrop
*/
!function(t,n){"function"==typeof define&&define.amd?define(["exports"],function(e){n(t,e)}):"undefined"!=typeof exports?n(t,exports):n(t,t.fd=t.fd||{})}(this,function(t,f){f.randomID=function(e){return(e||"fd")+"_"+(1e4*Math.random()).toFixed()},f.uniqueID=function(e){do{var t=f.randomID(e)}while(f.byID(t));return t},f.byID=function(e){return f.isTag(e)?e:document.getElementById(e)},f.isTag=function(e,t){return"object"==typeof e&&e&&1==e.nodeType&&(!t||e.tagName.toUpperCase()==t.toUpperCase())},f.newXHR=function(){try{return new XMLHttpRequest}catch(e){for(var t=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],n=0;n<t.length;n++)try{return new ActiveXObject(t[n])}catch(e){}}throw"Cannot create XMLHttpRequest."},f.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)},f.toArray=function(e,t){return null==e?[]:(f.isArray(e)||"object"==typeof e&&"callee"in e||(e=[e]),Array.prototype.slice.call(e,t||0))},f.addEvent=function(e,t,n){return e&&t&&n&&(e.attachEvent?(e["e"+t+n]=n,e[t+n]=function(){e["e"+t+n](window.event)},e.attachEvent("on"+t,e[t+n])):e.addEventListener(t,n,!1)),e},f.stopEvent=function(e){return e.cancelBubble=!0,e.returnValue=!1,e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e},f.setClass=function(e,t,n){return(e=f.byID(e))&&null!=t&&(void 0===n||n?f.hasClass(e,t)||(e.className+=" "+t):e.className=e.className.replace(f.classRegExp(t)," ")),e},f.hasClass=function(e,t){return f.classRegExp(t).test((f.byID(e)||{}).className)},f.classRegExp=function(e){return""==e||"object"==typeof e?/$o_O/:new RegExp("(^|\\s+)"+e+"(\\s+|$)","gi")},f.extend=function(e,t,n){for(var r in e=e||{},t=t||{})!n&&void 0!==e[r]||(e[r]=t[r]);return e},f.callAll=function(e,t,n){var r;if(t=f.toArray(t),"function"==typeof e&&(e=[e]),f.isArray(e))for(var o=0;o<e.length&&("function"!=typeof e[o]||null==(r=e[o].apply(n||this,t)));o++);else if(e)throw"FileDrop event list must be either an Array, Function, undefined or null but "+typeof e+" was given.";return r},f.callAllOfObject=function(e,t,n){f.logging&&f.hasConsole&&(r=e.events[t]&&e.events[t].length||0,console.info("FileDrop "+t+" event ("+r+") args:"),console.dir([n]));var r=[f.onObjectCall].concat(e.events.any);return null!=(r=f.callAll(r,[t].concat(f.toArray(n)),e))?r:f.callAll(e.events[t],n,e)},f.appendEventsToObject=function(e,t){if(f.addEventsToObject(this,!1,arguments))return this;switch(arguments.length){case 0:return f.extend({},this.events);case 1:if(null===e)return this.events={},this;if(f.isArray(e)){for(var n={},r=0;r<e.length;r++)n[e[r]]=f.toArray(this.events[e[r]]);return n}if("function"==typeof e)return f.funcNS(e);if("string"==typeof e)return f.toArray(this.events[e]);case 2:if(e=f.toArray(e),null===t){for(r=0;r<e.length;r++){var o=f.splitNS(e[r]);if(o[0])if(o[1]){if(this.events[o[0]])for(var i=this.events[o[0]].length-1;0<=i;i--)f.funcNS(this.events[o[0]][i])==o[1]&&this.events[o[0]].splice(i,1)}else this.events[o[0]]=[];else for(var a in this.events)arguments.callee.call(this,[a+":"+o[1]],null)}return this}}throw"Bad parameters for FileDrop event()."},f.previewToObject=function(e,t){if(f.addEventsToObject(this,!0,arguments))return this;throw"Bad parameters for FileDrop preview()."},f.addEventsToObject=function(e,t,n){var r=n[0],o=n[1];switch(n.length){case 1:if(r&&"object"==typeof r&&!f.isArray(r)){for(var i in r)arguments.callee(e,t,[i,r[i]]);return!0}case 2:if("function"==typeof o||f.isArray(o)){for(var r=f.toArray(r),o=f.toArray(o),a=t?"unshift":"push",l=0;l<r.length;l++){for(var s=f.splitNS(r[l]),u=0;u<o.length;u++)f.funcNS(o[u],s[1]);e.events[s[0]]=e.events[s[0]]||[],e.events[s[0]][a].apply(e.events[s[0]],o)}return!0}}},f.funcNS=function(e,t){return"function"!=typeof e?e:1==arguments.length?(e[f.nsProp]||"").toString():(e[f.nsProp]=(t||"").toString(),e)},f.splitNS=function(e){return(e||"").match(/^([^:]*):?(.*)$/).slice(1)},f.extend(f,{logging:!0,hasConsole:"console"in window&&console.log&&console.dir,onObjectCall:null,all:[],isIE6:!1,isIE9:!1,isChrome:-1!=(navigator.vendor||"").indexOf("Google"),nsProp:"_fdns"}),f.DropHandle=function(n,e){var o=this;if(o.el=n=f.byID(n),!n)throw"Cannot locate DOM node given to new FileDrop class.";o.opt={zoneClass:"fd-zone",inputClass:"fd-file",iframe:{url:"",callbackParam:"fd-callback",fileParam:"fd-file"},input:null,recreateInput:!0,fullDocDragDetect:!1,multiple:!1,dropEffect:"copy"},f.all.push(o),o.filedrop=null;var t=o.opt.iframe;f.extend(o.opt,e,!0),f.extend(o.opt.iframe,t),f.isChrome&&(o.opt.fullDocDragDetect=!0),o.events={any:[],dragEnter:[],dragLeave:[],dragOver:[],dragEnd:[],dragExit:[],upload:[],uploadElsewhere:[],inputSetup:[],iframeSetup:[],iframeDone:[]},o.on=o.events,o.zone=o.el,o.hook=function(e){!1!==o.opt.input&&(o.opt.input=o.opt.input||o.prepareInput(e),o.opt.input&&f.callAllOfObject(o,"inputSetup",o.opt.input)),o.hookDragOn(e),o.hookDropOn(e)},o.hookDragOn=function(e){o.opt.fullDocDragDetect?(o.delegate(document.body,"dragEnter"),f.addEvent(document,"dragleave",function(e){(0==e.clientX&&0==e.clientY||f.isTag(e.relatedTarget,"html"))&&(f.stopEvent(e),f.callAllOfObject(o,"dragLeave",e))})):(o.delegate(e,"dragEnter"),o.delegate(e,"dragLeave")),o.delegate(e,"dragOver"),o.delegate(e,"dragEnd"),o.delegate(e,"dragExit")},o.hookDropOn=function(e){f.isIE9||o.delegate(e,"drop","upload")},o.delegate=function(e,t,n){f.addEvent(e,t.toLowerCase(),function(e){f.stopEvent(e),f.callAllOfObject(o,n||t,e)})},o.prepareInput=function(e){var t=o.findInputRecursive(e)||o.createInputAt(e);if(t){for(var n=t.parentNode;n&&!f.isTag(n,"form");)n=n.parentNode;if(!n)throw"FileDrop file input has no parent form element.";if((e=n?n.getAttribute("target"):"")&&f.isTag(f.byID(e),"iframe"))return{file:t,form:n}}return!1},o.findInputRecursive=function(e){for(var t=0;t<e.childNodes.length;t++){var n=e.childNodes[t];if(f.isTag(n,"input")&&"file"==n.getAttribute("type")&&f.hasClass(n,o.opt.inputClass))return n;if(n=arguments.callee(n))return n}},o.createInputAt=function(e){do{var t=f.randomID()}while(f.byID(t));var n=document.createElement("div");n.innerHTML='<iframe src="javascript:false" name="'+t+'"></iframe><form method="post" enctype="multipart/form-data"><input type="hidden" name="'+o.opt.iframe.callbackParam+'" /><input type="file" name="'+o.opt.iframe.fileParam+'" /></form>',n.firstChild.setAttribute("id",t),n.firstChild.style.display="none",n.lastChild.setAttribute("target",t);for(var r=e.firstChild;r&&(!f.isTag(r)||f.isTag(r,"legend"));)r=r.nextSibling;return r?e.insertBefore(n,r):e.appendChild(n),n.lastChild.lastChild},o.abortIFrame=function(){var e;!o.opt.input.form||(e=f.byID(o.opt.input.form.getAttribute("target")))&&e.setAttribute("src","javascript:false")},o.sendViaIFrame=function(t){t=t||o.opt.iframe.url;var e=(o.opt.input||{}).form;if(t&&e){do{var n=f.randomID()}while(n in window);window[n]=function(e){"object"!=typeof e&&(e={response:e,responseXML:"",responseText:(e||"").toString(),readyState:4,status:200,statusText:"OK",getAllResponseHeaders:function(){return""},getResponseHeader:function(){return""},setRequestHeader:function(){return this},statusCode:function(){return this},abort:function(){return this}}),f.extend(e,{iframe:!0,url:t}),f.callAllOfObject(o,"iframeDone",e)};for(var r=e.firstChild;r&&(!f.isTag(r,"input")||r.name!=o.opt.iframe.callbackParam);)r=r.nextSibling;return r?r.value=n:t=t.replace(/[?&]+$/,"")+(-1==t.indexOf("?")?"?":"&")+o.opt.iframe.callbackParam+"="+n,e.setAttribute("action",t),f.callAllOfObject(o,"iframeSetup",e),e.submit(),setTimeout(o.resetForm,300),!0}},o.resetForm=function(){var e,t=o.opt.input&&o.opt.input.file;t&&(t.value="",o.opt.recreateInput&&(e=o.opt.input.file=t.cloneNode(!0),t.parentNode.replaceChild(e,t),f.callAllOfObject(o,"inputSetup",[o.opt.input,t])))},o.multiple=function(e){return o.opt.input&&void 0!==e&&(e?o.opt.input.file.setAttribute("multiple","multiple"):o.opt.input.file.removeAttribute("multiple")),o.opt.input&&!!o.opt.input.file.getAttribute("multiple")},o.event=function(e,t){return f.appendEventsToObject.apply(o,arguments)},o.preview=function(e,t){return f.previewToObject.apply(o,arguments)},o.onInputSetup=function(e,t){t?(e.file.clearAttributes&&e.file.clearAttributes(),e.file.mergeAttributes&&e.file.mergeAttributes(t)):o.multiple(o.opt.multiple),f.setClass(e.file,o.opt.inputClass),o.delegate(e.file,"change","upload"),(e=e.file.parentNode)&&e.style.display.match(/^(static)?$/)&&(e.style.position="relative"),f.isTag(n,"fieldset")&&((e=document.createElement("div")).style.position="relative",e.style.overflow="hidden",n.parentNode.insertBefore(e,n),e.appendChild(n))},o.onDragOver=function(e){f.stopEvent(e),e.dataTransfer&&(e.dataTransfer.dropEffect=o.opt.dropEffect)},o.onUpload=function(){for(var e=0;e<f.all.length;e++)f.all[e]!==o&&f.all[e].events&&f.callAllOfObject(f.all[e],"uploadElsewhere",o)},o.event({inputSetup:o.onInputSetup,dragOver:o.onDragOver,upload:o.onUpload}),f.setClass(n,o.opt.zoneClass),o.hook(n)},f.FileDrop=function(t,e){var s=this;function n(e){return function(){f.setClass(t,s.opt.dragOverClass,e)}}t=f.byID(t),s.handle=new f.DropHandle(t,e),s.handle.filedrop=s,f.extend(s.handle.opt,{dragOverClass:"over"}),f.extend(s.handle.opt.iframe,{force:!1}),f.extend(s.handle.events,{send:[],fileSetup:[]}),s.onUpload=function(e){(e=!s.opt.iframe.force&&s.eventFiles(e,!0))?0<e.length&&f.callAllOfObject(s,"send",[e]):!s.handle.sendViaIFrame()&&f.hasConsole&&console.warn("FileDrop fallback upload triggered but iframe options were not configured - doing nothing.")},s.eventFiles=function(e,t){var n,r=new f.FileList(e);if(n=e.dataTransfer&&(e.dataTransfer.length||e.dataTransfer.files)?e.dataTransfer:e.target&&e.target.files||e.srcElement&&e.srcElement.files){var o=n.items||[];n.files&&(n=n.files);for(var i={},a=0;a<n.length;a++){var l=new f.File(n[a]);i[l.name]&&"image.jpg"!=l.name||(i[l.name]=!0,l.setNativeEntry(o[a]),f.callAllOfObject(s,"fileSetup",l),(0<l.size||l.nativeEntry)&&r.push(l))}}else t&&(r=!1);return r},f.extend(s,s.handle),s.event({upload:s.onUpload,send:s.resetForm,dragEnter:n(!0),dragLeave:n(!1),uploadElsewhere:n(!1)}),s.preview({upload:n(!1)})},f.FileList=function(e){var a=this;a.dropEffect=e&&e.dropEffect||"",a.length=0,e=null,a.push=function(e){return a[a.length++]=e,a},a.pop=function(){if(0<a.length){var e=a.last();return delete a[--a.length],e}},a.first=function(){return a[0]},a.last=function(){return a[a.length-1]},a.remove=function(e){for(;e<a.length-1;e++)a[e]=a[e+1];return se.f.pop(),a},a.clear=function(){for(var e=0;e<a.length;e++)delete a[e];return a.length=0,a},a.reverse=function(){for(var e=0;e<Math.floor(a.length/2);e++)a[e]=a[a.length-e-1];return a},a.concat=function(e){for(var t=new f.FileList,n=0;n<a.length;n++)t[n]=a[n];for(n=0;e&&n<e.length;n++)t[a.length+n+1]=e[n];return t.length=a.length+(e||[]).length,a},a.sort=function(e,t){for(var n=0;n<a.length;n++)for(var r,o=0;o<a.length;o++)e.call(t||this,a[n],a[o],n,o)<0&&(r=a[n],a[n]=a[o],a[o]=r);return a},a.sortBy=function(e,t){for(var n=[],r=0;r<a.length;r++)n.push([r,e.call(t||this,a[r],r)]);for(n.sort(function(e,t){return e[1]>t[1]?1:e[1]<t[1]?-1:0}),r=0;r<n.length;r++)a[r]=n[r][0];return a},a.find=function(e,t){for(var n=0;n<a.length;n++)if(null!=e.call(t||this,a[n],n))return a[n]},a.each=function(e,t){return a.find(function(){e.apply(this,arguments)},t),a},a.invoke=function(t,e){var n=f.toArray(arguments,1);return this.each(function(e){e[t].apply(e,n)})},a.abort=function(){return this.invoke("abort")},a.findCompare=function(t,n){var r,o,i=null;return a.each(function(e){(null==i||i<(o=t.call(n,r)))&&(r=e,i=o)},n),r},a.filter=function(t,e){var n=new f.FileList;return a.each(function(e){t.apply(this,arguments)&&n.push(e)},e),n},a.largest=function(){return a.findCompare(function(e){return e.size})},a.smallest=function(){return a.findCompare(function(e){return-e.size})},a.oldest=function(){return a.findCompare(function(e){return-e.modDate.getTime()})},a.newest=function(){return a.findCompare(function(e){return e.modDate})},a.ofType=function(t){return t+=-1==t.indexOf("/")?"/":"$",t=new RegExp("^"+t,"i"),a.filter(function(e){return t.test(e.type)})},a.images=function(){return a.ofType("image")},a.named=function(t){return"string"==typeof t?a.find(function(e){return e.name==t}):a.filter(function(e){return t.test(e.name)})}},f.FileList.prototype.length=0,f.FileList.prototype.splice=Array.prototype.splice,f.File=function(t){var s=this;s.nativeFile=t,s.nativeEntry=null,s.name=t.webkitRelativePath||t.fileName||t.name||"",s.size=t.fileSize||t.size||0,s.type=s.mime=t.fileType||t.type||"",s.modDate=t.lastModifiedDate||new Date,s.xhr=null,s.opt={extraHeaders:!0,xRequestedWith:!0,method:"POST"},s.events={any:[],xhrSetup:[],xhrSend:[],progress:[],done:[],error:[]},s.events.sendXHR=s.events.xhrSend,s.abort=function(){return s.xhr&&s.xhr.abort&&s.xhr.abort(),s},s.sendTo=function(e,t){return(t=f.extend(t,s.opt)).url=e,s.size?window.FileReader?((e=new FileReader).onload=function(e){s.sendDataReadyTo(t,e)},e.onerror=function(e){f.callAllOfObject(s,"error",[e])},e.readAsArrayBuffer(s.nativeFile)):s.sendDataReadyTo(t):f.hasConsole&&console.warn("Trying to send an empty FileDrop.File."),s},s.sendDataReadyTo=function(e,t){var n;return s.abort(),s.xhr=f.newXHR(),s.hookXHR(s.xhr),s.xhr.open(e.method,e.url,!0),s.xhr.overrideMimeType&&s.xhr.overrideMimeType("application/octet-stream"),s.xhr.setRequestHeader("Content-Type","application/octet-stream"),e.extraHeaders&&(s.xhr.setRequestHeader("X-File-Name",encodeURIComponent(s.name)),s.xhr.setRequestHeader("X-File-Size",s.size),s.xhr.setRequestHeader("X-File-Type",s.type),s.xhr.setRequestHeader("X-File-Date",s.modDate.toGMTString()),(n=!0===(n=e.xRequestedWith)?"FileDrop-XHR-"+(window.FileReader?"FileAPI":"Webkit"):n)&&s.xhr.setRequestHeader("X-Requested-With",n)),f.callAllOfObject(s,"xhrSetup",[s.xhr,e]),t=t&&t.target&&t.target.result?t.target.result:s.nativeFile,f.callAllOfObject(s,"xhrSend",[s.xhr,t,e]),s.xhr},s.hookXHR=function(r){var e=r.upload||r;r.onreadystatechange=function(e){if(4==r.readyState){try{var t=200==r.status?"done":"error"}catch(e){t="error"}var n="error"==t?[e,r]:[r,e];f.callAllOfObject(s,t,n)}},e.onprogress=function(e){var t=e.lengthComputable?e.loaded:null;f.callAllOfObject(s,"progress",[t,e.total||null,r,e])}},s.readData=function(e,t,n){return s.read({onDone:e,onError:t,func:n})},s.readDataURL=function(e,t){return s.readData(e,t||!1,"uri")},s.readDataURI=s.readDataURL,s.read=function(n){function t(e,t){"object"==typeof t||(t.message=t),t.fdError=e,!1!==n.onError&&(n.onError||n.onDone).apply(this,arguments)}if(f.extend(n,{onDone:new Function,onError:null,blob:s.nativeFile,func:"",start:0,end:null,mime:""}),!window.FileReader)return t("support",e);(0<n.start||null!=n.end&&n.end)&&(n.blob.slice?(null==n.end&&(n.end=n.blob.size||n.blob.fileSize),n.blob=n.blob.slice(n.start,n.end,n.mime)):f.hasConsole&&console.warn("File Blob/slice() are unsupported - operating on entire File."));var r=new FileReader;r.onerror=function(e){t("read",e)},r.onload=function(e){e.target&&e.target.result?("readAsBinaryString"==n.func&&(e.target.result=String.fromCharCode.apply(null,new Uint8Array(e.target.result))),n.onDone(e.target.result)):r.onerror(e)};var o=n.func;if(f.isArray(o)){var i=o[0];return o[0]=n.blob,r[i].apply(r,o)}if(o&&"bin"!=o){if("url"==o||"uri"==o||"src"==o)o="readAsDataURL";else if("array"==o)o="readAsArrayBuffer";else if("text"==o)o="readAsText";else if("read"!=o.substr(0,4))return r.readAsText(n.blob,o)}else o="readAsBinaryString";return r[o="readAsBinaryString"==o?"readAsArrayBuffer":o](n.blob)},s.listEntries=function(t,r){if(s.nativeEntry&&s.nativeEntry.isDirectory){r=r||new Function;var o=s.nativeEntry.createReader(),i=new f.FileList,a=0;function l(e){0==(a-=e)&&t&&(t(i),t=null)}return o.readEntries(function(e){for(var t=0;t<e.length;t++){var n=e[t];n.file?(a++,n.file(function(e){(e=new f.File(e)).setNativeEntry(n),i.push(e),l(1)},function(){i.push(f.File.fromEntry(n)),l(1),r.apply(this,arguments)})):i.push(f.File.fromEntry(n))}t?o.readEntries(arguments.callee,r):l(0)},r),!0}},s.setNativeEntry=function(e){s.nativeEntry=e&&e.webkitGetAsEntry&&e.webkitGetAsEntry()},s.event=function(e,t){return f.appendEventsToObject.apply(s,arguments)},s.preview=function(e,t){return f.previewToObject.apply(s,arguments)},s.onXhrSend=function(e,t){e.send(t)},s.event({xhrSend:s.onXhrSend})},f.File.fromEntry=function(e){var t=new f.File(e);return t.setNativeEntry(e),t.nativeFile=null,t},f.jQuery=function(i){if(!(i=i||jQuery||window.jQuery))throw"No window.jQuery object to integrate FileDrop into.";i.fn.filedrop=function(e){function t(n,r){return function(e){var t=(r||[]).concat(f.toArray(arguments,1));return o.triggerHandler((n+e).toLowerCase(),t)}}var o=this,n=this.data("filedrop");if("string"==typeof e)if(n){if(void 0!==n[e]){var r=n[e];return"function"==typeof r?r.apply(n,f.toArray(arguments,1)):r}i.error("There's no method or property FileDrop."+e+".")}else i.error("$.filedrop('comment') needs an initialized FilrDrop on this element.");else if(e&&"object"!=typeof e)i.error("Invalid $.filedrop() parameter - expected nothing (creates new zone), a string (property to access) or an object (custom zone options).");else if(n){if(!e)return n;f.extend(n.opt,e,!0)}else(n=new FileDrop(this[0],e)).$el=i(this),this.first().data("filedrop",n),n.event("any",t("fd")),n.on.fileSetup.push(function(e){e.event("any",t("file",[e]))});return o}},t.FileDrop=f.FileDrop});