     e.preventDefault()
     e.stopPropagation()
 
-    removeClass(this.el, this.defaults.overClass)
+    @emit('candru-drop', e)
+    removeClass(@el, @defaults.overClass)
 
     files = e.dataTransfer.files
     for file in files
-      if not this.fileTypeCheck(file)
+      if not @fileTypeCheck(file)
         console.log('Skipping file of type: ', file.type)
         continue
 
-      if not this.fileSizeCheck(file)
+      if not @fileSizeCheck(file)
         console.log('Skipping file of size: ', file.size)
         continue
 
-      uploadItem = this.defaults.createUploadItem(file, this._index)
-      this.el.appendChild(uploadItem)
-
-      if this.defaults.queue
-        this._fileQueue.push({
+      uploadItem = @defaults.createUploadItem(file, @_index)
+      @el.appendChild(uploadItem)
+
+      if @defaults.queue
+        @emit('candru-queue-add', file, @_index, 'unprocessed')
+        @_fileQueue.push({
           file: file,
-          index: this._index,
+          index: @_index,
           state: 'unprocessed'
         })
       else
-        this.defaults.uploadHandler(file, this._index)
-
-      this._index++
+        @emit('candru-process', file, @_index)
+        @defaults.uploadHandler(file, @_index)
+
+      @_index++
 
     false
 
   uploadHandler: (file, index) =>
-    throw new Error('Evaporate instance is null.') unless this.defaults.evaporate
-    evap = this.defaults.evaporate
+    throw new Error('Evaporate instance is null.') unless @defaults.evaporate
+    evap = @defaults.evaporate
 
     evap.add({
-      name: this.defaults.sanitizeFilename(file),
+      name: @defaults.sanitizeFilename(file),
       file: file,
       complete: =>
-        this.defaults.uploadComplete(file, index)
+        @emit('candru-evaporate-complete', file, index)
+        @defaults.uploadComplete(file, index)
       progress: (progress) =>
-        this.defaults.uploadProgress(progress, file, index)
+        @emit('candru-evaporate-complete', progress, file, index)
+        @defaults.uploadProgress(progress, file, index)
       info: (message) =>
-        this.defaults.uploadInfo(message, file, index)
+        @emit('candru-evaporate-info', message, file, index)
+        @defaults.uploadInfo(message, file, index)
       warn: (message) =>
-        this.defaults.uploadWarn(message, file, index)
+        @emit('candru-evaporate-warn', message, file, index)
+        @defaults.uploadWarn(message, file, index)
       error: (message) =>
-        this.defaults.uploadError(message, file, index)
+        @emit('candru-evaporate-error', message, file, index)
+        @defaults.uploadError(message, file, index)
     })
 
   uploadComplete: (file, index) =>
-    this._complete++
-
-    uploadMeter = this.defaults.getMeterEl(index)
+    @_complete++
+
+    uploadMeter = @defaults.getMeterEl(index)
     uploadMeter.style.width = '100%' # Sometimes it goes so fast it doesn't get progress before it finishes
-    addClass(uploadMeter, this.defaults.uploadSuccessClass)
-
-    cancelEl = this.defaults.getCancelEl(index)
+    addClass(uploadMeter, @defaults.uploadSuccessClass)
+
+    cancelEl = @defaults.getCancelEl(index)
     addClass(cancelEl.querySelector('a'), 'hidden')
 
   uploadProgress: (progress, file, index) =>
-    uploadMeter = this.defaults.getMeterEl(index)
+    uploadMeter = @defaults.getMeterEl(index)
     uploadMeter.style.width = "#{progress * 100.0}%"
 
   uploadCancel: (file, index) =>
-    this._cancelled++
-
-    throw new Error('Evaporate instance is null.') unless this.defaults.evaporate
-    evap = this.defaults.evaporate
-
-    uploadMeter = this.defaults.getMeterEl(index)
-    addClass(uploadMeter, this.defaults.uploadCancelledClass)
+    @_cancelled++
+
+    throw new Error('Evaporate instance is null.') unless @defaults.evaporate
+    evap = @defaults.evaporate
+
+    uploadMeter = @defaults.getMeterEl(index)
+    addClass(uploadMeter, @defaults.uploadCancelledClass)
     uploadMeter.style.width = '100%'
 
-    cancelEl = this.defaults.getCancelEl(index)
+    cancelEl = @defaults.getCancelEl(index)
     addClass(cancelEl.querySelector('a'), 'hidden')
 
-    if this.defaults.queue
-      for queuedFile in this._fileQueue
+    if @defaults.queue
+      for queuedFile in @_fileQueue
         if queuedFile.index is index
           queuedFile.state = 'cancelled'
 
     evap.cancel(index)
 
   uploadInfo: (message, file, index) =>
-    if this.defaults.debug
+    if @defaults.debug
       console.log('INFO: File:', file, 'Index:', index, 'Message:', message)
 
   uploadWarn: (message, file, index) =>
-    if this.defaults.debug
+    if @defaults.debug
       console.log('WARN: File:', file, 'Index:', index, 'Message:', message)
 
   uploadError: (message, file, index) =>
-    if this.defaults.debug
+    if @defaults.debug
       console.log('ERROR: File:', file, 'Index:', index, 'Message:', message)
 
-    this._failed++
-
-    uploadMeter = this.getMeterEl(index)
-    addClass(uploadMeter, this.defaults.uploadFailedClass)
+    @_failed++
+
+    uploadMeter = @getMeterEl(index)
+    addClass(uploadMeter, @defaults.uploadFailedClass)
 
   processQueue: ->
-    return false unless this.defaults.queue
-
-    for queuedFile in this._fileQueue
+    return false unless @defaults.queue
+
+    for queuedFile in @_fileQueue
       if queuedFile.state is 'unprocessed'
-        this.defaults.uploadHandler(queuedFile.file, queuedFile.index)
+        @defaults.uploadHandler(queuedFile.file, queuedFile.index)
         queuedFile.state = 'processed'
       else
 
   cancelAll: ->
-    cancelTriggers = this.el.querySelectorAll(this.defaults.cancelSelector + ' a')
+    cancelTriggers = @el.querySelectorAll(@defaults.cancelSelector + ' a')
 
     # Fake the cancel click
     for trigger in cancelTriggers
-      console.log(trigger, hasClass(trigger, 'hidden'))
       trigger.click() unless hasClass(trigger, 'hidden')
 
     # Clear up the queue
-    if this.defaults.queue
-      for queuedFile in this._fileQueue
+    if @defaults.queue
+      for queuedFile in @_fileQueue
         if queuedFile.state is 'unprocessed'
+          @emit('candru-queue-cancelled', queuedFile.file, queuedFile.index, 'cancelled')
           queuedFile.state = 'cancelled'
 
   getFileCount: ->
-    return this._index
+    return @_index
 
   allFilesFinished: ->
-    return this._index == (this._complete + this._failed + this._cancelled)
+    return @_index == (@_complete + @_failed + @_cancelled)

    e.preventDefault()
    e.stopPropagation()

    removeClass(this.el, this.defaults.overClass)

    false

  fileTypeCheck: (file) ->
    acceptedType = false

    for type in this.defaults.allowedTypes
      if type.test(file.type)
        acceptedType = true
        break

        <span class='meter'></span>\
      </div>"

    uploadItem.querySelector(@defaults.cancelSelector).addEventListener('click', (e) =>
      ((index) =>
        @defaults.uploadCancel(file, index)
      )(index))

    return uploadItem
