evoapp.directive('fileUpload', function($rootScope, $filter, globals, $timeout) {
    return {
        restrict: 'AE',
        template: 
            '' + 
                'Seleccionar Ficheiro' + 
                '' + 
            '' +  
            '
' 
        ,
        scope: {
            title: '@',
            name: '@',
            itemId: '@',
            url: '@',
            formData: '='
        },
        controller: function($rootScope, $scope, $filter, globals, $timeout) {
            $scope.files = [];
            $scope.$filter = $filter;
            $scope.$rootScope = $rootScope;
            if($scope.$parent[$scope.itemId] == undefined)
            {
                $scope.$parent[$scope.itemId] = $scope;
            }
            else
            {
                throw Error('FileUpload ' + $scope.itemId + ' already exists!');
            }
        },
        link: function (scope, elem, attrs) {
            var files = $($(elem[0]).find('#files')[0]);
            //pass specified values to specified function arguments
            function callback(fn, args) {
                var fnArgs = [].concat(args);
                fnArgs.push.apply(fnArgs, arguments);
                return fn.apply(this, fnArgs);
            };
            $(elem[0]).fileupload({
                url: scope.url,
                dataType: 'json',
                singleFileUploads: true,
                autoUpload: false,
                acceptFileTypes: /(\.|\/)(gif|jpe?g|png|pdf|doc|docx|odt|ods|odp)$/i
            }).on('fileuploadadd', function (e, data) {
                var file = data.files[0];
                
                files.html('
' + file.name + '
');
            }).on('fileuploadprocessalways', function (e, data) {
            }).on('fileuploadprogressall', function (e, data) {
            }).on('fileuploaddone', function (e, data) {
                files.text('');
            }).on('fileuploadfail', function (e, data) {
                files.text('');
            });
            $(elem[0]).bind('change', function (e) {
                var f = e.target.files || [{name: this.value}];
                scope.files = new Array();
                var file = f[0]; 
                if(file.error == undefined)
                {
                    scope.files.push(f[0]);
                }
                else
                {   
                    globals.message.alert({
                        message: 'Tipo de Ficheiro inválido!',
                        callback: function(){
                            scope.reset();
                        }
                    });
                }
            });
            scope.upload = function(formData){
                if(scope.files.length > 0)
                {
                    scope.$rootScope.$broadcast('loadingStatusActive');
                    var callbackFn = arguments[1];
                    $(elem[0]).fileupload('send', {
                        files: scope.files,
                        formData: formData
                    })
                    .success(function (result, textStatus, jqXHR) {                    
                        scope.$rootScope.$broadcast('loadingStatusInactive');
                        callback(callbackFn, [result, textStatus, jqXHR]);
                    })
                    .error(function (jqXHR, textStatus, errorThrown) {
                        scope.$rootScope.$broadcast('loadingStatusInactive');
                        //callback(callbackFn, [jqXHR, textStatus, errorThrown]);
                    })
                    .complete(function (result, textStatus, jqXHR) {
                        //callback(callbackFn, [result, textStatus, jqXHR]);
                    });
                }
            };
            scope.reset = function(){
                scope.files = [];
                files.empty();
            };
        }
    }
});