app = angular.module 'ngFileDrop', []
app.directive 'dropZone', ->
	restrict: 'A'
	link: (scope, element, attrs) ->
		element = $(element[0])

		outputType = attrs.outputType || 'dataURI'
		dragClassName = attrs.dragClass || 'dragging'

		# Hidden file input
		$("body").append '<input type=file style="display: none" class="__dropZoneInput">'

		# Events listeners
		element[0].addEventListener 'dragover', (event) ->
			event.preventDefault()
			event.stopPropagation()

			element.addClass dragClassName
		element[0].addEventListener 'dragleave', (event) ->
			event.preventDefault()
			event.stopPropagation()

			element.removeClass dragClassName

		element[0].addEventListener 'drop', (e) ->
			event.preventDefault()
			event.stopPropagation()

			element.removeClass dragClassName

			files = e.dataTransfer.files

			handleFiles files

		$(".__dropZoneInput").on 'change', ->
			files = @files

			handleFiles files

		element.click ->
			$(".__dropZoneInput").click()

		handleFiles = (files) ->
			reader = new FileReader
			if outputType == 'dataURI'
				reader.readAsDataURL files[0]
			else if outputType == 'ArrayBuffer'
				reader.readAsArrayBuffer files[0]
			else if outputType == 'File'
				scope.$apply ->
					scope.file = files[0]
			reader.onload = (res) ->
				scope.$apply ->
					scope.file = res.target.result

			count = files.length
			scope.$apply ->
				scope.files = []
			for file in files
				reader = new FileReader
				if outputType == 'dataURI'
					reader.readAsDataURL file
				else if outputType == 'ArrayBuffer'
					reader.readAsArrayBuffer file
				else if outputType == 'File'
					scope.$apply ->
						scope.files.push file
					count--
					if count == 0
						scope.$apply ->
							do scope.drop
				reader.onload = (res) ->
					scope.$apply ->
						scope.files.push res.target.result
					count--
					if count == 0
						scope.$apply ->
							do scope.drop

	scope: 
		file: '=file'
		files: '=files'
		drop: '=drop'