2017-10-06 13:59:58 -04:00
2016-07-07 18:54:16 -07:00
/ *
*
* More info at [ www . dropzonejs . com ] ( http : //www.dropzonejs.com)
*
* Copyright ( c ) 2012 , Matias Meno
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the "Software" ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
*
* /
2017-10-06 13:59:58 -04:00
( function ( ) {
var Dropzone , Emitter , ExifRestore , camelize , contentLoaded , detectVerticalSquash , drawImageIOSFix , noop , without ,
slice = [ ] . slice ,
extend1 = function ( child , parent ) { for ( var key in parent ) { if ( hasProp . call ( parent , key ) ) child [ key ] = parent [ key ] ; } function ctor ( ) { this . constructor = child ; } ctor . prototype = parent . prototype ; child . prototype = new ctor ( ) ; child . _ _super _ _ = parent . prototype ; return child ; } ,
hasProp = { } . hasOwnProperty ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
noop = function ( ) { } ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Emitter = ( function ( ) {
function Emitter ( ) { }
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Emitter . prototype . addEventListener = Emitter . prototype . on ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Emitter . prototype . on = function ( event , fn ) {
this . _callbacks = this . _callbacks || { } ;
if ( ! this . _callbacks [ event ] ) {
this . _callbacks [ event ] = [ ] ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
this . _callbacks [ event ] . push ( fn ) ;
2017-09-25 19:14:33 +01:00
return this ;
2017-10-06 13:59:58 -04:00
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Emitter . prototype . emit = function ( ) {
var args , callback , callbacks , event , j , len ;
event = arguments [ 0 ] , args = 2 <= arguments . length ? slice . call ( arguments , 1 ) : [ ] ;
this . _callbacks = this . _callbacks || { } ;
callbacks = this . _callbacks [ event ] ;
if ( callbacks ) {
for ( j = 0 , len = callbacks . length ; j < len ; j ++ ) {
callback = callbacks [ j ] ;
callback . apply ( this , args ) ;
}
}
2017-09-25 19:14:33 +01:00
return this ;
2017-10-06 13:59:58 -04:00
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Emitter . prototype . removeListener = Emitter . prototype . off ;
Emitter . prototype . removeAllListeners = Emitter . prototype . off ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Emitter . prototype . removeEventListener = Emitter . prototype . off ;
Emitter . prototype . off = function ( event , fn ) {
var callback , callbacks , i , j , len ;
if ( ! this . _callbacks || arguments . length === 0 ) {
this . _callbacks = { } ;
return this ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
callbacks = this . _callbacks [ event ] ;
if ( ! callbacks ) {
return this ;
}
if ( arguments . length === 1 ) {
delete this . _callbacks [ event ] ;
return this ;
}
for ( i = j = 0 , len = callbacks . length ; j < len ; i = ++ j ) {
callback = callbacks [ i ] ;
if ( callback === fn ) {
callbacks . splice ( i , 1 ) ;
break ;
}
}
return this ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
return Emitter ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
} ) ( ) ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone = ( function ( superClass ) {
var extend , resolveOption ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
extend1 ( Dropzone , superClass ) ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . Emitter = Emitter ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
/ *
This is a list of all available events you can register on a dropzone object .
You can register an event handler like this :
dropzone . on ( "dragEnter" , function ( ) { } ) ;
2017-09-25 19:14:33 +01:00
* /
2017-10-06 13:59:58 -04:00
Dropzone . prototype . events = [ "drop" , "dragstart" , "dragend" , "dragenter" , "dragover" , "dragleave" , "addedfile" , "addedfiles" , "removedfile" , "thumbnail" , "error" , "errormultiple" , "processing" , "processingmultiple" , "uploadprogress" , "totaluploadprogress" , "sending" , "sendingmultiple" , "success" , "successmultiple" , "canceled" , "canceledmultiple" , "complete" , "completemultiple" , "reset" , "maxfilesexceeded" , "maxfilesreached" , "queuecomplete" ] ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . defaultOptions = {
url : null ,
method : "post" ,
2017-09-25 19:14:33 +01:00
withCredentials : false ,
timeout : 30000 ,
parallelUploads : 2 ,
uploadMultiple : false ,
maxFilesize : 256 ,
paramName : "file" ,
createImageThumbnails : true ,
maxThumbnailFilesize : 10 ,
thumbnailWidth : 120 ,
thumbnailHeight : 120 ,
thumbnailMethod : 'crop' ,
resizeWidth : null ,
resizeHeight : null ,
resizeMimeType : null ,
resizeQuality : 0.8 ,
resizeMethod : 'contain' ,
filesizeBase : 1000 ,
maxFiles : null ,
params : { } ,
headers : null ,
clickable : true ,
ignoreHiddenFiles : true ,
acceptedFiles : null ,
acceptedMimeTypes : null ,
autoProcessQueue : true ,
autoQueue : true ,
addRemoveLinks : false ,
previewsContainer : null ,
hiddenInputContainer : "body" ,
capture : null ,
renameFilename : null ,
renameFile : null ,
forceFallback : false ,
dictDefaultMessage : "Drop files here to upload" ,
dictFallbackMessage : "Your browser does not support drag'n'drop file uploads." ,
dictFallbackText : "Please use the fallback form below to upload your files like in the olden days." ,
dictFileTooBig : "File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB." ,
dictInvalidFileType : "You can't upload files of this type." ,
dictResponseError : "Server responded with {{statusCode}} code." ,
dictCancelUpload : "Cancel upload" ,
dictCancelUploadConfirmation : "Are you sure you want to cancel this upload?" ,
dictRemoveFile : "Remove file" ,
dictRemoveFileConfirmation : null ,
dictMaxFilesExceeded : "You can not upload any more files." ,
2017-10-06 13:59:58 -04:00
dictFileSizeUnits : {
tb : "TB" ,
gb : "GB" ,
mb : "MB" ,
kb : "KB" ,
b : "b"
} ,
init : function ( ) {
return noop ;
} ,
accept : function ( file , done ) {
2017-09-25 19:14:33 +01:00
return done ( ) ;
} ,
2017-10-06 13:59:58 -04:00
fallback : function ( ) {
var child , j , len , messageElement , ref , span ;
this . element . className = this . element . className + " dz-browser-not-supported" ;
ref = this . element . getElementsByTagName ( "div" ) ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
child = ref [ j ] ;
2017-09-25 19:14:33 +01:00
if ( /(^| )dz-message($| )/ . test ( child . className ) ) {
messageElement = child ;
2017-10-06 13:59:58 -04:00
child . className = "dz-message" ;
2017-09-25 19:14:33 +01:00
continue ;
}
}
if ( ! messageElement ) {
messageElement = Dropzone . createElement ( "<div class=\"dz-message\"><span></span></div>" ) ;
this . element . appendChild ( messageElement ) ;
}
2017-10-06 13:59:58 -04:00
span = messageElement . getElementsByTagName ( "span" ) [ 0 ] ;
2017-09-25 19:14:33 +01:00
if ( span ) {
if ( span . textContent != null ) {
span . textContent = this . options . dictFallbackMessage ;
} else if ( span . innerText != null ) {
span . innerText = this . options . dictFallbackMessage ;
}
}
return this . element . appendChild ( this . getFallbackForm ( ) ) ;
} ,
2017-10-06 13:59:58 -04:00
resize : function ( file , width , height , resizeMethod ) {
var info , srcRatio , trgRatio ;
info = {
2017-09-25 19:14:33 +01:00
srcX : 0 ,
srcY : 0 ,
srcWidth : file . width ,
srcHeight : file . height
} ;
2017-10-06 13:59:58 -04:00
srcRatio = file . width / file . height ;
2017-09-25 19:14:33 +01:00
if ( ( width == null ) && ( height == null ) ) {
width = info . srcWidth ;
height = info . srcHeight ;
2017-10-06 13:59:58 -04:00
} else if ( width == null ) {
2017-09-25 19:14:33 +01:00
width = height * srcRatio ;
2017-10-06 13:59:58 -04:00
} else if ( height == null ) {
2017-09-25 19:14:33 +01:00
height = width / srcRatio ;
}
width = Math . min ( width , info . srcWidth ) ;
height = Math . min ( height , info . srcHeight ) ;
2017-10-06 13:59:58 -04:00
trgRatio = width / height ;
if ( info . srcWidth > width || info . srcHeight > height ) {
2017-09-25 19:14:33 +01:00
if ( resizeMethod === 'crop' ) {
if ( srcRatio > trgRatio ) {
info . srcHeight = file . height ;
info . srcWidth = info . srcHeight * trgRatio ;
} else {
info . srcWidth = file . width ;
info . srcHeight = info . srcWidth / trgRatio ;
}
} else if ( resizeMethod === 'contain' ) {
if ( srcRatio > trgRatio ) {
height = width / srcRatio ;
} else {
width = height * srcRatio ;
}
} else {
2017-10-06 13:59:58 -04:00
throw new Error ( "Unknown resizeMethod '" + resizeMethod + "'" ) ;
2017-09-25 19:14:33 +01:00
}
}
info . srcX = ( file . width - info . srcWidth ) / 2 ;
info . srcY = ( file . height - info . srcHeight ) / 2 ;
info . trgWidth = width ;
info . trgHeight = height ;
return info ;
} ,
2017-10-06 13:59:58 -04:00
transformFile : function ( file , done ) {
2017-09-25 19:14:33 +01:00
if ( ( this . options . resizeWidth || this . options . resizeHeight ) && file . type . match ( /image.*/ ) ) {
return this . resizeImage ( file , this . options . resizeWidth , this . options . resizeHeight , this . options . resizeMethod , done ) ;
} else {
return done ( file ) ;
}
} ,
2017-10-06 13:59:58 -04:00
previewTemplate : "<div class=\"dz-preview dz-file-preview\">\n <div class=\"dz-image\"><img data-dz-thumbnail /></div>\n <div class=\"dz-details\">\n <div class=\"dz-size\"><span data-dz-size></span></div>\n <div class=\"dz-filename\"><span data-dz-name></span></div>\n </div>\n <div class=\"dz-progress\"><span class=\"dz-upload\" data-dz-uploadprogress></span></div>\n <div class=\"dz-error-message\"><span data-dz-errormessage></span></div>\n <div class=\"dz-success-mark\">\n <svg width=\"54px\" height=\"54px\" viewBox=\"0 0 54 54\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n <title>Check</title>\n <defs></defs>\n <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n <path d=\"M23.5,31.8431458 L17.5852419,25.9283877 C16.0248253,24.3679711 13.4910294,24.366835 11.9289322,25.9289322 C10.3700136,27.4878508 10.3665912,30.0234455 11.9283877,31.5852419 L20.4147581,40.0716123 C20.5133999,40.1702541 20.6159315,40.2626649 20.7218615,40.3488435 C22.2835669,41.8725651 24.794234,41.8626202 26.3461564,40.3106978 L43.3106978,23.3461564 C44.8771021,21.7797521 44.8758057,19.2483887 43.3137085,17.6862915 C41.7547899,16.1273729 39.2176035,16.1255422 37.6538436,17.6893022 L23.5,31.8431458 Z M27,53 C41.3594035,53 53,41.3594035 53,27 C53,12.6405965 41.3594035,1 27,1 C12.6405965,1 1,12.6405965 1,27 C1,41.3594035 12.6405965,53 27,53 Z\" id=\"Oval-2\" stroke-opacity=\"0.198794158\" stroke=\"#747474\" fill-opacity=\"0.816519475\" fill=\"#FFFFFF\" sketch:type=\"MSShapeGroup\"></path>\n </g>\n </svg>\n </div>\n <div class=\"dz-error-mark\">\n <svg width=\"54px\" height=\"54px\" viewBox=\"0 0 54 54\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n <title>Error</title>\n <defs></defs>\n <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n <g id=\"Check-+-Oval-2\" sketch:type=\"MSLayerGroup\" stroke=\"#747474\" stroke-opacity=\"0.198794158\" fill=\"#FFFFFF\" fill-opacity=\"0.816519475\">\n <path d=\"M32.6568542,29 L38.3106978,23.3461564 C39.8771021,21.7797521 39.8758057,19.2483887 38.3137085,17.6862915 C36.7547899,16.1273729 34.2176035,16.1255422 32.6538436,17.6893022 L27,23.3431458 L21.3461564,17.6893022 C19.7823965,16.1255422 17.2452101,16.1273729 15.6862915,17.6862915 C14.1241943,19.2483887 14.1228979,21.7797521 15.6893022,23.3461564 L21.3431458,29 L15.6893022,34.6538436 C14.1228979,36.2202479 14.1241943,38.7516113 15.6862915,40.3137085 C17.2452101,41.8726271 19.7823965,41.8744578 21.3461564,40.3106978 L27,34.6568542 L32.6538436,40.3106978 C34.2176035,41.8744578 36.7547899,41.8726271 38.3137085,40.3137085 C39.8758057,38.7516113 39.8771021,36.2202479 38.3106978,34.6538436 L32.6568542,29 Z M27,53 C41.3594035,53 53,41.3594035 53,27 C53,12.6405965 41.3594035,1 27,1 C12.6405965,1 1,12.6405965 1,27 C1,41.3594035 12.6405965,53 27,53 Z\" id=\"Oval-2\" sketch:type=\"MSShapeGroup\"></path>\n </g>\n </g>\n </svg>\n </div>\n</div>" ,
2017-09-25 19:14:33 +01:00
/ *
2017-10-06 13:59:58 -04:00
Those functions register themselves to the events on init and handle all
the user interface specific stuff . Overwriting them won ' t break the upload
but can break the way it ' s displayed .
You can overwrite them if you don ' t like the default behavior . If you just
want to add an additional event handler , register it on the dropzone object
and don ' t overwrite those options .
2017-09-25 19:14:33 +01:00
* /
2017-10-06 13:59:58 -04:00
drop : function ( e ) {
2017-09-25 19:14:33 +01:00
return this . element . classList . remove ( "dz-drag-hover" ) ;
} ,
2017-10-06 13:59:58 -04:00
dragstart : noop ,
dragend : function ( e ) {
2017-09-25 19:14:33 +01:00
return this . element . classList . remove ( "dz-drag-hover" ) ;
} ,
2017-10-06 13:59:58 -04:00
dragenter : function ( e ) {
2017-09-25 19:14:33 +01:00
return this . element . classList . add ( "dz-drag-hover" ) ;
} ,
2017-10-06 13:59:58 -04:00
dragover : function ( e ) {
2017-09-25 19:14:33 +01:00
return this . element . classList . add ( "dz-drag-hover" ) ;
} ,
2017-10-06 13:59:58 -04:00
dragleave : function ( e ) {
2017-09-25 19:14:33 +01:00
return this . element . classList . remove ( "dz-drag-hover" ) ;
} ,
2017-10-06 13:59:58 -04:00
paste : noop ,
reset : function ( ) {
2017-09-25 19:14:33 +01:00
return this . element . classList . remove ( "dz-started" ) ;
} ,
2017-10-06 13:59:58 -04:00
addedfile : function ( file ) {
var j , k , l , len , len1 , len2 , node , ref , ref1 , ref2 , removeFileEvent , removeLink , results ;
2017-09-25 19:14:33 +01:00
if ( this . element === this . previewsContainer ) {
this . element . classList . add ( "dz-started" ) ;
}
if ( this . previewsContainer ) {
file . previewElement = Dropzone . createElement ( this . options . previewTemplate . trim ( ) ) ;
2017-10-06 13:59:58 -04:00
file . previewTemplate = file . previewElement ;
2017-09-25 19:14:33 +01:00
this . previewsContainer . appendChild ( file . previewElement ) ;
2017-10-06 13:59:58 -04:00
ref = file . previewElement . querySelectorAll ( "[data-dz-name]" ) ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
node = ref [ j ] ;
2017-09-25 19:14:33 +01:00
node . textContent = file . name ;
}
2017-10-06 13:59:58 -04:00
ref1 = file . previewElement . querySelectorAll ( "[data-dz-size]" ) ;
for ( k = 0 , len1 = ref1 . length ; k < len1 ; k ++ ) {
node = ref1 [ k ] ;
2017-09-25 19:14:33 +01:00
node . innerHTML = this . filesize ( file . size ) ;
}
if ( this . options . addRemoveLinks ) {
2017-10-06 13:59:58 -04:00
file . _removeLink = Dropzone . createElement ( "<a class=\"dz-remove\" href=\"javascript:undefined;\" data-dz-remove>" + this . options . dictRemoveFile + "</a>" ) ;
2017-09-25 19:14:33 +01:00
file . previewElement . appendChild ( file . _removeLink ) ;
}
2017-10-06 13:59:58 -04:00
removeFileEvent = ( function ( _this ) {
return function ( e ) {
e . preventDefault ( ) ;
e . stopPropagation ( ) ;
if ( file . status === Dropzone . UPLOADING ) {
return Dropzone . confirm ( _this . options . dictCancelUploadConfirmation , function ( ) {
return _this . removeFile ( file ) ;
} ) ;
2017-09-25 19:14:33 +01:00
} else {
2017-10-06 13:59:58 -04:00
if ( _this . options . dictRemoveFileConfirmation ) {
return Dropzone . confirm ( _this . options . dictRemoveFileConfirmation , function ( ) {
return _this . removeFile ( file ) ;
} ) ;
} else {
return _this . removeFile ( file ) ;
}
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} ;
} ) ( this ) ;
ref2 = file . previewElement . querySelectorAll ( "[data-dz-remove]" ) ;
results = [ ] ;
for ( l = 0 , len2 = ref2 . length ; l < len2 ; l ++ ) {
removeLink = ref2 [ l ] ;
results . push ( removeLink . addEventListener ( "click" , removeFileEvent ) ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return results ;
2017-09-25 19:14:33 +01:00
}
} ,
2017-10-06 13:59:58 -04:00
removedfile : function ( file ) {
var ref ;
if ( file . previewElement ) {
if ( ( ref = file . previewElement ) != null ) {
ref . parentNode . removeChild ( file . previewElement ) ;
}
2017-09-25 19:14:33 +01:00
}
return this . _updateMaxFilesReachedClass ( ) ;
} ,
2017-10-06 13:59:58 -04:00
thumbnail : function ( file , dataUrl ) {
var j , len , ref , thumbnailElement ;
2017-09-25 19:14:33 +01:00
if ( file . previewElement ) {
file . previewElement . classList . remove ( "dz-file-preview" ) ;
2017-10-06 13:59:58 -04:00
ref = file . previewElement . querySelectorAll ( "[data-dz-thumbnail]" ) ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
thumbnailElement = ref [ j ] ;
2017-09-25 19:14:33 +01:00
thumbnailElement . alt = file . name ;
thumbnailElement . src = dataUrl ;
}
2017-10-06 13:59:58 -04:00
return setTimeout ( ( ( function ( _this ) {
return function ( ) {
return file . previewElement . classList . add ( "dz-image-preview" ) ;
} ;
} ) ( this ) ) , 1 ) ;
2017-09-25 19:14:33 +01:00
}
} ,
2017-10-06 13:59:58 -04:00
error : function ( file , message ) {
var j , len , node , ref , results ;
2017-09-25 19:14:33 +01:00
if ( file . previewElement ) {
file . previewElement . classList . add ( "dz-error" ) ;
2017-10-06 13:59:58 -04:00
if ( typeof message !== "String" && message . error ) {
2017-09-25 19:14:33 +01:00
message = message . error ;
}
2017-10-06 13:59:58 -04:00
ref = file . previewElement . querySelectorAll ( "[data-dz-errormessage]" ) ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
node = ref [ j ] ;
results . push ( node . textContent = message ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return results ;
2017-09-25 19:14:33 +01:00
}
} ,
2017-10-06 13:59:58 -04:00
errormultiple : noop ,
processing : function ( file ) {
2017-09-25 19:14:33 +01:00
if ( file . previewElement ) {
file . previewElement . classList . add ( "dz-processing" ) ;
if ( file . _removeLink ) {
return file . _removeLink . textContent = this . options . dictCancelUpload ;
}
}
} ,
2017-10-06 13:59:58 -04:00
processingmultiple : noop ,
uploadprogress : function ( file , progress , bytesSent ) {
var j , len , node , ref , results ;
2017-09-25 19:14:33 +01:00
if ( file . previewElement ) {
2017-10-06 13:59:58 -04:00
ref = file . previewElement . querySelectorAll ( "[data-dz-uploadprogress]" ) ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
node = ref [ j ] ;
if ( node . nodeName === 'PROGRESS' ) {
results . push ( node . value = progress ) ;
} else {
results . push ( node . style . width = progress + "%" ) ;
}
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return results ;
2017-09-25 19:14:33 +01:00
}
} ,
2017-10-06 13:59:58 -04:00
totaluploadprogress : noop ,
sending : noop ,
sendingmultiple : noop ,
success : function ( file ) {
2017-09-25 19:14:33 +01:00
if ( file . previewElement ) {
return file . previewElement . classList . add ( "dz-success" ) ;
}
} ,
2017-10-06 13:59:58 -04:00
successmultiple : noop ,
canceled : function ( file ) {
2017-09-25 19:14:33 +01:00
return this . emit ( "error" , file , "Upload canceled." ) ;
} ,
2017-10-06 13:59:58 -04:00
canceledmultiple : noop ,
complete : function ( file ) {
2017-09-25 19:14:33 +01:00
if ( file . _removeLink ) {
file . _removeLink . textContent = this . options . dictRemoveFile ;
}
if ( file . previewElement ) {
return file . previewElement . classList . add ( "dz-complete" ) ;
}
} ,
2017-10-06 13:59:58 -04:00
completemultiple : noop ,
maxfilesexceeded : noop ,
maxfilesreached : noop ,
queuecomplete : noop ,
addedfiles : noop
2017-09-25 19:14:33 +01:00
} ;
2017-10-06 13:59:58 -04:00
extend = function ( ) {
var j , key , len , object , objects , target , val ;
target = arguments [ 0 ] , objects = 2 <= arguments . length ? slice . call ( arguments , 1 ) : [ ] ;
for ( j = 0 , len = objects . length ; j < len ; j ++ ) {
object = objects [ j ] ;
for ( key in object ) {
val = object [ key ] ;
target [ key ] = val ;
}
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return target ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
function Dropzone ( element1 , options ) {
var elementOptions , fallback , ref ;
this . element = element1 ;
this . version = Dropzone . version ;
this . defaultOptions . previewTemplate = this . defaultOptions . previewTemplate . replace ( /\n*/g , "" ) ;
this . clickableElements = [ ] ;
this . listeners = [ ] ;
this . files = [ ] ;
if ( typeof this . element === "string" ) {
this . element = document . querySelector ( this . element ) ;
}
if ( ! ( this . element && ( this . element . nodeType != null ) ) ) {
throw new Error ( "Invalid dropzone element." ) ;
}
if ( this . element . dropzone ) {
throw new Error ( "Dropzone already attached." ) ;
}
Dropzone . instances . push ( this ) ;
this . element . dropzone = this ;
elementOptions = ( ref = Dropzone . optionsForElement ( this . element ) ) != null ? ref : { } ;
this . options = extend ( { } , this . defaultOptions , elementOptions , options != null ? options : { } ) ;
if ( this . options . forceFallback || ! Dropzone . isBrowserSupported ( ) ) {
return this . options . fallback . call ( this ) ;
}
if ( this . options . url == null ) {
this . options . url = this . element . getAttribute ( "action" ) ;
}
if ( ! this . options . url ) {
throw new Error ( "No URL provided." ) ;
}
if ( this . options . acceptedFiles && this . options . acceptedMimeTypes ) {
throw new Error ( "You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated." ) ;
}
if ( this . options . acceptedMimeTypes ) {
this . options . acceptedFiles = this . options . acceptedMimeTypes ;
delete this . options . acceptedMimeTypes ;
}
if ( this . options . renameFilename != null ) {
this . options . renameFile = ( function ( _this ) {
return function ( file ) {
return _this . options . renameFilename . call ( _this , file . name , file ) ;
} ;
} ) ( this ) ;
}
this . options . method = this . options . method . toUpperCase ( ) ;
if ( ( fallback = this . getExistingFallback ( ) ) && fallback . parentNode ) {
fallback . parentNode . removeChild ( fallback ) ;
}
if ( this . options . previewsContainer !== false ) {
if ( this . options . previewsContainer ) {
this . previewsContainer = Dropzone . getElement ( this . options . previewsContainer , "previewsContainer" ) ;
} else {
this . previewsContainer = this . element ;
}
}
if ( this . options . clickable ) {
if ( this . options . clickable === true ) {
this . clickableElements = [ this . element ] ;
} else {
this . clickableElements = Dropzone . getElements ( this . options . clickable , "clickable" ) ;
}
}
this . init ( ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
Dropzone . prototype . getAcceptedFiles = function ( ) {
var file , j , len , ref , results ;
ref = this . files ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
file = ref [ j ] ;
if ( file . accepted ) {
results . push ( file ) ;
}
}
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . getRejectedFiles = function ( ) {
var file , j , len , ref , results ;
ref = this . files ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
file = ref [ j ] ;
if ( ! file . accepted ) {
results . push ( file ) ;
}
}
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . getFilesWithStatus = function ( status ) {
var file , j , len , ref , results ;
ref = this . files ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
file = ref [ j ] ;
if ( file . status === status ) {
results . push ( file ) ;
}
}
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . getQueuedFiles = function ( ) {
return this . getFilesWithStatus ( Dropzone . QUEUED ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . getUploadingFiles = function ( ) {
return this . getFilesWithStatus ( Dropzone . UPLOADING ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . getAddedFiles = function ( ) {
return this . getFilesWithStatus ( Dropzone . ADDED ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . getActiveFiles = function ( ) {
var file , j , len , ref , results ;
ref = this . files ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
file = ref [ j ] ;
if ( file . status === Dropzone . UPLOADING || file . status === Dropzone . QUEUED ) {
results . push ( file ) ;
}
}
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . init = function ( ) {
var eventName , j , len , noPropagation , ref , ref1 , setupHiddenFileInput ;
if ( this . element . tagName === "form" ) {
this . element . setAttribute ( "enctype" , "multipart/form-data" ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
if ( this . element . classList . contains ( "dropzone" ) && ! this . element . querySelector ( ".dz-message" ) ) {
this . element . appendChild ( Dropzone . createElement ( "<div class=\"dz-default dz-message\"><span>" + this . options . dictDefaultMessage + "</span></div>" ) ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
if ( this . clickableElements . length ) {
setupHiddenFileInput = ( function ( _this ) {
return function ( ) {
if ( _this . hiddenFileInput ) {
_this . hiddenFileInput . parentNode . removeChild ( _this . hiddenFileInput ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
_this . hiddenFileInput = document . createElement ( "input" ) ;
_this . hiddenFileInput . setAttribute ( "type" , "file" ) ;
if ( ( _this . options . maxFiles == null ) || _this . options . maxFiles > 1 ) {
_this . hiddenFileInput . setAttribute ( "multiple" , "multiple" ) ;
}
_this . hiddenFileInput . className = "dz-hidden-input" ;
if ( _this . options . acceptedFiles != null ) {
_this . hiddenFileInput . setAttribute ( "accept" , _this . options . acceptedFiles ) ;
}
if ( _this . options . capture != null ) {
_this . hiddenFileInput . setAttribute ( "capture" , _this . options . capture ) ;
}
_this . hiddenFileInput . style . visibility = "hidden" ;
_this . hiddenFileInput . style . position = "absolute" ;
_this . hiddenFileInput . style . top = "0" ;
_this . hiddenFileInput . style . left = "0" ;
_this . hiddenFileInput . style . height = "0" ;
_this . hiddenFileInput . style . width = "0" ;
document . querySelector ( _this . options . hiddenInputContainer ) . appendChild ( _this . hiddenFileInput ) ;
return _this . hiddenFileInput . addEventListener ( "change" , function ( ) {
var file , files , j , len ;
files = _this . hiddenFileInput . files ;
if ( files . length ) {
for ( j = 0 , len = files . length ; j < len ; j ++ ) {
file = files [ j ] ;
_this . addFile ( file ) ;
}
}
_this . emit ( "addedfiles" , files ) ;
return setupHiddenFileInput ( ) ;
} ) ;
} ;
} ) ( this ) ;
setupHiddenFileInput ( ) ;
}
this . URL = ( ref = window . URL ) != null ? ref : window . webkitURL ;
ref1 = this . events ;
for ( j = 0 , len = ref1 . length ; j < len ; j ++ ) {
eventName = ref1 [ j ] ;
this . on ( eventName , this . options [ eventName ] ) ;
}
this . on ( "uploadprogress" , ( function ( _this ) {
return function ( ) {
return _this . updateTotalUploadProgress ( ) ;
} ;
} ) ( this ) ) ;
this . on ( "removedfile" , ( function ( _this ) {
return function ( ) {
return _this . updateTotalUploadProgress ( ) ;
} ;
} ) ( this ) ) ;
this . on ( "canceled" , ( function ( _this ) {
return function ( file ) {
return _this . emit ( "complete" , file ) ;
} ;
} ) ( this ) ) ;
this . on ( "complete" , ( function ( _this ) {
return function ( file ) {
if ( _this . getAddedFiles ( ) . length === 0 && _this . getUploadingFiles ( ) . length === 0 && _this . getQueuedFiles ( ) . length === 0 ) {
return setTimeout ( ( function ( ) {
return _this . emit ( "queuecomplete" ) ;
} ) , 0 ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} ;
} ) ( this ) ) ;
noPropagation = function ( e ) {
e . stopPropagation ( ) ;
if ( e . preventDefault ) {
return e . preventDefault ( ) ;
} else {
return e . returnValue = false ;
}
2017-09-25 19:14:33 +01:00
} ;
2017-10-06 13:59:58 -04:00
this . listeners = [
{
element : this . element ,
events : {
"dragstart" : ( function ( _this ) {
return function ( e ) {
return _this . emit ( "dragstart" , e ) ;
} ;
} ) ( this ) ,
"dragenter" : ( function ( _this ) {
return function ( e ) {
noPropagation ( e ) ;
return _this . emit ( "dragenter" , e ) ;
} ;
} ) ( this ) ,
"dragover" : ( function ( _this ) {
return function ( e ) {
var efct ;
try {
efct = e . dataTransfer . effectAllowed ;
} catch ( undefined ) { }
e . dataTransfer . dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy' ;
noPropagation ( e ) ;
return _this . emit ( "dragover" , e ) ;
} ;
} ) ( this ) ,
"dragleave" : ( function ( _this ) {
return function ( e ) {
return _this . emit ( "dragleave" , e ) ;
} ;
} ) ( this ) ,
"drop" : ( function ( _this ) {
return function ( e ) {
noPropagation ( e ) ;
return _this . drop ( e ) ;
} ;
} ) ( this ) ,
"dragend" : ( function ( _this ) {
return function ( e ) {
return _this . emit ( "dragend" , e ) ;
} ;
} ) ( this )
}
}
] ;
this . clickableElements . forEach ( ( function ( _this ) {
return function ( clickableElement ) {
return _this . listeners . push ( {
element : clickableElement ,
events : {
"click" : function ( evt ) {
if ( ( clickableElement !== _this . element ) || ( evt . target === _this . element || Dropzone . elementInside ( evt . target , _this . element . querySelector ( ".dz-message" ) ) ) ) {
_this . hiddenFileInput . click ( ) ;
}
return true ;
}
}
} ) ;
} ;
} ) ( this ) ) ;
this . enable ( ) ;
return this . options . init . call ( this ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . destroy = function ( ) {
var ref ;
this . disable ( ) ;
this . removeAllFiles ( true ) ;
if ( ( ref = this . hiddenFileInput ) != null ? ref . parentNode : void 0 ) {
this . hiddenFileInput . parentNode . removeChild ( this . hiddenFileInput ) ;
this . hiddenFileInput = null ;
}
delete this . element . dropzone ;
return Dropzone . instances . splice ( Dropzone . instances . indexOf ( this ) , 1 ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . updateTotalUploadProgress = function ( ) {
var activeFiles , file , j , len , ref , totalBytes , totalBytesSent , totalUploadProgress ;
totalBytesSent = 0 ;
totalBytes = 0 ;
activeFiles = this . getActiveFiles ( ) ;
if ( activeFiles . length ) {
ref = this . getActiveFiles ( ) ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
file = ref [ j ] ;
totalBytesSent += file . upload . bytesSent ;
totalBytes += file . upload . total ;
}
totalUploadProgress = 100 * totalBytesSent / totalBytes ;
} else {
totalUploadProgress = 100 ;
}
return this . emit ( "totaluploadprogress" , totalUploadProgress , totalBytes , totalBytesSent ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _getParamName = function ( n ) {
if ( typeof this . options . paramName === "function" ) {
return this . options . paramName ( n ) ;
} else {
return "" + this . options . paramName + ( this . options . uploadMultiple ? "[" + n + "]" : "" ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _renameFile = function ( file ) {
if ( typeof this . options . renameFile !== "function" ) {
return file . name ;
}
return this . options . renameFile ( file ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . getFallbackForm = function ( ) {
var existingFallback , fields , fieldsString , form ;
if ( existingFallback = this . getExistingFallback ( ) ) {
return existingFallback ;
}
fieldsString = "<div class=\"dz-fallback\">" ;
if ( this . options . dictFallbackText ) {
fieldsString += "<p>" + this . options . dictFallbackText + "</p>" ;
}
fieldsString += "<input type=\"file\" name=\"" + ( this . _getParamName ( 0 ) ) + "\" " + ( this . options . uploadMultiple ? 'multiple="multiple"' : void 0 ) + " /><input type=\"submit\" value=\"Upload!\"></div>" ;
fields = Dropzone . createElement ( fieldsString ) ;
if ( this . element . tagName !== "FORM" ) {
form = Dropzone . createElement ( "<form action=\"" + this . options . url + "\" enctype=\"multipart/form-data\" method=\"" + this . options . method + "\"></form>" ) ;
form . appendChild ( fields ) ;
2017-09-25 19:14:33 +01:00
} else {
2017-10-06 13:59:58 -04:00
this . element . setAttribute ( "enctype" , "multipart/form-data" ) ;
this . element . setAttribute ( "method" , this . options . method ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return form != null ? form : fields ;
2017-09-25 19:14:33 +01:00
} ;
2017-10-06 13:59:58 -04:00
Dropzone . prototype . getExistingFallback = function ( ) {
var fallback , getFallback , j , len , ref , tagName ;
getFallback = function ( elements ) {
var el , j , len ;
for ( j = 0 , len = elements . length ; j < len ; j ++ ) {
el = elements [ j ] ;
if ( /(^| )fallback($| )/ . test ( el . className ) ) {
return el ;
2017-09-25 19:14:33 +01:00
}
}
2017-10-06 13:59:58 -04:00
} ;
ref = [ "div" , "form" ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
tagName = ref [ j ] ;
if ( fallback = getFallback ( this . element . getElementsByTagName ( tagName ) ) ) {
return fallback ;
2017-09-25 19:14:33 +01:00
}
}
} ;
2017-10-06 13:59:58 -04:00
Dropzone . prototype . setupEventListeners = function ( ) {
var elementListeners , event , j , len , listener , ref , results ;
ref = this . listeners ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
elementListeners = ref [ j ] ;
results . push ( ( function ( ) {
var ref1 , results1 ;
ref1 = elementListeners . events ;
results1 = [ ] ;
for ( event in ref1 ) {
listener = ref1 [ event ] ;
results1 . push ( elementListeners . element . addEventListener ( event , listener , false ) ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return results1 ;
2017-09-25 19:14:33 +01:00
} ) ( ) ) ;
2017-10-06 13:59:58 -04:00
}
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . removeEventListeners = function ( ) {
var elementListeners , event , j , len , listener , ref , results ;
ref = this . listeners ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
elementListeners = ref [ j ] ;
results . push ( ( function ( ) {
var ref1 , results1 ;
ref1 = elementListeners . events ;
results1 = [ ] ;
for ( event in ref1 ) {
listener = ref1 [ event ] ;
results1 . push ( elementListeners . element . removeEventListener ( event , listener , false ) ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return results1 ;
2017-09-25 19:14:33 +01:00
} ) ( ) ) ;
}
2017-10-06 13:59:58 -04:00
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . disable = function ( ) {
var file , j , len , ref , results ;
this . clickableElements . forEach ( function ( element ) {
return element . classList . remove ( "dz-clickable" ) ;
} ) ;
this . removeEventListeners ( ) ;
ref = this . files ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
file = ref [ j ] ;
results . push ( this . cancelUpload ( file ) ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . enable = function ( ) {
this . clickableElements . forEach ( function ( element ) {
return element . classList . add ( "dz-clickable" ) ;
} ) ;
return this . setupEventListeners ( ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . filesize = function ( size ) {
var cutoff , i , j , len , selectedSize , selectedUnit , unit , units ;
selectedSize = 0 ;
selectedUnit = "b" ;
if ( size > 0 ) {
units = [ 'tb' , 'gb' , 'mb' , 'kb' , 'b' ] ;
for ( i = j = 0 , len = units . length ; j < len ; i = ++ j ) {
unit = units [ i ] ;
cutoff = Math . pow ( this . options . filesizeBase , 4 - i ) / 10 ;
if ( size >= cutoff ) {
selectedSize = size / Math . pow ( this . options . filesizeBase , 4 - i ) ;
selectedUnit = unit ;
break ;
}
}
selectedSize = Math . round ( 10 * selectedSize ) / 10 ;
}
return "<strong>" + selectedSize + "</strong> " + this . options . dictFileSizeUnits [ selectedUnit ] ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _updateMaxFilesReachedClass = function ( ) {
if ( ( this . options . maxFiles != null ) && this . getAcceptedFiles ( ) . length >= this . options . maxFiles ) {
if ( this . getAcceptedFiles ( ) . length === this . options . maxFiles ) {
this . emit ( 'maxfilesreached' , this . files ) ;
}
return this . element . classList . add ( "dz-max-files-reached" ) ;
2017-09-25 19:14:33 +01:00
} else {
2017-10-06 13:59:58 -04:00
return this . element . classList . remove ( "dz-max-files-reached" ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . drop = function ( e ) {
var files , items ;
if ( ! e . dataTransfer ) {
return ;
}
this . emit ( "drop" , e ) ;
files = e . dataTransfer . files ;
this . emit ( "addedfiles" , files ) ;
if ( files . length ) {
items = e . dataTransfer . items ;
if ( items && items . length && ( items [ 0 ] . webkitGetAsEntry != null ) ) {
this . _addFilesFromItems ( items ) ;
} else {
this . handleFiles ( files ) ;
}
}
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . paste = function ( e ) {
var items , ref ;
if ( ( e != null ? ( ref = e . clipboardData ) != null ? ref . items : void 0 : void 0 ) == null ) {
return ;
}
this . emit ( "paste" , e ) ;
items = e . clipboardData . items ;
if ( items . length ) {
return this . _addFilesFromItems ( items ) ;
}
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . handleFiles = function ( files ) {
var file , j , len , results ;
results = [ ] ;
for ( j = 0 , len = files . length ; j < len ; j ++ ) {
file = files [ j ] ;
results . push ( this . addFile ( file ) ) ;
}
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _addFilesFromItems = function ( items ) {
var entry , item , j , len , results ;
results = [ ] ;
for ( j = 0 , len = items . length ; j < len ; j ++ ) {
item = items [ j ] ;
2017-09-25 19:14:33 +01:00
if ( ( item . webkitGetAsEntry != null ) && ( entry = item . webkitGetAsEntry ( ) ) ) {
if ( entry . isFile ) {
2017-10-06 13:59:58 -04:00
results . push ( this . addFile ( item . getAsFile ( ) ) ) ;
2017-09-25 19:14:33 +01:00
} else if ( entry . isDirectory ) {
2017-10-06 13:59:58 -04:00
results . push ( this . _addFilesFromDirectory ( entry , entry . name ) ) ;
2017-09-25 19:14:33 +01:00
} else {
2017-10-06 13:59:58 -04:00
results . push ( void 0 ) ;
2017-09-25 19:14:33 +01:00
}
} else if ( item . getAsFile != null ) {
2017-10-06 13:59:58 -04:00
if ( ( item . kind == null ) || item . kind === "file" ) {
results . push ( this . addFile ( item . getAsFile ( ) ) ) ;
2017-09-25 19:14:33 +01:00
} else {
2017-10-06 13:59:58 -04:00
results . push ( void 0 ) ;
2017-09-25 19:14:33 +01:00
}
} else {
2017-10-06 13:59:58 -04:00
results . push ( void 0 ) ;
2017-09-25 19:14:33 +01:00
}
}
2017-10-06 13:59:58 -04:00
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _addFilesFromDirectory = function ( directory , path ) {
var dirReader , errorHandler , readEntries ;
dirReader = directory . createReader ( ) ;
errorHandler = function ( error ) {
return typeof console !== "undefined" && console !== null ? typeof console . log === "function" ? console . log ( error ) : void 0 : void 0 ;
} ;
readEntries = ( function ( _this ) {
return function ( ) {
return dirReader . readEntries ( function ( entries ) {
var entry , j , len ;
2017-09-25 19:14:33 +01:00
if ( entries . length > 0 ) {
2017-10-06 13:59:58 -04:00
for ( j = 0 , len = entries . length ; j < len ; j ++ ) {
entry = entries [ j ] ;
2017-09-25 19:14:33 +01:00
if ( entry . isFile ) {
2017-10-06 13:59:58 -04:00
entry . file ( function ( file ) {
if ( _this . options . ignoreHiddenFiles && file . name . substring ( 0 , 1 ) === '.' ) {
2017-09-25 19:14:33 +01:00
return ;
}
2017-10-06 13:59:58 -04:00
file . fullPath = path + "/" + file . name ;
return _this . addFile ( file ) ;
2017-09-25 19:14:33 +01:00
} ) ;
} else if ( entry . isDirectory ) {
2017-10-06 13:59:58 -04:00
_this . _addFilesFromDirectory ( entry , path + "/" + entry . name ) ;
2017-09-25 19:14:33 +01:00
}
}
readEntries ( ) ;
}
return null ;
2017-10-06 13:59:58 -04:00
} , errorHandler ) ;
} ;
} ) ( this ) ;
return readEntries ( ) ;
2017-09-25 19:14:33 +01:00
} ;
2017-10-06 13:59:58 -04:00
Dropzone . prototype . accept = function ( file , done ) {
if ( file . size > this . options . maxFilesize * 1024 * 1024 ) {
return done ( this . options . dictFileTooBig . replace ( "{{filesize}}" , Math . round ( file . size / 1024 / 10.24 ) / 100 ) . replace ( "{{maxFilesize}}" , this . options . maxFilesize ) ) ;
} else if ( ! Dropzone . isValidFile ( file , this . options . acceptedFiles ) ) {
return done ( this . options . dictInvalidFileType ) ;
} else if ( ( this . options . maxFiles != null ) && this . getAcceptedFiles ( ) . length >= this . options . maxFiles ) {
done ( this . options . dictMaxFilesExceeded . replace ( "{{maxFiles}}" , this . options . maxFiles ) ) ;
return this . emit ( "maxfilesexceeded" , file ) ;
2017-09-25 19:14:33 +01:00
} else {
2017-10-06 13:59:58 -04:00
return this . options . accept . call ( this , file , done ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . addFile = function ( file ) {
file . upload = {
progress : 0 ,
total : file . size ,
bytesSent : 0 ,
filename : this . _renameFile ( file )
} ;
this . files . push ( file ) ;
file . status = Dropzone . ADDED ;
this . emit ( "addedfile" , file ) ;
this . _enqueueThumbnail ( file ) ;
return this . accept ( file , ( function ( _this ) {
return function ( error ) {
if ( error ) {
file . accepted = false ;
_this . _errorProcessing ( [ file ] , error ) ;
} else {
file . accepted = true ;
if ( _this . options . autoQueue ) {
_this . enqueueFile ( file ) ;
}
}
return _this . _updateMaxFilesReachedClass ( ) ;
} ;
} ) ( this ) ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . enqueueFiles = function ( files ) {
var file , j , len ;
for ( j = 0 , len = files . length ; j < len ; j ++ ) {
file = files [ j ] ;
this . enqueueFile ( file ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return null ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . enqueueFile = function ( file ) {
if ( file . status === Dropzone . ADDED && file . accepted === true ) {
file . status = Dropzone . QUEUED ;
if ( this . options . autoProcessQueue ) {
return setTimeout ( ( ( function ( _this ) {
return function ( ) {
return _this . processQueue ( ) ;
} ;
} ) ( this ) ) , 0 ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} else {
throw new Error ( "This file can't be queued because it has already been processed or was rejected." ) ;
2017-09-25 19:14:33 +01:00
}
} ;
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _thumbnailQueue = [ ] ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _processingThumbnail = false ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _enqueueThumbnail = function ( file ) {
if ( this . options . createImageThumbnails && file . type . match ( /image.*/ ) && file . size <= this . options . maxThumbnailFilesize * 1024 * 1024 ) {
this . _thumbnailQueue . push ( file ) ;
return setTimeout ( ( ( function ( _this ) {
return function ( ) {
return _this . _processThumbnailQueue ( ) ;
} ;
} ) ( this ) ) , 0 ) ;
2017-09-25 19:14:33 +01:00
}
} ;
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _processThumbnailQueue = function ( ) {
var file ;
if ( this . _processingThumbnail || this . _thumbnailQueue . length === 0 ) {
return ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
this . _processingThumbnail = true ;
file = this . _thumbnailQueue . shift ( ) ;
return this . createThumbnail ( file , this . options . thumbnailWidth , this . options . thumbnailHeight , this . options . thumbnailMethod , true , ( function ( _this ) {
return function ( dataUrl ) {
_this . emit ( "thumbnail" , file , dataUrl ) ;
_this . _processingThumbnail = false ;
return _this . _processThumbnailQueue ( ) ;
} ;
} ) ( this ) ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . removeFile = function ( file ) {
if ( file . status === Dropzone . UPLOADING ) {
this . cancelUpload ( file ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
this . files = without ( this . files , file ) ;
this . emit ( "removedfile" , file ) ;
if ( this . files . length === 0 ) {
return this . emit ( "reset" ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . removeAllFiles = function ( cancelIfNecessary ) {
var file , j , len , ref ;
if ( cancelIfNecessary == null ) {
cancelIfNecessary = false ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
ref = this . files . slice ( ) ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
file = ref [ j ] ;
if ( file . status !== Dropzone . UPLOADING || cancelIfNecessary ) {
this . removeFile ( file ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
}
return null ;
2017-09-25 19:14:33 +01:00
} ;
2017-10-06 13:59:58 -04:00
Dropzone . prototype . resizeImage = function ( file , width , height , resizeMethod , callback ) {
return this . createThumbnail ( file , width , height , resizeMethod , false , ( function ( _this ) {
return function ( dataUrl , canvas ) {
var resizeMimeType , resizedDataURL ;
if ( canvas === null ) {
return callback ( file ) ;
} else {
resizeMimeType = _this . options . resizeMimeType ;
if ( resizeMimeType == null ) {
resizeMimeType = file . type ;
}
resizedDataURL = canvas . toDataURL ( resizeMimeType , _this . options . resizeQuality ) ;
if ( resizeMimeType === 'image/jpeg' || resizeMimeType === 'image/jpg' ) {
resizedDataURL = ExifRestore . restore ( file . dataURL , resizedDataURL ) ;
}
return callback ( Dropzone . dataURItoBlob ( resizedDataURL ) ) ;
}
} ;
} ) ( this ) ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . createThumbnail = function ( file , width , height , resizeMethod , fixOrientation , callback ) {
var fileReader ;
fileReader = new FileReader ;
fileReader . onload = ( function ( _this ) {
return function ( ) {
file . dataURL = fileReader . result ;
if ( file . type === "image/svg+xml" ) {
if ( callback != null ) {
callback ( fileReader . result ) ;
}
return ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return _this . createThumbnailFromUrl ( file , width , height , resizeMethod , fixOrientation , callback ) ;
} ;
} ) ( this ) ;
return fileReader . readAsDataURL ( file ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . createThumbnailFromUrl = function ( file , width , height , resizeMethod , fixOrientation , callback , crossOrigin ) {
var img ;
img = document . createElement ( "img" ) ;
if ( crossOrigin ) {
img . crossOrigin = crossOrigin ;
}
img . onload = ( function ( _this ) {
return function ( ) {
var loadExif ;
loadExif = function ( callback ) {
return callback ( 1 ) ;
} ;
if ( ( typeof EXIF !== "undefined" && EXIF !== null ) && fixOrientation ) {
loadExif = function ( callback ) {
return EXIF . getData ( img , function ( ) {
return callback ( EXIF . getTag ( this , 'Orientation' ) ) ;
} ) ;
} ;
}
return loadExif ( function ( orientation ) {
var canvas , ctx , ref , ref1 , ref2 , ref3 , resizeInfo , thumbnail ;
file . width = img . width ;
file . height = img . height ;
resizeInfo = _this . options . resize . call ( _this , file , width , height , resizeMethod ) ;
canvas = document . createElement ( "canvas" ) ;
ctx = canvas . getContext ( "2d" ) ;
canvas . width = resizeInfo . trgWidth ;
canvas . height = resizeInfo . trgHeight ;
if ( orientation > 4 ) {
canvas . width = resizeInfo . trgHeight ;
canvas . height = resizeInfo . trgWidth ;
}
switch ( orientation ) {
case 2 :
ctx . translate ( canvas . width , 0 ) ;
ctx . scale ( - 1 , 1 ) ;
break ;
case 3 :
ctx . translate ( canvas . width , canvas . height ) ;
ctx . rotate ( Math . PI ) ;
break ;
case 4 :
ctx . translate ( 0 , canvas . height ) ;
ctx . scale ( 1 , - 1 ) ;
break ;
case 5 :
ctx . rotate ( 0.5 * Math . PI ) ;
ctx . scale ( 1 , - 1 ) ;
break ;
case 6 :
ctx . rotate ( 0.5 * Math . PI ) ;
ctx . translate ( 0 , - canvas . height ) ;
break ;
case 7 :
ctx . rotate ( 0.5 * Math . PI ) ;
ctx . translate ( canvas . width , - canvas . height ) ;
ctx . scale ( - 1 , 1 ) ;
break ;
case 8 :
ctx . rotate ( - 0.5 * Math . PI ) ;
ctx . translate ( - canvas . width , 0 ) ;
}
drawImageIOSFix ( ctx , img , ( ref = resizeInfo . srcX ) != null ? ref : 0 , ( ref1 = resizeInfo . srcY ) != null ? ref1 : 0 , resizeInfo . srcWidth , resizeInfo . srcHeight , ( ref2 = resizeInfo . trgX ) != null ? ref2 : 0 , ( ref3 = resizeInfo . trgY ) != null ? ref3 : 0 , resizeInfo . trgWidth , resizeInfo . trgHeight ) ;
thumbnail = canvas . toDataURL ( "image/png" ) ;
if ( callback != null ) {
return callback ( thumbnail , canvas ) ;
}
} ) ;
} ;
} ) ( this ) ;
if ( callback != null ) {
img . onerror = callback ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return img . src = file . dataURL ;
2017-09-25 19:14:33 +01:00
} ;
2017-10-06 13:59:58 -04:00
Dropzone . prototype . processQueue = function ( ) {
var i , parallelUploads , processingLength , queuedFiles ;
parallelUploads = this . options . parallelUploads ;
processingLength = this . getUploadingFiles ( ) . length ;
i = processingLength ;
if ( processingLength >= parallelUploads ) {
2017-09-25 19:14:33 +01:00
return ;
}
2017-10-06 13:59:58 -04:00
queuedFiles = this . getQueuedFiles ( ) ;
if ( ! ( queuedFiles . length > 0 ) ) {
2017-09-25 19:14:33 +01:00
return ;
}
2017-10-06 13:59:58 -04:00
if ( this . options . uploadMultiple ) {
return this . processFiles ( queuedFiles . slice ( 0 , parallelUploads - processingLength ) ) ;
} else {
while ( i < parallelUploads ) {
if ( ! queuedFiles . length ) {
return ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
this . processFile ( queuedFiles . shift ( ) ) ;
i ++ ;
2017-09-25 19:14:33 +01:00
}
}
2017-10-06 13:59:58 -04:00
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . processFile = function ( file ) {
return this . processFiles ( [ file ] ) ;
2017-09-25 19:14:33 +01:00
} ;
2017-10-06 13:59:58 -04:00
Dropzone . prototype . processFiles = function ( files ) {
var file , j , len ;
for ( j = 0 , len = files . length ; j < len ; j ++ ) {
file = files [ j ] ;
file . processing = true ;
file . status = Dropzone . UPLOADING ;
this . emit ( "processing" , file ) ;
}
if ( this . options . uploadMultiple ) {
this . emit ( "processingmultiple" , files ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return this . uploadFiles ( files ) ;
2017-09-25 19:14:33 +01:00
} ;
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _getFilesWithXhr = function ( xhr ) {
var file , files ;
return files = ( function ( ) {
var j , len , ref , results ;
ref = this . files ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
file = ref [ j ] ;
if ( file . xhr === xhr ) {
results . push ( file ) ;
}
}
return results ;
} ) . call ( this ) ;
2017-09-25 19:14:33 +01:00
} ;
2017-10-06 13:59:58 -04:00
Dropzone . prototype . cancelUpload = function ( file ) {
var groupedFile , groupedFiles , j , k , len , len1 , ref ;
if ( file . status === Dropzone . UPLOADING ) {
groupedFiles = this . _getFilesWithXhr ( file . xhr ) ;
for ( j = 0 , len = groupedFiles . length ; j < len ; j ++ ) {
groupedFile = groupedFiles [ j ] ;
groupedFile . status = Dropzone . CANCELED ;
}
file . xhr . abort ( ) ;
for ( k = 0 , len1 = groupedFiles . length ; k < len1 ; k ++ ) {
groupedFile = groupedFiles [ k ] ;
this . emit ( "canceled" , groupedFile ) ;
}
if ( this . options . uploadMultiple ) {
this . emit ( "canceledmultiple" , groupedFiles ) ;
}
} else if ( ( ref = file . status ) === Dropzone . ADDED || ref === Dropzone . QUEUED ) {
file . status = Dropzone . CANCELED ;
this . emit ( "canceled" , file ) ;
if ( this . options . uploadMultiple ) {
this . emit ( "canceledmultiple" , [ file ] ) ;
}
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
if ( this . options . autoProcessQueue ) {
return this . processQueue ( ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
resolveOption = function ( ) {
var args , option ;
option = arguments [ 0 ] , args = 2 <= arguments . length ? slice . call ( arguments , 1 ) : [ ] ;
if ( typeof option === 'function' ) {
return option . apply ( this , args ) ;
}
return option ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . uploadFile = function ( file ) {
return this . uploadFiles ( [ file ] ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . uploadFiles = function ( files ) {
var doneCounter , doneFunction , file , formData , handleError , headerName , headerValue , headers , i , input , inputName , inputType , j , k , key , l , len , len1 , len2 , len3 , m , method , o , option , progressObj , ref , ref1 , ref2 , ref3 , ref4 , ref5 , response , results , updateProgress , url , value , xhr ;
xhr = new XMLHttpRequest ( ) ;
for ( j = 0 , len = files . length ; j < len ; j ++ ) {
file = files [ j ] ;
file . xhr = xhr ;
}
method = resolveOption ( this . options . method , files ) ;
url = resolveOption ( this . options . url , files ) ;
xhr . open ( method , url , true ) ;
xhr . timeout = resolveOption ( this . options . timeout , files ) ;
xhr . withCredentials = ! ! this . options . withCredentials ;
response = null ;
handleError = ( function ( _this ) {
return function ( ) {
var k , len1 , results ;
results = [ ] ;
for ( k = 0 , len1 = files . length ; k < len1 ; k ++ ) {
file = files [ k ] ;
results . push ( _this . _errorProcessing ( files , response || _this . options . dictResponseError . replace ( "{{statusCode}}" , xhr . status ) , xhr ) ) ;
}
return results ;
} ;
} ) ( this ) ;
updateProgress = ( function ( _this ) {
return function ( e ) {
var allFilesFinished , k , l , len1 , len2 , len3 , m , progress , results ;
if ( e != null ) {
progress = 100 * e . loaded / e . total ;
for ( k = 0 , len1 = files . length ; k < len1 ; k ++ ) {
file = files [ k ] ;
file . upload . progress = progress ;
file . upload . total = e . total ;
file . upload . bytesSent = e . loaded ;
}
} else {
allFilesFinished = true ;
progress = 100 ;
for ( l = 0 , len2 = files . length ; l < len2 ; l ++ ) {
file = files [ l ] ;
if ( ! ( file . upload . progress === 100 && file . upload . bytesSent === file . upload . total ) ) {
allFilesFinished = false ;
}
file . upload . progress = progress ;
file . upload . bytesSent = file . upload . total ;
}
if ( allFilesFinished ) {
return ;
}
}
results = [ ] ;
for ( m = 0 , len3 = files . length ; m < len3 ; m ++ ) {
file = files [ m ] ;
results . push ( _this . emit ( "uploadprogress" , file , progress , file . upload . bytesSent ) ) ;
}
return results ;
} ;
} ) ( this ) ;
xhr . onload = ( function ( _this ) {
return function ( e ) {
var error1 , ref ;
if ( files [ 0 ] . status === Dropzone . CANCELED ) {
return ;
}
if ( xhr . readyState !== 4 ) {
return ;
}
if ( xhr . responseType !== 'arraybuffer' && xhr . responseType !== 'blob' ) {
response = xhr . responseText ;
if ( xhr . getResponseHeader ( "content-type" ) && ~ xhr . getResponseHeader ( "content-type" ) . indexOf ( "application/json" ) ) {
try {
response = JSON . parse ( response ) ;
} catch ( error1 ) {
e = error1 ;
response = "Invalid JSON response from server." ;
}
2017-09-25 19:14:33 +01:00
}
}
2017-10-06 13:59:58 -04:00
updateProgress ( ) ;
if ( ! ( ( 200 <= ( ref = xhr . status ) && ref < 300 ) ) ) {
return handleError ( ) ;
} else {
return _this . _finished ( files , response , e ) ;
}
} ;
} ) ( this ) ;
xhr . onerror = ( function ( _this ) {
return function ( ) {
if ( files [ 0 ] . status === Dropzone . CANCELED ) {
return ;
}
return handleError ( ) ;
} ;
} ) ( this ) ;
progressObj = ( ref = xhr . upload ) != null ? ref : xhr ;
progressObj . onprogress = updateProgress ;
headers = {
"Accept" : "application/json" ,
"Cache-Control" : "no-cache" ,
"X-Requested-With" : "XMLHttpRequest"
} ;
if ( this . options . headers ) {
extend ( headers , this . options . headers ) ;
}
for ( headerName in headers ) {
headerValue = headers [ headerName ] ;
if ( headerValue ) {
xhr . setRequestHeader ( headerName , headerValue ) ;
2017-09-25 19:14:33 +01:00
}
}
2017-10-06 13:59:58 -04:00
formData = new FormData ( ) ;
if ( this . options . params ) {
ref1 = this . options . params ;
for ( key in ref1 ) {
value = ref1 [ key ] ;
formData . append ( key , value ) ;
}
}
for ( k = 0 , len1 = files . length ; k < len1 ; k ++ ) {
file = files [ k ] ;
this . emit ( "sending" , file , xhr , formData ) ;
}
if ( this . options . uploadMultiple ) {
this . emit ( "sendingmultiple" , files , xhr , formData ) ;
}
if ( this . element . tagName === "FORM" ) {
ref2 = this . element . querySelectorAll ( "input, textarea, select, button" ) ;
for ( l = 0 , len2 = ref2 . length ; l < len2 ; l ++ ) {
input = ref2 [ l ] ;
inputName = input . getAttribute ( "name" ) ;
inputType = input . getAttribute ( "type" ) ;
if ( input . tagName === "SELECT" && input . hasAttribute ( "multiple" ) ) {
ref3 = input . options ;
for ( m = 0 , len3 = ref3 . length ; m < len3 ; m ++ ) {
option = ref3 [ m ] ;
if ( option . selected ) {
formData . append ( inputName , option . value ) ;
}
}
} else if ( ! inputType || ( ( ref4 = inputType . toLowerCase ( ) ) !== "checkbox" && ref4 !== "radio" ) || input . checked ) {
formData . append ( inputName , input . value ) ;
}
}
}
doneCounter = 0 ;
results = [ ] ;
for ( i = o = 0 , ref5 = files . length - 1 ; 0 <= ref5 ? o <= ref5 : o >= ref5 ; i = 0 <= ref5 ? ++ o : -- o ) {
doneFunction = ( function ( _this ) {
return function ( file , paramName , fileName ) {
return function ( transformedFile ) {
formData . append ( paramName , transformedFile , fileName ) ;
if ( ++ doneCounter === files . length ) {
return _this . submitRequest ( xhr , formData , files ) ;
}
} ;
} ;
} ) ( this ) ;
results . push ( this . options . transformFile . call ( this , files [ i ] , doneFunction ( files [ i ] , this . _getParamName ( i ) , files [ i ] . upload . filename ) ) ) ;
}
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . submitRequest = function ( xhr , formData , files ) {
return xhr . send ( formData ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _finished = function ( files , responseText , e ) {
var file , j , len ;
for ( j = 0 , len = files . length ; j < len ; j ++ ) {
file = files [ j ] ;
file . status = Dropzone . SUCCESS ;
this . emit ( "success" , file , responseText , e ) ;
this . emit ( "complete" , file ) ;
}
if ( this . options . uploadMultiple ) {
this . emit ( "successmultiple" , files , responseText , e ) ;
this . emit ( "completemultiple" , files ) ;
}
if ( this . options . autoProcessQueue ) {
return this . processQueue ( ) ;
}
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . prototype . _errorProcessing = function ( files , message , xhr ) {
var file , j , len ;
for ( j = 0 , len = files . length ; j < len ; j ++ ) {
file = files [ j ] ;
file . status = Dropzone . ERROR ;
this . emit ( "error" , file , message , xhr ) ;
this . emit ( "complete" , file ) ;
}
if ( this . options . uploadMultiple ) {
this . emit ( "errormultiple" , files , message , xhr ) ;
this . emit ( "completemultiple" , files ) ;
}
if ( this . options . autoProcessQueue ) {
return this . processQueue ( ) ;
}
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
return Dropzone ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
} ) ( Emitter ) ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . version = "5.1.1" ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . options = { } ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . optionsForElement = function ( element ) {
if ( element . getAttribute ( "id" ) ) {
return Dropzone . options [ camelize ( element . getAttribute ( "id" ) ) ] ;
} else {
return void 0 ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . instances = [ ] ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . forElement = function ( element ) {
if ( typeof element === "string" ) {
element = document . querySelector ( element ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
if ( ( element != null ? element . dropzone : void 0 ) == null ) {
throw new Error ( "No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone." ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return element . dropzone ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . autoDiscover = true ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
Dropzone . discover = function ( ) {
var checkElements , dropzone , dropzones , j , len , results ;
if ( document . querySelectorAll ) {
dropzones = document . querySelectorAll ( ".dropzone" ) ;
} else {
dropzones = [ ] ;
checkElements = function ( elements ) {
var el , j , len , results ;
results = [ ] ;
for ( j = 0 , len = elements . length ; j < len ; j ++ ) {
el = elements [ j ] ;
if ( /(^| )dropzone($| )/ . test ( el . className ) ) {
results . push ( dropzones . push ( el ) ) ;
} else {
results . push ( void 0 ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
}
return results ;
} ;
checkElements ( document . getElementsByTagName ( "div" ) ) ;
checkElements ( document . getElementsByTagName ( "form" ) ) ;
}
results = [ ] ;
for ( j = 0 , len = dropzones . length ; j < len ; j ++ ) {
dropzone = dropzones [ j ] ;
2017-09-25 19:14:33 +01:00
if ( Dropzone . optionsForElement ( dropzone ) !== false ) {
2017-10-06 13:59:58 -04:00
results . push ( new Dropzone ( dropzone ) ) ;
2017-09-25 19:14:33 +01:00
} else {
2017-10-06 13:59:58 -04:00
results . push ( void 0 ) ;
2017-09-25 19:14:33 +01:00
}
}
2017-10-06 13:59:58 -04:00
return results ;
} ;
Dropzone . blacklistedBrowsers = [ /opera.*Macintosh.*version\/12/i ] ;
Dropzone . isBrowserSupported = function ( ) {
var capableBrowser , j , len , ref , regex ;
capableBrowser = true ;
if ( window . File && window . FileReader && window . FileList && window . Blob && window . FormData && document . querySelector ) {
if ( ! ( "classList" in document . createElement ( "a" ) ) ) {
capableBrowser = false ;
} else {
ref = Dropzone . blacklistedBrowsers ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
regex = ref [ j ] ;
if ( regex . test ( navigator . userAgent ) ) {
capableBrowser = false ;
continue ;
}
2017-09-25 19:14:33 +01:00
}
}
2017-10-06 13:59:58 -04:00
} else {
capableBrowser = false ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return capableBrowser ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . dataURItoBlob = function ( dataURI ) {
var ab , byteString , i , ia , j , mimeString , ref ;
byteString = atob ( dataURI . split ( ',' ) [ 1 ] ) ;
mimeString = dataURI . split ( ',' ) [ 0 ] . split ( ':' ) [ 1 ] . split ( ';' ) [ 0 ] ;
ab = new ArrayBuffer ( byteString . length ) ;
ia = new Uint8Array ( ab ) ;
for ( i = j = 0 , ref = byteString . length ; 0 <= ref ? j <= ref : j >= ref ; i = 0 <= ref ? ++ j : -- j ) {
ia [ i ] = byteString . charCodeAt ( i ) ;
}
return new Blob ( [ ab ] , {
type : mimeString
} ) ;
} ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
without = function ( list , rejectedItem ) {
var item , j , len , results ;
results = [ ] ;
for ( j = 0 , len = list . length ; j < len ; j ++ ) {
item = list [ j ] ;
if ( item !== rejectedItem ) {
results . push ( item ) ;
}
}
return results ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
camelize = function ( str ) {
return str . replace ( /[\-_](\w)/g , function ( match ) {
return match . charAt ( 1 ) . toUpperCase ( ) ;
} ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . createElement = function ( string ) {
var div ;
div = document . createElement ( "div" ) ;
div . innerHTML = string ;
return div . childNodes [ 0 ] ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . elementInside = function ( element , container ) {
2017-09-25 19:14:33 +01:00
if ( element === container ) {
return true ;
}
2017-10-06 13:59:58 -04:00
while ( element = element . parentNode ) {
if ( element === container ) {
return true ;
2017-09-25 19:14:33 +01:00
}
}
2017-10-06 13:59:58 -04:00
return false ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . getElement = function ( el , name ) {
var element ;
if ( typeof el === "string" ) {
element = document . querySelector ( el ) ;
} else if ( el . nodeType != null ) {
element = el ;
}
if ( element == null ) {
throw new Error ( "Invalid `" + name + "` option provided. Please provide a CSS selector or a plain HTML element." ) ;
}
return element ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . getElements = function ( els , name ) {
var e , el , elements , error1 , j , k , len , len1 , ref ;
if ( els instanceof Array ) {
elements = [ ] ;
try {
for ( j = 0 , len = els . length ; j < len ; j ++ ) {
el = els [ j ] ;
elements . push ( this . getElement ( el , name ) ) ;
}
} catch ( error1 ) {
e = error1 ;
elements = null ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} else if ( typeof els === "string" ) {
elements = [ ] ;
ref = document . querySelectorAll ( els ) ;
for ( k = 0 , len1 = ref . length ; k < len1 ; k ++ ) {
el = ref [ k ] ;
elements . push ( el ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} else if ( els . nodeType != null ) {
elements = [ els ] ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
if ( ! ( ( elements != null ) && elements . length ) ) {
throw new Error ( "Invalid `" + name + "` option provided. Please provide a CSS selector, a plain HTML element or a list of those." ) ;
}
return elements ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . confirm = function ( question , accepted , rejected ) {
if ( window . confirm ( question ) ) {
return accepted ( ) ;
} else if ( rejected != null ) {
return rejected ( ) ;
}
2017-09-25 19:14:33 +01:00
} ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
Dropzone . isValidFile = function ( file , acceptedFiles ) {
var baseMimeType , j , len , mimeType , validType ;
if ( ! acceptedFiles ) {
return true ;
}
acceptedFiles = acceptedFiles . split ( "," ) ;
mimeType = file . type ;
baseMimeType = mimeType . replace ( /\/.*$/ , "" ) ;
for ( j = 0 , len = acceptedFiles . length ; j < len ; j ++ ) {
validType = acceptedFiles [ j ] ;
validType = validType . trim ( ) ;
if ( validType . charAt ( 0 ) === "." ) {
if ( file . name . toLowerCase ( ) . indexOf ( validType . toLowerCase ( ) , file . name . length - validType . length ) !== - 1 ) {
return true ;
}
} else if ( /\/\*$/ . test ( validType ) ) {
if ( baseMimeType === validType . replace ( /\/.*$/ , "" ) ) {
return true ;
}
} else {
if ( mimeType === validType ) {
return true ;
}
}
}
return false ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
if ( typeof jQuery !== "undefined" && jQuery !== null ) {
jQuery . fn . dropzone = function ( options ) {
return this . each ( function ( ) {
return new Dropzone ( this , options ) ;
} ) ;
} ;
}
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
if ( typeof module !== "undefined" && module !== null ) {
module . exports = Dropzone ;
} else {
window . Dropzone = Dropzone ;
}
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . ADDED = "added" ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
Dropzone . QUEUED = "queued" ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
Dropzone . ACCEPTED = Dropzone . QUEUED ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
Dropzone . UPLOADING = "uploading" ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
Dropzone . PROCESSING = Dropzone . UPLOADING ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
Dropzone . CANCELED = "canceled" ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . ERROR = "error" ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Dropzone . SUCCESS = "success" ;
2016-07-07 18:54:16 -07:00
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
/ *
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
Bugfix for iOS 6 and 7
Source : http : //stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios
based on the work of https : //github.com/stomita/ios-imagefile-megapixel
* /
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
detectVerticalSquash = function ( img ) {
var alpha , canvas , ctx , data , ey , ih , iw , py , ratio , sy ;
iw = img . naturalWidth ;
ih = img . naturalHeight ;
canvas = document . createElement ( "canvas" ) ;
canvas . width = 1 ;
canvas . height = ih ;
ctx = canvas . getContext ( "2d" ) ;
ctx . drawImage ( img , 0 , 0 ) ;
data = ctx . getImageData ( 1 , 0 , 1 , ih ) . data ;
sy = 0 ;
ey = ih ;
py = ih ;
while ( py > sy ) {
alpha = data [ ( py - 1 ) * 4 + 3 ] ;
if ( alpha === 0 ) {
ey = py ;
} else {
sy = py ;
}
py = ( ey + sy ) >> 1 ;
}
ratio = py / ih ;
if ( ratio === 0 ) {
return 1 ;
2017-09-25 19:14:33 +01:00
} else {
2017-10-06 13:59:58 -04:00
return ratio ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
drawImageIOSFix = function ( ctx , img , sx , sy , sw , sh , dx , dy , dw , dh ) {
var vertSquashRatio ;
vertSquashRatio = detectVerticalSquash ( img ) ;
return ctx . drawImage ( img , sx , sy , sw , sh , dx , dy , dw , dh / vertSquashRatio ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
ExifRestore = ( function ( ) {
function ExifRestore ( ) { }
ExifRestore . KEY _STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' ;
ExifRestore . encode64 = function ( input ) {
var chr1 , chr2 , chr3 , enc1 , enc2 , enc3 , enc4 , i , output ;
output = '' ;
chr1 = void 0 ;
chr2 = void 0 ;
chr3 = '' ;
enc1 = void 0 ;
enc2 = void 0 ;
enc3 = void 0 ;
enc4 = '' ;
i = 0 ;
while ( true ) {
chr1 = input [ i ++ ] ;
chr2 = input [ i ++ ] ;
chr3 = input [ i ++ ] ;
enc1 = chr1 >> 2 ;
enc2 = ( chr1 & 3 ) << 4 | chr2 >> 4 ;
enc3 = ( chr2 & 15 ) << 2 | chr3 >> 6 ;
enc4 = chr3 & 63 ;
if ( isNaN ( chr2 ) ) {
enc3 = enc4 = 64 ;
} else if ( isNaN ( chr3 ) ) {
enc4 = 64 ;
}
output = output + this . KEY _STR . charAt ( enc1 ) + this . KEY _STR . charAt ( enc2 ) + this . KEY _STR . charAt ( enc3 ) + this . KEY _STR . charAt ( enc4 ) ;
chr1 = chr2 = chr3 = '' ;
enc1 = enc2 = enc3 = enc4 = '' ;
if ( ! ( i < input . length ) ) {
break ;
}
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return output ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
ExifRestore . restore = function ( origFileBase64 , resizedFileBase64 ) {
var image , rawImage , segments ;
if ( ! origFileBase64 . match ( 'data:image/jpeg;base64,' ) ) {
return resizedFileBase64 ;
}
rawImage = this . decode64 ( origFileBase64 . replace ( 'data:image/jpeg;base64,' , '' ) ) ;
segments = this . slice2Segments ( rawImage ) ;
image = this . exifManipulation ( resizedFileBase64 , segments ) ;
return 'data:image/jpeg;base64,' + this . encode64 ( image ) ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
ExifRestore . exifManipulation = function ( resizedFileBase64 , segments ) {
var aBuffer , exifArray , newImageArray ;
exifArray = this . getExifArray ( segments ) ;
newImageArray = this . insertExif ( resizedFileBase64 , exifArray ) ;
aBuffer = new Uint8Array ( newImageArray ) ;
return aBuffer ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
ExifRestore . getExifArray = function ( segments ) {
var seg , x ;
seg = void 0 ;
x = 0 ;
while ( x < segments . length ) {
seg = segments [ x ] ;
if ( seg [ 0 ] === 255 & seg [ 1 ] === 225 ) {
return seg ;
}
x ++ ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return [ ] ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
ExifRestore . insertExif = function ( resizedFileBase64 , exifArray ) {
var array , ato , buf , imageData , mae , separatePoint ;
imageData = resizedFileBase64 . replace ( 'data:image/jpeg;base64,' , '' ) ;
buf = this . decode64 ( imageData ) ;
separatePoint = buf . indexOf ( 255 , 3 ) ;
mae = buf . slice ( 0 , separatePoint ) ;
ato = buf . slice ( separatePoint ) ;
array = mae ;
array = array . concat ( exifArray ) ;
array = array . concat ( ato ) ;
return array ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
ExifRestore . slice2Segments = function ( rawImageArray ) {
var endPoint , head , length , seg , segments ;
head = 0 ;
segments = [ ] ;
while ( true ) {
if ( rawImageArray [ head ] === 255 & rawImageArray [ head + 1 ] === 218 ) {
break ;
}
if ( rawImageArray [ head ] === 255 & rawImageArray [ head + 1 ] === 216 ) {
head += 2 ;
} else {
length = rawImageArray [ head + 2 ] * 256 + rawImageArray [ head + 3 ] ;
endPoint = head + length + 2 ;
seg = rawImageArray . slice ( head , endPoint ) ;
segments . push ( seg ) ;
head = endPoint ;
}
if ( head > rawImageArray . length ) {
break ;
}
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return segments ;
} ;
ExifRestore . decode64 = function ( input ) {
var base64test , buf , chr1 , chr2 , chr3 , enc1 , enc2 , enc3 , enc4 , i , output ;
output = '' ;
chr1 = void 0 ;
chr2 = void 0 ;
chr3 = '' ;
enc1 = void 0 ;
enc2 = void 0 ;
enc3 = void 0 ;
enc4 = '' ;
i = 0 ;
buf = [ ] ;
base64test = /[^A-Za-z0-9\+\/\=]/g ;
if ( base64test . exec ( input ) ) {
console . warning ( 'There were invalid base64 characters in the input text.\n' + 'Valid base64 characters are A-Z, a-z, 0-9, \'+\', \'/\',and \'=\'\n' + 'Expect errors in decoding.' ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
input = input . replace ( /[^A-Za-z0-9\+\/\=]/g , '' ) ;
while ( true ) {
enc1 = this . KEY _STR . indexOf ( input . charAt ( i ++ ) ) ;
enc2 = this . KEY _STR . indexOf ( input . charAt ( i ++ ) ) ;
enc3 = this . KEY _STR . indexOf ( input . charAt ( i ++ ) ) ;
enc4 = this . KEY _STR . indexOf ( input . charAt ( i ++ ) ) ;
chr1 = enc1 << 2 | enc2 >> 4 ;
chr2 = ( enc2 & 15 ) << 4 | enc3 >> 2 ;
chr3 = ( enc3 & 3 ) << 6 | enc4 ;
buf . push ( chr1 ) ;
if ( enc3 !== 64 ) {
buf . push ( chr2 ) ;
}
if ( enc4 !== 64 ) {
buf . push ( chr3 ) ;
}
chr1 = chr2 = chr3 = '' ;
enc1 = enc2 = enc3 = enc4 = '' ;
if ( ! ( i < input . length ) ) {
break ;
}
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return buf ;
} ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
return ExifRestore ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
} ) ( ) ;
2017-09-25 19:14:33 +01:00
2017-10-06 13:59:58 -04:00
/ *
* contentloaded . js
*
* Author : Diego Perini ( diego . perini at gmail . com )
* Summary : cross - browser wrapper for DOMContentLoaded
* Updated : 20101020
* License : MIT
* Version : 1.2
*
* URL :
* http : //javascript.nwbox.com/ContentLoaded/
* http : //javascript.nwbox.com/ContentLoaded/MIT-LICENSE
* /
contentLoaded = function ( win , fn ) {
var add , doc , done , init , poll , pre , rem , root , top ;
done = false ;
top = true ;
doc = win . document ;
root = doc . documentElement ;
add = ( doc . addEventListener ? "addEventListener" : "attachEvent" ) ;
rem = ( doc . addEventListener ? "removeEventListener" : "detachEvent" ) ;
pre = ( doc . addEventListener ? "" : "on" ) ;
init = function ( e ) {
if ( e . type === "readystatechange" && doc . readyState !== "complete" ) {
return ;
}
( e . type === "load" ? win : doc ) [ rem ] ( pre + e . type , init , false ) ;
if ( ! done && ( done = true ) ) {
return fn . call ( win , e . type || e ) ;
}
} ;
poll = function ( ) {
var e , error1 ;
2017-09-25 19:14:33 +01:00
try {
2017-10-06 13:59:58 -04:00
root . doScroll ( "left" ) ;
} catch ( error1 ) {
e = error1 ;
setTimeout ( poll , 50 ) ;
return ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
return init ( "poll" ) ;
} ;
if ( doc . readyState !== "complete" ) {
if ( doc . createEventObject && root . doScroll ) {
try {
top = ! win . frameElement ;
} catch ( undefined ) { }
if ( top ) {
poll ( ) ;
}
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
doc [ add ] ( pre + "DOMContentLoaded" , init , false ) ;
doc [ add ] ( pre + "readystatechange" , init , false ) ;
return win [ add ] ( pre + "load" , init , false ) ;
2017-09-25 19:14:33 +01:00
}
2017-10-06 13:59:58 -04:00
} ;
Dropzone . _autoDiscoverFunction = function ( ) {
if ( Dropzone . autoDiscover ) {
return Dropzone . discover ( ) ;
}
} ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
contentLoaded ( window , Dropzone . _autoDiscoverFunction ) ;
2016-07-07 18:54:16 -07:00
2017-10-06 13:59:58 -04:00
} ) . call ( this ) ;