hjg
2023-11-18 bb48edb3d9faaaeab0088151c86fc24137acdb08
提交 | 用户 | 时间
58d006 1
A 2 /*
3  *
4  * More info at [www.dropzonejs.com](http://www.dropzonejs.com)
5  *
6  * Copyright (c) 2012, Matias Meno
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a copy
9  * of this software and associated documentation files (the "Software"), to deal
10  * in the Software without restriction, including without limitation the rights
11  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  * copies of the Software, and to permit persons to whom the Software is
13  * furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24  * THE SOFTWARE.
25  *
26  */
27
28 (function() {
29   var Dropzone, Emitter, camelize, contentLoaded, detectVerticalSquash, drawImageIOSFix, noop, without,
30     __slice = [].slice,
31     __hasProp = {}.hasOwnProperty,
32     __extends = 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; };
33
34   noop = function() {};
35
36   Emitter = (function() {
37     function Emitter() {}
38
39     Emitter.prototype.addEventListener = Emitter.prototype.on;
40
41     Emitter.prototype.on = function(event, fn) {
42       this._callbacks = this._callbacks || {};
43       if (!this._callbacks[event]) {
44         this._callbacks[event] = [];
45       }
46       this._callbacks[event].push(fn);
47       return this;
48     };
49
50     Emitter.prototype.emit = function() {
51       var args, callback, callbacks, event, _i, _len;
52       event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
53       this._callbacks = this._callbacks || {};
54       callbacks = this._callbacks[event];
55       if (callbacks) {
56         for (_i = 0, _len = callbacks.length; _i < _len; _i++) {
57           callback = callbacks[_i];
58           callback.apply(this, args);
59         }
60       }
61       return this;
62     };
63
64     Emitter.prototype.removeListener = Emitter.prototype.off;
65
66     Emitter.prototype.removeAllListeners = Emitter.prototype.off;
67
68     Emitter.prototype.removeEventListener = Emitter.prototype.off;
69
70     Emitter.prototype.off = function(event, fn) {
71       var callback, callbacks, i, _i, _len;
72       if (!this._callbacks || arguments.length === 0) {
73         this._callbacks = {};
74         return this;
75       }
76       callbacks = this._callbacks[event];
77       if (!callbacks) {
78         return this;
79       }
80       if (arguments.length === 1) {
81         delete this._callbacks[event];
82         return this;
83       }
84       for (i = _i = 0, _len = callbacks.length; _i < _len; i = ++_i) {
85         callback = callbacks[i];
86         if (callback === fn) {
87           callbacks.splice(i, 1);
88           break;
89         }
90       }
91       return this;
92     };
93
94     return Emitter;
95
96   })();
97
98   Dropzone = (function(_super) {
99     var extend, resolveOption;
100
101     __extends(Dropzone, _super);
102
103     Dropzone.prototype.Emitter = Emitter;
104
105
106     /*
107     This is a list of all available events you can register on a dropzone object.
108     
109     You can register an event handler like this:
110     
111         dropzone.on("dragEnter", function() { });
112      */
113
114     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"];
115
116     Dropzone.prototype.defaultOptions = {
117       url: null,
118       method: "post",
119       withCredentials: false,
120       parallelUploads: 2,
121       uploadMultiple: false,
122       maxFilesize: 256,
123       paramName: "file",
124       createImageThumbnails: true,
125       maxThumbnailFilesize: 10,
126       thumbnailWidth: 120,
127       thumbnailHeight: 120,
128       filesizeBase: 1000,
129       maxFiles: null,
130       params: {},
131       clickable: true,
132       ignoreHiddenFiles: true,
133       acceptedFiles: null,
134       acceptedMimeTypes: null,
135       autoProcessQueue: true,
136       autoQueue: true,
137       addRemoveLinks: false,
138       previewsContainer: null,
139       hiddenInputContainer: "body",
140       capture: null,
141       dictDefaultMessage: "Drop files here to upload",
142       dictFallbackMessage: "Your browser does not support drag'n'drop file uploads.",
143       dictFallbackText: "Please use the fallback form below to upload your files like in the olden days.",
144       dictFileTooBig: "File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.",
145       dictInvalidFileType: "You can't upload files of this type.",
146       dictResponseError: "Server responded with {{statusCode}} code.",
147       dictCancelUpload: "Cancel upload",
148       dictCancelUploadConfirmation: "Are you sure you want to cancel this upload?",
149       dictRemoveFile: "Remove file",
150       dictRemoveFileConfirmation: null,
151       dictMaxFilesExceeded: "You can not upload any more files.",
152       accept: function(file, done) {
153         return done();
154       },
155       init: function() {
156         return noop;
157       },
158       forceFallback: false,
159       fallback: function() {
160         var child, messageElement, span, _i, _len, _ref;
161         this.element.className = "" + this.element.className + " dz-browser-not-supported";
162         _ref = this.element.getElementsByTagName("div");
163         for (_i = 0, _len = _ref.length; _i < _len; _i++) {
164           child = _ref[_i];
165           if (/(^| )dz-message($| )/.test(child.className)) {
166             messageElement = child;
167             child.className = "dz-message";
168             continue;
169           }
170         }
171         if (!messageElement) {
172           messageElement = Dropzone.createElement("<div class=\"dz-message\"><span></span></div>");
173           this.element.appendChild(messageElement);
174         }
175         span = messageElement.getElementsByTagName("span")[0];
176         if (span) {
177           if (span.textContent != null) {
178             span.textContent = this.options.dictFallbackMessage;
179           } else if (span.innerText != null) {
180             span.innerText = this.options.dictFallbackMessage;
181           }
182         }
183         return this.element.appendChild(this.getFallbackForm());
184       },
185       resize: function(file) {
186         var info, srcRatio, trgRatio;
187         info = {
188           srcX: 0,
189           srcY: 0,
190           srcWidth: file.width,
191           srcHeight: file.height
192         };
193         srcRatio = file.width / file.height;
194         info.optWidth = this.options.thumbnailWidth;
195         info.optHeight = this.options.thumbnailHeight;
196         if ((info.optWidth == null) && (info.optHeight == null)) {
197           info.optWidth = info.srcWidth;
198           info.optHeight = info.srcHeight;
199         } else if (info.optWidth == null) {
200           info.optWidth = srcRatio * info.optHeight;
201         } else if (info.optHeight == null) {
202           info.optHeight = (1 / srcRatio) * info.optWidth;
203         }
204         trgRatio = info.optWidth / info.optHeight;
205         if (file.height < info.optHeight || file.width < info.optWidth) {
206           info.trgHeight = info.srcHeight;
207           info.trgWidth = info.srcWidth;
208         } else {
209           if (srcRatio > trgRatio) {
210             info.srcHeight = file.height;
211             info.srcWidth = info.srcHeight * trgRatio;
212           } else {
213             info.srcWidth = file.width;
214             info.srcHeight = info.srcWidth / trgRatio;
215           }
216         }
217         info.srcX = (file.width - info.srcWidth) / 2;
218         info.srcY = (file.height - info.srcHeight) / 2;
219         return info;
220       },
221
222       /*
223       Those functions register themselves to the events on init and handle all
224       the user interface specific stuff. Overwriting them won't break the upload
225       but can break the way it's displayed.
226       You can overwrite them if you don't like the default behavior. If you just
227       want to add an additional event handler, register it on the dropzone object
228       and don't overwrite those options.
229        */
230       drop: function(e) {
231         return this.element.classList.remove("dz-drag-hover");
232       },
233       dragstart: noop,
234       dragend: function(e) {
235         return this.element.classList.remove("dz-drag-hover");
236       },
237       dragenter: function(e) {
238         return this.element.classList.add("dz-drag-hover");
239       },
240       dragover: function(e) {
241         return this.element.classList.add("dz-drag-hover");
242       },
243       dragleave: function(e) {
244         return this.element.classList.remove("dz-drag-hover");
245       },
246       paste: noop,
247       reset: function() {
248         return this.element.classList.remove("dz-started");
249       },
250       addedfile: function(file) {
251         var node, removeFileEvent, removeLink, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;
252         if (this.element === this.previewsContainer) {
253           this.element.classList.add("dz-started");
254         }
255         if (this.previewsContainer) {
256           file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim());
257           file.previewTemplate = file.previewElement;
258           this.previewsContainer.appendChild(file.previewElement);
259           _ref = file.previewElement.querySelectorAll("[data-dz-name]");
260           for (_i = 0, _len = _ref.length; _i < _len; _i++) {
261             node = _ref[_i];
262             node.textContent = file.name;
263           }
264           _ref1 = file.previewElement.querySelectorAll("[data-dz-size]");
265           for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
266             node = _ref1[_j];
267             node.innerHTML = this.filesize(file.size);
268           }
269           if (this.options.addRemoveLinks) {
270             file._removeLink = Dropzone.createElement("<a class=\"dz-remove\" href=\"javascript:undefined;\" data-dz-remove>" + this.options.dictRemoveFile + "</a>");
271             file.previewElement.appendChild(file._removeLink);
272           }
273           removeFileEvent = (function(_this) {
274             return function(e) {
275               e.preventDefault();
276               e.stopPropagation();
277               if (file.status === Dropzone.UPLOADING) {
278                 return Dropzone.confirm(_this.options.dictCancelUploadConfirmation, function() {
279                   return _this.removeFile(file);
280                 });
281               } else {
282                 if (_this.options.dictRemoveFileConfirmation) {
283                   return Dropzone.confirm(_this.options.dictRemoveFileConfirmation, function() {
284                     return _this.removeFile(file);
285                   });
286                 } else {
287                   return _this.removeFile(file);
288                 }
289               }
290             };
291           })(this);
292           _ref2 = file.previewElement.querySelectorAll("[data-dz-remove]");
293           _results = [];
294           for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
295             removeLink = _ref2[_k];
296             _results.push(removeLink.addEventListener("click", removeFileEvent));
297           }
298           return _results;
299         }
300       },
301       removedfile: function(file) {
302         var _ref;
303         if (file.previewElement) {
304           if ((_ref = file.previewElement) != null) {
305             _ref.parentNode.removeChild(file.previewElement);
306           }
307         }
308         return this._updateMaxFilesReachedClass();
309       },
310       thumbnail: function(file, dataUrl) {
311         var thumbnailElement, _i, _len, _ref;
312         if (file.previewElement) {
313           file.previewElement.classList.remove("dz-file-preview");
314           _ref = file.previewElement.querySelectorAll("[data-dz-thumbnail]");
315           for (_i = 0, _len = _ref.length; _i < _len; _i++) {
316             thumbnailElement = _ref[_i];
317             thumbnailElement.alt = file.name;
318             thumbnailElement.src = dataUrl;
319           }
320           return setTimeout(((function(_this) {
321             return function() {
322               return file.previewElement.classList.add("dz-image-preview");
323             };
324           })(this)), 1);
325         }
326       },
327       error: function(file, message) {
328         var node, _i, _len, _ref, _results;
329         if (file.previewElement) {
330           file.previewElement.classList.add("dz-error");
331           if (typeof message !== "String" && message.error) {
332             message = message.error;
333           }
334           _ref = file.previewElement.querySelectorAll("[data-dz-errormessage]");
335           _results = [];
336           for (_i = 0, _len = _ref.length; _i < _len; _i++) {
337             node = _ref[_i];
338             _results.push(node.textContent = message);
339           }
340           return _results;
341         }
342       },
343       errormultiple: noop,
344       processing: function(file) {
345         if (file.previewElement) {
346           file.previewElement.classList.add("dz-processing");
347           if (file._removeLink) {
348             return file._removeLink.textContent = this.options.dictCancelUpload;
349           }
350         }
351       },
352       processingmultiple: noop,
353       uploadprogress: function(file, progress, bytesSent) {
354         var node, _i, _len, _ref, _results;
355         if (file.previewElement) {
356           _ref = file.previewElement.querySelectorAll("[data-dz-uploadprogress]");
357           _results = [];
358           for (_i = 0, _len = _ref.length; _i < _len; _i++) {
359             node = _ref[_i];
360             if (node.nodeName === 'PROGRESS') {
361               _results.push(node.value = progress);
362             } else {
363               _results.push(node.style.width = "" + progress + "%");
364             }
365           }
366           return _results;
367         }
368       },
369       totaluploadprogress: noop,
370       sending: noop,
371       sendingmultiple: noop,
372       success: function(file) {
373         if (file.previewElement) {
374           return file.previewElement.classList.add("dz-success");
375         }
376       },
377       successmultiple: noop,
378       canceled: function(file) {
379         return this.emit("error", file, "Upload canceled.");
380       },
381       canceledmultiple: noop,
382       complete: function(file) {
383         if (file._removeLink) {
384           file._removeLink.textContent = this.options.dictRemoveFile;
385         }
386         if (file.previewElement) {
387           return file.previewElement.classList.add("dz-complete");
388         }
389       },
390       completemultiple: noop,
391       maxfilesexceeded: noop,
392       maxfilesreached: noop,
393       queuecomplete: noop,
394       addedfiles: noop,
395       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>"
396     };
397
398     extend = function() {
399       var key, object, objects, target, val, _i, _len;
400       target = arguments[0], objects = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
401       for (_i = 0, _len = objects.length; _i < _len; _i++) {
402         object = objects[_i];
403         for (key in object) {
404           val = object[key];
405           target[key] = val;
406         }
407       }
408       return target;
409     };
410
411     function Dropzone(element, options) {
412       var elementOptions, fallback, _ref;
413       this.element = element;
414       this.version = Dropzone.version;
415       this.defaultOptions.previewTemplate = this.defaultOptions.previewTemplate.replace(/\n*/g, "");
416       this.clickableElements = [];
417       this.listeners = [];
418       this.files = [];
419       if (typeof this.element === "string") {
420         this.element = document.querySelector(this.element);
421       }
422       if (!(this.element && (this.element.nodeType != null))) {
423         throw new Error("Invalid dropzone element.");
424       }
425       if (this.element.dropzone) {
426         throw new Error("Dropzone already attached.");
427       }
428       Dropzone.instances.push(this);
429       this.element.dropzone = this;
430       elementOptions = (_ref = Dropzone.optionsForElement(this.element)) != null ? _ref : {};
431       this.options = extend({}, this.defaultOptions, elementOptions, options != null ? options : {});
432       if (this.options.forceFallback || !Dropzone.isBrowserSupported()) {
433         return this.options.fallback.call(this);
434       }
435       if (this.options.url == null) {
436         this.options.url = this.element.getAttribute("action");
437       }
438       if (!this.options.url) {
439         throw new Error("No URL provided.");
440       }
441       if (this.options.acceptedFiles && this.options.acceptedMimeTypes) {
442         throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.");
443       }
444       if (this.options.acceptedMimeTypes) {
445         this.options.acceptedFiles = this.options.acceptedMimeTypes;
446         delete this.options.acceptedMimeTypes;
447       }
448       this.options.method = this.options.method.toUpperCase();
449       if ((fallback = this.getExistingFallback()) && fallback.parentNode) {
450         fallback.parentNode.removeChild(fallback);
451       }
452       if (this.options.previewsContainer !== false) {
453         if (this.options.previewsContainer) {
454           this.previewsContainer = Dropzone.getElement(this.options.previewsContainer, "previewsContainer");
455         } else {
456           this.previewsContainer = this.element;
457         }
458       }
459       if (this.options.clickable) {
460         if (this.options.clickable === true) {
461           this.clickableElements = [this.element];
462         } else {
463           this.clickableElements = Dropzone.getElements(this.options.clickable, "clickable");
464         }
465       }
466       this.init();
467     }
468
469     Dropzone.prototype.getAcceptedFiles = function() {
470       var file, _i, _len, _ref, _results;
471       _ref = this.files;
472       _results = [];
473       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
474         file = _ref[_i];
475         if (file.accepted) {
476           _results.push(file);
477         }
478       }
479       return _results;
480     };
481
482     Dropzone.prototype.getRejectedFiles = function() {
483       var file, _i, _len, _ref, _results;
484       _ref = this.files;
485       _results = [];
486       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
487         file = _ref[_i];
488         if (!file.accepted) {
489           _results.push(file);
490         }
491       }
492       return _results;
493     };
494
495     Dropzone.prototype.getFilesWithStatus = function(status) {
496       var file, _i, _len, _ref, _results;
497       _ref = this.files;
498       _results = [];
499       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
500         file = _ref[_i];
501         if (file.status === status) {
502           _results.push(file);
503         }
504       }
505       return _results;
506     };
507
508     Dropzone.prototype.getQueuedFiles = function() {
509       return this.getFilesWithStatus(Dropzone.QUEUED);
510     };
511
512     Dropzone.prototype.getUploadingFiles = function() {
513       return this.getFilesWithStatus(Dropzone.UPLOADING);
514     };
515
516     Dropzone.prototype.getAddedFiles = function() {
517       return this.getFilesWithStatus(Dropzone.ADDED);
518     };
519
520     Dropzone.prototype.getActiveFiles = function() {
521       var file, _i, _len, _ref, _results;
522       _ref = this.files;
523       _results = [];
524       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
525         file = _ref[_i];
526         if (file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED) {
527           _results.push(file);
528         }
529       }
530       return _results;
531     };
532
533     Dropzone.prototype.init = function() {
534       var eventName, noPropagation, setupHiddenFileInput, _i, _len, _ref, _ref1;
535       if (this.element.tagName === "form") {
536         this.element.setAttribute("enctype", "multipart/form-data");
537       }
538       if (this.element.classList.contains("dropzone") && !this.element.querySelector(".dz-message")) {
539         this.element.appendChild(Dropzone.createElement("<div class=\"dz-default dz-message\"><span>" + this.options.dictDefaultMessage + "</span></div>"));
540       }
541       if (this.clickableElements.length) {
542         setupHiddenFileInput = (function(_this) {
543           return function() {
544             if (_this.hiddenFileInput) {
545               _this.hiddenFileInput.parentNode.removeChild(_this.hiddenFileInput);
546             }
547             _this.hiddenFileInput = document.createElement("input");
548             _this.hiddenFileInput.setAttribute("type", "file");
549             if ((_this.options.maxFiles == null) || _this.options.maxFiles > 1) {
550               _this.hiddenFileInput.setAttribute("multiple", "multiple");
551             }
552             _this.hiddenFileInput.className = "dz-hidden-input";
553             if (_this.options.acceptedFiles != null) {
554               _this.hiddenFileInput.setAttribute("accept", _this.options.acceptedFiles);
555             }
556             if (_this.options.capture != null) {
557               _this.hiddenFileInput.setAttribute("capture", _this.options.capture);
558             }
559             _this.hiddenFileInput.style.visibility = "hidden";
560             _this.hiddenFileInput.style.position = "absolute";
561             _this.hiddenFileInput.style.top = "0";
562             _this.hiddenFileInput.style.left = "0";
563             _this.hiddenFileInput.style.height = "0";
564             _this.hiddenFileInput.style.width = "0";
565             document.querySelector(_this.options.hiddenInputContainer).appendChild(_this.hiddenFileInput);
566             return _this.hiddenFileInput.addEventListener("change", function() {
567               var file, files, _i, _len;
568               files = _this.hiddenFileInput.files;
569               if (files.length) {
570                 for (_i = 0, _len = files.length; _i < _len; _i++) {
571                   file = files[_i];
572                   _this.addFile(file);
573                 }
574               }
575               _this.emit("addedfiles", files);
576               return setupHiddenFileInput();
577             });
578           };
579         })(this);
580         setupHiddenFileInput();
581       }
582       this.URL = (_ref = window.URL) != null ? _ref : window.webkitURL;
583       _ref1 = this.events;
584       for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
585         eventName = _ref1[_i];
586         this.on(eventName, this.options[eventName]);
587       }
588       this.on("uploadprogress", (function(_this) {
589         return function() {
590           return _this.updateTotalUploadProgress();
591         };
592       })(this));
593       this.on("removedfile", (function(_this) {
594         return function() {
595           return _this.updateTotalUploadProgress();
596         };
597       })(this));
598       this.on("canceled", (function(_this) {
599         return function(file) {
600           return _this.emit("complete", file);
601         };
602       })(this));
603       this.on("complete", (function(_this) {
604         return function(file) {
605           if (_this.getAddedFiles().length === 0 && _this.getUploadingFiles().length === 0 && _this.getQueuedFiles().length === 0) {
606             return setTimeout((function() {
607               return _this.emit("queuecomplete");
608             }), 0);
609           }
610         };
611       })(this));
612       noPropagation = function(e) {
613         e.stopPropagation();
614         if (e.preventDefault) {
615           return e.preventDefault();
616         } else {
617           return e.returnValue = false;
618         }
619       };
620       this.listeners = [
621         {
622           element: this.element,
623           events: {
624             "dragstart": (function(_this) {
625               return function(e) {
626                 return _this.emit("dragstart", e);
627               };
628             })(this),
629             "dragenter": (function(_this) {
630               return function(e) {
631                 noPropagation(e);
632                 return _this.emit("dragenter", e);
633               };
634             })(this),
635             "dragover": (function(_this) {
636               return function(e) {
637                 var efct;
638                 try {
639                   efct = e.dataTransfer.effectAllowed;
640                 } catch (_error) {}
641                 e.dataTransfer.dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy';
642                 noPropagation(e);
643                 return _this.emit("dragover", e);
644               };
645             })(this),
646             "dragleave": (function(_this) {
647               return function(e) {
648                 return _this.emit("dragleave", e);
649               };
650             })(this),
651             "drop": (function(_this) {
652               return function(e) {
653                 noPropagation(e);
654                 return _this.drop(e);
655               };
656             })(this),
657             "dragend": (function(_this) {
658               return function(e) {
659                 return _this.emit("dragend", e);
660               };
661             })(this)
662           }
663         }
664       ];
665       this.clickableElements.forEach((function(_this) {
666         return function(clickableElement) {
667           return _this.listeners.push({
668             element: clickableElement,
669             events: {
670               "click": function(evt) {
671                 if ((clickableElement !== _this.element) || (evt.target === _this.element || Dropzone.elementInside(evt.target, _this.element.querySelector(".dz-message")))) {
672                   _this.hiddenFileInput.click();
673                 }
674                 return true;
675               }
676             }
677           });
678         };
679       })(this));
680       this.enable();
681       return this.options.init.call(this);
682     };
683
684     Dropzone.prototype.destroy = function() {
685       var _ref;
686       this.disable();
687       this.removeAllFiles(true);
688       if ((_ref = this.hiddenFileInput) != null ? _ref.parentNode : void 0) {
689         this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);
690         this.hiddenFileInput = null;
691       }
692       delete this.element.dropzone;
693       return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1);
694     };
695
696     Dropzone.prototype.updateTotalUploadProgress = function() {
697       var activeFiles, file, totalBytes, totalBytesSent, totalUploadProgress, _i, _len, _ref;
698       totalBytesSent = 0;
699       totalBytes = 0;
700       activeFiles = this.getActiveFiles();
701       if (activeFiles.length) {
702         _ref = this.getActiveFiles();
703         for (_i = 0, _len = _ref.length; _i < _len; _i++) {
704           file = _ref[_i];
705           totalBytesSent += file.upload.bytesSent;
706           totalBytes += file.upload.total;
707         }
708         totalUploadProgress = 100 * totalBytesSent / totalBytes;
709       } else {
710         totalUploadProgress = 100;
711       }
712       return this.emit("totaluploadprogress", totalUploadProgress, totalBytes, totalBytesSent);
713     };
714
715     Dropzone.prototype._getParamName = function(n) {
716       if (typeof this.options.paramName === "function") {
717         return this.options.paramName(n);
718       } else {
719         return "" + this.options.paramName + (this.options.uploadMultiple ? "[" + n + "]" : "");
720       }
721     };
722
723     Dropzone.prototype.getFallbackForm = function() {
724       var existingFallback, fields, fieldsString, form;
725       if (existingFallback = this.getExistingFallback()) {
726         return existingFallback;
727       }
728       fieldsString = "<div class=\"dz-fallback\">";
729       if (this.options.dictFallbackText) {
730         fieldsString += "<p>" + this.options.dictFallbackText + "</p>";
731       }
732       fieldsString += "<input type=\"file\" name=\"" + (this._getParamName(0)) + "\" " + (this.options.uploadMultiple ? 'multiple="multiple"' : void 0) + " /><input type=\"submit\" value=\"Upload!\"></div>";
733       fields = Dropzone.createElement(fieldsString);
734       if (this.element.tagName !== "FORM") {
735         form = Dropzone.createElement("<form action=\"" + this.options.url + "\" enctype=\"multipart/form-data\" method=\"" + this.options.method + "\"></form>");
736         form.appendChild(fields);
737       } else {
738         this.element.setAttribute("enctype", "multipart/form-data");
739         this.element.setAttribute("method", this.options.method);
740       }
741       return form != null ? form : fields;
742     };
743
744     Dropzone.prototype.getExistingFallback = function() {
745       var fallback, getFallback, tagName, _i, _len, _ref;
746       getFallback = function(elements) {
747         var el, _i, _len;
748         for (_i = 0, _len = elements.length; _i < _len; _i++) {
749           el = elements[_i];
750           if (/(^| )fallback($| )/.test(el.className)) {
751             return el;
752           }
753         }
754       };
755       _ref = ["div", "form"];
756       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
757         tagName = _ref[_i];
758         if (fallback = getFallback(this.element.getElementsByTagName(tagName))) {
759           return fallback;
760         }
761       }
762     };
763
764     Dropzone.prototype.setupEventListeners = function() {
765       var elementListeners, event, listener, _i, _len, _ref, _results;
766       _ref = this.listeners;
767       _results = [];
768       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
769         elementListeners = _ref[_i];
770         _results.push((function() {
771           var _ref1, _results1;
772           _ref1 = elementListeners.events;
773           _results1 = [];
774           for (event in _ref1) {
775             listener = _ref1[event];
776             _results1.push(elementListeners.element.addEventListener(event, listener, false));
777           }
778           return _results1;
779         })());
780       }
781       return _results;
782     };
783
784     Dropzone.prototype.removeEventListeners = function() {
785       var elementListeners, event, listener, _i, _len, _ref, _results;
786       _ref = this.listeners;
787       _results = [];
788       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
789         elementListeners = _ref[_i];
790         _results.push((function() {
791           var _ref1, _results1;
792           _ref1 = elementListeners.events;
793           _results1 = [];
794           for (event in _ref1) {
795             listener = _ref1[event];
796             _results1.push(elementListeners.element.removeEventListener(event, listener, false));
797           }
798           return _results1;
799         })());
800       }
801       return _results;
802     };
803
804     Dropzone.prototype.disable = function() {
805       var file, _i, _len, _ref, _results;
806       this.clickableElements.forEach(function(element) {
807         return element.classList.remove("dz-clickable");
808       });
809       this.removeEventListeners();
810       _ref = this.files;
811       _results = [];
812       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
813         file = _ref[_i];
814         _results.push(this.cancelUpload(file));
815       }
816       return _results;
817     };
818
819     Dropzone.prototype.enable = function() {
820       this.clickableElements.forEach(function(element) {
821         return element.classList.add("dz-clickable");
822       });
823       return this.setupEventListeners();
824     };
825
826     Dropzone.prototype.filesize = function(size) {
827       var cutoff, i, selectedSize, selectedUnit, unit, units, _i, _len;
828       selectedSize = 0;
829       selectedUnit = "b";
830       if (size > 0) {
831         units = ['TB', 'GB', 'MB', 'KB', 'b'];
832         for (i = _i = 0, _len = units.length; _i < _len; i = ++_i) {
833           unit = units[i];
834           cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10;
835           if (size >= cutoff) {
836             selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i);
837             selectedUnit = unit;
838             break;
839           }
840         }
841         selectedSize = Math.round(10 * selectedSize) / 10;
842       }
843       return "<strong>" + selectedSize + "</strong> " + selectedUnit;
844     };
845
846     Dropzone.prototype._updateMaxFilesReachedClass = function() {
847       if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) {
848         if (this.getAcceptedFiles().length === this.options.maxFiles) {
849           this.emit('maxfilesreached', this.files);
850         }
851         return this.element.classList.add("dz-max-files-reached");
852       } else {
853         return this.element.classList.remove("dz-max-files-reached");
854       }
855     };
856
857     Dropzone.prototype.drop = function(e) {
858       var files, items;
859       if (!e.dataTransfer) {
860         return;
861       }
862       this.emit("drop", e);
863       files = e.dataTransfer.files;
864       this.emit("addedfiles", files);
865       if (files.length) {
866         items = e.dataTransfer.items;
867         if (items && items.length && (items[0].webkitGetAsEntry != null)) {
868           this._addFilesFromItems(items);
869         } else {
870           this.handleFiles(files);
871         }
872       }
873     };
874
875     Dropzone.prototype.paste = function(e) {
876       var items, _ref;
877       if ((e != null ? (_ref = e.clipboardData) != null ? _ref.items : void 0 : void 0) == null) {
878         return;
879       }
880       this.emit("paste", e);
881       items = e.clipboardData.items;
882       if (items.length) {
883         return this._addFilesFromItems(items);
884       }
885     };
886
887     Dropzone.prototype.handleFiles = function(files) {
888       var file, _i, _len, _results;
889       _results = [];
890       for (_i = 0, _len = files.length; _i < _len; _i++) {
891         file = files[_i];
892         _results.push(this.addFile(file));
893       }
894       return _results;
895     };
896
897     Dropzone.prototype._addFilesFromItems = function(items) {
898       var entry, item, _i, _len, _results;
899       _results = [];
900       for (_i = 0, _len = items.length; _i < _len; _i++) {
901         item = items[_i];
902         if ((item.webkitGetAsEntry != null) && (entry = item.webkitGetAsEntry())) {
903           if (entry.isFile) {
904             _results.push(this.addFile(item.getAsFile()));
905           } else if (entry.isDirectory) {
906             _results.push(this._addFilesFromDirectory(entry, entry.name));
907           } else {
908             _results.push(void 0);
909           }
910         } else if (item.getAsFile != null) {
911           if ((item.kind == null) || item.kind === "file") {
912             _results.push(this.addFile(item.getAsFile()));
913           } else {
914             _results.push(void 0);
915           }
916         } else {
917           _results.push(void 0);
918         }
919       }
920       return _results;
921     };
922
923     Dropzone.prototype._addFilesFromDirectory = function(directory, path) {
924       var dirReader, entriesReader;
925       dirReader = directory.createReader();
926       entriesReader = (function(_this) {
927         return function(entries) {
928           var entry, _i, _len;
929           for (_i = 0, _len = entries.length; _i < _len; _i++) {
930             entry = entries[_i];
931             if (entry.isFile) {
932               entry.file(function(file) {
933                 if (_this.options.ignoreHiddenFiles && file.name.substring(0, 1) === '.') {
934                   return;
935                 }
936                 file.fullPath = "" + path + "/" + file.name;
937                 return _this.addFile(file);
938               });
939             } else if (entry.isDirectory) {
940               _this._addFilesFromDirectory(entry, "" + path + "/" + entry.name);
941             }
942           }
943         };
944       })(this);
945       return dirReader.readEntries(entriesReader, function(error) {
946         return typeof console !== "undefined" && console !== null ? typeof console.log === "function" ? console.log(error) : void 0 : void 0;
947       });
948     };
949
950     Dropzone.prototype.accept = function(file, done) {
951       if (file.size > this.options.maxFilesize * 1024 * 1024) {
952         return done(this.options.dictFileTooBig.replace("{{filesize}}", Math.round(file.size / 1024 / 10.24) / 100).replace("{{maxFilesize}}", this.options.maxFilesize));
953       } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) {
954         return done(this.options.dictInvalidFileType);
955       } else if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) {
956         done(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}", this.options.maxFiles));
957         return this.emit("maxfilesexceeded", file);
958       } else {
959         return this.options.accept.call(this, file, done);
960       }
961     };
962
963     Dropzone.prototype.addFile = function(file) {
964       file.upload = {
965         progress: 0,
966         total: file.size,
967         bytesSent: 0
968       };
969       this.files.push(file);
970       file.status = Dropzone.ADDED;
971       this.emit("addedfile", file);
972       this._enqueueThumbnail(file);
973       return this.accept(file, (function(_this) {
974         return function(error) {
975           if (error) {
976             file.accepted = false;
977             _this._errorProcessing([file], error);
978           } else {
979             file.accepted = true;
980             if (_this.options.autoQueue) {
981               _this.enqueueFile(file);
982             }
983           }
984           return _this._updateMaxFilesReachedClass();
985         };
986       })(this));
987     };
988
989     Dropzone.prototype.enqueueFiles = function(files) {
990       var file, _i, _len;
991       for (_i = 0, _len = files.length; _i < _len; _i++) {
992         file = files[_i];
993         this.enqueueFile(file);
994       }
995       return null;
996     };
997
998     Dropzone.prototype.enqueueFile = function(file) {
999       if (file.status === Dropzone.ADDED && file.accepted === true) {
1000         file.status = Dropzone.QUEUED;
1001         if (this.options.autoProcessQueue) {
1002           return setTimeout(((function(_this) {
1003             return function() {
1004               return _this.processQueue();
1005             };
1006           })(this)), 0);
1007         }
1008       } else {
1009         throw new Error("This file can't be queued because it has already been processed or was rejected.");
1010       }
1011     };
1012
1013     Dropzone.prototype._thumbnailQueue = [];
1014
1015     Dropzone.prototype._processingThumbnail = false;
1016
1017     Dropzone.prototype._enqueueThumbnail = function(file) {
1018       if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) {
1019         this._thumbnailQueue.push(file);
1020         return setTimeout(((function(_this) {
1021           return function() {
1022             return _this._processThumbnailQueue();
1023           };
1024         })(this)), 0);
1025       }
1026     };
1027
1028     Dropzone.prototype._processThumbnailQueue = function() {
1029       if (this._processingThumbnail || this._thumbnailQueue.length === 0) {
1030         return;
1031       }
1032       this._processingThumbnail = true;
1033       return this.createThumbnail(this._thumbnailQueue.shift(), (function(_this) {
1034         return function() {
1035           _this._processingThumbnail = false;
1036           return _this._processThumbnailQueue();
1037         };
1038       })(this));
1039     };
1040
1041     Dropzone.prototype.removeFile = function(file) {
1042       if (file.status === Dropzone.UPLOADING) {
1043         this.cancelUpload(file);
1044       }
1045       this.files = without(this.files, file);
1046       this.emit("removedfile", file);
1047       if (this.files.length === 0) {
1048         return this.emit("reset");
1049       }
1050     };
1051
1052     Dropzone.prototype.removeAllFiles = function(cancelIfNecessary) {
1053       var file, _i, _len, _ref;
1054       if (cancelIfNecessary == null) {
1055         cancelIfNecessary = false;
1056       }
1057       _ref = this.files.slice();
1058       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1059         file = _ref[_i];
1060         if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) {
1061           this.removeFile(file);
1062         }
1063       }
1064       return null;
1065     };
1066
1067     Dropzone.prototype.createThumbnail = function(file, callback) {
1068       var fileReader;
1069       fileReader = new FileReader;
1070       fileReader.onload = (function(_this) {
1071         return function() {
1072           if (file.type === "image/svg+xml") {
1073             _this.emit("thumbnail", file, fileReader.result);
1074             if (callback != null) {
1075               callback();
1076             }
1077             return;
1078           }
1079           return _this.createThumbnailFromUrl(file, fileReader.result, callback);
1080         };
1081       })(this);
1082       return fileReader.readAsDataURL(file);
1083     };
1084
1085     Dropzone.prototype.createThumbnailFromUrl = function(file, imageUrl, callback, crossOrigin) {
1086       var img;
1087       img = document.createElement("img");
1088       if (crossOrigin) {
1089         img.crossOrigin = crossOrigin;
1090       }
1091       img.onload = (function(_this) {
1092         return function() {
1093           var canvas, ctx, resizeInfo, thumbnail, _ref, _ref1, _ref2, _ref3;
1094           file.width = img.width;
1095           file.height = img.height;
1096           resizeInfo = _this.options.resize.call(_this, file);
1097           if (resizeInfo.trgWidth == null) {
1098             resizeInfo.trgWidth = resizeInfo.optWidth;
1099           }
1100           if (resizeInfo.trgHeight == null) {
1101             resizeInfo.trgHeight = resizeInfo.optHeight;
1102           }
1103           canvas = document.createElement("canvas");
1104           ctx = canvas.getContext("2d");
1105           canvas.width = resizeInfo.trgWidth;
1106           canvas.height = resizeInfo.trgHeight;
1107           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);
1108           thumbnail = canvas.toDataURL("image/png");
1109           _this.emit("thumbnail", file, thumbnail);
1110           if (callback != null) {
1111             return callback();
1112           }
1113         };
1114       })(this);
1115       if (callback != null) {
1116         img.onerror = callback;
1117       }
1118       return img.src = imageUrl;
1119     };
1120
1121     Dropzone.prototype.processQueue = function() {
1122       var i, parallelUploads, processingLength, queuedFiles;
1123       parallelUploads = this.options.parallelUploads;
1124       processingLength = this.getUploadingFiles().length;
1125       i = processingLength;
1126       if (processingLength >= parallelUploads) {
1127         return;
1128       }
1129       queuedFiles = this.getQueuedFiles();
1130       if (!(queuedFiles.length > 0)) {
1131         return;
1132       }
1133       if (this.options.uploadMultiple) {
1134         return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));
1135       } else {
1136         while (i < parallelUploads) {
1137           if (!queuedFiles.length) {
1138             return;
1139           }
1140           this.processFile(queuedFiles.shift());
1141           i++;
1142         }
1143       }
1144     };
1145
1146     Dropzone.prototype.processFile = function(file) {
1147       return this.processFiles([file]);
1148     };
1149
1150     Dropzone.prototype.processFiles = function(files) {
1151       var file, _i, _len;
1152       for (_i = 0, _len = files.length; _i < _len; _i++) {
1153         file = files[_i];
1154         file.processing = true;
1155         file.status = Dropzone.UPLOADING;
1156         this.emit("processing", file);
1157       }
1158       if (this.options.uploadMultiple) {
1159         this.emit("processingmultiple", files);
1160       }
1161       return this.uploadFiles(files);
1162     };
1163
1164     Dropzone.prototype._getFilesWithXhr = function(xhr) {
1165       var file, files;
1166       return files = (function() {
1167         var _i, _len, _ref, _results;
1168         _ref = this.files;
1169         _results = [];
1170         for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1171           file = _ref[_i];
1172           if (file.xhr === xhr) {
1173             _results.push(file);
1174           }
1175         }
1176         return _results;
1177       }).call(this);
1178     };
1179
1180     Dropzone.prototype.cancelUpload = function(file) {
1181       var groupedFile, groupedFiles, _i, _j, _len, _len1, _ref;
1182       if (file.status === Dropzone.UPLOADING) {
1183         groupedFiles = this._getFilesWithXhr(file.xhr);
1184         for (_i = 0, _len = groupedFiles.length; _i < _len; _i++) {
1185           groupedFile = groupedFiles[_i];
1186           groupedFile.status = Dropzone.CANCELED;
1187         }
1188         file.xhr.abort();
1189         for (_j = 0, _len1 = groupedFiles.length; _j < _len1; _j++) {
1190           groupedFile = groupedFiles[_j];
1191           this.emit("canceled", groupedFile);
1192         }
1193         if (this.options.uploadMultiple) {
1194           this.emit("canceledmultiple", groupedFiles);
1195         }
1196       } else if ((_ref = file.status) === Dropzone.ADDED || _ref === Dropzone.QUEUED) {
1197         file.status = Dropzone.CANCELED;
1198         this.emit("canceled", file);
1199         if (this.options.uploadMultiple) {
1200           this.emit("canceledmultiple", [file]);
1201         }
1202       }
1203       if (this.options.autoProcessQueue) {
1204         return this.processQueue();
1205       }
1206     };
1207
1208     resolveOption = function() {
1209       var args, option;
1210       option = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
1211       if (typeof option === 'function') {
1212         return option.apply(this, args);
1213       }
1214       return option;
1215     };
1216
1217     Dropzone.prototype.uploadFile = function(file) {
1218       return this.uploadFiles([file]);
1219     };
1220
1221     Dropzone.prototype.uploadFiles = function(files) {
1222       var file, formData, handleError, headerName, headerValue, headers, i, input, inputName, inputType, key, method, option, progressObj, response, updateProgress, url, value, xhr, _i, _j, _k, _l, _len, _len1, _len2, _len3, _m, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
1223       xhr = new XMLHttpRequest();
1224       for (_i = 0, _len = files.length; _i < _len; _i++) {
1225         file = files[_i];
1226         file.xhr = xhr;
1227       }
1228       method = resolveOption(this.options.method, files);
1229       url = resolveOption(this.options.url, files);
1230       xhr.open(method, url, true);
1231       xhr.withCredentials = !!this.options.withCredentials;
1232       response = null;
1233       handleError = (function(_this) {
1234         return function() {
1235           var _j, _len1, _results;
1236           _results = [];
1237           for (_j = 0, _len1 = files.length; _j < _len1; _j++) {
1238             file = files[_j];
1239             _results.push(_this._errorProcessing(files, response || _this.options.dictResponseError.replace("{{statusCode}}", xhr.status), xhr));
1240           }
1241           return _results;
1242         };
1243       })(this);
1244       updateProgress = (function(_this) {
1245         return function(e) {
1246           var allFilesFinished, progress, _j, _k, _l, _len1, _len2, _len3, _results;
1247           if (e != null) {
1248             progress = 100 * e.loaded / e.total;
1249             for (_j = 0, _len1 = files.length; _j < _len1; _j++) {
1250               file = files[_j];
1251               file.upload = {
1252                 progress: progress,
1253                 total: e.total,
1254                 bytesSent: e.loaded
1255               };
1256             }
1257           } else {
1258             allFilesFinished = true;
1259             progress = 100;
1260             for (_k = 0, _len2 = files.length; _k < _len2; _k++) {
1261               file = files[_k];
1262               if (!(file.upload.progress === 100 && file.upload.bytesSent === file.upload.total)) {
1263                 allFilesFinished = false;
1264               }
1265               file.upload.progress = progress;
1266               file.upload.bytesSent = file.upload.total;
1267             }
1268             if (allFilesFinished) {
1269               return;
1270             }
1271           }
1272           _results = [];
1273           for (_l = 0, _len3 = files.length; _l < _len3; _l++) {
1274             file = files[_l];
1275             _results.push(_this.emit("uploadprogress", file, progress, file.upload.bytesSent));
1276           }
1277           return _results;
1278         };
1279       })(this);
1280       xhr.onload = (function(_this) {
1281         return function(e) {
1282           var _ref;
1283           if (files[0].status === Dropzone.CANCELED) {
1284             return;
1285           }
1286           if (xhr.readyState !== 4) {
1287             return;
1288           }
1289           response = xhr.responseText;
1290           if (xhr.getResponseHeader("content-type") && ~xhr.getResponseHeader("content-type").indexOf("application/json")) {
1291             try {
1292               response = JSON.parse(response);
1293             } catch (_error) {
1294               e = _error;
1295               response = "Invalid JSON response from server.";
1296             }
1297           }
1298           updateProgress();
1299           if (!((200 <= (_ref = xhr.status) && _ref < 300))) {
1300             return handleError();
1301           } else {
1302             return _this._finished(files, response, e);
1303           }
1304         };
1305       })(this);
1306       xhr.onerror = (function(_this) {
1307         return function() {
1308           if (files[0].status === Dropzone.CANCELED) {
1309             return;
1310           }
1311           return handleError();
1312         };
1313       })(this);
1314       progressObj = (_ref = xhr.upload) != null ? _ref : xhr;
1315       progressObj.onprogress = updateProgress;
1316       headers = {
1317         "Accept": "application/json",
1318         "Cache-Control": "no-cache",
1319         "X-Requested-With": "XMLHttpRequest"
1320       };
1321       if (this.options.headers) {
1322         extend(headers, this.options.headers);
1323       }
1324       for (headerName in headers) {
1325         headerValue = headers[headerName];
1326         if (headerValue) {
1327           xhr.setRequestHeader(headerName, headerValue);
1328         }
1329       }
1330       formData = new FormData();
1331       if (this.options.params) {
1332         _ref1 = this.options.params;
1333         for (key in _ref1) {
1334           value = _ref1[key];
1335           formData.append(key, value);
1336         }
1337       }
1338       for (_j = 0, _len1 = files.length; _j < _len1; _j++) {
1339         file = files[_j];
1340         this.emit("sending", file, xhr, formData);
1341       }
1342       if (this.options.uploadMultiple) {
1343         this.emit("sendingmultiple", files, xhr, formData);
1344       }
1345       if (this.element.tagName === "FORM") {
1346         _ref2 = this.element.querySelectorAll("input, textarea, select, button");
1347         for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
1348           input = _ref2[_k];
1349           inputName = input.getAttribute("name");
1350           inputType = input.getAttribute("type");
1351           if (input.tagName === "SELECT" && input.hasAttribute("multiple")) {
1352             _ref3 = input.options;
1353             for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
1354               option = _ref3[_l];
1355               if (option.selected) {
1356                 formData.append(inputName, option.value);
1357               }
1358             }
1359           } else if (!inputType || ((_ref4 = inputType.toLowerCase()) !== "checkbox" && _ref4 !== "radio") || input.checked) {
1360             formData.append(inputName, input.value);
1361           }
1362         }
1363       }
1364       for (i = _m = 0, _ref5 = files.length - 1; 0 <= _ref5 ? _m <= _ref5 : _m >= _ref5; i = 0 <= _ref5 ? ++_m : --_m) {
1365         formData.append(this._getParamName(i), files[i], files[i].name);
1366       }
1367       return this.submitRequest(xhr, formData, files);
1368     };
1369
1370     Dropzone.prototype.submitRequest = function(xhr, formData, files) {
1371       return xhr.send(formData);
1372     };
1373
1374     Dropzone.prototype._finished = function(files, responseText, e) {
1375       var file, _i, _len;
1376       for (_i = 0, _len = files.length; _i < _len; _i++) {
1377         file = files[_i];
1378         file.status = Dropzone.SUCCESS;
1379         this.emit("success", file, responseText, e);
1380         this.emit("complete", file);
1381       }
1382       if (this.options.uploadMultiple) {
1383         this.emit("successmultiple", files, responseText, e);
1384         this.emit("completemultiple", files);
1385       }
1386       if (this.options.autoProcessQueue) {
1387         return this.processQueue();
1388       }
1389     };
1390
1391     Dropzone.prototype._errorProcessing = function(files, message, xhr) {
1392       var file, _i, _len;
1393       for (_i = 0, _len = files.length; _i < _len; _i++) {
1394         file = files[_i];
1395         file.status = Dropzone.ERROR;
1396         this.emit("error", file, message, xhr);
1397         this.emit("complete", file);
1398       }
1399       if (this.options.uploadMultiple) {
1400         this.emit("errormultiple", files, message, xhr);
1401         this.emit("completemultiple", files);
1402       }
1403       if (this.options.autoProcessQueue) {
1404         return this.processQueue();
1405       }
1406     };
1407
1408     return Dropzone;
1409
1410   })(Emitter);
1411
1412   Dropzone.version = "4.2.0";
1413
1414   Dropzone.options = {};
1415
1416   Dropzone.optionsForElement = function(element) {
1417     if (element.getAttribute("id")) {
1418       return Dropzone.options[camelize(element.getAttribute("id"))];
1419     } else {
1420       return void 0;
1421     }
1422   };
1423
1424   Dropzone.instances = [];
1425
1426   Dropzone.forElement = function(element) {
1427     if (typeof element === "string") {
1428       element = document.querySelector(element);
1429     }
1430     if ((element != null ? element.dropzone : void 0) == null) {
1431       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.");
1432     }
1433     return element.dropzone;
1434   };
1435
1436   Dropzone.autoDiscover = true;
1437
1438   Dropzone.discover = function() {
1439     var checkElements, dropzone, dropzones, _i, _len, _results;
1440     if (document.querySelectorAll) {
1441       dropzones = document.querySelectorAll(".dropzone");
1442     } else {
1443       dropzones = [];
1444       checkElements = function(elements) {
1445         var el, _i, _len, _results;
1446         _results = [];
1447         for (_i = 0, _len = elements.length; _i < _len; _i++) {
1448           el = elements[_i];
1449           if (/(^| )dropzone($| )/.test(el.className)) {
1450             _results.push(dropzones.push(el));
1451           } else {
1452             _results.push(void 0);
1453           }
1454         }
1455         return _results;
1456       };
1457       checkElements(document.getElementsByTagName("div"));
1458       checkElements(document.getElementsByTagName("form"));
1459     }
1460     _results = [];
1461     for (_i = 0, _len = dropzones.length; _i < _len; _i++) {
1462       dropzone = dropzones[_i];
1463       if (Dropzone.optionsForElement(dropzone) !== false) {
1464         _results.push(new Dropzone(dropzone));
1465       } else {
1466         _results.push(void 0);
1467       }
1468     }
1469     return _results;
1470   };
1471
1472   Dropzone.blacklistedBrowsers = [/opera.*Macintosh.*version\/12/i];
1473
1474   Dropzone.isBrowserSupported = function() {
1475     var capableBrowser, regex, _i, _len, _ref;
1476     capableBrowser = true;
1477     if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {
1478       if (!("classList" in document.createElement("a"))) {
1479         capableBrowser = false;
1480       } else {
1481         _ref = Dropzone.blacklistedBrowsers;
1482         for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1483           regex = _ref[_i];
1484           if (regex.test(navigator.userAgent)) {
1485             capableBrowser = false;
1486             continue;
1487           }
1488         }
1489       }
1490     } else {
1491       capableBrowser = false;
1492     }
1493     return capableBrowser;
1494   };
1495
1496   without = function(list, rejectedItem) {
1497     var item, _i, _len, _results;
1498     _results = [];
1499     for (_i = 0, _len = list.length; _i < _len; _i++) {
1500       item = list[_i];
1501       if (item !== rejectedItem) {
1502         _results.push(item);
1503       }
1504     }
1505     return _results;
1506   };
1507
1508   camelize = function(str) {
1509     return str.replace(/[\-_](\w)/g, function(match) {
1510       return match.charAt(1).toUpperCase();
1511     });
1512   };
1513
1514   Dropzone.createElement = function(string) {
1515     var div;
1516     div = document.createElement("div");
1517     div.innerHTML = string;
1518     return div.childNodes[0];
1519   };
1520
1521   Dropzone.elementInside = function(element, container) {
1522     if (element === container) {
1523       return true;
1524     }
1525     while (element = element.parentNode) {
1526       if (element === container) {
1527         return true;
1528       }
1529     }
1530     return false;
1531   };
1532
1533   Dropzone.getElement = function(el, name) {
1534     var element;
1535     if (typeof el === "string") {
1536       element = document.querySelector(el);
1537     } else if (el.nodeType != null) {
1538       element = el;
1539     }
1540     if (element == null) {
1541       throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector or a plain HTML element.");
1542     }
1543     return element;
1544   };
1545
1546   Dropzone.getElements = function(els, name) {
1547     var e, el, elements, _i, _j, _len, _len1, _ref;
1548     if (els instanceof Array) {
1549       elements = [];
1550       try {
1551         for (_i = 0, _len = els.length; _i < _len; _i++) {
1552           el = els[_i];
1553           elements.push(this.getElement(el, name));
1554         }
1555       } catch (_error) {
1556         e = _error;
1557         elements = null;
1558       }
1559     } else if (typeof els === "string") {
1560       elements = [];
1561       _ref = document.querySelectorAll(els);
1562       for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
1563         el = _ref[_j];
1564         elements.push(el);
1565       }
1566     } else if (els.nodeType != null) {
1567       elements = [els];
1568     }
1569     if (!((elements != null) && elements.length)) {
1570       throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector, a plain HTML element or a list of those.");
1571     }
1572     return elements;
1573   };
1574
1575   Dropzone.confirm = function(question, accepted, rejected) {
1576     if (window.confirm(question)) {
1577       return accepted();
1578     } else if (rejected != null) {
1579       return rejected();
1580     }
1581   };
1582
1583   Dropzone.isValidFile = function(file, acceptedFiles) {
1584     var baseMimeType, mimeType, validType, _i, _len;
1585     if (!acceptedFiles) {
1586       return true;
1587     }
1588     acceptedFiles = acceptedFiles.split(",");
1589     mimeType = file.type;
1590     baseMimeType = mimeType.replace(/\/.*$/, "");
1591     for (_i = 0, _len = acceptedFiles.length; _i < _len; _i++) {
1592       validType = acceptedFiles[_i];
1593       validType = validType.trim();
1594       if (validType.charAt(0) === ".") {
1595         if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {
1596           return true;
1597         }
1598       } else if (/\/\*$/.test(validType)) {
1599         if (baseMimeType === validType.replace(/\/.*$/, "")) {
1600           return true;
1601         }
1602       } else {
1603         if (mimeType === validType) {
1604           return true;
1605         }
1606       }
1607     }
1608     return false;
1609   };
1610
1611   if (typeof jQuery !== "undefined" && jQuery !== null) {
1612     jQuery.fn.dropzone = function(options) {
1613       return this.each(function() {
1614         return new Dropzone(this, options);
1615       });
1616     };
1617   }
1618
1619   if (typeof module !== "undefined" && module !== null) {
1620     module.exports = Dropzone;
1621   } else {
1622     window.Dropzone = Dropzone;
1623   }
1624
1625   Dropzone.ADDED = "added";
1626
1627   Dropzone.QUEUED = "queued";
1628
1629   Dropzone.ACCEPTED = Dropzone.QUEUED;
1630
1631   Dropzone.UPLOADING = "uploading";
1632
1633   Dropzone.PROCESSING = Dropzone.UPLOADING;
1634
1635   Dropzone.CANCELED = "canceled";
1636
1637   Dropzone.ERROR = "error";
1638
1639   Dropzone.SUCCESS = "success";
1640
1641
1642   /*
1643   
1644   Bugfix for iOS 6 and 7
1645   Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios
1646   based on the work of https://github.com/stomita/ios-imagefile-megapixel
1647    */
1648
1649   detectVerticalSquash = function(img) {
1650     var alpha, canvas, ctx, data, ey, ih, iw, py, ratio, sy;
1651     iw = img.naturalWidth;
1652     ih = img.naturalHeight;
1653     canvas = document.createElement("canvas");
1654     canvas.width = 1;
1655     canvas.height = ih;
1656     ctx = canvas.getContext("2d");
1657     ctx.drawImage(img, 0, 0);
1658     data = ctx.getImageData(0, 0, 1, ih).data;
1659     sy = 0;
1660     ey = ih;
1661     py = ih;
1662     while (py > sy) {
1663       alpha = data[(py - 1) * 4 + 3];
1664       if (alpha === 0) {
1665         ey = py;
1666       } else {
1667         sy = py;
1668       }
1669       py = (ey + sy) >> 1;
1670     }
1671     ratio = py / ih;
1672     if (ratio === 0) {
1673       return 1;
1674     } else {
1675       return ratio;
1676     }
1677   };
1678
1679   drawImageIOSFix = function(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {
1680     var vertSquashRatio;
1681     vertSquashRatio = detectVerticalSquash(img);
1682     return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);
1683   };
1684
1685
1686   /*
1687    * contentloaded.js
1688    *
1689    * Author: Diego Perini (diego.perini at gmail.com)
1690    * Summary: cross-browser wrapper for DOMContentLoaded
1691    * Updated: 20101020
1692    * License: MIT
1693    * Version: 1.2
1694    *
1695    * URL:
1696    * http://javascript.nwbox.com/ContentLoaded/
1697    * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE
1698    */
1699
1700   contentLoaded = function(win, fn) {
1701     var add, doc, done, init, poll, pre, rem, root, top;
1702     done = false;
1703     top = true;
1704     doc = win.document;
1705     root = doc.documentElement;
1706     add = (doc.addEventListener ? "addEventListener" : "attachEvent");
1707     rem = (doc.addEventListener ? "removeEventListener" : "detachEvent");
1708     pre = (doc.addEventListener ? "" : "on");
1709     init = function(e) {
1710       if (e.type === "readystatechange" && doc.readyState !== "complete") {
1711         return;
1712       }
1713       (e.type === "load" ? win : doc)[rem](pre + e.type, init, false);
1714       if (!done && (done = true)) {
1715         return fn.call(win, e.type || e);
1716       }
1717     };
1718     poll = function() {
1719       var e;
1720       try {
1721         root.doScroll("left");
1722       } catch (_error) {
1723         e = _error;
1724         setTimeout(poll, 50);
1725         return;
1726       }
1727       return init("poll");
1728     };
1729     if (doc.readyState !== "complete") {
1730       if (doc.createEventObject && root.doScroll) {
1731         try {
1732           top = !win.frameElement;
1733         } catch (_error) {}
1734         if (top) {
1735           poll();
1736         }
1737       }
1738       doc[add](pre + "DOMContentLoaded", init, false);
1739       doc[add](pre + "readystatechange", init, false);
1740       return win[add](pre + "load", init, false);
1741     }
1742   };
1743
1744   Dropzone._autoDiscoverFunction = function() {
1745     if (Dropzone.autoDiscover) {
1746       return Dropzone.discover();
1747     }
1748   };
1749
1750   contentLoaded(window, Dropzone._autoDiscoverFunction);
1751
1752 }).call(this);