Socket
Socket
Sign inDemoInstall

ng-file-upload

Package Overview
Dependencies
Maintainers
1
Versions
169
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ng-file-upload - npm Package Compare versions

Comparing version 6.1.2 to 6.2.0

src/validate.js

2

demo/src/main/webapp/js/FileAPI.min.js

@@ -1,2 +0,2 @@

/*! 6.1.2 */
/*! 6.2.0 */
/*! FileAPI 2.0.7 - BSD | git://github.com/mailru/FileAPI.git

@@ -3,0 +3,0 @@ * FileAPI — a set of javascript tools for working with files. Multiupload, drag'n'drop and chunked file upload. Images: crop, resize and auto orientation by EXIF.

@@ -5,3 +5,3 @@ /**!

* @author Danial <danial.farid@gmail.com>
* @version 6.1.2
* @version 6.2.0
*/

@@ -434,3 +434,3 @@

* @author Danial <danial.farid@gmail.com>
* @version 6.1.2
* @version 6.2.0
*/

@@ -456,6 +456,6 @@

ngFileUpload.version = '6.1.2';
ngFileUpload.version = '6.2.0';
ngFileUpload.defaults = {};
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
ngFileUpload.service('UploadBase', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {

@@ -633,30 +633,6 @@ config.method = config.method || 'POST';

this.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
callback(URL.createObjectURL(file));
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result);
});
};
}
});
} else {
callback(null);
}
};
this.setDefaults = function(defaults) {
ngFileUpload.defaults = defaults || {};
};
ngFileUpload.Upload = this;
}

@@ -667,3 +643,3 @@

(function () {
ngFileUpload.getAttrWithDefaults = function(attr, name) {
ngFileUpload.getAttrWithDefaults = function (attr, name) {
return attr[name] != null ? attr[name] :

@@ -674,6 +650,7 @@ (ngFileUpload.defaults[name] == null ?

var getAttr = ngFileUpload.getAttrWithDefaults;
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile', 'Upload',
function ($parse, $timeout, $compile, Upload) {
uploadService = Upload;
return {

@@ -698,4 +675,5 @@ restrict: 'AEC',

/** @namespace attr.ngfValidate */
/** @namespace attr.ngfMaxSize */
/** @namespace attr.ngfMinSize */
/** @namespace attr.ngfDuration*/
/** @namespace attr.ngfWidth*/
/** @namespace attr.ngfHeight*/
/** @namespace attr.ngfResetOnClick */

@@ -724,30 +702,13 @@ /** @namespace attr.ngfResetModelOnClick */

var isUpdating = false;
function changeFn(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
elem.$$ngfHasFile = true;
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
var fileList = evt.__files_ || (evt.target && evt.target.files);
uploadService.validate(scope, $parse, attr, fileList, evt, function(files, rejFiles) {
elem.$$ngfHasFile = true;
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) {
// angular.element(evt.target).remove();
// }
} finally {
isUpdating = false;
}
}
});
}

@@ -801,3 +762,3 @@

if (elem.$$ngfHasFile) {
updateModel($parse, $timeout, scope, ngModel, attr,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true);

@@ -809,2 +770,3 @@ delete elem.$$ngfHasFile;

var initialTouchStartY = 0;
function clickHandler(evt) {

@@ -837,3 +799,3 @@ if (elem.attr('disabled') || disabled) return false;

fileElem[0].click();
$timeout(function() {
$timeout(function () {
delete elem.$$ngfProgramClick;

@@ -888,62 +850,2 @@ }, 500);

ngFileUpload.validate = function (scope, $parse, attr, file, evt) {
if (file == null) {
return false;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
var custom = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (custom != null && (custom === false || custom.length > 0)) {
file.$error = custom ? custom : 'validate';
return false;
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt});
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991;
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1;
if (accept != null && angular.isString(accept)) {
var regexp = new RegExp(globStringToRegex(accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return false;
}
} else {
if (accept === false) {
file.$error = 'accept';
return false;
}
}
if (file.size == null) return true;
if (file.size > fileSizeMax) {
file.$error = 'maxSize';
return false;
}
if (file.size < fileSizeMin) {
file.$error = 'minSize';
return false;
}
return true;
};
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange,

@@ -974,4 +876,6 @@ files, rejFiles, evt, noDelay) {

if (ngModel) {
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && ! getAttr(attr, 'multiple') && !keep;
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && !getAttr(attr, 'multiple') && !keep;
$timeout(function() {
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
});
$timeout(function () {

@@ -1010,18 +914,52 @@ if (ngModel) {

var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
})();
(function () {
var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
var getAttr = ngFileUpload.getAttrWithDefaults;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
ngFileUpload.service('UploadDataUrl', ['UploadBase', '$timeout', function(UploadBase, $timeout) {
UploadBase.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
var url;
try {
url = URL.createObjectURL(file);
} catch(e) {
callback('', file);
}
if (url) callback(url, file);
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result, file);
});
};
}
});
} else {
callback(null, file);
}
};
return UploadBase;
}]);
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('src', '{{(' + attr.ngfSrc + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}');
attr.$set('ngfSrc', null);
$compile(elem)(scope);
});
}

@@ -1031,2 +969,273 @@ };

/** @namespace attr.ngfBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('style', elem.attr('style') + ';background-image:url(\'{{(' + attr.ngfBackground + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}\')');
attr.$set('ngfBackground', null);
$compile(elem)(scope);
});
}
};
}]);
ngFileUpload.config(['$compileProvider', function ($compileProvider) {
$compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
}]);
ngFileUpload.filter('ngfDataUrl', ['UploadDataUrl', '$sce', function (UploadDataUrl, $sce) {
return function (file, disallowObjectUrl) {
//return 'aaaa' + file + disallowObjectUrl + $sce + UploadDataUrl;
if (file && !file.dataUrl && !angular.isString(file)) {
if (file.dataUrl === undefined && angular.isObject(file)) {
file.dataUrl = null;
UploadDataUrl.dataUrl(file, function (url, file) {
file.dataUrl = url;
}, disallowObjectUrl);
}
return '';
}
return (file && file.dataUrl ? $sce.trustAsResourceUrl(file.dataUrl) : file) || '';
};
}]);
})();
(function () {
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
function translateScalars(str) {
if (angular.isString(str)) {
if (str.search(/kb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000);
} else if (str.search(/mb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000);
} else if (str.search(/gb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000000);
} else if (str.search(/b/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/s/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/m/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 60);
} else if (str.search(/h/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 3600);
}
}
return str;
}
ngFileUpload.service('Upload', ['UploadDataUrl', function (UploadDataUrl) {
var getAttr = ngFileUpload.getAttrWithDefaults;
UploadDataUrl.validate = function (scope, $parse, attr, files, evt, callback) {
if (getAttr(attr, 'ngfValidate') == null && getAttr(attr, 'ngfAccept') == null) {
return callback(files);
}
var accFiles = [], rejFiles = [];
function fileCallback(file, accepted) {
if (accepted) {
accFiles.push(file);
} else {
rejFiles.push(file);
}
validated++;
if (validated === files.length) {
callback(accFiles, rejFiles);
}
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$event: evt});
var validated = 0;
for (var i = 0; i < files.length; i++) {
var file = files[i];
var validator = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (validator != null && (validator === false || angular.isString(validator))) {
file.$error = 'validate';
file.$errorParam = validator;
fileCallback(file, false);
} else if (validator != null || accept != null) {
validator = validator || {};
if (accept != null) validator.accept = accept;
this.validateFile(file, validator, fileCallback);
} else {
fileCallback(file, true);
}
}
};
UploadDataUrl.validateFile = function (file, constraints, callback) {
if (file == null) {
return callback(file, false);
}
var accept = constraints.accept;
if (constraints.accept != null && angular.isString(constraints.accept)) {
var regexp = new RegExp(globStringToRegex(constraints.accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return callback(file, false);
}
} else {
if (accept === false) {
file.$error = 'accept';
return callback(file, false);
}
}
if (file.size != null && constraints.size && (constraints.size.max || constraints.size.min)) {
if (file.size > translateScalars(constraints.size.max)) {
file.$error = 'size.max';
file.$errorParam = constraints.size.max;
return callback(file, false);
}
if (file.size < translateScalars(constraints.size.min)) {
file.$error = 'size.min';
file.$errorParam = constraints.size.min;
return callback(file, false);
}
}
if ((constraints.width || constraints.height) && file.type.indexOf('image') === 0) {
this.imageDimensions(file, function (width, height) {
file.width = width;
file.height = height;
if (constraints.width && (constraints.width.min || constraints.width.max)) {
if (constraints.width.max && width > translateScalars(constraints.width.max)) {
file.$error = 'width.max';
file.$errorParam = constraints.width.max;
}
if (constraints.width.min && width < translateScalars(constraints.width.min)) {
file.$error = 'width.min';
file.$errorParam = constraints.width.min;
}
if (!width && !constraints.width.soft) {
file.$error = constraints.width.min ? 'width.min' : 'width.max';
file.$errorParam = constraints.width.min || constraints.width.max;
}
}
if (constraints.height && (constraints.height.min || constraints.height.max)) {
if (constraints.height.max && height > translateScalars(constraints.height.max)) {
file.$error = 'height.max';
file.$errorParam = constraints.height.max;
}
if (constraints.height.min && height < translateScalars(constraints.height.min)) {
file.$error = 'height.min';
file.$errorParam = constraints.height.min;
}
if (!height && !constraints.height.soft) {
file.$error = constraints.height.min ? 'height.min' : 'height.max';
file.$errorParam = constraints.height.min || constraints.height.max;
}
callback(file, !file.$error);
}
});
if ((constraints.width && (constraints.width.min || constraints.width.max)) ||
(constraints.height && (constraints.height.min || constraints.height.max))) return;
}
if ((constraints.duration) &&
(file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0)) {
this.mediaDuration(file, function (duration) {
file.duration = duration;
if (constraints.duration.min || constraints.duration.max) {
if (constraints.duration.max && duration > translateScalars(constraints.duration.max)) {
file.$error = 'duration.max';
file.$errorParam = constraints.duration.max;
}
if (constraints.duration.min && duration < translateScalars(constraints.duration.min)) {
file.$error = 'duration.min';
file.$errorParam = constraints.duration.min;
}
if (!duration && !constraints.duration.soft) {
file.$error = constraints.duration.min ? 'duration.min' : 'duration.max';
file.$errorParam = constraints.duration.min || constraints.duration.max;
}
callback(file, !file.$error);
}
});
if (constraints.duration.min || constraints.duration.max) return;
}
return callback(file, true);
};
UploadDataUrl.imageDimensions = function (file, callback) {
if (file.type.indexOf('image') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var img = angular.element('<img>').attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
img.on('load error', function () {
var width = img[0].clientWidth;
var height = img[0].clientHeight;
img.remove();
callback(width, height, file);
});
angular.element(document.body).append(img);
}, true);
} else {
return false;
}
};
UploadDataUrl.mediaDuration = function (file, callback) {
if (file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var el = angular.element(file.type.indexOf('audio') === 0 ? '<audio>' : '<video>')
.attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
el.on('loadedmetadata error', function () {
var duration = el[0].duration;
el.remove();
callback(duration, file);
});
angular.element(document.body).append(el);
});
} else {
return false;
}
};
return UploadDataUrl;
}]);
})();
(function () {
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', 'Upload',
function ($parse, $timeout, $location, Upload) {
uploadService = Upload;
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
};
}]);
ngFileUpload.directive('ngfNoFileDrop', function () {

@@ -1072,3 +1281,3 @@ return function (scope, elem) {

if (getAttr(attr, 'ngfDrop').search(/\W+\$files\W+/) === -1) {
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) {
scope.$watch(getAttr(attr, 'ngfDrop'), function (val) {
disabled = val === false;

@@ -1093,6 +1302,9 @@ });

$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
if (!actualDragOverClass) {
actualDragOverClass = 'C';
calculateDragOverClass(scope, attr, evt, function (clazz) {
actualDragOverClass = clazz;
elem.addClass(actualDragOverClass);
});
}
elem.addClass(actualDragOverClass);
}, false);

@@ -1118,5 +1330,5 @@ elem[0].addEventListener('dragenter', function (evt) {

extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));

@@ -1126,37 +1338,39 @@ }, false);

if (elem.attr('disabled') || disabled) return;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, false, getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));
var files = [];
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
files.push(clipboard.items[k].getAsFile());
}
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
});
}
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
function calculateDragOverClass(scope, attr, evt, callback) {
var items = evt.dataTransfer.items, files = [];
if (items != null) {
for (var i = 0; i < items.length && accepted; i++) {
accepted = accepted &&
(items[i].kind === 'file' || items[i].kind === '') &&
validate(scope, $parse, attr, items[i], evt);
for (var i = 0; i < items.length; i++) {
if (items[i].kind === 'file' || items[i].kind === '') {
files.push(items[i]);
}
}
}
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover';
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = !rejFiles || !rejFiles.length ? clazz.accept : clazz.reject;
}
callback(clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover');
});
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], processing = 0;
var files = [], processing = 0;
function addFile(file) {
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
function traverseFileTree(files, entry, path) {

@@ -1166,3 +1380,3 @@ if (entry != null) {

var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
files.push({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();

@@ -1198,3 +1412,3 @@ var entries = [];

file.path = (path ? path : '') + file.name;
addFile(file);
files.push(file);
} catch (e) {

@@ -1211,60 +1425,50 @@ processing--;

if (evt.type === 'paste') {
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
addFile(clipboard.items[k].getAsFile());
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) files.push(f);
}
callback(files, rejFiles);
if (!multiple && files.length > 0) break;
}
} else {
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
files.push(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
addFile(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
});
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}, delay || 0);
})();
}
}
}, delay || 0);
})();
}

@@ -1279,66 +1483,1 @@ }

})();
(function () {
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) {
if (defaultName) {
callback($parse(defaultName)(scope));
}
scope.$watch(name, function (file) {
if (!angular.isString(file)) {
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) {
Upload.dataUrl(file, function (url) {
if (callback) {
callback(url);
} else {
file.dataUrl = url || $parse(defaultName)(scope);
}
}, $parse(attr.ngfNoObjectUrl)(scope));
}
} else {
callback(file);
}
});
}
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfDefaultSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) {
elem.attr('src', url);
});
}
};
}]);
/** @namespace attr.ngfBackground */
/** @namespace attr.ngfDefaultBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) {
elem.css('background-image', 'url(' + url + ')');
});
}
};
}]);
/** @namespace attr.ngfDataUrl */
/** @namespace attr.ngfDefaultDataUrl */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl);
}
};
}]);
})();

@@ -1,2 +0,2 @@

/*! 6.1.2 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.1.2",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var k=b.__files_||b.target&&b.target.files,l=[],m=[],n=0;n<k.length;n++){var o=k.item(n);d(a,i,g,o,b)?l.push(o):m.push(o)}f.$$ngfHasFile=!0,e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),l,m,b),0===l.length&&(b.target.value=l)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&((null==e.value||""===e.value)&&("required"===e.name&&(e.value="required"),"multiple"===e.name&&(e.value="multiple")),b.attr(e.name,e.value))}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;if(f.$$ngfProgramClick)return f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){f.$$ngfHasFile&&(e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0),delete f.$$ngfHasFile)}function q(d){function e(a){a&&!f.$$ngfProgramClick&&(f.$$ngfProgramClick=!0,s[0].click(),j(function(){delete f.$$ngfProgramClick},500)),!l()&&a||!n||f.bind("click touchstart touchend",q)}if(f.attr("disabled")||r)return!1;if(null!=d){var h=d.changedTouches||d.originalEvent&&d.originalEvent.changedTouches;if("touchstart"===d.type)return t=h?h[0].clientY:0,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var k=h?h[0].clientY:0;if(Math.abs(k-t)>20)return!1}}var n=i(c(g,"ngfResetOnClick"))(a)!==!1,s=o(d,n);return s&&((!d||n)&&s.bind("change",m),d&&n&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){function g(a){if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])return a.substring(1,a.length-1);var b=a.split(","),c="";if(b.length>1)for(var d=0;d<b.length;d++)c+="("+g(b[d])+")",d<b.length-1&&(c+="|");else 0===a.indexOf(".")&&(a="*"+a),c="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",c=c.replace(/\\\*/g,".*").replace(/\\\?/g,".");return c}if(null==e)return!1;var h=b(c(d,"ngfValidate"))(a,{$file:e,$event:f});if(null!=h&&(h===!1||h.length>0))return e.$error=h?h:"validate",!1;var i=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),j=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,k=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=i&&angular.isString(i)){var l=new RegExp(g(i),"gi");if(i=null!=e.type&&l.test(e.type.toLowerCase())||null!=e.name&&l.test(e.name.toLowerCase()),!i)return e.$error="accept",!1}else if(i===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>j?(e.$error="maxSize",!1):e.size<k?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){var k=a(c(f,"ngfKeep"))(d);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(c(f,"ngfMultiple"))(d)&&!c(f,"multiple")&&!k;a(c(f,"ngModel")).assign(d,q?p:h),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=c(f,"ngfModel");r&&a(r).assign(d,h),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];o++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");o--}}catch(h){o--,console.error(h)}},function(){o--})};g()}else o++,b.file(function(a){try{o--,a.path=(c?c:"")+a.name,h(a)}catch(b){o--,console.error(b)}},function(){o--})}var m=[],n=[],o=0;if("paste"===b.type){var p=b.clipboardData||b.originalEvent.clipboardData;if(p&&p.items){for(var q=0;q<p.items.length;q++)-1!==p.items[q].type.indexOf("image")&&h(p.items[q].getAsFile());d(m,n)}}else{var r=b.dataTransfer.items;if(r&&r.length>0&&"file"!==k.protocol())for(var s=0;s<r.length;s++){if(r[s].webkitGetAsEntry&&r[s].webkitGetAsEntry()&&r[s].webkitGetAsEntry().isDirectory){var t=r[s].webkitGetAsEntry();if(t.isDirectory&&!e)continue;null!=t&&l(m,t)}else{var u=r[s].getAsFile();null!=u&&h(u)}if(!f&&m.length>0)break}else{var v=b.dataTransfer.files;if(null!=v)for(var w=0;w<v.length&&(h(v.item(w)),f||!(m.length>0));w++);}var x=0;!function y(a){j(function(){if(o)10*x++<2e4&&y(10);else{if(!f&&m.length>1){for(s=0;"directory"===m[s].type;)s++;m=[m[s]]}d(m,n)}},a||0)}()}}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1),f[0].addEventListener("paste",function(b){f.attr("disabled")||o||m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){f&&g(c(f)(b)),b.$watch(e,function(e){angular.isString(e)?g(e):window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}();
/*! 6.2.0 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.2.0",ngFileUpload.defaults={},ngFileUpload.service("UploadBase",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}},ngFileUpload.Upload=this}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){var j=b.__files_||b.target&&b.target.files;c.validate(a,h,f,j,b,function(c,j){e.$$ngfHasFile=!0,ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),c,j,b),0===c.length&&(b.target.value=c)})}function m(b){d(f,"ngfMultiple")&&b.attr("multiple",h(d(f,"ngfMultiple"))(a)),d(f,"ngfCapture")&&b.attr("capture",h(d(f,"ngfCapture"))(a)),d(f,"accept")&&b.attr("accept",d(f,"accept"));for(var c=0;c<e[0].attributes.length;c++){var g=e[0].attributes[c];(k()&&"type"!==g.name||"type"!==g.name&&"class"!==g.name&&"id"!==g.name&&"style"!==g.name)&&((null==g.value||""===g.value)&&("required"===g.name&&(g.value="required"),"multiple"===g.name&&(g.value="multiple")),b.attr(g.name,g.value))}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;if(e.$$ngfProgramClick)return e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){e.$$ngfHasFile&&(ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),[],[],b,!0),delete e.$$ngfHasFile)}function p(c){function g(a){a&&!e.$$ngfProgramClick&&(e.$$ngfProgramClick=!0,t[0].click(),i(function(){delete e.$$ngfProgramClick},500)),!k()&&a||!s||e.bind("click touchstart touchend",p)}if(e.attr("disabled")||q)return!1;if(null!=c){var j=c.changedTouches||c.originalEvent&&c.originalEvent.changedTouches;if("touchstart"===c.type)return r=j?j[0].clientY:0,!0;if(c.stopPropagation(),c.preventDefault(),"touchend"===c.type){var m=j?j[0].clientY:0;if(Math.abs(m-r)>20)return!1}}var s=h(d(f,"ngfResetOnClick"))(a)!==!1,t=n(c,s);return t&&((!c||s)&&t.bind("change",l),c&&s&&h(d(f,"ngfResetModelOnClick"))(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){g(c)},0):g(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===d(f,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfSelect"),function(a){q=a===!1});var r=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.updateModel=function(a,b,c,e,f,g,h,i,j,k){function l(){var k=a(d(f,"ngfKeep"))(c);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(d(f,"ngfKeepDistinct"))(c)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(d(f,"ngfMultiple"))(c)&&!d(f,"multiple")&&!k;b(function(){a(d(f,"ngModel")).assign(c,q?p:h)}),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=d(f,"ngfModel");r&&a(r).assign(c,h),d(f,"ngModelRejected")&&a(d(f,"ngModelRejected")).assign(c,i),g&&a(g)(c,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})}}(),function(){ngFileUpload.service("UploadDataUrl",["UploadBase","$timeout",function(a,b){return a.dataUrl=function(a,c,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?b(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d){var f;try{f=e.createObjectURL(a)}catch(g){c("",a)}f&&c(f,a)}else{var h=new FileReader;h.readAsDataURL(a),h.onload=function(d){b(function(){c(d.target.result,a)})}}}):c(null,a)},a}]),ngFileUpload.directive("ngfSrc",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("src","{{("+f.ngfSrc+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}"),f.$set("ngfSrc",null),b(e)(d)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("style",e.attr("style")+";background-image:url('{{("+f.ngfBackground+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}')"),f.$set("ngfBackground",null),b(e)(d)})}}}]),ngFileUpload.config(["$compileProvider",function(a){a.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/),a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/)}]),ngFileUpload.filter("ngfDataUrl",["UploadDataUrl","$sce",function(a,b){return function(c,d){return!c||c.dataUrl||angular.isString(c)?(c&&c.dataUrl?b.trustAsResourceUrl(c.dataUrl):c)||"":(void 0===c.dataUrl&&angular.isObject(c)&&(c.dataUrl=null,a.dataUrl(c,function(a,b){b.dataUrl=a},d)),"")}}])}(),function(){function a(b){if(b.length>2&&"/"===b[0]&&"/"===b[b.length-1])return b.substring(1,b.length-1);var c=b.split(","),d="";if(c.length>1)for(var e=0;e<c.length;e++)d+="("+a(c[e])+")",e<c.length-1&&(d+="|");else 0===b.indexOf(".")&&(b="*"+b),d="^"+b.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",d=d.replace(/\\\*/g,".*").replace(/\\\?/g,".");return d}function b(a){if(angular.isString(a)){if(a.search(/kb/i)===a.length-2)return parseFloat(1e3*a.substring(0,a.length-2));if(a.search(/mb/i)===a.length-2)return parseFloat(1e6*a.substring(0,a.length-2));if(a.search(/gb/i)===a.length-2)return parseFloat(1e9*a.substring(0,a.length-2));if(a.search(/b/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/s/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/m/i)===a.length-1)return parseFloat(60*a.substring(0,a.length-1));if(a.search(/h/i)===a.length-1)return parseFloat(3600*a.substring(0,a.length-1))}return a}ngFileUpload.service("Upload",["UploadDataUrl",function(c){var d=ngFileUpload.getAttrWithDefaults;return c.validate=function(a,b,c,e,f,g){function h(a,b){b?i.push(a):j.push(a),l++,l===e.length&&g(i,j)}if(null==d(c,"ngfValidate")&&null==d(c,"ngfAccept"))return g(e);for(var i=[],j=[],k=b(d(c,"ngfAccept"))(a,{$event:f}),l=0,m=0;m<e.length;m++){var n=e[m],o=b(d(c,"ngfValidate"))(a,{$file:n,$event:f});null==o||o!==!1&&!angular.isString(o)?null!=o||null!=k?(o=o||{},null!=k&&(o.accept=k),this.validateFile(n,o,h)):h(n,!0):(n.$error="validate",n.$errorParam=o,h(n,!1))}},c.validateFile=function(c,d,e){if(null==c)return e(c,!1);var f=d.accept;if(null!=d.accept&&angular.isString(d.accept)){var g=new RegExp(a(d.accept),"gi");if(f=null!=c.type&&g.test(c.type.toLowerCase())||null!=c.name&&g.test(c.name.toLowerCase()),!f)return c.$error="accept",e(c,!1)}else if(f===!1)return c.$error="accept",e(c,!1);if(null!=c.size&&d.size&&(d.size.max||d.size.min)){if(c.size>b(d.size.max))return c.$error="size.max",c.$errorParam=d.size.max,e(c,!1);if(c.size<b(d.size.min))return c.$error="size.min",c.$errorParam=d.size.min,e(c,!1)}if(!((d.width||d.height)&&0===c.type.indexOf("image")&&(this.imageDimensions(c,function(a,f){c.width=a,c.height=f,d.width&&(d.width.min||d.width.max)&&(d.width.max&&a>b(d.width.max)&&(c.$error="width.max",c.$errorParam=d.width.max),d.width.min&&a<b(d.width.min)&&(c.$error="width.min",c.$errorParam=d.width.min),a||d.width.soft||(c.$error=d.width.min?"width.min":"width.max",c.$errorParam=d.width.min||d.width.max)),d.height&&(d.height.min||d.height.max)&&(d.height.max&&f>b(d.height.max)&&(c.$error="height.max",c.$errorParam=d.height.max),d.height.min&&f<b(d.height.min)&&(c.$error="height.min",c.$errorParam=d.height.min),f||d.height.soft||(c.$error=d.height.min?"height.min":"height.max",c.$errorParam=d.height.min||d.height.max),e(c,!c.$error))}),d.width&&(d.width.min||d.width.max)||d.height&&(d.height.min||d.height.max))||d.duration&&(0===c.type.indexOf("audio")||0===c.type.indexOf("video"))&&(this.mediaDuration(c,function(a){c.duration=a,(d.duration.min||d.duration.max)&&(d.duration.max&&a>b(d.duration.max)&&(c.$error="duration.max",c.$errorParam=d.duration.max),d.duration.min&&a<b(d.duration.min)&&(c.$error="duration.min",c.$errorParam=d.duration.min),a||d.duration.soft||(c.$error=d.duration.min?"duration.min":"duration.max",c.$errorParam=d.duration.min||d.duration.max),e(c,!c.$error))}),d.duration.min||d.duration.max)))return e(c,!0)},c.imageDimensions=function(a,b){return 0!==a.type.indexOf("image")?!1:void c.dataUrl(a,function(c){var d=angular.element("<img>").attr("src",c).css("visibility","none").css("position","fixed");d.on("load error",function(){var c=d[0].clientWidth,e=d[0].clientHeight;d.remove(),b(c,e,a)}),angular.element(document.body).append(d)},!0)},c.mediaDuration=function(a,b){return 0!==a.type.indexOf("audio")&&0!==a.type.indexOf("video")?!1:void c.dataUrl(a,function(c){var d=angular.element(0===a.type.indexOf("audio")?"<audio>":"<video>").attr("src",c).css("visibility","none").css("position","fixed");d.on("loadedmetadata error",function(){var c=d[0].duration;d.remove(),b(c,a)}),angular.element(document.body).append(d)})},c}])}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,e,f){var g=e.dataTransfer.items,i=[];if(null!=g)for(var j=0;j<g.length;j++)("file"===g[j].kind||""===g[j].kind)&&i.push(g[j]);c.validate(a,h,b,i,e,function(c,g){var i=h(d(b,"ngfDragOverClass"))(a,{$event:e});i&&(i.delay&&(r=i.delay),i.accept&&(i=g&&g.length?i.reject:i.accept)),f(i||d(b,"ngfDragOverClass")||"dragover")})}function l(b,d,e,g){function k(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;a.push({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];m++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)k(a,f[e],(c?c:"")+b.name+"/");m--}}catch(h){m--,console.error(h)}},function(){m--})};g()}else m++,b.file(function(b){try{m--,b.path=(c?c:"")+b.name,a.push(b)}catch(d){m--,console.error(d)}},function(){m--})}var l=[],m=0,n=b.dataTransfer.items;if(n&&n.length>0&&"file"!==j.protocol())for(var o=0;o<n.length;o++){if(n[o].webkitGetAsEntry&&n[o].webkitGetAsEntry()&&n[o].webkitGetAsEntry().isDirectory){var p=n[o].webkitGetAsEntry();if(p.isDirectory&&!e)continue;null!=p&&k(l,p)}else{var q=n[o].getAsFile();null!=q&&l.push(q)}if(!g&&l.length>0)break}else{var r=b.dataTransfer.files;if(null!=r)for(var s=0;s<r.length&&(l.push(r.item(s)),g||!(l.length>0));s++);}var t=0;!function u(e){i(function(){if(m)10*t++<2e4&&u(10);else{if(!g&&l.length>1){for(o=0;"directory"===l[o].type;)o++;l=[l[o]]}c.validate(a,h,f,l,b,function(a,b){d(a,b)})}},e||0)}()}var m=b();if(d(f,"dropAvailable")&&i(function(){a[d(f,"dropAvailable")]?a[d(f,"dropAvailable")].value=m:a[d(f,"dropAvailable")]=m}),!m)return void(h(d(f,"ngfHideOnDropNotAvailable"))(a)===!0&&e.css("display","none"));var n=!1;-1===d(f,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfDrop"),function(a){n=a===!1});var o,p=null,q=h(d(f,"ngfStopPropagation")),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),o||(o="C",k(a,f,b,function(a){o=a,e.addClass(o)}))}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)},h(d(f,"ngfAllowDir"))(a)!==!1,d(f,"multiple")||h(d(f,"ngfMultiple"))(a)))},!1),e[0].addEventListener("paste",function(b){if(!e.attr("disabled")&&!n){var j=[],k=b.clipboardData||b.originalEvent.clipboardData;if(k&&k.items){for(var l=0;l<k.items.length;l++)-1!==k.items[l].type.indexOf("image")&&j.push(k.items[l].getAsFile());c.validate(a,h,f,j,b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)})}}},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(e,f,g){if(b()){var h=a(d(g,"ngfDropAvailable"));c(function(){h(e),h.assign&&h.assign(e,!0)})}}}])}();

@@ -5,3 +5,3 @@ /**!

* @author Danial <danial.farid@gmail.com>
* @version 6.1.2
* @version 6.2.0
*/

@@ -8,0 +8,0 @@

@@ -1,2 +0,2 @@

/*! 6.1.2 */
/*! 6.2.0 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}});
/**!
* AngularJS file upload/drop directive and service with progress and abort
* @author Danial <danial.farid@gmail.com>
* @version 6.1.2
* @version 6.2.0
*/

@@ -25,6 +25,6 @@

ngFileUpload.version = '6.1.2';
ngFileUpload.version = '6.2.0';
ngFileUpload.defaults = {};
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
ngFileUpload.service('UploadBase', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {

@@ -202,30 +202,6 @@ config.method = config.method || 'POST';

this.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
callback(URL.createObjectURL(file));
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result);
});
};
}
});
} else {
callback(null);
}
};
this.setDefaults = function(defaults) {
ngFileUpload.defaults = defaults || {};
};
ngFileUpload.Upload = this;
}

@@ -236,3 +212,3 @@

(function () {
ngFileUpload.getAttrWithDefaults = function(attr, name) {
ngFileUpload.getAttrWithDefaults = function (attr, name) {
return attr[name] != null ? attr[name] :

@@ -243,6 +219,7 @@ (ngFileUpload.defaults[name] == null ?

var getAttr = ngFileUpload.getAttrWithDefaults;
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile', 'Upload',
function ($parse, $timeout, $compile, Upload) {
uploadService = Upload;
return {

@@ -267,4 +244,5 @@ restrict: 'AEC',

/** @namespace attr.ngfValidate */
/** @namespace attr.ngfMaxSize */
/** @namespace attr.ngfMinSize */
/** @namespace attr.ngfDuration*/
/** @namespace attr.ngfWidth*/
/** @namespace attr.ngfHeight*/
/** @namespace attr.ngfResetOnClick */

@@ -293,30 +271,13 @@ /** @namespace attr.ngfResetModelOnClick */

var isUpdating = false;
function changeFn(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
elem.$$ngfHasFile = true;
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
var fileList = evt.__files_ || (evt.target && evt.target.files);
uploadService.validate(scope, $parse, attr, fileList, evt, function(files, rejFiles) {
elem.$$ngfHasFile = true;
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) {
// angular.element(evt.target).remove();
// }
} finally {
isUpdating = false;
}
}
});
}

@@ -370,3 +331,3 @@

if (elem.$$ngfHasFile) {
updateModel($parse, $timeout, scope, ngModel, attr,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true);

@@ -378,2 +339,3 @@ delete elem.$$ngfHasFile;

var initialTouchStartY = 0;
function clickHandler(evt) {

@@ -406,3 +368,3 @@ if (elem.attr('disabled') || disabled) return false;

fileElem[0].click();
$timeout(function() {
$timeout(function () {
delete elem.$$ngfProgramClick;

@@ -457,62 +419,2 @@ }, 500);

ngFileUpload.validate = function (scope, $parse, attr, file, evt) {
if (file == null) {
return false;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
var custom = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (custom != null && (custom === false || custom.length > 0)) {
file.$error = custom ? custom : 'validate';
return false;
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt});
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991;
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1;
if (accept != null && angular.isString(accept)) {
var regexp = new RegExp(globStringToRegex(accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return false;
}
} else {
if (accept === false) {
file.$error = 'accept';
return false;
}
}
if (file.size == null) return true;
if (file.size > fileSizeMax) {
file.$error = 'maxSize';
return false;
}
if (file.size < fileSizeMin) {
file.$error = 'minSize';
return false;
}
return true;
};
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange,

@@ -543,4 +445,6 @@ files, rejFiles, evt, noDelay) {

if (ngModel) {
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && ! getAttr(attr, 'multiple') && !keep;
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && !getAttr(attr, 'multiple') && !keep;
$timeout(function() {
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
});
$timeout(function () {

@@ -579,18 +483,52 @@ if (ngModel) {

var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
})();
(function () {
var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
var getAttr = ngFileUpload.getAttrWithDefaults;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
ngFileUpload.service('UploadDataUrl', ['UploadBase', '$timeout', function(UploadBase, $timeout) {
UploadBase.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
var url;
try {
url = URL.createObjectURL(file);
} catch(e) {
callback('', file);
}
if (url) callback(url, file);
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result, file);
});
};
}
});
} else {
callback(null, file);
}
};
return UploadBase;
}]);
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('src', '{{(' + attr.ngfSrc + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}');
attr.$set('ngfSrc', null);
$compile(elem)(scope);
});
}

@@ -600,2 +538,273 @@ };

/** @namespace attr.ngfBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('style', elem.attr('style') + ';background-image:url(\'{{(' + attr.ngfBackground + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}\')');
attr.$set('ngfBackground', null);
$compile(elem)(scope);
});
}
};
}]);
ngFileUpload.config(['$compileProvider', function ($compileProvider) {
$compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
}]);
ngFileUpload.filter('ngfDataUrl', ['UploadDataUrl', '$sce', function (UploadDataUrl, $sce) {
return function (file, disallowObjectUrl) {
//return 'aaaa' + file + disallowObjectUrl + $sce + UploadDataUrl;
if (file && !file.dataUrl && !angular.isString(file)) {
if (file.dataUrl === undefined && angular.isObject(file)) {
file.dataUrl = null;
UploadDataUrl.dataUrl(file, function (url, file) {
file.dataUrl = url;
}, disallowObjectUrl);
}
return '';
}
return (file && file.dataUrl ? $sce.trustAsResourceUrl(file.dataUrl) : file) || '';
};
}]);
})();
(function () {
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
function translateScalars(str) {
if (angular.isString(str)) {
if (str.search(/kb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000);
} else if (str.search(/mb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000);
} else if (str.search(/gb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000000);
} else if (str.search(/b/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/s/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/m/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 60);
} else if (str.search(/h/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 3600);
}
}
return str;
}
ngFileUpload.service('Upload', ['UploadDataUrl', function (UploadDataUrl) {
var getAttr = ngFileUpload.getAttrWithDefaults;
UploadDataUrl.validate = function (scope, $parse, attr, files, evt, callback) {
if (getAttr(attr, 'ngfValidate') == null && getAttr(attr, 'ngfAccept') == null) {
return callback(files);
}
var accFiles = [], rejFiles = [];
function fileCallback(file, accepted) {
if (accepted) {
accFiles.push(file);
} else {
rejFiles.push(file);
}
validated++;
if (validated === files.length) {
callback(accFiles, rejFiles);
}
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$event: evt});
var validated = 0;
for (var i = 0; i < files.length; i++) {
var file = files[i];
var validator = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (validator != null && (validator === false || angular.isString(validator))) {
file.$error = 'validate';
file.$errorParam = validator;
fileCallback(file, false);
} else if (validator != null || accept != null) {
validator = validator || {};
if (accept != null) validator.accept = accept;
this.validateFile(file, validator, fileCallback);
} else {
fileCallback(file, true);
}
}
};
UploadDataUrl.validateFile = function (file, constraints, callback) {
if (file == null) {
return callback(file, false);
}
var accept = constraints.accept;
if (constraints.accept != null && angular.isString(constraints.accept)) {
var regexp = new RegExp(globStringToRegex(constraints.accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return callback(file, false);
}
} else {
if (accept === false) {
file.$error = 'accept';
return callback(file, false);
}
}
if (file.size != null && constraints.size && (constraints.size.max || constraints.size.min)) {
if (file.size > translateScalars(constraints.size.max)) {
file.$error = 'size.max';
file.$errorParam = constraints.size.max;
return callback(file, false);
}
if (file.size < translateScalars(constraints.size.min)) {
file.$error = 'size.min';
file.$errorParam = constraints.size.min;
return callback(file, false);
}
}
if ((constraints.width || constraints.height) && file.type.indexOf('image') === 0) {
this.imageDimensions(file, function (width, height) {
file.width = width;
file.height = height;
if (constraints.width && (constraints.width.min || constraints.width.max)) {
if (constraints.width.max && width > translateScalars(constraints.width.max)) {
file.$error = 'width.max';
file.$errorParam = constraints.width.max;
}
if (constraints.width.min && width < translateScalars(constraints.width.min)) {
file.$error = 'width.min';
file.$errorParam = constraints.width.min;
}
if (!width && !constraints.width.soft) {
file.$error = constraints.width.min ? 'width.min' : 'width.max';
file.$errorParam = constraints.width.min || constraints.width.max;
}
}
if (constraints.height && (constraints.height.min || constraints.height.max)) {
if (constraints.height.max && height > translateScalars(constraints.height.max)) {
file.$error = 'height.max';
file.$errorParam = constraints.height.max;
}
if (constraints.height.min && height < translateScalars(constraints.height.min)) {
file.$error = 'height.min';
file.$errorParam = constraints.height.min;
}
if (!height && !constraints.height.soft) {
file.$error = constraints.height.min ? 'height.min' : 'height.max';
file.$errorParam = constraints.height.min || constraints.height.max;
}
callback(file, !file.$error);
}
});
if ((constraints.width && (constraints.width.min || constraints.width.max)) ||
(constraints.height && (constraints.height.min || constraints.height.max))) return;
}
if ((constraints.duration) &&
(file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0)) {
this.mediaDuration(file, function (duration) {
file.duration = duration;
if (constraints.duration.min || constraints.duration.max) {
if (constraints.duration.max && duration > translateScalars(constraints.duration.max)) {
file.$error = 'duration.max';
file.$errorParam = constraints.duration.max;
}
if (constraints.duration.min && duration < translateScalars(constraints.duration.min)) {
file.$error = 'duration.min';
file.$errorParam = constraints.duration.min;
}
if (!duration && !constraints.duration.soft) {
file.$error = constraints.duration.min ? 'duration.min' : 'duration.max';
file.$errorParam = constraints.duration.min || constraints.duration.max;
}
callback(file, !file.$error);
}
});
if (constraints.duration.min || constraints.duration.max) return;
}
return callback(file, true);
};
UploadDataUrl.imageDimensions = function (file, callback) {
if (file.type.indexOf('image') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var img = angular.element('<img>').attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
img.on('load error', function () {
var width = img[0].clientWidth;
var height = img[0].clientHeight;
img.remove();
callback(width, height, file);
});
angular.element(document.body).append(img);
}, true);
} else {
return false;
}
};
UploadDataUrl.mediaDuration = function (file, callback) {
if (file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var el = angular.element(file.type.indexOf('audio') === 0 ? '<audio>' : '<video>')
.attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
el.on('loadedmetadata error', function () {
var duration = el[0].duration;
el.remove();
callback(duration, file);
});
angular.element(document.body).append(el);
});
} else {
return false;
}
};
return UploadDataUrl;
}]);
})();
(function () {
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', 'Upload',
function ($parse, $timeout, $location, Upload) {
uploadService = Upload;
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
};
}]);
ngFileUpload.directive('ngfNoFileDrop', function () {

@@ -641,3 +850,3 @@ return function (scope, elem) {

if (getAttr(attr, 'ngfDrop').search(/\W+\$files\W+/) === -1) {
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) {
scope.$watch(getAttr(attr, 'ngfDrop'), function (val) {
disabled = val === false;

@@ -662,6 +871,9 @@ });

$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
if (!actualDragOverClass) {
actualDragOverClass = 'C';
calculateDragOverClass(scope, attr, evt, function (clazz) {
actualDragOverClass = clazz;
elem.addClass(actualDragOverClass);
});
}
elem.addClass(actualDragOverClass);
}, false);

@@ -687,5 +899,5 @@ elem[0].addEventListener('dragenter', function (evt) {

extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));

@@ -695,37 +907,39 @@ }, false);

if (elem.attr('disabled') || disabled) return;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, false, getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));
var files = [];
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
files.push(clipboard.items[k].getAsFile());
}
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
});
}
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
function calculateDragOverClass(scope, attr, evt, callback) {
var items = evt.dataTransfer.items, files = [];
if (items != null) {
for (var i = 0; i < items.length && accepted; i++) {
accepted = accepted &&
(items[i].kind === 'file' || items[i].kind === '') &&
validate(scope, $parse, attr, items[i], evt);
for (var i = 0; i < items.length; i++) {
if (items[i].kind === 'file' || items[i].kind === '') {
files.push(items[i]);
}
}
}
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover';
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = !rejFiles || !rejFiles.length ? clazz.accept : clazz.reject;
}
callback(clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover');
});
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], processing = 0;
var files = [], processing = 0;
function addFile(file) {
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
function traverseFileTree(files, entry, path) {

@@ -735,3 +949,3 @@ if (entry != null) {

var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
files.push({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();

@@ -767,3 +981,3 @@ var entries = [];

file.path = (path ? path : '') + file.name;
addFile(file);
files.push(file);
} catch (e) {

@@ -780,60 +994,50 @@ processing--;

if (evt.type === 'paste') {
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
addFile(clipboard.items[k].getAsFile());
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) files.push(f);
}
callback(files, rejFiles);
if (!multiple && files.length > 0) break;
}
} else {
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
files.push(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
addFile(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
});
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}, delay || 0);
})();
}
}
}, delay || 0);
})();
}

@@ -848,66 +1052,1 @@ }

})();
(function () {
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) {
if (defaultName) {
callback($parse(defaultName)(scope));
}
scope.$watch(name, function (file) {
if (!angular.isString(file)) {
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) {
Upload.dataUrl(file, function (url) {
if (callback) {
callback(url);
} else {
file.dataUrl = url || $parse(defaultName)(scope);
}
}, $parse(attr.ngfNoObjectUrl)(scope));
}
} else {
callback(file);
}
});
}
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfDefaultSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) {
elem.attr('src', url);
});
}
};
}]);
/** @namespace attr.ngfBackground */
/** @namespace attr.ngfDefaultBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) {
elem.css('background-image', 'url(' + url + ')');
});
}
};
}]);
/** @namespace attr.ngfDataUrl */
/** @namespace attr.ngfDefaultDataUrl */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl);
}
};
}]);
})();

@@ -1,2 +0,2 @@

/*! 6.1.2 */
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.1.2",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var k=b.__files_||b.target&&b.target.files,l=[],m=[],n=0;n<k.length;n++){var o=k.item(n);d(a,i,g,o,b)?l.push(o):m.push(o)}f.$$ngfHasFile=!0,e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),l,m,b),0===l.length&&(b.target.value=l)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&((null==e.value||""===e.value)&&("required"===e.name&&(e.value="required"),"multiple"===e.name&&(e.value="multiple")),b.attr(e.name,e.value))}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;if(f.$$ngfProgramClick)return f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){f.$$ngfHasFile&&(e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0),delete f.$$ngfHasFile)}function q(d){function e(a){a&&!f.$$ngfProgramClick&&(f.$$ngfProgramClick=!0,s[0].click(),j(function(){delete f.$$ngfProgramClick},500)),!l()&&a||!n||f.bind("click touchstart touchend",q)}if(f.attr("disabled")||r)return!1;if(null!=d){var h=d.changedTouches||d.originalEvent&&d.originalEvent.changedTouches;if("touchstart"===d.type)return t=h?h[0].clientY:0,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var k=h?h[0].clientY:0;if(Math.abs(k-t)>20)return!1}}var n=i(c(g,"ngfResetOnClick"))(a)!==!1,s=o(d,n);return s&&((!d||n)&&s.bind("change",m),d&&n&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){function g(a){if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])return a.substring(1,a.length-1);var b=a.split(","),c="";if(b.length>1)for(var d=0;d<b.length;d++)c+="("+g(b[d])+")",d<b.length-1&&(c+="|");else 0===a.indexOf(".")&&(a="*"+a),c="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",c=c.replace(/\\\*/g,".*").replace(/\\\?/g,".");return c}if(null==e)return!1;var h=b(c(d,"ngfValidate"))(a,{$file:e,$event:f});if(null!=h&&(h===!1||h.length>0))return e.$error=h?h:"validate",!1;var i=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),j=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,k=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=i&&angular.isString(i)){var l=new RegExp(g(i),"gi");if(i=null!=e.type&&l.test(e.type.toLowerCase())||null!=e.name&&l.test(e.name.toLowerCase()),!i)return e.$error="accept",!1}else if(i===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>j?(e.$error="maxSize",!1):e.size<k?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){var k=a(c(f,"ngfKeep"))(d);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(c(f,"ngfMultiple"))(d)&&!c(f,"multiple")&&!k;a(c(f,"ngModel")).assign(d,q?p:h),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=c(f,"ngfModel");r&&a(r).assign(d,h),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];o++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");o--}}catch(h){o--,console.error(h)}},function(){o--})};g()}else o++,b.file(function(a){try{o--,a.path=(c?c:"")+a.name,h(a)}catch(b){o--,console.error(b)}},function(){o--})}var m=[],n=[],o=0;if("paste"===b.type){var p=b.clipboardData||b.originalEvent.clipboardData;if(p&&p.items){for(var q=0;q<p.items.length;q++)-1!==p.items[q].type.indexOf("image")&&h(p.items[q].getAsFile());d(m,n)}}else{var r=b.dataTransfer.items;if(r&&r.length>0&&"file"!==k.protocol())for(var s=0;s<r.length;s++){if(r[s].webkitGetAsEntry&&r[s].webkitGetAsEntry()&&r[s].webkitGetAsEntry().isDirectory){var t=r[s].webkitGetAsEntry();if(t.isDirectory&&!e)continue;null!=t&&l(m,t)}else{var u=r[s].getAsFile();null!=u&&h(u)}if(!f&&m.length>0)break}else{var v=b.dataTransfer.files;if(null!=v)for(var w=0;w<v.length&&(h(v.item(w)),f||!(m.length>0));w++);}var x=0;!function y(a){j(function(){if(o)10*x++<2e4&&y(10);else{if(!f&&m.length>1){for(s=0;"directory"===m[s].type;)s++;m=[m[s]]}d(m,n)}},a||0)}()}}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1),f[0].addEventListener("paste",function(b){f.attr("disabled")||o||m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){f&&g(c(f)(b)),b.$watch(e,function(e){angular.isString(e)?g(e):window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}();
/*! 6.2.0 */
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.2.0",ngFileUpload.defaults={},ngFileUpload.service("UploadBase",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}},ngFileUpload.Upload=this}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){var j=b.__files_||b.target&&b.target.files;c.validate(a,h,f,j,b,function(c,j){e.$$ngfHasFile=!0,ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),c,j,b),0===c.length&&(b.target.value=c)})}function m(b){d(f,"ngfMultiple")&&b.attr("multiple",h(d(f,"ngfMultiple"))(a)),d(f,"ngfCapture")&&b.attr("capture",h(d(f,"ngfCapture"))(a)),d(f,"accept")&&b.attr("accept",d(f,"accept"));for(var c=0;c<e[0].attributes.length;c++){var g=e[0].attributes[c];(k()&&"type"!==g.name||"type"!==g.name&&"class"!==g.name&&"id"!==g.name&&"style"!==g.name)&&((null==g.value||""===g.value)&&("required"===g.name&&(g.value="required"),"multiple"===g.name&&(g.value="multiple")),b.attr(g.name,g.value))}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;if(e.$$ngfProgramClick)return e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){e.$$ngfHasFile&&(ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),[],[],b,!0),delete e.$$ngfHasFile)}function p(c){function g(a){a&&!e.$$ngfProgramClick&&(e.$$ngfProgramClick=!0,t[0].click(),i(function(){delete e.$$ngfProgramClick},500)),!k()&&a||!s||e.bind("click touchstart touchend",p)}if(e.attr("disabled")||q)return!1;if(null!=c){var j=c.changedTouches||c.originalEvent&&c.originalEvent.changedTouches;if("touchstart"===c.type)return r=j?j[0].clientY:0,!0;if(c.stopPropagation(),c.preventDefault(),"touchend"===c.type){var m=j?j[0].clientY:0;if(Math.abs(m-r)>20)return!1}}var s=h(d(f,"ngfResetOnClick"))(a)!==!1,t=n(c,s);return t&&((!c||s)&&t.bind("change",l),c&&s&&h(d(f,"ngfResetModelOnClick"))(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){g(c)},0):g(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===d(f,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfSelect"),function(a){q=a===!1});var r=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.updateModel=function(a,b,c,e,f,g,h,i,j,k){function l(){var k=a(d(f,"ngfKeep"))(c);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(d(f,"ngfKeepDistinct"))(c)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(d(f,"ngfMultiple"))(c)&&!d(f,"multiple")&&!k;b(function(){a(d(f,"ngModel")).assign(c,q?p:h)}),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=d(f,"ngfModel");r&&a(r).assign(c,h),d(f,"ngModelRejected")&&a(d(f,"ngModelRejected")).assign(c,i),g&&a(g)(c,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})}}(),function(){ngFileUpload.service("UploadDataUrl",["UploadBase","$timeout",function(a,b){return a.dataUrl=function(a,c,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?b(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d){var f;try{f=e.createObjectURL(a)}catch(g){c("",a)}f&&c(f,a)}else{var h=new FileReader;h.readAsDataURL(a),h.onload=function(d){b(function(){c(d.target.result,a)})}}}):c(null,a)},a}]),ngFileUpload.directive("ngfSrc",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("src","{{("+f.ngfSrc+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}"),f.$set("ngfSrc",null),b(e)(d)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("style",e.attr("style")+";background-image:url('{{("+f.ngfBackground+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}')"),f.$set("ngfBackground",null),b(e)(d)})}}}]),ngFileUpload.config(["$compileProvider",function(a){a.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/),a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/)}]),ngFileUpload.filter("ngfDataUrl",["UploadDataUrl","$sce",function(a,b){return function(c,d){return!c||c.dataUrl||angular.isString(c)?(c&&c.dataUrl?b.trustAsResourceUrl(c.dataUrl):c)||"":(void 0===c.dataUrl&&angular.isObject(c)&&(c.dataUrl=null,a.dataUrl(c,function(a,b){b.dataUrl=a},d)),"")}}])}(),function(){function a(b){if(b.length>2&&"/"===b[0]&&"/"===b[b.length-1])return b.substring(1,b.length-1);var c=b.split(","),d="";if(c.length>1)for(var e=0;e<c.length;e++)d+="("+a(c[e])+")",e<c.length-1&&(d+="|");else 0===b.indexOf(".")&&(b="*"+b),d="^"+b.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",d=d.replace(/\\\*/g,".*").replace(/\\\?/g,".");return d}function b(a){if(angular.isString(a)){if(a.search(/kb/i)===a.length-2)return parseFloat(1e3*a.substring(0,a.length-2));if(a.search(/mb/i)===a.length-2)return parseFloat(1e6*a.substring(0,a.length-2));if(a.search(/gb/i)===a.length-2)return parseFloat(1e9*a.substring(0,a.length-2));if(a.search(/b/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/s/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/m/i)===a.length-1)return parseFloat(60*a.substring(0,a.length-1));if(a.search(/h/i)===a.length-1)return parseFloat(3600*a.substring(0,a.length-1))}return a}ngFileUpload.service("Upload",["UploadDataUrl",function(c){var d=ngFileUpload.getAttrWithDefaults;return c.validate=function(a,b,c,e,f,g){function h(a,b){b?i.push(a):j.push(a),l++,l===e.length&&g(i,j)}if(null==d(c,"ngfValidate")&&null==d(c,"ngfAccept"))return g(e);for(var i=[],j=[],k=b(d(c,"ngfAccept"))(a,{$event:f}),l=0,m=0;m<e.length;m++){var n=e[m],o=b(d(c,"ngfValidate"))(a,{$file:n,$event:f});null==o||o!==!1&&!angular.isString(o)?null!=o||null!=k?(o=o||{},null!=k&&(o.accept=k),this.validateFile(n,o,h)):h(n,!0):(n.$error="validate",n.$errorParam=o,h(n,!1))}},c.validateFile=function(c,d,e){if(null==c)return e(c,!1);var f=d.accept;if(null!=d.accept&&angular.isString(d.accept)){var g=new RegExp(a(d.accept),"gi");if(f=null!=c.type&&g.test(c.type.toLowerCase())||null!=c.name&&g.test(c.name.toLowerCase()),!f)return c.$error="accept",e(c,!1)}else if(f===!1)return c.$error="accept",e(c,!1);if(null!=c.size&&d.size&&(d.size.max||d.size.min)){if(c.size>b(d.size.max))return c.$error="size.max",c.$errorParam=d.size.max,e(c,!1);if(c.size<b(d.size.min))return c.$error="size.min",c.$errorParam=d.size.min,e(c,!1)}if(!((d.width||d.height)&&0===c.type.indexOf("image")&&(this.imageDimensions(c,function(a,f){c.width=a,c.height=f,d.width&&(d.width.min||d.width.max)&&(d.width.max&&a>b(d.width.max)&&(c.$error="width.max",c.$errorParam=d.width.max),d.width.min&&a<b(d.width.min)&&(c.$error="width.min",c.$errorParam=d.width.min),a||d.width.soft||(c.$error=d.width.min?"width.min":"width.max",c.$errorParam=d.width.min||d.width.max)),d.height&&(d.height.min||d.height.max)&&(d.height.max&&f>b(d.height.max)&&(c.$error="height.max",c.$errorParam=d.height.max),d.height.min&&f<b(d.height.min)&&(c.$error="height.min",c.$errorParam=d.height.min),f||d.height.soft||(c.$error=d.height.min?"height.min":"height.max",c.$errorParam=d.height.min||d.height.max),e(c,!c.$error))}),d.width&&(d.width.min||d.width.max)||d.height&&(d.height.min||d.height.max))||d.duration&&(0===c.type.indexOf("audio")||0===c.type.indexOf("video"))&&(this.mediaDuration(c,function(a){c.duration=a,(d.duration.min||d.duration.max)&&(d.duration.max&&a>b(d.duration.max)&&(c.$error="duration.max",c.$errorParam=d.duration.max),d.duration.min&&a<b(d.duration.min)&&(c.$error="duration.min",c.$errorParam=d.duration.min),a||d.duration.soft||(c.$error=d.duration.min?"duration.min":"duration.max",c.$errorParam=d.duration.min||d.duration.max),e(c,!c.$error))}),d.duration.min||d.duration.max)))return e(c,!0)},c.imageDimensions=function(a,b){return 0!==a.type.indexOf("image")?!1:void c.dataUrl(a,function(c){var d=angular.element("<img>").attr("src",c).css("visibility","none").css("position","fixed");d.on("load error",function(){var c=d[0].clientWidth,e=d[0].clientHeight;d.remove(),b(c,e,a)}),angular.element(document.body).append(d)},!0)},c.mediaDuration=function(a,b){return 0!==a.type.indexOf("audio")&&0!==a.type.indexOf("video")?!1:void c.dataUrl(a,function(c){var d=angular.element(0===a.type.indexOf("audio")?"<audio>":"<video>").attr("src",c).css("visibility","none").css("position","fixed");d.on("loadedmetadata error",function(){var c=d[0].duration;d.remove(),b(c,a)}),angular.element(document.body).append(d)})},c}])}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,e,f){var g=e.dataTransfer.items,i=[];if(null!=g)for(var j=0;j<g.length;j++)("file"===g[j].kind||""===g[j].kind)&&i.push(g[j]);c.validate(a,h,b,i,e,function(c,g){var i=h(d(b,"ngfDragOverClass"))(a,{$event:e});i&&(i.delay&&(r=i.delay),i.accept&&(i=g&&g.length?i.reject:i.accept)),f(i||d(b,"ngfDragOverClass")||"dragover")})}function l(b,d,e,g){function k(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;a.push({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];m++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)k(a,f[e],(c?c:"")+b.name+"/");m--}}catch(h){m--,console.error(h)}},function(){m--})};g()}else m++,b.file(function(b){try{m--,b.path=(c?c:"")+b.name,a.push(b)}catch(d){m--,console.error(d)}},function(){m--})}var l=[],m=0,n=b.dataTransfer.items;if(n&&n.length>0&&"file"!==j.protocol())for(var o=0;o<n.length;o++){if(n[o].webkitGetAsEntry&&n[o].webkitGetAsEntry()&&n[o].webkitGetAsEntry().isDirectory){var p=n[o].webkitGetAsEntry();if(p.isDirectory&&!e)continue;null!=p&&k(l,p)}else{var q=n[o].getAsFile();null!=q&&l.push(q)}if(!g&&l.length>0)break}else{var r=b.dataTransfer.files;if(null!=r)for(var s=0;s<r.length&&(l.push(r.item(s)),g||!(l.length>0));s++);}var t=0;!function u(e){i(function(){if(m)10*t++<2e4&&u(10);else{if(!g&&l.length>1){for(o=0;"directory"===l[o].type;)o++;l=[l[o]]}c.validate(a,h,f,l,b,function(a,b){d(a,b)})}},e||0)}()}var m=b();if(d(f,"dropAvailable")&&i(function(){a[d(f,"dropAvailable")]?a[d(f,"dropAvailable")].value=m:a[d(f,"dropAvailable")]=m}),!m)return void(h(d(f,"ngfHideOnDropNotAvailable"))(a)===!0&&e.css("display","none"));var n=!1;-1===d(f,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfDrop"),function(a){n=a===!1});var o,p=null,q=h(d(f,"ngfStopPropagation")),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),o||(o="C",k(a,f,b,function(a){o=a,e.addClass(o)}))}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)},h(d(f,"ngfAllowDir"))(a)!==!1,d(f,"multiple")||h(d(f,"ngfMultiple"))(a)))},!1),e[0].addEventListener("paste",function(b){if(!e.attr("disabled")&&!n){var j=[],k=b.clipboardData||b.originalEvent.clipboardData;if(k&&k.items){for(var l=0;l<k.items.length;l++)-1!==k.items[l].type.indexOf("image")&&j.push(k.items[l].getAsFile());c.validate(a,h,f,j,b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)})}}},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(e,f,g){if(b()){var h=a(d(g,"ngfDropAvailable"));c(function(){h(e),h.assign&&h.assign(e,!0)})}}}])}();

@@ -5,232 +5,238 @@ 'use strict';

var app = angular.module('fileUpload', ['ngFileUpload']);
var version = '6.0.3';
var version = '6.2.0';
app.controller('MyCtrl', ['$scope', '$http', '$timeout', '$compile', 'Upload', function ($scope, $http, $timeout, $compile, Upload) {
$scope.usingFlash = FileAPI && FileAPI.upload != null;
//Upload.setDefaults({ngfKeep: true, ngfResetModelOnClick: false, ngfResetOnClick:false});
$scope.changeAngularVersion = function () {
window.location.hash = $scope.angularVersion;
window.location.reload(true);
};
$scope.angularVersion = window.location.hash.length > 1 ? (window.location.hash.indexOf('/') === 1 ?
window.location.hash.substring(2) : window.location.hash.substring(1)) : '1.2.20';
$scope.usingFlash = FileAPI && FileAPI.upload != null;
//Upload.setDefaults({ngfKeep: true, ngfResetModelOnClick: false, ngfResetOnClick:false});
$scope.changeAngularVersion = function () {
window.location.hash = $scope.angularVersion;
window.location.reload(true);
};
$scope.angularVersion = window.location.hash.length > 1 ? (window.location.hash.indexOf('/') === 1 ?
window.location.hash.substring(2) : window.location.hash.substring(1)) : '1.2.20';
$scope.$watch('files', function (files) {
$scope.formUpload = false;
if (files != null) {
if (!angular.isArray(files)) {
$timeout(function() {
$scope.files = files = [files];
});
return;
}
for (var i = 0; i < files.length; i++) {
$scope.errorMsg = null;
(function (f) {
upload(f);
})(files[i]);
}
}
});
$scope.$watch('files', function (files) {
$scope.formUpload = false;
if (files != null) {
if (!angular.isArray(files)) {
$timeout(function () {
$scope.files = files = [files];
});
return;
}
for (var i = 0; i < files.length; i++) {
$scope.errorMsg = null;
(function (f) {
upload(f);
})(files[i]);
}
}
});
$scope.uploadPic = function(file) {
$scope.formUpload = true;
if (file != null) {
upload(file)
}
};
$scope.uploadPic = function (file) {
$scope.formUpload = true;
if (file != null) {
upload(file)
}
};
function upload(file) {
$scope.errorMsg = null;
if ($scope.howToSend === 1) {
uploadUsingUpload(file);
} else if ($scope.howToSend == 2) {
uploadUsing$http(file);
} else {
uploadS3(file);
}
function upload(file) {
$scope.errorMsg = null;
if ($scope.howToSend === 1) {
uploadUsingUpload(file);
} else if ($scope.howToSend == 2) {
uploadUsing$http(file);
} else {
uploadS3(file);
}
}
function uploadUsingUpload(file) {
file.upload = Upload.upload({
url: 'https://angular-file-upload-cors-srv.appspot.com/upload' + $scope.getReqParams(),
method: 'POST',
headers: {
'my-header': 'my-header-value'
},
fields: {username: $scope.username},
file: file,
fileFormDataName: 'myFile'
});
function uploadUsingUpload(file) {
file.upload = Upload.upload({
url: 'https://angular-file-upload-cors-srv.appspot.com/upload' + $scope.getReqParams(),
method: 'POST',
headers: {
'my-header': 'my-header-value'
},
fields: {username: $scope.username},
file: file,
fileFormDataName: 'myFile'
});
file.upload.then(function (response) {
$timeout(function () {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.then(function (response) {
$timeout(function () {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.progress(function (evt) {
// Math.min is to fix IE which reports 200% sometimes
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
file.upload.progress(function (evt) {
// Math.min is to fix IE which reports 200% sometimes
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
file.upload.xhr(function (xhr) {
// xhr.upload.addEventListener('abort', function(){console.log('abort complete')}, false);
});
}
file.upload.xhr(function (xhr) {
// xhr.upload.addEventListener('abort', function(){console.log('abort complete')}, false);
});
}
function uploadUsing$http(file) {
file.upload = Upload.http({
url: 'https://angular-file-upload-cors-srv.appspot.com/upload' + $scope.getReqParams(),
method: 'POST',
headers: {
'Content-Type': file.type
},
data: file
});
function uploadUsing$http(file) {
file.upload = Upload.http({
url: 'https://angular-file-upload-cors-srv.appspot.com/upload' + $scope.getReqParams(),
method: 'POST',
headers: {
'Content-Type': file.type
},
data: file
});
file.upload.then(function (response) {
file.result = response.data;
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.then(function (response) {
file.result = response.data;
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.progress(function (evt) {
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
file.upload.progress(function (evt) {
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
function uploadS3(file) {
file.upload = Upload.upload({
url: $scope.s3url,
method: 'POST',
fields: {
key: file.name,
AWSAccessKeyId: $scope.AWSAccessKeyId,
acl: $scope.acl,
policy: $scope.policy,
signature: $scope.signature,
'Content-Type': file.type === null || file.type === '' ? 'application/octet-stream' : file.type,
filename: file.name
},
file: file
});
function uploadS3(file) {
file.upload = Upload.upload({
url: $scope.s3url,
method: 'POST',
fields: {
key: file.name,
AWSAccessKeyId: $scope.AWSAccessKeyId,
acl: $scope.acl,
policy: $scope.policy,
signature: $scope.signature,
'Content-Type': file.type === null || file.type === '' ? 'application/octet-stream' : file.type,
filename: file.name
},
file: file
});
file.upload.then(function (response) {
$timeout(function () {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.then(function (response) {
$timeout(function () {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.progress(function (evt) {
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
storeS3UploadConfigInLocalStore();
}
file.upload.progress(function (evt) {
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
storeS3UploadConfigInLocalStore();
}
$scope.generateSignature = function () {
$http.post('/s3sign?aws-secret-key=' + encodeURIComponent($scope.AWSSecretKey), $scope.jsonPolicy).
success(function (data) {
$scope.policy = data.policy;
$scope.signature = data.signature;
});
};
$scope.generateSignature = function () {
$http.post('/s3sign?aws-secret-key=' + encodeURIComponent($scope.AWSSecretKey), $scope.jsonPolicy).
success(function (data) {
$scope.policy = data.policy;
$scope.signature = data.signature;
});
};
if (localStorage) {
$scope.s3url = localStorage.getItem('s3url');
$scope.AWSAccessKeyId = localStorage.getItem('AWSAccessKeyId');
$scope.acl = localStorage.getItem('acl');
$scope.success_action_redirect = localStorage.getItem('success_action_redirect');
$scope.policy = localStorage.getItem('policy');
$scope.signature = localStorage.getItem('signature');
if (localStorage) {
$scope.s3url = localStorage.getItem('s3url');
$scope.AWSAccessKeyId = localStorage.getItem('AWSAccessKeyId');
$scope.acl = localStorage.getItem('acl');
$scope.success_action_redirect = localStorage.getItem('success_action_redirect');
$scope.policy = localStorage.getItem('policy');
$scope.signature = localStorage.getItem('signature');
}
$scope.success_action_redirect = $scope.success_action_redirect || window.location.protocol + '//' + window.location.host;
$scope.jsonPolicy = $scope.jsonPolicy || '{\n "expiration": "2020-01-01T00:00:00Z",\n "conditions": [\n {"bucket": "angular-file-upload"},\n ["starts-with", "$key", ""],\n {"acl": "private"},\n ["starts-with", "$Content-Type", ""],\n ["starts-with", "$filename", ""],\n ["content-length-range", 0, 524288000]\n ]\n}';
$scope.acl = $scope.acl || 'private';
function storeS3UploadConfigInLocalStore() {
if ($scope.howToSend === 3 && localStorage) {
localStorage.setItem('s3url', $scope.s3url);
localStorage.setItem('AWSAccessKeyId', $scope.AWSAccessKeyId);
localStorage.setItem('acl', $scope.acl);
localStorage.setItem('success_action_redirect', $scope.success_action_redirect);
localStorage.setItem('policy', $scope.policy);
localStorage.setItem('signature', $scope.signature);
}
}
$scope.success_action_redirect = $scope.success_action_redirect || window.location.protocol + '//' + window.location.host;
$scope.jsonPolicy = $scope.jsonPolicy || '{\n "expiration": "2020-01-01T00:00:00Z",\n "conditions": [\n {"bucket": "angular-file-upload"},\n ["starts-with", "$key", ""],\n {"acl": "private"},\n ["starts-with", "$Content-Type", ""],\n ["starts-with", "$filename", ""],\n ["content-length-range", 0, 524288000]\n ]\n}';
$scope.acl = $scope.acl || 'private';
(function handleDynamicEditingOfScriptsAndHtml($scope) {
$scope.defaultHtml = document.getElementById('editArea').innerHTML.replace(/\t\t\t\t/g, '');
function storeS3UploadConfigInLocalStore() {
if ($scope.howToSend === 3 && localStorage) {
localStorage.setItem('s3url', $scope.s3url);
localStorage.setItem('AWSAccessKeyId', $scope.AWSAccessKeyId);
localStorage.setItem('acl', $scope.acl);
localStorage.setItem('success_action_redirect', $scope.success_action_redirect);
localStorage.setItem('policy', $scope.policy);
localStorage.setItem('signature', $scope.signature);
}
var fromLocal = (localStorage && localStorage.getItem('editHtml' + version));
$scope.editHtml = fromLocal || $scope.defaultHtml;
function htmlEdit() {
document.getElementById('editArea').innerHTML = $scope.editHtml;
$compile(document.getElementById('editArea'))($scope);
$scope.editHtml && localStorage && localStorage.setItem('editHtml' + version, $scope.editHtml);
if ($scope.editHtml != $scope.htmlEditor.getValue()) $scope.htmlEditor.setValue($scope.editHtml);
}
(function handleDynamicEditingOfScriptsAndHtml($scope) {
$scope.defaultHtml = document.getElementById('editArea').innerHTML.replace(/\t\t\t\t/g, '');
$scope.$watch('editHtml', htmlEdit);
var fromLocal = (localStorage && localStorage.getItem('editHtml' + version));
$scope.editHtml = fromLocal || $scope.defaultHtml;
function htmlEdit() {
document.getElementById('editArea').innerHTML = $scope.editHtml;
$compile(document.getElementById('editArea'))($scope);
$scope.editHtml && localStorage && localStorage.setItem('editHtml' + version, $scope.editHtml);
if ($scope.editHtml != $scope.htmlEditor.getValue()) $scope.htmlEditor.setValue($scope.editHtml);
}
$scope.htmlEditor = CodeMirror(document.getElementById('htmlEdit'), {
lineNumbers: true, indentUnit: 4,
mode: 'htmlmixed'
});
$scope.htmlEditor.on('change', function () {
if ($scope.editHtml != $scope.htmlEditor.getValue()) {
$scope.editHtml = $scope.htmlEditor.getValue();
htmlEdit();
}
});
})($scope, $http);
$scope.$watch('editHtml', htmlEdit);
$scope.confirm = function () {
return confirm('Are you sure? Your local changes will be lost.');
};
$scope.htmlEditor = CodeMirror(document.getElementById('htmlEdit'), {
lineNumbers: true, indentUnit: 4,
mode: 'htmlmixed'
});
$scope.htmlEditor.on('change', function () {
if ($scope.editHtml != $scope.htmlEditor.getValue()) {
$scope.editHtml = $scope.htmlEditor.getValue();
htmlEdit();
}
});
})($scope, $http);
$scope.getReqParams = function () {
return $scope.generateErrorOnServer ? '?errorCode=' + $scope.serverErrorCode +
'&errorMessage=' + $scope.serverErrorMsg : '';
};
$scope.confirm = function () {
return confirm('Are you sure? Your local changes will be lost.');
};
angular.element(window).bind('dragover', function (e) {
e.preventDefault();
});
angular.element(window).bind('drop', function (e) {
e.preventDefault();
});
$scope.getReqParams = function () {
return $scope.generateErrorOnServer ? '?errorCode=' + $scope.serverErrorCode +
'&errorMessage=' + $scope.serverErrorMsg : '';
};
$scope.$watch('validate', function (v) {
$scope.validateObj = eval('(function(){return ' + v + ';})()');
});
angular.element(window).bind('dragover', function (e) {
e.preventDefault();
$timeout(function () {
$scope.capture = localStorage.getItem('capture' + version) || 'camera';
$scope.accept = localStorage.getItem('accept' + version) || 'image/*,audio/*,video/*';
$scope.acceptSelect = localStorage.getItem('acceptSelect' + version) || 'image/*,audio/*,video/*';
$scope.disabled = localStorage.getItem('disabled' + version) == 'true' || false;
$scope.multiple = localStorage.getItem('multiple' + version) == 'true' || false;
$scope.allowDir = localStorage.getItem('allowDir' + version) == 'true' || true;
$scope.validate = localStorage.getItem('validate' + version) || '{size: {max: \'20MB\', min: \'10B\'}, height: {max: 5000}, width: {max: 5000}, duration: {max: \'5m\'}}';
$scope.resetOnClick = localStorage.getItem('resetOnClick' + version) == 'true' || true;
$scope.resetModelOnClick = localStorage.getItem('resetModelOnClick' + version) == 'true' || true;
$scope.keep = localStorage.getItem('keep' + version) == 'true' || false;
$scope.keepDistinct = localStorage.getItem('keepDistinct' + version) == 'true' || false;
$scope.$watch('validate+capture+accept+acceptSelect+disabled+capture+multiple+allowDir+resetOnClick+resetModelOnClick+keep+keepDistinct', function () {
localStorage.setItem('capture' + version, $scope.capture);
localStorage.setItem('accept' + version, $scope.accept);
localStorage.setItem('acceptSelect' + version, $scope.acceptSelect);
localStorage.setItem('disabled' + version, $scope.disabled);
localStorage.setItem('multiple' + version, $scope.multiple);
localStorage.setItem('allowDir' + version, $scope.allowDir);
localStorage.setItem('validate' + version, $scope.validate);
localStorage.setItem('resetOnClick' + version, $scope.resetOnClick);
localStorage.setItem('resetModelOnClick' + version, $scope.resetModelOnClick);
localStorage.setItem('keep' + version, $scope.keep);
localStorage.setItem('keepDistinct' + version, $scope.keepDistinct);
});
angular.element(window).bind('drop', function (e) {
e.preventDefault();
});
$timeout(function () {
$scope.capture = localStorage.getItem('capture' + version) || 'camera';
$scope.accept = localStorage.getItem('accept' + version) || 'image/*,audio/*,video/*';
$scope.acceptSelect = localStorage.getItem('acceptSelect' + version) || 'image/*,audio/*,video/*';
$scope.disabled = localStorage.getItem('disabled' + version) == 'true' || false;
$scope.multiple = localStorage.getItem('multiple' + version) == 'true' || false;
$scope.allowDir = localStorage.getItem('allowDir' + version) == 'true' || true;
$scope.resetOnClick = localStorage.getItem('resetOnClick' + version) == 'true' || true;
$scope.resetModelOnClick = localStorage.getItem('resetModelOnClick' + version) == 'true' || true;
$scope.keep = localStorage.getItem('keep' + version) == 'true' || false;
$scope.keepDistinct = localStorage.getItem('keepDistinct' + version) == 'true' || false;
$scope.$watch('capture+accept+acceptSelect+disabled+capture+multiple+allowDir+resetOnClick+resetModelOnClick+keep+keepDistinct', function () {
localStorage.setItem('capture' + version, $scope.capture);
localStorage.setItem('accept' + version, $scope.accept);
localStorage.setItem('acceptSelect' + version, $scope.acceptSelect);
localStorage.setItem('disabled' + version, $scope.disabled);
localStorage.setItem('multiple' + version, $scope.multiple);
localStorage.setItem('allowDir' + version, $scope.allowDir);
localStorage.setItem('resetOnClick' + version, $scope.resetOnClick);
localStorage.setItem('resetModelOnClick' + version, $scope.resetModelOnClick);
localStorage.setItem('keep' + version, $scope.keep);
localStorage.setItem('keepDistinct' + version, $scope.keepDistinct);
});
});
});
}]);

@@ -1,2 +0,2 @@

/*! 6.1.1 */
/*! 6.2.0 */
/*! FileAPI 2.0.7 - BSD | git://github.com/mailru/FileAPI.git

@@ -3,0 +3,0 @@ * FileAPI — a set of javascript tools for working with files. Multiupload, drag'n'drop and chunked file upload. Images: crop, resize and auto orientation by EXIF.

@@ -5,3 +5,3 @@ /**!

* @author Danial <danial.farid@gmail.com>
* @version 6.1.1
* @version 6.2.0
*/

@@ -434,3 +434,3 @@

* @author Danial <danial.farid@gmail.com>
* @version 6.1.1
* @version 6.2.0
*/

@@ -456,6 +456,6 @@

ngFileUpload.version = '6.1.1';
ngFileUpload.version = '6.2.0';
ngFileUpload.defaults = {};
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
ngFileUpload.service('UploadBase', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {

@@ -633,30 +633,6 @@ config.method = config.method || 'POST';

this.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
callback(URL.createObjectURL(file));
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result);
});
};
}
});
} else {
callback(null);
}
};
this.setDefaults = function(defaults) {
ngFileUpload.defaults = defaults || {};
};
ngFileUpload.Upload = this;
}

@@ -667,3 +643,3 @@

(function () {
ngFileUpload.getAttrWithDefaults = function(attr, name) {
ngFileUpload.getAttrWithDefaults = function (attr, name) {
return attr[name] != null ? attr[name] :

@@ -674,6 +650,7 @@ (ngFileUpload.defaults[name] == null ?

var getAttr = ngFileUpload.getAttrWithDefaults;
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile', 'Upload',
function ($parse, $timeout, $compile, Upload) {
uploadService = Upload;
return {

@@ -698,4 +675,5 @@ restrict: 'AEC',

/** @namespace attr.ngfValidate */
/** @namespace attr.ngfMaxSize */
/** @namespace attr.ngfMinSize */
/** @namespace attr.ngfDuration*/
/** @namespace attr.ngfWidth*/
/** @namespace attr.ngfHeight*/
/** @namespace attr.ngfResetOnClick */

@@ -724,30 +702,13 @@ /** @namespace attr.ngfResetModelOnClick */

var isUpdating = false;
function changeFn(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
elem.$$ngfHasFile = true;
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
var fileList = evt.__files_ || (evt.target && evt.target.files);
uploadService.validate(scope, $parse, attr, fileList, evt, function(files, rejFiles) {
elem.$$ngfHasFile = true;
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) {
// angular.element(evt.target).remove();
// }
} finally {
isUpdating = false;
}
}
});
}

@@ -801,3 +762,3 @@

if (elem.$$ngfHasFile) {
updateModel($parse, $timeout, scope, ngModel, attr,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true);

@@ -809,2 +770,3 @@ delete elem.$$ngfHasFile;

var initialTouchStartY = 0;
function clickHandler(evt) {

@@ -837,3 +799,3 @@ if (elem.attr('disabled') || disabled) return false;

fileElem[0].click();
$timeout(function() {
$timeout(function () {
delete elem.$$ngfProgramClick;

@@ -888,62 +850,2 @@ }, 500);

ngFileUpload.validate = function (scope, $parse, attr, file, evt) {
if (file == null) {
return false;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
var custom = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (custom != null && (custom === false || custom.length > 0)) {
file.$error = custom ? custom : 'validate';
return false;
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt});
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991;
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1;
if (accept != null && angular.isString(accept)) {
var regexp = new RegExp(globStringToRegex(accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return false;
}
} else {
if (accept === false) {
file.$error = 'accept';
return false;
}
}
if (file.size == null) return true;
if (file.size > fileSizeMax) {
file.$error = 'maxSize';
return false;
}
if (file.size < fileSizeMin) {
file.$error = 'minSize';
return false;
}
return true;
};
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange,

@@ -974,4 +876,6 @@ files, rejFiles, evt, noDelay) {

if (ngModel) {
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && ! getAttr(attr, 'multiple') && !keep;
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && !getAttr(attr, 'multiple') && !keep;
$timeout(function() {
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
});
$timeout(function () {

@@ -1010,18 +914,52 @@ if (ngModel) {

var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
})();
(function () {
var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
var getAttr = ngFileUpload.getAttrWithDefaults;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
ngFileUpload.service('UploadDataUrl', ['UploadBase', '$timeout', function(UploadBase, $timeout) {
UploadBase.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
var url;
try {
url = URL.createObjectURL(file);
} catch(e) {
callback('', file);
}
if (url) callback(url, file);
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result, file);
});
};
}
});
} else {
callback(null, file);
}
};
return UploadBase;
}]);
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('src', '{{(' + attr.ngfSrc + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}');
attr.$set('ngfSrc', null);
$compile(elem)(scope);
});
}

@@ -1031,2 +969,273 @@ };

/** @namespace attr.ngfBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('style', elem.attr('style') + ';background-image:url(\'{{(' + attr.ngfBackground + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}\')');
attr.$set('ngfBackground', null);
$compile(elem)(scope);
});
}
};
}]);
ngFileUpload.config(['$compileProvider', function ($compileProvider) {
$compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
}]);
ngFileUpload.filter('ngfDataUrl', ['UploadDataUrl', '$sce', function (UploadDataUrl, $sce) {
return function (file, disallowObjectUrl) {
//return 'aaaa' + file + disallowObjectUrl + $sce + UploadDataUrl;
if (file && !file.dataUrl && !angular.isString(file)) {
if (file.dataUrl === undefined && angular.isObject(file)) {
file.dataUrl = null;
UploadDataUrl.dataUrl(file, function (url, file) {
file.dataUrl = url;
}, disallowObjectUrl);
}
return '';
}
return (file && file.dataUrl ? $sce.trustAsResourceUrl(file.dataUrl) : file) || '';
};
}]);
})();
(function () {
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
function translateScalars(str) {
if (angular.isString(str)) {
if (str.search(/kb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000);
} else if (str.search(/mb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000);
} else if (str.search(/gb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000000);
} else if (str.search(/b/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/s/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/m/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 60);
} else if (str.search(/h/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 3600);
}
}
return str;
}
ngFileUpload.service('Upload', ['UploadDataUrl', function (UploadDataUrl) {
var getAttr = ngFileUpload.getAttrWithDefaults;
UploadDataUrl.validate = function (scope, $parse, attr, files, evt, callback) {
if (getAttr(attr, 'ngfValidate') == null && getAttr(attr, 'ngfAccept') == null) {
return callback(files);
}
var accFiles = [], rejFiles = [];
function fileCallback(file, accepted) {
if (accepted) {
accFiles.push(file);
} else {
rejFiles.push(file);
}
validated++;
if (validated === files.length) {
callback(accFiles, rejFiles);
}
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$event: evt});
var validated = 0;
for (var i = 0; i < files.length; i++) {
var file = files[i];
var validator = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (validator != null && (validator === false || angular.isString(validator))) {
file.$error = 'validate';
file.$errorParam = validator;
fileCallback(file, false);
} else if (validator != null || accept != null) {
validator = validator || {};
if (accept != null) validator.accept = accept;
this.validateFile(file, validator, fileCallback);
} else {
fileCallback(file, true);
}
}
};
UploadDataUrl.validateFile = function (file, constraints, callback) {
if (file == null) {
return callback(file, false);
}
var accept = constraints.accept;
if (constraints.accept != null && angular.isString(constraints.accept)) {
var regexp = new RegExp(globStringToRegex(constraints.accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return callback(file, false);
}
} else {
if (accept === false) {
file.$error = 'accept';
return callback(file, false);
}
}
if (file.size != null && constraints.size && (constraints.size.max || constraints.size.min)) {
if (file.size > translateScalars(constraints.size.max)) {
file.$error = 'size.max';
file.$errorParam = constraints.size.max;
return callback(file, false);
}
if (file.size < translateScalars(constraints.size.min)) {
file.$error = 'size.min';
file.$errorParam = constraints.size.min;
return callback(file, false);
}
}
if ((constraints.width || constraints.height) && file.type.indexOf('image') === 0) {
this.imageDimensions(file, function (width, height) {
file.width = width;
file.height = height;
if (constraints.width && (constraints.width.min || constraints.width.max)) {
if (constraints.width.max && width > translateScalars(constraints.width.max)) {
file.$error = 'width.max';
file.$errorParam = constraints.width.max;
}
if (constraints.width.min && width < translateScalars(constraints.width.min)) {
file.$error = 'width.min';
file.$errorParam = constraints.width.min;
}
if (!width && !constraints.width.soft) {
file.$error = constraints.width.min ? 'width.min' : 'width.max';
file.$errorParam = constraints.width.min || constraints.width.max;
}
}
if (constraints.height && (constraints.height.min || constraints.height.max)) {
if (constraints.height.max && height > translateScalars(constraints.height.max)) {
file.$error = 'height.max';
file.$errorParam = constraints.height.max;
}
if (constraints.height.min && height < translateScalars(constraints.height.min)) {
file.$error = 'height.min';
file.$errorParam = constraints.height.min;
}
if (!height && !constraints.height.soft) {
file.$error = constraints.height.min ? 'height.min' : 'height.max';
file.$errorParam = constraints.height.min || constraints.height.max;
}
callback(file, !file.$error);
}
});
if ((constraints.width && (constraints.width.min || constraints.width.max)) ||
(constraints.height && (constraints.height.min || constraints.height.max))) return;
}
if ((constraints.duration) &&
(file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0)) {
this.mediaDuration(file, function (duration) {
file.duration = duration;
if (constraints.duration.min || constraints.duration.max) {
if (constraints.duration.max && duration > translateScalars(constraints.duration.max)) {
file.$error = 'duration.max';
file.$errorParam = constraints.duration.max;
}
if (constraints.duration.min && duration < translateScalars(constraints.duration.min)) {
file.$error = 'duration.min';
file.$errorParam = constraints.duration.min;
}
if (!duration && !constraints.duration.soft) {
file.$error = constraints.duration.min ? 'duration.min' : 'duration.max';
file.$errorParam = constraints.duration.min || constraints.duration.max;
}
callback(file, !file.$error);
}
});
if (constraints.duration.min || constraints.duration.max) return;
}
return callback(file, true);
};
UploadDataUrl.imageDimensions = function (file, callback) {
if (file.type.indexOf('image') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var img = angular.element('<img>').attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
img.on('load error', function () {
var width = img[0].clientWidth;
var height = img[0].clientHeight;
img.remove();
callback(width, height, file);
});
angular.element(document.body).append(img);
}, true);
} else {
return false;
}
};
UploadDataUrl.mediaDuration = function (file, callback) {
if (file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var el = angular.element(file.type.indexOf('audio') === 0 ? '<audio>' : '<video>')
.attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
el.on('loadedmetadata error', function () {
var duration = el[0].duration;
el.remove();
callback(duration, file);
});
angular.element(document.body).append(el);
});
} else {
return false;
}
};
return UploadDataUrl;
}]);
})();
(function () {
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', 'Upload',
function ($parse, $timeout, $location, Upload) {
uploadService = Upload;
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
};
}]);
ngFileUpload.directive('ngfNoFileDrop', function () {

@@ -1072,3 +1281,3 @@ return function (scope, elem) {

if (getAttr(attr, 'ngfDrop').search(/\W+\$files\W+/) === -1) {
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) {
scope.$watch(getAttr(attr, 'ngfDrop'), function (val) {
disabled = val === false;

@@ -1093,6 +1302,9 @@ });

$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
if (!actualDragOverClass) {
actualDragOverClass = 'C';
calculateDragOverClass(scope, attr, evt, function (clazz) {
actualDragOverClass = clazz;
elem.addClass(actualDragOverClass);
});
}
elem.addClass(actualDragOverClass);
}, false);

@@ -1118,5 +1330,5 @@ elem[0].addEventListener('dragenter', function (evt) {

extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));

@@ -1126,37 +1338,39 @@ }, false);

if (elem.attr('disabled') || disabled) return;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, false, getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));
var files = [];
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
files.push(clipboard.items[k].getAsFile());
}
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
});
}
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
function calculateDragOverClass(scope, attr, evt, callback) {
var items = evt.dataTransfer.items, files = [];
if (items != null) {
for (var i = 0; i < items.length && accepted; i++) {
accepted = accepted &&
(items[i].kind === 'file' || items[i].kind === '') &&
validate(scope, $parse, attr, items[i], evt);
for (var i = 0; i < items.length; i++) {
if (items[i].kind === 'file' || items[i].kind === '') {
files.push(items[i]);
}
}
}
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover';
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = !rejFiles || !rejFiles.length ? clazz.accept : clazz.reject;
}
callback(clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover');
});
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], processing = 0;
var files = [], processing = 0;
function addFile(file) {
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
function traverseFileTree(files, entry, path) {

@@ -1166,3 +1380,3 @@ if (entry != null) {

var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
files.push({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();

@@ -1198,3 +1412,3 @@ var entries = [];

file.path = (path ? path : '') + file.name;
addFile(file);
files.push(file);
} catch (e) {

@@ -1211,60 +1425,50 @@ processing--;

if (evt.type === 'paste') {
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
addFile(clipboard.items[k].getAsFile());
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) files.push(f);
}
callback(files, rejFiles);
if (!multiple && files.length > 0) break;
}
} else {
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
files.push(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
addFile(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
});
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}, delay || 0);
})();
}
}
}, delay || 0);
})();
}

@@ -1279,66 +1483,1 @@ }

})();
(function () {
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) {
if (defaultName) {
callback($parse(defaultName)(scope));
}
scope.$watch(name, function (file) {
if (!angular.isString(file)) {
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) {
Upload.dataUrl(file, function (url) {
if (callback) {
callback(url);
} else {
file.dataUrl = url || $parse(defaultName)(scope);
}
}, $parse(attr.ngfNoObjectUrl)(scope));
}
} else {
callback(file);
}
});
}
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfDefaultSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) {
elem.attr('src', url);
});
}
};
}]);
/** @namespace attr.ngfBackground */
/** @namespace attr.ngfDefaultBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) {
elem.css('background-image', 'url(' + url + ')');
});
}
};
}]);
/** @namespace attr.ngfDataUrl */
/** @namespace attr.ngfDefaultDataUrl */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl);
}
};
}]);
})();

@@ -1,2 +0,2 @@

/*! 6.1.1 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.1.1",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var k=b.__files_||b.target&&b.target.files,l=[],m=[],n=0;n<k.length;n++){var o=k.item(n);d(a,i,g,o,b)?l.push(o):m.push(o)}f.$$ngfHasFile=!0,e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),l,m,b),0===l.length&&(b.target.value=l)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&((null==e.value||""===e.value)&&("required"===e.name&&(e.value="required"),"multiple"===e.name&&(e.value="multiple")),b.attr(e.name,e.value))}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;if(f.$$ngfProgramClick)return f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){f.$$ngfHasFile&&(e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0),delete f.$$ngfHasFile)}function q(d){function e(a){a&&!f.$$ngfProgramClick&&(f.$$ngfProgramClick=!0,s[0].click(),j(function(){delete f.$$ngfProgramClick},500)),!l()&&a||!n||f.bind("click touchstart touchend",q)}if(f.attr("disabled")||r)return!1;if(null!=d){var h=d.changedTouches||d.originalEvent&&d.originalEvent.changedTouches;if("touchstart"===d.type)return t=h?h[0].clientY:0,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var k=h?h[0].clientY:0;if(Math.abs(k-t)>20)return!1}}var n=i(c(g,"ngfResetOnClick"))(a)!==!1,s=o(d,n);return s&&((!d||n)&&s.bind("change",m),d&&n&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){function g(a){if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])return a.substring(1,a.length-1);var b=a.split(","),c="";if(b.length>1)for(var d=0;d<b.length;d++)c+="("+g(b[d])+")",d<b.length-1&&(c+="|");else 0===a.indexOf(".")&&(a="*"+a),c="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",c=c.replace(/\\\*/g,".*").replace(/\\\?/g,".");return c}if(null==e)return!1;var h=b(c(d,"ngfValidate"))(a,{$file:e,$event:f});if(null!=h&&(h===!1||h.length>0))return e.$error=h?h:"validate",!1;var i=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),j=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,k=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=i&&angular.isString(i)){var l=new RegExp(g(i),"gi");if(i=null!=e.type&&l.test(e.type.toLowerCase())||null!=e.name&&l.test(e.name.toLowerCase()),!i)return e.$error="accept",!1}else if(i===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>j?(e.$error="maxSize",!1):e.size<k?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){var k=a(c(f,"ngfKeep"))(d);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(c(f,"ngfMultiple"))(d)&&!c(f,"multiple")&&!k;a(c(f,"ngModel")).assign(d,q?p:h),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=c(f,"ngfModel");r&&a(r).assign(d,h),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];o++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");o--}}catch(h){o--,console.error(h)}},function(){o--})};g()}else o++,b.file(function(a){try{o--,a.path=(c?c:"")+a.name,h(a)}catch(b){o--,console.error(b)}},function(){o--})}var m=[],n=[],o=0;if("paste"===b.type){var p=b.clipboardData||b.originalEvent.clipboardData;if(p&&p.items){for(var q=0;q<p.items.length;q++)-1!==p.items[q].type.indexOf("image")&&h(p.items[q].getAsFile());d(m,n)}}else{var r=b.dataTransfer.items;if(r&&r.length>0&&"file"!==k.protocol())for(var s=0;s<r.length;s++){if(r[s].webkitGetAsEntry&&r[s].webkitGetAsEntry()&&r[s].webkitGetAsEntry().isDirectory){var t=r[s].webkitGetAsEntry();if(t.isDirectory&&!e)continue;null!=t&&l(m,t)}else{var u=r[s].getAsFile();null!=u&&h(u)}if(!f&&m.length>0)break}else{var v=b.dataTransfer.files;if(null!=v)for(var w=0;w<v.length&&(h(v.item(w)),f||!(m.length>0));w++);}var x=0;!function y(a){j(function(){if(o)10*x++<2e4&&y(10);else{if(!f&&m.length>1){for(s=0;"directory"===m[s].type;)s++;m=[m[s]]}d(m,n)}},a||0)}()}}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1),f[0].addEventListener("paste",function(b){f.attr("disabled")||o||m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){f&&g(c(f)(b)),b.$watch(e,function(e){angular.isString(e)?g(e):window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}();
/*! 6.2.0 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.2.0",ngFileUpload.defaults={},ngFileUpload.service("UploadBase",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}},ngFileUpload.Upload=this}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){var j=b.__files_||b.target&&b.target.files;c.validate(a,h,f,j,b,function(c,j){e.$$ngfHasFile=!0,ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),c,j,b),0===c.length&&(b.target.value=c)})}function m(b){d(f,"ngfMultiple")&&b.attr("multiple",h(d(f,"ngfMultiple"))(a)),d(f,"ngfCapture")&&b.attr("capture",h(d(f,"ngfCapture"))(a)),d(f,"accept")&&b.attr("accept",d(f,"accept"));for(var c=0;c<e[0].attributes.length;c++){var g=e[0].attributes[c];(k()&&"type"!==g.name||"type"!==g.name&&"class"!==g.name&&"id"!==g.name&&"style"!==g.name)&&((null==g.value||""===g.value)&&("required"===g.name&&(g.value="required"),"multiple"===g.name&&(g.value="multiple")),b.attr(g.name,g.value))}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;if(e.$$ngfProgramClick)return e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){e.$$ngfHasFile&&(ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),[],[],b,!0),delete e.$$ngfHasFile)}function p(c){function g(a){a&&!e.$$ngfProgramClick&&(e.$$ngfProgramClick=!0,t[0].click(),i(function(){delete e.$$ngfProgramClick},500)),!k()&&a||!s||e.bind("click touchstart touchend",p)}if(e.attr("disabled")||q)return!1;if(null!=c){var j=c.changedTouches||c.originalEvent&&c.originalEvent.changedTouches;if("touchstart"===c.type)return r=j?j[0].clientY:0,!0;if(c.stopPropagation(),c.preventDefault(),"touchend"===c.type){var m=j?j[0].clientY:0;if(Math.abs(m-r)>20)return!1}}var s=h(d(f,"ngfResetOnClick"))(a)!==!1,t=n(c,s);return t&&((!c||s)&&t.bind("change",l),c&&s&&h(d(f,"ngfResetModelOnClick"))(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){g(c)},0):g(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===d(f,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfSelect"),function(a){q=a===!1});var r=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.updateModel=function(a,b,c,e,f,g,h,i,j,k){function l(){var k=a(d(f,"ngfKeep"))(c);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(d(f,"ngfKeepDistinct"))(c)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(d(f,"ngfMultiple"))(c)&&!d(f,"multiple")&&!k;b(function(){a(d(f,"ngModel")).assign(c,q?p:h)}),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=d(f,"ngfModel");r&&a(r).assign(c,h),d(f,"ngModelRejected")&&a(d(f,"ngModelRejected")).assign(c,i),g&&a(g)(c,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})}}(),function(){ngFileUpload.service("UploadDataUrl",["UploadBase","$timeout",function(a,b){return a.dataUrl=function(a,c,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?b(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d){var f;try{f=e.createObjectURL(a)}catch(g){c("",a)}f&&c(f,a)}else{var h=new FileReader;h.readAsDataURL(a),h.onload=function(d){b(function(){c(d.target.result,a)})}}}):c(null,a)},a}]),ngFileUpload.directive("ngfSrc",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("src","{{("+f.ngfSrc+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}"),f.$set("ngfSrc",null),b(e)(d)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("style",e.attr("style")+";background-image:url('{{("+f.ngfBackground+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}')"),f.$set("ngfBackground",null),b(e)(d)})}}}]),ngFileUpload.config(["$compileProvider",function(a){a.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/),a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/)}]),ngFileUpload.filter("ngfDataUrl",["UploadDataUrl","$sce",function(a,b){return function(c,d){return!c||c.dataUrl||angular.isString(c)?(c&&c.dataUrl?b.trustAsResourceUrl(c.dataUrl):c)||"":(void 0===c.dataUrl&&angular.isObject(c)&&(c.dataUrl=null,a.dataUrl(c,function(a,b){b.dataUrl=a},d)),"")}}])}(),function(){function a(b){if(b.length>2&&"/"===b[0]&&"/"===b[b.length-1])return b.substring(1,b.length-1);var c=b.split(","),d="";if(c.length>1)for(var e=0;e<c.length;e++)d+="("+a(c[e])+")",e<c.length-1&&(d+="|");else 0===b.indexOf(".")&&(b="*"+b),d="^"+b.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",d=d.replace(/\\\*/g,".*").replace(/\\\?/g,".");return d}function b(a){if(angular.isString(a)){if(a.search(/kb/i)===a.length-2)return parseFloat(1e3*a.substring(0,a.length-2));if(a.search(/mb/i)===a.length-2)return parseFloat(1e6*a.substring(0,a.length-2));if(a.search(/gb/i)===a.length-2)return parseFloat(1e9*a.substring(0,a.length-2));if(a.search(/b/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/s/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/m/i)===a.length-1)return parseFloat(60*a.substring(0,a.length-1));if(a.search(/h/i)===a.length-1)return parseFloat(3600*a.substring(0,a.length-1))}return a}ngFileUpload.service("Upload",["UploadDataUrl",function(c){var d=ngFileUpload.getAttrWithDefaults;return c.validate=function(a,b,c,e,f,g){function h(a,b){b?i.push(a):j.push(a),l++,l===e.length&&g(i,j)}if(null==d(c,"ngfValidate")&&null==d(c,"ngfAccept"))return g(e);for(var i=[],j=[],k=b(d(c,"ngfAccept"))(a,{$event:f}),l=0,m=0;m<e.length;m++){var n=e[m],o=b(d(c,"ngfValidate"))(a,{$file:n,$event:f});null==o||o!==!1&&!angular.isString(o)?null!=o||null!=k?(o=o||{},null!=k&&(o.accept=k),this.validateFile(n,o,h)):h(n,!0):(n.$error="validate",n.$errorParam=o,h(n,!1))}},c.validateFile=function(c,d,e){if(null==c)return e(c,!1);var f=d.accept;if(null!=d.accept&&angular.isString(d.accept)){var g=new RegExp(a(d.accept),"gi");if(f=null!=c.type&&g.test(c.type.toLowerCase())||null!=c.name&&g.test(c.name.toLowerCase()),!f)return c.$error="accept",e(c,!1)}else if(f===!1)return c.$error="accept",e(c,!1);if(null!=c.size&&d.size&&(d.size.max||d.size.min)){if(c.size>b(d.size.max))return c.$error="size.max",c.$errorParam=d.size.max,e(c,!1);if(c.size<b(d.size.min))return c.$error="size.min",c.$errorParam=d.size.min,e(c,!1)}if(!((d.width||d.height)&&0===c.type.indexOf("image")&&(this.imageDimensions(c,function(a,f){c.width=a,c.height=f,d.width&&(d.width.min||d.width.max)&&(d.width.max&&a>b(d.width.max)&&(c.$error="width.max",c.$errorParam=d.width.max),d.width.min&&a<b(d.width.min)&&(c.$error="width.min",c.$errorParam=d.width.min),a||d.width.soft||(c.$error=d.width.min?"width.min":"width.max",c.$errorParam=d.width.min||d.width.max)),d.height&&(d.height.min||d.height.max)&&(d.height.max&&f>b(d.height.max)&&(c.$error="height.max",c.$errorParam=d.height.max),d.height.min&&f<b(d.height.min)&&(c.$error="height.min",c.$errorParam=d.height.min),f||d.height.soft||(c.$error=d.height.min?"height.min":"height.max",c.$errorParam=d.height.min||d.height.max),e(c,!c.$error))}),d.width&&(d.width.min||d.width.max)||d.height&&(d.height.min||d.height.max))||d.duration&&(0===c.type.indexOf("audio")||0===c.type.indexOf("video"))&&(this.mediaDuration(c,function(a){c.duration=a,(d.duration.min||d.duration.max)&&(d.duration.max&&a>b(d.duration.max)&&(c.$error="duration.max",c.$errorParam=d.duration.max),d.duration.min&&a<b(d.duration.min)&&(c.$error="duration.min",c.$errorParam=d.duration.min),a||d.duration.soft||(c.$error=d.duration.min?"duration.min":"duration.max",c.$errorParam=d.duration.min||d.duration.max),e(c,!c.$error))}),d.duration.min||d.duration.max)))return e(c,!0)},c.imageDimensions=function(a,b){return 0!==a.type.indexOf("image")?!1:void c.dataUrl(a,function(c){var d=angular.element("<img>").attr("src",c).css("visibility","none").css("position","fixed");d.on("load error",function(){var c=d[0].clientWidth,e=d[0].clientHeight;d.remove(),b(c,e,a)}),angular.element(document.body).append(d)},!0)},c.mediaDuration=function(a,b){return 0!==a.type.indexOf("audio")&&0!==a.type.indexOf("video")?!1:void c.dataUrl(a,function(c){var d=angular.element(0===a.type.indexOf("audio")?"<audio>":"<video>").attr("src",c).css("visibility","none").css("position","fixed");d.on("loadedmetadata error",function(){var c=d[0].duration;d.remove(),b(c,a)}),angular.element(document.body).append(d)})},c}])}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,e,f){var g=e.dataTransfer.items,i=[];if(null!=g)for(var j=0;j<g.length;j++)("file"===g[j].kind||""===g[j].kind)&&i.push(g[j]);c.validate(a,h,b,i,e,function(c,g){var i=h(d(b,"ngfDragOverClass"))(a,{$event:e});i&&(i.delay&&(r=i.delay),i.accept&&(i=g&&g.length?i.reject:i.accept)),f(i||d(b,"ngfDragOverClass")||"dragover")})}function l(b,d,e,g){function k(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;a.push({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];m++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)k(a,f[e],(c?c:"")+b.name+"/");m--}}catch(h){m--,console.error(h)}},function(){m--})};g()}else m++,b.file(function(b){try{m--,b.path=(c?c:"")+b.name,a.push(b)}catch(d){m--,console.error(d)}},function(){m--})}var l=[],m=0,n=b.dataTransfer.items;if(n&&n.length>0&&"file"!==j.protocol())for(var o=0;o<n.length;o++){if(n[o].webkitGetAsEntry&&n[o].webkitGetAsEntry()&&n[o].webkitGetAsEntry().isDirectory){var p=n[o].webkitGetAsEntry();if(p.isDirectory&&!e)continue;null!=p&&k(l,p)}else{var q=n[o].getAsFile();null!=q&&l.push(q)}if(!g&&l.length>0)break}else{var r=b.dataTransfer.files;if(null!=r)for(var s=0;s<r.length&&(l.push(r.item(s)),g||!(l.length>0));s++);}var t=0;!function u(e){i(function(){if(m)10*t++<2e4&&u(10);else{if(!g&&l.length>1){for(o=0;"directory"===l[o].type;)o++;l=[l[o]]}c.validate(a,h,f,l,b,function(a,b){d(a,b)})}},e||0)}()}var m=b();if(d(f,"dropAvailable")&&i(function(){a[d(f,"dropAvailable")]?a[d(f,"dropAvailable")].value=m:a[d(f,"dropAvailable")]=m}),!m)return void(h(d(f,"ngfHideOnDropNotAvailable"))(a)===!0&&e.css("display","none"));var n=!1;-1===d(f,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfDrop"),function(a){n=a===!1});var o,p=null,q=h(d(f,"ngfStopPropagation")),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),o||(o="C",k(a,f,b,function(a){o=a,e.addClass(o)}))}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)},h(d(f,"ngfAllowDir"))(a)!==!1,d(f,"multiple")||h(d(f,"ngfMultiple"))(a)))},!1),e[0].addEventListener("paste",function(b){if(!e.attr("disabled")&&!n){var j=[],k=b.clipboardData||b.originalEvent.clipboardData;if(k&&k.items){for(var l=0;l<k.items.length;l++)-1!==k.items[l].type.indexOf("image")&&j.push(k.items[l].getAsFile());c.validate(a,h,f,j,b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)})}}},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(e,f,g){if(b()){var h=a(d(g,"ngfDropAvailable"));c(function(){h(e),h.assign&&h.assign(e,!0)})}}}])}();

@@ -5,3 +5,3 @@ /**!

* @author Danial <danial.farid@gmail.com>
* @version 6.1.1
* @version 6.2.0
*/

@@ -8,0 +8,0 @@

@@ -1,2 +0,2 @@

/*! 6.1.1 */
/*! 6.2.0 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}});
/**!
* AngularJS file upload/drop directive and service with progress and abort
* @author Danial <danial.farid@gmail.com>
* @version 6.1.1
* @version 6.2.0
*/

@@ -25,6 +25,6 @@

ngFileUpload.version = '6.1.1';
ngFileUpload.version = '6.2.0';
ngFileUpload.defaults = {};
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
ngFileUpload.service('UploadBase', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {

@@ -202,30 +202,6 @@ config.method = config.method || 'POST';

this.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
callback(URL.createObjectURL(file));
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result);
});
};
}
});
} else {
callback(null);
}
};
this.setDefaults = function(defaults) {
ngFileUpload.defaults = defaults || {};
};
ngFileUpload.Upload = this;
}

@@ -236,3 +212,3 @@

(function () {
ngFileUpload.getAttrWithDefaults = function(attr, name) {
ngFileUpload.getAttrWithDefaults = function (attr, name) {
return attr[name] != null ? attr[name] :

@@ -243,6 +219,7 @@ (ngFileUpload.defaults[name] == null ?

var getAttr = ngFileUpload.getAttrWithDefaults;
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile', 'Upload',
function ($parse, $timeout, $compile, Upload) {
uploadService = Upload;
return {

@@ -267,4 +244,5 @@ restrict: 'AEC',

/** @namespace attr.ngfValidate */
/** @namespace attr.ngfMaxSize */
/** @namespace attr.ngfMinSize */
/** @namespace attr.ngfDuration*/
/** @namespace attr.ngfWidth*/
/** @namespace attr.ngfHeight*/
/** @namespace attr.ngfResetOnClick */

@@ -293,30 +271,13 @@ /** @namespace attr.ngfResetModelOnClick */

var isUpdating = false;
function changeFn(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
elem.$$ngfHasFile = true;
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
var fileList = evt.__files_ || (evt.target && evt.target.files);
uploadService.validate(scope, $parse, attr, fileList, evt, function(files, rejFiles) {
elem.$$ngfHasFile = true;
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) {
// angular.element(evt.target).remove();
// }
} finally {
isUpdating = false;
}
}
});
}

@@ -370,3 +331,3 @@

if (elem.$$ngfHasFile) {
updateModel($parse, $timeout, scope, ngModel, attr,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true);

@@ -378,2 +339,3 @@ delete elem.$$ngfHasFile;

var initialTouchStartY = 0;
function clickHandler(evt) {

@@ -406,3 +368,3 @@ if (elem.attr('disabled') || disabled) return false;

fileElem[0].click();
$timeout(function() {
$timeout(function () {
delete elem.$$ngfProgramClick;

@@ -457,62 +419,2 @@ }, 500);

ngFileUpload.validate = function (scope, $parse, attr, file, evt) {
if (file == null) {
return false;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
var custom = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (custom != null && (custom === false || custom.length > 0)) {
file.$error = custom ? custom : 'validate';
return false;
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt});
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991;
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1;
if (accept != null && angular.isString(accept)) {
var regexp = new RegExp(globStringToRegex(accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return false;
}
} else {
if (accept === false) {
file.$error = 'accept';
return false;
}
}
if (file.size == null) return true;
if (file.size > fileSizeMax) {
file.$error = 'maxSize';
return false;
}
if (file.size < fileSizeMin) {
file.$error = 'minSize';
return false;
}
return true;
};
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange,

@@ -543,4 +445,6 @@ files, rejFiles, evt, noDelay) {

if (ngModel) {
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && ! getAttr(attr, 'multiple') && !keep;
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && !getAttr(attr, 'multiple') && !keep;
$timeout(function() {
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
});
$timeout(function () {

@@ -579,18 +483,52 @@ if (ngModel) {

var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
})();
(function () {
var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
var getAttr = ngFileUpload.getAttrWithDefaults;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
ngFileUpload.service('UploadDataUrl', ['UploadBase', '$timeout', function(UploadBase, $timeout) {
UploadBase.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
var url;
try {
url = URL.createObjectURL(file);
} catch(e) {
callback('', file);
}
if (url) callback(url, file);
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result, file);
});
};
}
});
} else {
callback(null, file);
}
};
return UploadBase;
}]);
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('src', '{{(' + attr.ngfSrc + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}');
attr.$set('ngfSrc', null);
$compile(elem)(scope);
});
}

@@ -600,2 +538,273 @@ };

/** @namespace attr.ngfBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('style', elem.attr('style') + ';background-image:url(\'{{(' + attr.ngfBackground + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}\')');
attr.$set('ngfBackground', null);
$compile(elem)(scope);
});
}
};
}]);
ngFileUpload.config(['$compileProvider', function ($compileProvider) {
$compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
}]);
ngFileUpload.filter('ngfDataUrl', ['UploadDataUrl', '$sce', function (UploadDataUrl, $sce) {
return function (file, disallowObjectUrl) {
//return 'aaaa' + file + disallowObjectUrl + $sce + UploadDataUrl;
if (file && !file.dataUrl && !angular.isString(file)) {
if (file.dataUrl === undefined && angular.isObject(file)) {
file.dataUrl = null;
UploadDataUrl.dataUrl(file, function (url, file) {
file.dataUrl = url;
}, disallowObjectUrl);
}
return '';
}
return (file && file.dataUrl ? $sce.trustAsResourceUrl(file.dataUrl) : file) || '';
};
}]);
})();
(function () {
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
function translateScalars(str) {
if (angular.isString(str)) {
if (str.search(/kb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000);
} else if (str.search(/mb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000);
} else if (str.search(/gb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000000);
} else if (str.search(/b/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/s/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/m/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 60);
} else if (str.search(/h/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 3600);
}
}
return str;
}
ngFileUpload.service('Upload', ['UploadDataUrl', function (UploadDataUrl) {
var getAttr = ngFileUpload.getAttrWithDefaults;
UploadDataUrl.validate = function (scope, $parse, attr, files, evt, callback) {
if (getAttr(attr, 'ngfValidate') == null && getAttr(attr, 'ngfAccept') == null) {
return callback(files);
}
var accFiles = [], rejFiles = [];
function fileCallback(file, accepted) {
if (accepted) {
accFiles.push(file);
} else {
rejFiles.push(file);
}
validated++;
if (validated === files.length) {
callback(accFiles, rejFiles);
}
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$event: evt});
var validated = 0;
for (var i = 0; i < files.length; i++) {
var file = files[i];
var validator = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (validator != null && (validator === false || angular.isString(validator))) {
file.$error = 'validate';
file.$errorParam = validator;
fileCallback(file, false);
} else if (validator != null || accept != null) {
validator = validator || {};
if (accept != null) validator.accept = accept;
this.validateFile(file, validator, fileCallback);
} else {
fileCallback(file, true);
}
}
};
UploadDataUrl.validateFile = function (file, constraints, callback) {
if (file == null) {
return callback(file, false);
}
var accept = constraints.accept;
if (constraints.accept != null && angular.isString(constraints.accept)) {
var regexp = new RegExp(globStringToRegex(constraints.accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return callback(file, false);
}
} else {
if (accept === false) {
file.$error = 'accept';
return callback(file, false);
}
}
if (file.size != null && constraints.size && (constraints.size.max || constraints.size.min)) {
if (file.size > translateScalars(constraints.size.max)) {
file.$error = 'size.max';
file.$errorParam = constraints.size.max;
return callback(file, false);
}
if (file.size < translateScalars(constraints.size.min)) {
file.$error = 'size.min';
file.$errorParam = constraints.size.min;
return callback(file, false);
}
}
if ((constraints.width || constraints.height) && file.type.indexOf('image') === 0) {
this.imageDimensions(file, function (width, height) {
file.width = width;
file.height = height;
if (constraints.width && (constraints.width.min || constraints.width.max)) {
if (constraints.width.max && width > translateScalars(constraints.width.max)) {
file.$error = 'width.max';
file.$errorParam = constraints.width.max;
}
if (constraints.width.min && width < translateScalars(constraints.width.min)) {
file.$error = 'width.min';
file.$errorParam = constraints.width.min;
}
if (!width && !constraints.width.soft) {
file.$error = constraints.width.min ? 'width.min' : 'width.max';
file.$errorParam = constraints.width.min || constraints.width.max;
}
}
if (constraints.height && (constraints.height.min || constraints.height.max)) {
if (constraints.height.max && height > translateScalars(constraints.height.max)) {
file.$error = 'height.max';
file.$errorParam = constraints.height.max;
}
if (constraints.height.min && height < translateScalars(constraints.height.min)) {
file.$error = 'height.min';
file.$errorParam = constraints.height.min;
}
if (!height && !constraints.height.soft) {
file.$error = constraints.height.min ? 'height.min' : 'height.max';
file.$errorParam = constraints.height.min || constraints.height.max;
}
callback(file, !file.$error);
}
});
if ((constraints.width && (constraints.width.min || constraints.width.max)) ||
(constraints.height && (constraints.height.min || constraints.height.max))) return;
}
if ((constraints.duration) &&
(file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0)) {
this.mediaDuration(file, function (duration) {
file.duration = duration;
if (constraints.duration.min || constraints.duration.max) {
if (constraints.duration.max && duration > translateScalars(constraints.duration.max)) {
file.$error = 'duration.max';
file.$errorParam = constraints.duration.max;
}
if (constraints.duration.min && duration < translateScalars(constraints.duration.min)) {
file.$error = 'duration.min';
file.$errorParam = constraints.duration.min;
}
if (!duration && !constraints.duration.soft) {
file.$error = constraints.duration.min ? 'duration.min' : 'duration.max';
file.$errorParam = constraints.duration.min || constraints.duration.max;
}
callback(file, !file.$error);
}
});
if (constraints.duration.min || constraints.duration.max) return;
}
return callback(file, true);
};
UploadDataUrl.imageDimensions = function (file, callback) {
if (file.type.indexOf('image') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var img = angular.element('<img>').attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
img.on('load error', function () {
var width = img[0].clientWidth;
var height = img[0].clientHeight;
img.remove();
callback(width, height, file);
});
angular.element(document.body).append(img);
}, true);
} else {
return false;
}
};
UploadDataUrl.mediaDuration = function (file, callback) {
if (file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var el = angular.element(file.type.indexOf('audio') === 0 ? '<audio>' : '<video>')
.attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
el.on('loadedmetadata error', function () {
var duration = el[0].duration;
el.remove();
callback(duration, file);
});
angular.element(document.body).append(el);
});
} else {
return false;
}
};
return UploadDataUrl;
}]);
})();
(function () {
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', 'Upload',
function ($parse, $timeout, $location, Upload) {
uploadService = Upload;
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
};
}]);
ngFileUpload.directive('ngfNoFileDrop', function () {

@@ -641,3 +850,3 @@ return function (scope, elem) {

if (getAttr(attr, 'ngfDrop').search(/\W+\$files\W+/) === -1) {
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) {
scope.$watch(getAttr(attr, 'ngfDrop'), function (val) {
disabled = val === false;

@@ -662,6 +871,9 @@ });

$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
if (!actualDragOverClass) {
actualDragOverClass = 'C';
calculateDragOverClass(scope, attr, evt, function (clazz) {
actualDragOverClass = clazz;
elem.addClass(actualDragOverClass);
});
}
elem.addClass(actualDragOverClass);
}, false);

@@ -687,5 +899,5 @@ elem[0].addEventListener('dragenter', function (evt) {

extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));

@@ -695,37 +907,39 @@ }, false);

if (elem.attr('disabled') || disabled) return;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, false, getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));
var files = [];
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
files.push(clipboard.items[k].getAsFile());
}
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
});
}
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
function calculateDragOverClass(scope, attr, evt, callback) {
var items = evt.dataTransfer.items, files = [];
if (items != null) {
for (var i = 0; i < items.length && accepted; i++) {
accepted = accepted &&
(items[i].kind === 'file' || items[i].kind === '') &&
validate(scope, $parse, attr, items[i], evt);
for (var i = 0; i < items.length; i++) {
if (items[i].kind === 'file' || items[i].kind === '') {
files.push(items[i]);
}
}
}
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover';
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = !rejFiles || !rejFiles.length ? clazz.accept : clazz.reject;
}
callback(clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover');
});
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], processing = 0;
var files = [], processing = 0;
function addFile(file) {
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
function traverseFileTree(files, entry, path) {

@@ -735,3 +949,3 @@ if (entry != null) {

var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
files.push({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();

@@ -767,3 +981,3 @@ var entries = [];

file.path = (path ? path : '') + file.name;
addFile(file);
files.push(file);
} catch (e) {

@@ -780,60 +994,50 @@ processing--;

if (evt.type === 'paste') {
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
addFile(clipboard.items[k].getAsFile());
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) files.push(f);
}
callback(files, rejFiles);
if (!multiple && files.length > 0) break;
}
} else {
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
files.push(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
addFile(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
});
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}, delay || 0);
})();
}
}
}, delay || 0);
})();
}

@@ -848,66 +1052,1 @@ }

})();
(function () {
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) {
if (defaultName) {
callback($parse(defaultName)(scope));
}
scope.$watch(name, function (file) {
if (!angular.isString(file)) {
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) {
Upload.dataUrl(file, function (url) {
if (callback) {
callback(url);
} else {
file.dataUrl = url || $parse(defaultName)(scope);
}
}, $parse(attr.ngfNoObjectUrl)(scope));
}
} else {
callback(file);
}
});
}
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfDefaultSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) {
elem.attr('src', url);
});
}
};
}]);
/** @namespace attr.ngfBackground */
/** @namespace attr.ngfDefaultBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) {
elem.css('background-image', 'url(' + url + ')');
});
}
};
}]);
/** @namespace attr.ngfDataUrl */
/** @namespace attr.ngfDefaultDataUrl */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl);
}
};
}]);
})();

@@ -1,2 +0,2 @@

/*! 6.1.1 */
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.1.1",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var k=b.__files_||b.target&&b.target.files,l=[],m=[],n=0;n<k.length;n++){var o=k.item(n);d(a,i,g,o,b)?l.push(o):m.push(o)}f.$$ngfHasFile=!0,e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),l,m,b),0===l.length&&(b.target.value=l)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&((null==e.value||""===e.value)&&("required"===e.name&&(e.value="required"),"multiple"===e.name&&(e.value="multiple")),b.attr(e.name,e.value))}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;if(f.$$ngfProgramClick)return f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){f.$$ngfHasFile&&(e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0),delete f.$$ngfHasFile)}function q(d){function e(a){a&&!f.$$ngfProgramClick&&(f.$$ngfProgramClick=!0,s[0].click(),j(function(){delete f.$$ngfProgramClick},500)),!l()&&a||!n||f.bind("click touchstart touchend",q)}if(f.attr("disabled")||r)return!1;if(null!=d){var h=d.changedTouches||d.originalEvent&&d.originalEvent.changedTouches;if("touchstart"===d.type)return t=h?h[0].clientY:0,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var k=h?h[0].clientY:0;if(Math.abs(k-t)>20)return!1}}var n=i(c(g,"ngfResetOnClick"))(a)!==!1,s=o(d,n);return s&&((!d||n)&&s.bind("change",m),d&&n&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){function g(a){if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])return a.substring(1,a.length-1);var b=a.split(","),c="";if(b.length>1)for(var d=0;d<b.length;d++)c+="("+g(b[d])+")",d<b.length-1&&(c+="|");else 0===a.indexOf(".")&&(a="*"+a),c="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",c=c.replace(/\\\*/g,".*").replace(/\\\?/g,".");return c}if(null==e)return!1;var h=b(c(d,"ngfValidate"))(a,{$file:e,$event:f});if(null!=h&&(h===!1||h.length>0))return e.$error=h?h:"validate",!1;var i=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),j=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,k=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=i&&angular.isString(i)){var l=new RegExp(g(i),"gi");if(i=null!=e.type&&l.test(e.type.toLowerCase())||null!=e.name&&l.test(e.name.toLowerCase()),!i)return e.$error="accept",!1}else if(i===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>j?(e.$error="maxSize",!1):e.size<k?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){var k=a(c(f,"ngfKeep"))(d);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(c(f,"ngfMultiple"))(d)&&!c(f,"multiple")&&!k;a(c(f,"ngModel")).assign(d,q?p:h),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=c(f,"ngfModel");r&&a(r).assign(d,h),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];o++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");o--}}catch(h){o--,console.error(h)}},function(){o--})};g()}else o++,b.file(function(a){try{o--,a.path=(c?c:"")+a.name,h(a)}catch(b){o--,console.error(b)}},function(){o--})}var m=[],n=[],o=0;if("paste"===b.type){var p=b.clipboardData||b.originalEvent.clipboardData;if(p&&p.items){for(var q=0;q<p.items.length;q++)-1!==p.items[q].type.indexOf("image")&&h(p.items[q].getAsFile());d(m,n)}}else{var r=b.dataTransfer.items;if(r&&r.length>0&&"file"!==k.protocol())for(var s=0;s<r.length;s++){if(r[s].webkitGetAsEntry&&r[s].webkitGetAsEntry()&&r[s].webkitGetAsEntry().isDirectory){var t=r[s].webkitGetAsEntry();if(t.isDirectory&&!e)continue;null!=t&&l(m,t)}else{var u=r[s].getAsFile();null!=u&&h(u)}if(!f&&m.length>0)break}else{var v=b.dataTransfer.files;if(null!=v)for(var w=0;w<v.length&&(h(v.item(w)),f||!(m.length>0));w++);}var x=0;!function y(a){j(function(){if(o)10*x++<2e4&&y(10);else{if(!f&&m.length>1){for(s=0;"directory"===m[s].type;)s++;m=[m[s]]}d(m,n)}},a||0)}()}}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1),f[0].addEventListener("paste",function(b){f.attr("disabled")||o||m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){f&&g(c(f)(b)),b.$watch(e,function(e){angular.isString(e)?g(e):window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}();
/*! 6.2.0 */
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.2.0",ngFileUpload.defaults={},ngFileUpload.service("UploadBase",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}},ngFileUpload.Upload=this}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){var j=b.__files_||b.target&&b.target.files;c.validate(a,h,f,j,b,function(c,j){e.$$ngfHasFile=!0,ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),c,j,b),0===c.length&&(b.target.value=c)})}function m(b){d(f,"ngfMultiple")&&b.attr("multiple",h(d(f,"ngfMultiple"))(a)),d(f,"ngfCapture")&&b.attr("capture",h(d(f,"ngfCapture"))(a)),d(f,"accept")&&b.attr("accept",d(f,"accept"));for(var c=0;c<e[0].attributes.length;c++){var g=e[0].attributes[c];(k()&&"type"!==g.name||"type"!==g.name&&"class"!==g.name&&"id"!==g.name&&"style"!==g.name)&&((null==g.value||""===g.value)&&("required"===g.name&&(g.value="required"),"multiple"===g.name&&(g.value="multiple")),b.attr(g.name,g.value))}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;if(e.$$ngfProgramClick)return e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){e.$$ngfHasFile&&(ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),[],[],b,!0),delete e.$$ngfHasFile)}function p(c){function g(a){a&&!e.$$ngfProgramClick&&(e.$$ngfProgramClick=!0,t[0].click(),i(function(){delete e.$$ngfProgramClick},500)),!k()&&a||!s||e.bind("click touchstart touchend",p)}if(e.attr("disabled")||q)return!1;if(null!=c){var j=c.changedTouches||c.originalEvent&&c.originalEvent.changedTouches;if("touchstart"===c.type)return r=j?j[0].clientY:0,!0;if(c.stopPropagation(),c.preventDefault(),"touchend"===c.type){var m=j?j[0].clientY:0;if(Math.abs(m-r)>20)return!1}}var s=h(d(f,"ngfResetOnClick"))(a)!==!1,t=n(c,s);return t&&((!c||s)&&t.bind("change",l),c&&s&&h(d(f,"ngfResetModelOnClick"))(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){g(c)},0):g(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===d(f,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfSelect"),function(a){q=a===!1});var r=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.updateModel=function(a,b,c,e,f,g,h,i,j,k){function l(){var k=a(d(f,"ngfKeep"))(c);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(d(f,"ngfKeepDistinct"))(c)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(d(f,"ngfMultiple"))(c)&&!d(f,"multiple")&&!k;b(function(){a(d(f,"ngModel")).assign(c,q?p:h)}),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=d(f,"ngfModel");r&&a(r).assign(c,h),d(f,"ngModelRejected")&&a(d(f,"ngModelRejected")).assign(c,i),g&&a(g)(c,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})}}(),function(){ngFileUpload.service("UploadDataUrl",["UploadBase","$timeout",function(a,b){return a.dataUrl=function(a,c,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?b(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d){var f;try{f=e.createObjectURL(a)}catch(g){c("",a)}f&&c(f,a)}else{var h=new FileReader;h.readAsDataURL(a),h.onload=function(d){b(function(){c(d.target.result,a)})}}}):c(null,a)},a}]),ngFileUpload.directive("ngfSrc",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("src","{{("+f.ngfSrc+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}"),f.$set("ngfSrc",null),b(e)(d)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("style",e.attr("style")+";background-image:url('{{("+f.ngfBackground+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}')"),f.$set("ngfBackground",null),b(e)(d)})}}}]),ngFileUpload.config(["$compileProvider",function(a){a.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/),a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/)}]),ngFileUpload.filter("ngfDataUrl",["UploadDataUrl","$sce",function(a,b){return function(c,d){return!c||c.dataUrl||angular.isString(c)?(c&&c.dataUrl?b.trustAsResourceUrl(c.dataUrl):c)||"":(void 0===c.dataUrl&&angular.isObject(c)&&(c.dataUrl=null,a.dataUrl(c,function(a,b){b.dataUrl=a},d)),"")}}])}(),function(){function a(b){if(b.length>2&&"/"===b[0]&&"/"===b[b.length-1])return b.substring(1,b.length-1);var c=b.split(","),d="";if(c.length>1)for(var e=0;e<c.length;e++)d+="("+a(c[e])+")",e<c.length-1&&(d+="|");else 0===b.indexOf(".")&&(b="*"+b),d="^"+b.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",d=d.replace(/\\\*/g,".*").replace(/\\\?/g,".");return d}function b(a){if(angular.isString(a)){if(a.search(/kb/i)===a.length-2)return parseFloat(1e3*a.substring(0,a.length-2));if(a.search(/mb/i)===a.length-2)return parseFloat(1e6*a.substring(0,a.length-2));if(a.search(/gb/i)===a.length-2)return parseFloat(1e9*a.substring(0,a.length-2));if(a.search(/b/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/s/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/m/i)===a.length-1)return parseFloat(60*a.substring(0,a.length-1));if(a.search(/h/i)===a.length-1)return parseFloat(3600*a.substring(0,a.length-1))}return a}ngFileUpload.service("Upload",["UploadDataUrl",function(c){var d=ngFileUpload.getAttrWithDefaults;return c.validate=function(a,b,c,e,f,g){function h(a,b){b?i.push(a):j.push(a),l++,l===e.length&&g(i,j)}if(null==d(c,"ngfValidate")&&null==d(c,"ngfAccept"))return g(e);for(var i=[],j=[],k=b(d(c,"ngfAccept"))(a,{$event:f}),l=0,m=0;m<e.length;m++){var n=e[m],o=b(d(c,"ngfValidate"))(a,{$file:n,$event:f});null==o||o!==!1&&!angular.isString(o)?null!=o||null!=k?(o=o||{},null!=k&&(o.accept=k),this.validateFile(n,o,h)):h(n,!0):(n.$error="validate",n.$errorParam=o,h(n,!1))}},c.validateFile=function(c,d,e){if(null==c)return e(c,!1);var f=d.accept;if(null!=d.accept&&angular.isString(d.accept)){var g=new RegExp(a(d.accept),"gi");if(f=null!=c.type&&g.test(c.type.toLowerCase())||null!=c.name&&g.test(c.name.toLowerCase()),!f)return c.$error="accept",e(c,!1)}else if(f===!1)return c.$error="accept",e(c,!1);if(null!=c.size&&d.size&&(d.size.max||d.size.min)){if(c.size>b(d.size.max))return c.$error="size.max",c.$errorParam=d.size.max,e(c,!1);if(c.size<b(d.size.min))return c.$error="size.min",c.$errorParam=d.size.min,e(c,!1)}if(!((d.width||d.height)&&0===c.type.indexOf("image")&&(this.imageDimensions(c,function(a,f){c.width=a,c.height=f,d.width&&(d.width.min||d.width.max)&&(d.width.max&&a>b(d.width.max)&&(c.$error="width.max",c.$errorParam=d.width.max),d.width.min&&a<b(d.width.min)&&(c.$error="width.min",c.$errorParam=d.width.min),a||d.width.soft||(c.$error=d.width.min?"width.min":"width.max",c.$errorParam=d.width.min||d.width.max)),d.height&&(d.height.min||d.height.max)&&(d.height.max&&f>b(d.height.max)&&(c.$error="height.max",c.$errorParam=d.height.max),d.height.min&&f<b(d.height.min)&&(c.$error="height.min",c.$errorParam=d.height.min),f||d.height.soft||(c.$error=d.height.min?"height.min":"height.max",c.$errorParam=d.height.min||d.height.max),e(c,!c.$error))}),d.width&&(d.width.min||d.width.max)||d.height&&(d.height.min||d.height.max))||d.duration&&(0===c.type.indexOf("audio")||0===c.type.indexOf("video"))&&(this.mediaDuration(c,function(a){c.duration=a,(d.duration.min||d.duration.max)&&(d.duration.max&&a>b(d.duration.max)&&(c.$error="duration.max",c.$errorParam=d.duration.max),d.duration.min&&a<b(d.duration.min)&&(c.$error="duration.min",c.$errorParam=d.duration.min),a||d.duration.soft||(c.$error=d.duration.min?"duration.min":"duration.max",c.$errorParam=d.duration.min||d.duration.max),e(c,!c.$error))}),d.duration.min||d.duration.max)))return e(c,!0)},c.imageDimensions=function(a,b){return 0!==a.type.indexOf("image")?!1:void c.dataUrl(a,function(c){var d=angular.element("<img>").attr("src",c).css("visibility","none").css("position","fixed");d.on("load error",function(){var c=d[0].clientWidth,e=d[0].clientHeight;d.remove(),b(c,e,a)}),angular.element(document.body).append(d)},!0)},c.mediaDuration=function(a,b){return 0!==a.type.indexOf("audio")&&0!==a.type.indexOf("video")?!1:void c.dataUrl(a,function(c){var d=angular.element(0===a.type.indexOf("audio")?"<audio>":"<video>").attr("src",c).css("visibility","none").css("position","fixed");d.on("loadedmetadata error",function(){var c=d[0].duration;d.remove(),b(c,a)}),angular.element(document.body).append(d)})},c}])}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,e,f){var g=e.dataTransfer.items,i=[];if(null!=g)for(var j=0;j<g.length;j++)("file"===g[j].kind||""===g[j].kind)&&i.push(g[j]);c.validate(a,h,b,i,e,function(c,g){var i=h(d(b,"ngfDragOverClass"))(a,{$event:e});i&&(i.delay&&(r=i.delay),i.accept&&(i=g&&g.length?i.reject:i.accept)),f(i||d(b,"ngfDragOverClass")||"dragover")})}function l(b,d,e,g){function k(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;a.push({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];m++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)k(a,f[e],(c?c:"")+b.name+"/");m--}}catch(h){m--,console.error(h)}},function(){m--})};g()}else m++,b.file(function(b){try{m--,b.path=(c?c:"")+b.name,a.push(b)}catch(d){m--,console.error(d)}},function(){m--})}var l=[],m=0,n=b.dataTransfer.items;if(n&&n.length>0&&"file"!==j.protocol())for(var o=0;o<n.length;o++){if(n[o].webkitGetAsEntry&&n[o].webkitGetAsEntry()&&n[o].webkitGetAsEntry().isDirectory){var p=n[o].webkitGetAsEntry();if(p.isDirectory&&!e)continue;null!=p&&k(l,p)}else{var q=n[o].getAsFile();null!=q&&l.push(q)}if(!g&&l.length>0)break}else{var r=b.dataTransfer.files;if(null!=r)for(var s=0;s<r.length&&(l.push(r.item(s)),g||!(l.length>0));s++);}var t=0;!function u(e){i(function(){if(m)10*t++<2e4&&u(10);else{if(!g&&l.length>1){for(o=0;"directory"===l[o].type;)o++;l=[l[o]]}c.validate(a,h,f,l,b,function(a,b){d(a,b)})}},e||0)}()}var m=b();if(d(f,"dropAvailable")&&i(function(){a[d(f,"dropAvailable")]?a[d(f,"dropAvailable")].value=m:a[d(f,"dropAvailable")]=m}),!m)return void(h(d(f,"ngfHideOnDropNotAvailable"))(a)===!0&&e.css("display","none"));var n=!1;-1===d(f,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfDrop"),function(a){n=a===!1});var o,p=null,q=h(d(f,"ngfStopPropagation")),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),o||(o="C",k(a,f,b,function(a){o=a,e.addClass(o)}))}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)},h(d(f,"ngfAllowDir"))(a)!==!1,d(f,"multiple")||h(d(f,"ngfMultiple"))(a)))},!1),e[0].addEventListener("paste",function(b){if(!e.attr("disabled")&&!n){var j=[],k=b.clipboardData||b.originalEvent.clipboardData;if(k&&k.items){for(var l=0;l<k.items.length;l++)-1!==k.items[l].type.indexOf("image")&&j.push(k.items[l].getAsFile());c.validate(a,h,f,j,b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)})}}},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(e,f,g){if(b()){var h=a(d(g,"ngfDropAvailable"));c(function(){h(e),h.assign&&h.assign(e,!0)})}}}])}();

@@ -5,232 +5,238 @@ 'use strict';

var app = angular.module('fileUpload', ['ngFileUpload']);
var version = '6.0.3';
var version = '6.2.0';
app.controller('MyCtrl', ['$scope', '$http', '$timeout', '$compile', 'Upload', function ($scope, $http, $timeout, $compile, Upload) {
$scope.usingFlash = FileAPI && FileAPI.upload != null;
//Upload.setDefaults({ngfKeep: true, ngfResetModelOnClick: false, ngfResetOnClick:false});
$scope.changeAngularVersion = function () {
window.location.hash = $scope.angularVersion;
window.location.reload(true);
};
$scope.angularVersion = window.location.hash.length > 1 ? (window.location.hash.indexOf('/') === 1 ?
window.location.hash.substring(2) : window.location.hash.substring(1)) : '1.2.20';
$scope.usingFlash = FileAPI && FileAPI.upload != null;
//Upload.setDefaults({ngfKeep: true, ngfResetModelOnClick: false, ngfResetOnClick:false});
$scope.changeAngularVersion = function () {
window.location.hash = $scope.angularVersion;
window.location.reload(true);
};
$scope.angularVersion = window.location.hash.length > 1 ? (window.location.hash.indexOf('/') === 1 ?
window.location.hash.substring(2) : window.location.hash.substring(1)) : '1.2.20';
$scope.$watch('files', function (files) {
$scope.formUpload = false;
if (files != null) {
if (!angular.isArray(files)) {
$timeout(function() {
$scope.files = files = [files];
});
return;
}
for (var i = 0; i < files.length; i++) {
$scope.errorMsg = null;
(function (f) {
upload(f);
})(files[i]);
}
}
});
$scope.$watch('files', function (files) {
$scope.formUpload = false;
if (files != null) {
if (!angular.isArray(files)) {
$timeout(function () {
$scope.files = files = [files];
});
return;
}
for (var i = 0; i < files.length; i++) {
$scope.errorMsg = null;
(function (f) {
upload(f);
})(files[i]);
}
}
});
$scope.uploadPic = function(file) {
$scope.formUpload = true;
if (file != null) {
upload(file)
}
};
$scope.uploadPic = function (file) {
$scope.formUpload = true;
if (file != null) {
upload(file)
}
};
function upload(file) {
$scope.errorMsg = null;
if ($scope.howToSend === 1) {
uploadUsingUpload(file);
} else if ($scope.howToSend == 2) {
uploadUsing$http(file);
} else {
uploadS3(file);
}
function upload(file) {
$scope.errorMsg = null;
if ($scope.howToSend === 1) {
uploadUsingUpload(file);
} else if ($scope.howToSend == 2) {
uploadUsing$http(file);
} else {
uploadS3(file);
}
}
function uploadUsingUpload(file) {
file.upload = Upload.upload({
url: 'https://angular-file-upload-cors-srv.appspot.com/upload' + $scope.getReqParams(),
method: 'POST',
headers: {
'my-header': 'my-header-value'
},
fields: {username: $scope.username},
file: file,
fileFormDataName: 'myFile'
});
function uploadUsingUpload(file) {
file.upload = Upload.upload({
url: 'https://angular-file-upload-cors-srv.appspot.com/upload' + $scope.getReqParams(),
method: 'POST',
headers: {
'my-header': 'my-header-value'
},
fields: {username: $scope.username},
file: file,
fileFormDataName: 'myFile'
});
file.upload.then(function (response) {
$timeout(function () {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.then(function (response) {
$timeout(function () {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.progress(function (evt) {
// Math.min is to fix IE which reports 200% sometimes
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
file.upload.progress(function (evt) {
// Math.min is to fix IE which reports 200% sometimes
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
file.upload.xhr(function (xhr) {
// xhr.upload.addEventListener('abort', function(){console.log('abort complete')}, false);
});
}
file.upload.xhr(function (xhr) {
// xhr.upload.addEventListener('abort', function(){console.log('abort complete')}, false);
});
}
function uploadUsing$http(file) {
file.upload = Upload.http({
url: 'https://angular-file-upload-cors-srv.appspot.com/upload' + $scope.getReqParams(),
method: 'POST',
headers: {
'Content-Type': file.type
},
data: file
});
function uploadUsing$http(file) {
file.upload = Upload.http({
url: 'https://angular-file-upload-cors-srv.appspot.com/upload' + $scope.getReqParams(),
method: 'POST',
headers: {
'Content-Type': file.type
},
data: file
});
file.upload.then(function (response) {
file.result = response.data;
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.then(function (response) {
file.result = response.data;
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.progress(function (evt) {
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
file.upload.progress(function (evt) {
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
function uploadS3(file) {
file.upload = Upload.upload({
url: $scope.s3url,
method: 'POST',
fields: {
key: file.name,
AWSAccessKeyId: $scope.AWSAccessKeyId,
acl: $scope.acl,
policy: $scope.policy,
signature: $scope.signature,
'Content-Type': file.type === null || file.type === '' ? 'application/octet-stream' : file.type,
filename: file.name
},
file: file
});
function uploadS3(file) {
file.upload = Upload.upload({
url: $scope.s3url,
method: 'POST',
fields: {
key: file.name,
AWSAccessKeyId: $scope.AWSAccessKeyId,
acl: $scope.acl,
policy: $scope.policy,
signature: $scope.signature,
'Content-Type': file.type === null || file.type === '' ? 'application/octet-stream' : file.type,
filename: file.name
},
file: file
});
file.upload.then(function (response) {
$timeout(function () {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.then(function (response) {
$timeout(function () {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.progress(function (evt) {
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
storeS3UploadConfigInLocalStore();
}
file.upload.progress(function (evt) {
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
storeS3UploadConfigInLocalStore();
}
$scope.generateSignature = function () {
$http.post('/s3sign?aws-secret-key=' + encodeURIComponent($scope.AWSSecretKey), $scope.jsonPolicy).
success(function (data) {
$scope.policy = data.policy;
$scope.signature = data.signature;
});
};
$scope.generateSignature = function () {
$http.post('/s3sign?aws-secret-key=' + encodeURIComponent($scope.AWSSecretKey), $scope.jsonPolicy).
success(function (data) {
$scope.policy = data.policy;
$scope.signature = data.signature;
});
};
if (localStorage) {
$scope.s3url = localStorage.getItem('s3url');
$scope.AWSAccessKeyId = localStorage.getItem('AWSAccessKeyId');
$scope.acl = localStorage.getItem('acl');
$scope.success_action_redirect = localStorage.getItem('success_action_redirect');
$scope.policy = localStorage.getItem('policy');
$scope.signature = localStorage.getItem('signature');
if (localStorage) {
$scope.s3url = localStorage.getItem('s3url');
$scope.AWSAccessKeyId = localStorage.getItem('AWSAccessKeyId');
$scope.acl = localStorage.getItem('acl');
$scope.success_action_redirect = localStorage.getItem('success_action_redirect');
$scope.policy = localStorage.getItem('policy');
$scope.signature = localStorage.getItem('signature');
}
$scope.success_action_redirect = $scope.success_action_redirect || window.location.protocol + '//' + window.location.host;
$scope.jsonPolicy = $scope.jsonPolicy || '{\n "expiration": "2020-01-01T00:00:00Z",\n "conditions": [\n {"bucket": "angular-file-upload"},\n ["starts-with", "$key", ""],\n {"acl": "private"},\n ["starts-with", "$Content-Type", ""],\n ["starts-with", "$filename", ""],\n ["content-length-range", 0, 524288000]\n ]\n}';
$scope.acl = $scope.acl || 'private';
function storeS3UploadConfigInLocalStore() {
if ($scope.howToSend === 3 && localStorage) {
localStorage.setItem('s3url', $scope.s3url);
localStorage.setItem('AWSAccessKeyId', $scope.AWSAccessKeyId);
localStorage.setItem('acl', $scope.acl);
localStorage.setItem('success_action_redirect', $scope.success_action_redirect);
localStorage.setItem('policy', $scope.policy);
localStorage.setItem('signature', $scope.signature);
}
}
$scope.success_action_redirect = $scope.success_action_redirect || window.location.protocol + '//' + window.location.host;
$scope.jsonPolicy = $scope.jsonPolicy || '{\n "expiration": "2020-01-01T00:00:00Z",\n "conditions": [\n {"bucket": "angular-file-upload"},\n ["starts-with", "$key", ""],\n {"acl": "private"},\n ["starts-with", "$Content-Type", ""],\n ["starts-with", "$filename", ""],\n ["content-length-range", 0, 524288000]\n ]\n}';
$scope.acl = $scope.acl || 'private';
(function handleDynamicEditingOfScriptsAndHtml($scope) {
$scope.defaultHtml = document.getElementById('editArea').innerHTML.replace(/\t\t\t\t/g, '');
function storeS3UploadConfigInLocalStore() {
if ($scope.howToSend === 3 && localStorage) {
localStorage.setItem('s3url', $scope.s3url);
localStorage.setItem('AWSAccessKeyId', $scope.AWSAccessKeyId);
localStorage.setItem('acl', $scope.acl);
localStorage.setItem('success_action_redirect', $scope.success_action_redirect);
localStorage.setItem('policy', $scope.policy);
localStorage.setItem('signature', $scope.signature);
}
var fromLocal = (localStorage && localStorage.getItem('editHtml' + version));
$scope.editHtml = fromLocal || $scope.defaultHtml;
function htmlEdit() {
document.getElementById('editArea').innerHTML = $scope.editHtml;
$compile(document.getElementById('editArea'))($scope);
$scope.editHtml && localStorage && localStorage.setItem('editHtml' + version, $scope.editHtml);
if ($scope.editHtml != $scope.htmlEditor.getValue()) $scope.htmlEditor.setValue($scope.editHtml);
}
(function handleDynamicEditingOfScriptsAndHtml($scope) {
$scope.defaultHtml = document.getElementById('editArea').innerHTML.replace(/\t\t\t\t/g, '');
$scope.$watch('editHtml', htmlEdit);
var fromLocal = (localStorage && localStorage.getItem('editHtml' + version));
$scope.editHtml = fromLocal || $scope.defaultHtml;
function htmlEdit() {
document.getElementById('editArea').innerHTML = $scope.editHtml;
$compile(document.getElementById('editArea'))($scope);
$scope.editHtml && localStorage && localStorage.setItem('editHtml' + version, $scope.editHtml);
if ($scope.editHtml != $scope.htmlEditor.getValue()) $scope.htmlEditor.setValue($scope.editHtml);
}
$scope.htmlEditor = CodeMirror(document.getElementById('htmlEdit'), {
lineNumbers: true, indentUnit: 4,
mode: 'htmlmixed'
});
$scope.htmlEditor.on('change', function () {
if ($scope.editHtml != $scope.htmlEditor.getValue()) {
$scope.editHtml = $scope.htmlEditor.getValue();
htmlEdit();
}
});
})($scope, $http);
$scope.$watch('editHtml', htmlEdit);
$scope.confirm = function () {
return confirm('Are you sure? Your local changes will be lost.');
};
$scope.htmlEditor = CodeMirror(document.getElementById('htmlEdit'), {
lineNumbers: true, indentUnit: 4,
mode: 'htmlmixed'
});
$scope.htmlEditor.on('change', function () {
if ($scope.editHtml != $scope.htmlEditor.getValue()) {
$scope.editHtml = $scope.htmlEditor.getValue();
htmlEdit();
}
});
})($scope, $http);
$scope.getReqParams = function () {
return $scope.generateErrorOnServer ? '?errorCode=' + $scope.serverErrorCode +
'&errorMessage=' + $scope.serverErrorMsg : '';
};
$scope.confirm = function () {
return confirm('Are you sure? Your local changes will be lost.');
};
angular.element(window).bind('dragover', function (e) {
e.preventDefault();
});
angular.element(window).bind('drop', function (e) {
e.preventDefault();
});
$scope.getReqParams = function () {
return $scope.generateErrorOnServer ? '?errorCode=' + $scope.serverErrorCode +
'&errorMessage=' + $scope.serverErrorMsg : '';
};
$scope.$watch('validate', function (v) {
$scope.validateObj = eval('(function(){return ' + v + ';})()');
});
angular.element(window).bind('dragover', function (e) {
e.preventDefault();
$timeout(function () {
$scope.capture = localStorage.getItem('capture' + version) || 'camera';
$scope.accept = localStorage.getItem('accept' + version) || 'image/*,audio/*,video/*';
$scope.acceptSelect = localStorage.getItem('acceptSelect' + version) || 'image/*,audio/*,video/*';
$scope.disabled = localStorage.getItem('disabled' + version) == 'true' || false;
$scope.multiple = localStorage.getItem('multiple' + version) == 'true' || false;
$scope.allowDir = localStorage.getItem('allowDir' + version) == 'true' || true;
$scope.validate = localStorage.getItem('validate' + version) || '{size: {max: \'20MB\', min: \'10B\'}, height: {max: 5000}, width: {max: 5000}, duration: {max: \'5m\'}}';
$scope.resetOnClick = localStorage.getItem('resetOnClick' + version) == 'true' || true;
$scope.resetModelOnClick = localStorage.getItem('resetModelOnClick' + version) == 'true' || true;
$scope.keep = localStorage.getItem('keep' + version) == 'true' || false;
$scope.keepDistinct = localStorage.getItem('keepDistinct' + version) == 'true' || false;
$scope.$watch('validate+capture+accept+acceptSelect+disabled+capture+multiple+allowDir+resetOnClick+resetModelOnClick+keep+keepDistinct', function () {
localStorage.setItem('capture' + version, $scope.capture);
localStorage.setItem('accept' + version, $scope.accept);
localStorage.setItem('acceptSelect' + version, $scope.acceptSelect);
localStorage.setItem('disabled' + version, $scope.disabled);
localStorage.setItem('multiple' + version, $scope.multiple);
localStorage.setItem('allowDir' + version, $scope.allowDir);
localStorage.setItem('validate' + version, $scope.validate);
localStorage.setItem('resetOnClick' + version, $scope.resetOnClick);
localStorage.setItem('resetModelOnClick' + version, $scope.resetModelOnClick);
localStorage.setItem('keep' + version, $scope.keep);
localStorage.setItem('keepDistinct' + version, $scope.keepDistinct);
});
angular.element(window).bind('drop', function (e) {
e.preventDefault();
});
$timeout(function () {
$scope.capture = localStorage.getItem('capture' + version) || 'camera';
$scope.accept = localStorage.getItem('accept' + version) || 'image/*,audio/*,video/*';
$scope.acceptSelect = localStorage.getItem('acceptSelect' + version) || 'image/*,audio/*,video/*';
$scope.disabled = localStorage.getItem('disabled' + version) == 'true' || false;
$scope.multiple = localStorage.getItem('multiple' + version) == 'true' || false;
$scope.allowDir = localStorage.getItem('allowDir' + version) == 'true' || true;
$scope.resetOnClick = localStorage.getItem('resetOnClick' + version) == 'true' || true;
$scope.resetModelOnClick = localStorage.getItem('resetModelOnClick' + version) == 'true' || true;
$scope.keep = localStorage.getItem('keep' + version) == 'true' || false;
$scope.keepDistinct = localStorage.getItem('keepDistinct' + version) == 'true' || false;
$scope.$watch('capture+accept+acceptSelect+disabled+capture+multiple+allowDir+resetOnClick+resetModelOnClick+keep+keepDistinct', function () {
localStorage.setItem('capture' + version, $scope.capture);
localStorage.setItem('accept' + version, $scope.accept);
localStorage.setItem('acceptSelect' + version, $scope.acceptSelect);
localStorage.setItem('disabled' + version, $scope.disabled);
localStorage.setItem('multiple' + version, $scope.multiple);
localStorage.setItem('allowDir' + version, $scope.allowDir);
localStorage.setItem('resetOnClick' + version, $scope.resetOnClick);
localStorage.setItem('resetModelOnClick' + version, $scope.resetModelOnClick);
localStorage.setItem('keep' + version, $scope.keep);
localStorage.setItem('keepDistinct' + version, $scope.keepDistinct);
});
});
});
}]);

@@ -1,2 +0,2 @@

/*! 6.1.2 */
/*! 6.2.0 */
/*! FileAPI 2.0.7 - BSD | git://github.com/mailru/FileAPI.git

@@ -3,0 +3,0 @@ * FileAPI — a set of javascript tools for working with files. Multiupload, drag'n'drop and chunked file upload. Images: crop, resize and auto orientation by EXIF.

@@ -5,3 +5,3 @@ /**!

* @author Danial <danial.farid@gmail.com>
* @version 6.1.2
* @version 6.2.0
*/

@@ -434,3 +434,3 @@

* @author Danial <danial.farid@gmail.com>
* @version 6.1.2
* @version 6.2.0
*/

@@ -456,6 +456,6 @@

ngFileUpload.version = '6.1.2';
ngFileUpload.version = '6.2.0';
ngFileUpload.defaults = {};
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
ngFileUpload.service('UploadBase', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {

@@ -633,30 +633,6 @@ config.method = config.method || 'POST';

this.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
callback(URL.createObjectURL(file));
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result);
});
};
}
});
} else {
callback(null);
}
};
this.setDefaults = function(defaults) {
ngFileUpload.defaults = defaults || {};
};
ngFileUpload.Upload = this;
}

@@ -667,3 +643,3 @@

(function () {
ngFileUpload.getAttrWithDefaults = function(attr, name) {
ngFileUpload.getAttrWithDefaults = function (attr, name) {
return attr[name] != null ? attr[name] :

@@ -674,6 +650,7 @@ (ngFileUpload.defaults[name] == null ?

var getAttr = ngFileUpload.getAttrWithDefaults;
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile', 'Upload',
function ($parse, $timeout, $compile, Upload) {
uploadService = Upload;
return {

@@ -698,4 +675,5 @@ restrict: 'AEC',

/** @namespace attr.ngfValidate */
/** @namespace attr.ngfMaxSize */
/** @namespace attr.ngfMinSize */
/** @namespace attr.ngfDuration*/
/** @namespace attr.ngfWidth*/
/** @namespace attr.ngfHeight*/
/** @namespace attr.ngfResetOnClick */

@@ -724,30 +702,13 @@ /** @namespace attr.ngfResetModelOnClick */

var isUpdating = false;
function changeFn(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
elem.$$ngfHasFile = true;
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
var fileList = evt.__files_ || (evt.target && evt.target.files);
uploadService.validate(scope, $parse, attr, fileList, evt, function(files, rejFiles) {
elem.$$ngfHasFile = true;
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) {
// angular.element(evt.target).remove();
// }
} finally {
isUpdating = false;
}
}
});
}

@@ -801,3 +762,3 @@

if (elem.$$ngfHasFile) {
updateModel($parse, $timeout, scope, ngModel, attr,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true);

@@ -809,2 +770,3 @@ delete elem.$$ngfHasFile;

var initialTouchStartY = 0;
function clickHandler(evt) {

@@ -837,3 +799,3 @@ if (elem.attr('disabled') || disabled) return false;

fileElem[0].click();
$timeout(function() {
$timeout(function () {
delete elem.$$ngfProgramClick;

@@ -888,62 +850,2 @@ }, 500);

ngFileUpload.validate = function (scope, $parse, attr, file, evt) {
if (file == null) {
return false;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
var custom = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (custom != null && (custom === false || custom.length > 0)) {
file.$error = custom ? custom : 'validate';
return false;
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt});
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991;
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1;
if (accept != null && angular.isString(accept)) {
var regexp = new RegExp(globStringToRegex(accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return false;
}
} else {
if (accept === false) {
file.$error = 'accept';
return false;
}
}
if (file.size == null) return true;
if (file.size > fileSizeMax) {
file.$error = 'maxSize';
return false;
}
if (file.size < fileSizeMin) {
file.$error = 'minSize';
return false;
}
return true;
};
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange,

@@ -974,4 +876,6 @@ files, rejFiles, evt, noDelay) {

if (ngModel) {
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && ! getAttr(attr, 'multiple') && !keep;
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && !getAttr(attr, 'multiple') && !keep;
$timeout(function() {
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
});
$timeout(function () {

@@ -1010,18 +914,52 @@ if (ngModel) {

var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
})();
(function () {
var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
var getAttr = ngFileUpload.getAttrWithDefaults;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
ngFileUpload.service('UploadDataUrl', ['UploadBase', '$timeout', function(UploadBase, $timeout) {
UploadBase.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
var url;
try {
url = URL.createObjectURL(file);
} catch(e) {
callback('', file);
}
if (url) callback(url, file);
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result, file);
});
};
}
});
} else {
callback(null, file);
}
};
return UploadBase;
}]);
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('src', '{{(' + attr.ngfSrc + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}');
attr.$set('ngfSrc', null);
$compile(elem)(scope);
});
}

@@ -1031,2 +969,273 @@ };

/** @namespace attr.ngfBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('style', elem.attr('style') + ';background-image:url(\'{{(' + attr.ngfBackground + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}\')');
attr.$set('ngfBackground', null);
$compile(elem)(scope);
});
}
};
}]);
ngFileUpload.config(['$compileProvider', function ($compileProvider) {
$compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
}]);
ngFileUpload.filter('ngfDataUrl', ['UploadDataUrl', '$sce', function (UploadDataUrl, $sce) {
return function (file, disallowObjectUrl) {
//return 'aaaa' + file + disallowObjectUrl + $sce + UploadDataUrl;
if (file && !file.dataUrl && !angular.isString(file)) {
if (file.dataUrl === undefined && angular.isObject(file)) {
file.dataUrl = null;
UploadDataUrl.dataUrl(file, function (url, file) {
file.dataUrl = url;
}, disallowObjectUrl);
}
return '';
}
return (file && file.dataUrl ? $sce.trustAsResourceUrl(file.dataUrl) : file) || '';
};
}]);
})();
(function () {
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
function translateScalars(str) {
if (angular.isString(str)) {
if (str.search(/kb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000);
} else if (str.search(/mb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000);
} else if (str.search(/gb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000000);
} else if (str.search(/b/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/s/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/m/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 60);
} else if (str.search(/h/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 3600);
}
}
return str;
}
ngFileUpload.service('Upload', ['UploadDataUrl', function (UploadDataUrl) {
var getAttr = ngFileUpload.getAttrWithDefaults;
UploadDataUrl.validate = function (scope, $parse, attr, files, evt, callback) {
if (getAttr(attr, 'ngfValidate') == null && getAttr(attr, 'ngfAccept') == null) {
return callback(files);
}
var accFiles = [], rejFiles = [];
function fileCallback(file, accepted) {
if (accepted) {
accFiles.push(file);
} else {
rejFiles.push(file);
}
validated++;
if (validated === files.length) {
callback(accFiles, rejFiles);
}
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$event: evt});
var validated = 0;
for (var i = 0; i < files.length; i++) {
var file = files[i];
var validator = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (validator != null && (validator === false || angular.isString(validator))) {
file.$error = 'validate';
file.$errorParam = validator;
fileCallback(file, false);
} else if (validator != null || accept != null) {
validator = validator || {};
if (accept != null) validator.accept = accept;
this.validateFile(file, validator, fileCallback);
} else {
fileCallback(file, true);
}
}
};
UploadDataUrl.validateFile = function (file, constraints, callback) {
if (file == null) {
return callback(file, false);
}
var accept = constraints.accept;
if (constraints.accept != null && angular.isString(constraints.accept)) {
var regexp = new RegExp(globStringToRegex(constraints.accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return callback(file, false);
}
} else {
if (accept === false) {
file.$error = 'accept';
return callback(file, false);
}
}
if (file.size != null && constraints.size && (constraints.size.max || constraints.size.min)) {
if (file.size > translateScalars(constraints.size.max)) {
file.$error = 'size.max';
file.$errorParam = constraints.size.max;
return callback(file, false);
}
if (file.size < translateScalars(constraints.size.min)) {
file.$error = 'size.min';
file.$errorParam = constraints.size.min;
return callback(file, false);
}
}
if ((constraints.width || constraints.height) && file.type.indexOf('image') === 0) {
this.imageDimensions(file, function (width, height) {
file.width = width;
file.height = height;
if (constraints.width && (constraints.width.min || constraints.width.max)) {
if (constraints.width.max && width > translateScalars(constraints.width.max)) {
file.$error = 'width.max';
file.$errorParam = constraints.width.max;
}
if (constraints.width.min && width < translateScalars(constraints.width.min)) {
file.$error = 'width.min';
file.$errorParam = constraints.width.min;
}
if (!width && !constraints.width.soft) {
file.$error = constraints.width.min ? 'width.min' : 'width.max';
file.$errorParam = constraints.width.min || constraints.width.max;
}
}
if (constraints.height && (constraints.height.min || constraints.height.max)) {
if (constraints.height.max && height > translateScalars(constraints.height.max)) {
file.$error = 'height.max';
file.$errorParam = constraints.height.max;
}
if (constraints.height.min && height < translateScalars(constraints.height.min)) {
file.$error = 'height.min';
file.$errorParam = constraints.height.min;
}
if (!height && !constraints.height.soft) {
file.$error = constraints.height.min ? 'height.min' : 'height.max';
file.$errorParam = constraints.height.min || constraints.height.max;
}
callback(file, !file.$error);
}
});
if ((constraints.width && (constraints.width.min || constraints.width.max)) ||
(constraints.height && (constraints.height.min || constraints.height.max))) return;
}
if ((constraints.duration) &&
(file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0)) {
this.mediaDuration(file, function (duration) {
file.duration = duration;
if (constraints.duration.min || constraints.duration.max) {
if (constraints.duration.max && duration > translateScalars(constraints.duration.max)) {
file.$error = 'duration.max';
file.$errorParam = constraints.duration.max;
}
if (constraints.duration.min && duration < translateScalars(constraints.duration.min)) {
file.$error = 'duration.min';
file.$errorParam = constraints.duration.min;
}
if (!duration && !constraints.duration.soft) {
file.$error = constraints.duration.min ? 'duration.min' : 'duration.max';
file.$errorParam = constraints.duration.min || constraints.duration.max;
}
callback(file, !file.$error);
}
});
if (constraints.duration.min || constraints.duration.max) return;
}
return callback(file, true);
};
UploadDataUrl.imageDimensions = function (file, callback) {
if (file.type.indexOf('image') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var img = angular.element('<img>').attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
img.on('load error', function () {
var width = img[0].clientWidth;
var height = img[0].clientHeight;
img.remove();
callback(width, height, file);
});
angular.element(document.body).append(img);
}, true);
} else {
return false;
}
};
UploadDataUrl.mediaDuration = function (file, callback) {
if (file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var el = angular.element(file.type.indexOf('audio') === 0 ? '<audio>' : '<video>')
.attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
el.on('loadedmetadata error', function () {
var duration = el[0].duration;
el.remove();
callback(duration, file);
});
angular.element(document.body).append(el);
});
} else {
return false;
}
};
return UploadDataUrl;
}]);
})();
(function () {
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', 'Upload',
function ($parse, $timeout, $location, Upload) {
uploadService = Upload;
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
};
}]);
ngFileUpload.directive('ngfNoFileDrop', function () {

@@ -1072,3 +1281,3 @@ return function (scope, elem) {

if (getAttr(attr, 'ngfDrop').search(/\W+\$files\W+/) === -1) {
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) {
scope.$watch(getAttr(attr, 'ngfDrop'), function (val) {
disabled = val === false;

@@ -1093,6 +1302,9 @@ });

$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
if (!actualDragOverClass) {
actualDragOverClass = 'C';
calculateDragOverClass(scope, attr, evt, function (clazz) {
actualDragOverClass = clazz;
elem.addClass(actualDragOverClass);
});
}
elem.addClass(actualDragOverClass);
}, false);

@@ -1118,5 +1330,5 @@ elem[0].addEventListener('dragenter', function (evt) {

extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));

@@ -1126,37 +1338,39 @@ }, false);

if (elem.attr('disabled') || disabled) return;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, false, getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));
var files = [];
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
files.push(clipboard.items[k].getAsFile());
}
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
});
}
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
function calculateDragOverClass(scope, attr, evt, callback) {
var items = evt.dataTransfer.items, files = [];
if (items != null) {
for (var i = 0; i < items.length && accepted; i++) {
accepted = accepted &&
(items[i].kind === 'file' || items[i].kind === '') &&
validate(scope, $parse, attr, items[i], evt);
for (var i = 0; i < items.length; i++) {
if (items[i].kind === 'file' || items[i].kind === '') {
files.push(items[i]);
}
}
}
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover';
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = !rejFiles || !rejFiles.length ? clazz.accept : clazz.reject;
}
callback(clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover');
});
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], processing = 0;
var files = [], processing = 0;
function addFile(file) {
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
function traverseFileTree(files, entry, path) {

@@ -1166,3 +1380,3 @@ if (entry != null) {

var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
files.push({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();

@@ -1198,3 +1412,3 @@ var entries = [];

file.path = (path ? path : '') + file.name;
addFile(file);
files.push(file);
} catch (e) {

@@ -1211,60 +1425,50 @@ processing--;

if (evt.type === 'paste') {
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
addFile(clipboard.items[k].getAsFile());
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) files.push(f);
}
callback(files, rejFiles);
if (!multiple && files.length > 0) break;
}
} else {
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
files.push(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
addFile(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
});
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}, delay || 0);
})();
}
}
}, delay || 0);
})();
}

@@ -1279,66 +1483,1 @@ }

})();
(function () {
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) {
if (defaultName) {
callback($parse(defaultName)(scope));
}
scope.$watch(name, function (file) {
if (!angular.isString(file)) {
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) {
Upload.dataUrl(file, function (url) {
if (callback) {
callback(url);
} else {
file.dataUrl = url || $parse(defaultName)(scope);
}
}, $parse(attr.ngfNoObjectUrl)(scope));
}
} else {
callback(file);
}
});
}
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfDefaultSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) {
elem.attr('src', url);
});
}
};
}]);
/** @namespace attr.ngfBackground */
/** @namespace attr.ngfDefaultBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) {
elem.css('background-image', 'url(' + url + ')');
});
}
};
}]);
/** @namespace attr.ngfDataUrl */
/** @namespace attr.ngfDefaultDataUrl */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl);
}
};
}]);
})();

@@ -1,2 +0,2 @@

/*! 6.1.2 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.1.2",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var k=b.__files_||b.target&&b.target.files,l=[],m=[],n=0;n<k.length;n++){var o=k.item(n);d(a,i,g,o,b)?l.push(o):m.push(o)}f.$$ngfHasFile=!0,e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),l,m,b),0===l.length&&(b.target.value=l)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&((null==e.value||""===e.value)&&("required"===e.name&&(e.value="required"),"multiple"===e.name&&(e.value="multiple")),b.attr(e.name,e.value))}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;if(f.$$ngfProgramClick)return f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){f.$$ngfHasFile&&(e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0),delete f.$$ngfHasFile)}function q(d){function e(a){a&&!f.$$ngfProgramClick&&(f.$$ngfProgramClick=!0,s[0].click(),j(function(){delete f.$$ngfProgramClick},500)),!l()&&a||!n||f.bind("click touchstart touchend",q)}if(f.attr("disabled")||r)return!1;if(null!=d){var h=d.changedTouches||d.originalEvent&&d.originalEvent.changedTouches;if("touchstart"===d.type)return t=h?h[0].clientY:0,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var k=h?h[0].clientY:0;if(Math.abs(k-t)>20)return!1}}var n=i(c(g,"ngfResetOnClick"))(a)!==!1,s=o(d,n);return s&&((!d||n)&&s.bind("change",m),d&&n&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){function g(a){if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])return a.substring(1,a.length-1);var b=a.split(","),c="";if(b.length>1)for(var d=0;d<b.length;d++)c+="("+g(b[d])+")",d<b.length-1&&(c+="|");else 0===a.indexOf(".")&&(a="*"+a),c="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",c=c.replace(/\\\*/g,".*").replace(/\\\?/g,".");return c}if(null==e)return!1;var h=b(c(d,"ngfValidate"))(a,{$file:e,$event:f});if(null!=h&&(h===!1||h.length>0))return e.$error=h?h:"validate",!1;var i=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),j=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,k=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=i&&angular.isString(i)){var l=new RegExp(g(i),"gi");if(i=null!=e.type&&l.test(e.type.toLowerCase())||null!=e.name&&l.test(e.name.toLowerCase()),!i)return e.$error="accept",!1}else if(i===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>j?(e.$error="maxSize",!1):e.size<k?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){var k=a(c(f,"ngfKeep"))(d);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(c(f,"ngfMultiple"))(d)&&!c(f,"multiple")&&!k;a(c(f,"ngModel")).assign(d,q?p:h),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=c(f,"ngfModel");r&&a(r).assign(d,h),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];o++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");o--}}catch(h){o--,console.error(h)}},function(){o--})};g()}else o++,b.file(function(a){try{o--,a.path=(c?c:"")+a.name,h(a)}catch(b){o--,console.error(b)}},function(){o--})}var m=[],n=[],o=0;if("paste"===b.type){var p=b.clipboardData||b.originalEvent.clipboardData;if(p&&p.items){for(var q=0;q<p.items.length;q++)-1!==p.items[q].type.indexOf("image")&&h(p.items[q].getAsFile());d(m,n)}}else{var r=b.dataTransfer.items;if(r&&r.length>0&&"file"!==k.protocol())for(var s=0;s<r.length;s++){if(r[s].webkitGetAsEntry&&r[s].webkitGetAsEntry()&&r[s].webkitGetAsEntry().isDirectory){var t=r[s].webkitGetAsEntry();if(t.isDirectory&&!e)continue;null!=t&&l(m,t)}else{var u=r[s].getAsFile();null!=u&&h(u)}if(!f&&m.length>0)break}else{var v=b.dataTransfer.files;if(null!=v)for(var w=0;w<v.length&&(h(v.item(w)),f||!(m.length>0));w++);}var x=0;!function y(a){j(function(){if(o)10*x++<2e4&&y(10);else{if(!f&&m.length>1){for(s=0;"directory"===m[s].type;)s++;m=[m[s]]}d(m,n)}},a||0)}()}}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1),f[0].addEventListener("paste",function(b){f.attr("disabled")||o||m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){f&&g(c(f)(b)),b.$watch(e,function(e){angular.isString(e)?g(e):window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}();
/*! 6.2.0 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.2.0",ngFileUpload.defaults={},ngFileUpload.service("UploadBase",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}},ngFileUpload.Upload=this}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){var j=b.__files_||b.target&&b.target.files;c.validate(a,h,f,j,b,function(c,j){e.$$ngfHasFile=!0,ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),c,j,b),0===c.length&&(b.target.value=c)})}function m(b){d(f,"ngfMultiple")&&b.attr("multiple",h(d(f,"ngfMultiple"))(a)),d(f,"ngfCapture")&&b.attr("capture",h(d(f,"ngfCapture"))(a)),d(f,"accept")&&b.attr("accept",d(f,"accept"));for(var c=0;c<e[0].attributes.length;c++){var g=e[0].attributes[c];(k()&&"type"!==g.name||"type"!==g.name&&"class"!==g.name&&"id"!==g.name&&"style"!==g.name)&&((null==g.value||""===g.value)&&("required"===g.name&&(g.value="required"),"multiple"===g.name&&(g.value="multiple")),b.attr(g.name,g.value))}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;if(e.$$ngfProgramClick)return e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){e.$$ngfHasFile&&(ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),[],[],b,!0),delete e.$$ngfHasFile)}function p(c){function g(a){a&&!e.$$ngfProgramClick&&(e.$$ngfProgramClick=!0,t[0].click(),i(function(){delete e.$$ngfProgramClick},500)),!k()&&a||!s||e.bind("click touchstart touchend",p)}if(e.attr("disabled")||q)return!1;if(null!=c){var j=c.changedTouches||c.originalEvent&&c.originalEvent.changedTouches;if("touchstart"===c.type)return r=j?j[0].clientY:0,!0;if(c.stopPropagation(),c.preventDefault(),"touchend"===c.type){var m=j?j[0].clientY:0;if(Math.abs(m-r)>20)return!1}}var s=h(d(f,"ngfResetOnClick"))(a)!==!1,t=n(c,s);return t&&((!c||s)&&t.bind("change",l),c&&s&&h(d(f,"ngfResetModelOnClick"))(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){g(c)},0):g(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===d(f,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfSelect"),function(a){q=a===!1});var r=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.updateModel=function(a,b,c,e,f,g,h,i,j,k){function l(){var k=a(d(f,"ngfKeep"))(c);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(d(f,"ngfKeepDistinct"))(c)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(d(f,"ngfMultiple"))(c)&&!d(f,"multiple")&&!k;b(function(){a(d(f,"ngModel")).assign(c,q?p:h)}),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=d(f,"ngfModel");r&&a(r).assign(c,h),d(f,"ngModelRejected")&&a(d(f,"ngModelRejected")).assign(c,i),g&&a(g)(c,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})}}(),function(){ngFileUpload.service("UploadDataUrl",["UploadBase","$timeout",function(a,b){return a.dataUrl=function(a,c,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?b(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d){var f;try{f=e.createObjectURL(a)}catch(g){c("",a)}f&&c(f,a)}else{var h=new FileReader;h.readAsDataURL(a),h.onload=function(d){b(function(){c(d.target.result,a)})}}}):c(null,a)},a}]),ngFileUpload.directive("ngfSrc",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("src","{{("+f.ngfSrc+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}"),f.$set("ngfSrc",null),b(e)(d)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("style",e.attr("style")+";background-image:url('{{("+f.ngfBackground+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}')"),f.$set("ngfBackground",null),b(e)(d)})}}}]),ngFileUpload.config(["$compileProvider",function(a){a.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/),a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/)}]),ngFileUpload.filter("ngfDataUrl",["UploadDataUrl","$sce",function(a,b){return function(c,d){return!c||c.dataUrl||angular.isString(c)?(c&&c.dataUrl?b.trustAsResourceUrl(c.dataUrl):c)||"":(void 0===c.dataUrl&&angular.isObject(c)&&(c.dataUrl=null,a.dataUrl(c,function(a,b){b.dataUrl=a},d)),"")}}])}(),function(){function a(b){if(b.length>2&&"/"===b[0]&&"/"===b[b.length-1])return b.substring(1,b.length-1);var c=b.split(","),d="";if(c.length>1)for(var e=0;e<c.length;e++)d+="("+a(c[e])+")",e<c.length-1&&(d+="|");else 0===b.indexOf(".")&&(b="*"+b),d="^"+b.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",d=d.replace(/\\\*/g,".*").replace(/\\\?/g,".");return d}function b(a){if(angular.isString(a)){if(a.search(/kb/i)===a.length-2)return parseFloat(1e3*a.substring(0,a.length-2));if(a.search(/mb/i)===a.length-2)return parseFloat(1e6*a.substring(0,a.length-2));if(a.search(/gb/i)===a.length-2)return parseFloat(1e9*a.substring(0,a.length-2));if(a.search(/b/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/s/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/m/i)===a.length-1)return parseFloat(60*a.substring(0,a.length-1));if(a.search(/h/i)===a.length-1)return parseFloat(3600*a.substring(0,a.length-1))}return a}ngFileUpload.service("Upload",["UploadDataUrl",function(c){var d=ngFileUpload.getAttrWithDefaults;return c.validate=function(a,b,c,e,f,g){function h(a,b){b?i.push(a):j.push(a),l++,l===e.length&&g(i,j)}if(null==d(c,"ngfValidate")&&null==d(c,"ngfAccept"))return g(e);for(var i=[],j=[],k=b(d(c,"ngfAccept"))(a,{$event:f}),l=0,m=0;m<e.length;m++){var n=e[m],o=b(d(c,"ngfValidate"))(a,{$file:n,$event:f});null==o||o!==!1&&!angular.isString(o)?null!=o||null!=k?(o=o||{},null!=k&&(o.accept=k),this.validateFile(n,o,h)):h(n,!0):(n.$error="validate",n.$errorParam=o,h(n,!1))}},c.validateFile=function(c,d,e){if(null==c)return e(c,!1);var f=d.accept;if(null!=d.accept&&angular.isString(d.accept)){var g=new RegExp(a(d.accept),"gi");if(f=null!=c.type&&g.test(c.type.toLowerCase())||null!=c.name&&g.test(c.name.toLowerCase()),!f)return c.$error="accept",e(c,!1)}else if(f===!1)return c.$error="accept",e(c,!1);if(null!=c.size&&d.size&&(d.size.max||d.size.min)){if(c.size>b(d.size.max))return c.$error="size.max",c.$errorParam=d.size.max,e(c,!1);if(c.size<b(d.size.min))return c.$error="size.min",c.$errorParam=d.size.min,e(c,!1)}if(!((d.width||d.height)&&0===c.type.indexOf("image")&&(this.imageDimensions(c,function(a,f){c.width=a,c.height=f,d.width&&(d.width.min||d.width.max)&&(d.width.max&&a>b(d.width.max)&&(c.$error="width.max",c.$errorParam=d.width.max),d.width.min&&a<b(d.width.min)&&(c.$error="width.min",c.$errorParam=d.width.min),a||d.width.soft||(c.$error=d.width.min?"width.min":"width.max",c.$errorParam=d.width.min||d.width.max)),d.height&&(d.height.min||d.height.max)&&(d.height.max&&f>b(d.height.max)&&(c.$error="height.max",c.$errorParam=d.height.max),d.height.min&&f<b(d.height.min)&&(c.$error="height.min",c.$errorParam=d.height.min),f||d.height.soft||(c.$error=d.height.min?"height.min":"height.max",c.$errorParam=d.height.min||d.height.max),e(c,!c.$error))}),d.width&&(d.width.min||d.width.max)||d.height&&(d.height.min||d.height.max))||d.duration&&(0===c.type.indexOf("audio")||0===c.type.indexOf("video"))&&(this.mediaDuration(c,function(a){c.duration=a,(d.duration.min||d.duration.max)&&(d.duration.max&&a>b(d.duration.max)&&(c.$error="duration.max",c.$errorParam=d.duration.max),d.duration.min&&a<b(d.duration.min)&&(c.$error="duration.min",c.$errorParam=d.duration.min),a||d.duration.soft||(c.$error=d.duration.min?"duration.min":"duration.max",c.$errorParam=d.duration.min||d.duration.max),e(c,!c.$error))}),d.duration.min||d.duration.max)))return e(c,!0)},c.imageDimensions=function(a,b){return 0!==a.type.indexOf("image")?!1:void c.dataUrl(a,function(c){var d=angular.element("<img>").attr("src",c).css("visibility","none").css("position","fixed");d.on("load error",function(){var c=d[0].clientWidth,e=d[0].clientHeight;d.remove(),b(c,e,a)}),angular.element(document.body).append(d)},!0)},c.mediaDuration=function(a,b){return 0!==a.type.indexOf("audio")&&0!==a.type.indexOf("video")?!1:void c.dataUrl(a,function(c){var d=angular.element(0===a.type.indexOf("audio")?"<audio>":"<video>").attr("src",c).css("visibility","none").css("position","fixed");d.on("loadedmetadata error",function(){var c=d[0].duration;d.remove(),b(c,a)}),angular.element(document.body).append(d)})},c}])}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,e,f){var g=e.dataTransfer.items,i=[];if(null!=g)for(var j=0;j<g.length;j++)("file"===g[j].kind||""===g[j].kind)&&i.push(g[j]);c.validate(a,h,b,i,e,function(c,g){var i=h(d(b,"ngfDragOverClass"))(a,{$event:e});i&&(i.delay&&(r=i.delay),i.accept&&(i=g&&g.length?i.reject:i.accept)),f(i||d(b,"ngfDragOverClass")||"dragover")})}function l(b,d,e,g){function k(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;a.push({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];m++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)k(a,f[e],(c?c:"")+b.name+"/");m--}}catch(h){m--,console.error(h)}},function(){m--})};g()}else m++,b.file(function(b){try{m--,b.path=(c?c:"")+b.name,a.push(b)}catch(d){m--,console.error(d)}},function(){m--})}var l=[],m=0,n=b.dataTransfer.items;if(n&&n.length>0&&"file"!==j.protocol())for(var o=0;o<n.length;o++){if(n[o].webkitGetAsEntry&&n[o].webkitGetAsEntry()&&n[o].webkitGetAsEntry().isDirectory){var p=n[o].webkitGetAsEntry();if(p.isDirectory&&!e)continue;null!=p&&k(l,p)}else{var q=n[o].getAsFile();null!=q&&l.push(q)}if(!g&&l.length>0)break}else{var r=b.dataTransfer.files;if(null!=r)for(var s=0;s<r.length&&(l.push(r.item(s)),g||!(l.length>0));s++);}var t=0;!function u(e){i(function(){if(m)10*t++<2e4&&u(10);else{if(!g&&l.length>1){for(o=0;"directory"===l[o].type;)o++;l=[l[o]]}c.validate(a,h,f,l,b,function(a,b){d(a,b)})}},e||0)}()}var m=b();if(d(f,"dropAvailable")&&i(function(){a[d(f,"dropAvailable")]?a[d(f,"dropAvailable")].value=m:a[d(f,"dropAvailable")]=m}),!m)return void(h(d(f,"ngfHideOnDropNotAvailable"))(a)===!0&&e.css("display","none"));var n=!1;-1===d(f,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfDrop"),function(a){n=a===!1});var o,p=null,q=h(d(f,"ngfStopPropagation")),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),o||(o="C",k(a,f,b,function(a){o=a,e.addClass(o)}))}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)},h(d(f,"ngfAllowDir"))(a)!==!1,d(f,"multiple")||h(d(f,"ngfMultiple"))(a)))},!1),e[0].addEventListener("paste",function(b){if(!e.attr("disabled")&&!n){var j=[],k=b.clipboardData||b.originalEvent.clipboardData;if(k&&k.items){for(var l=0;l<k.items.length;l++)-1!==k.items[l].type.indexOf("image")&&j.push(k.items[l].getAsFile());c.validate(a,h,f,j,b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)})}}},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(e,f,g){if(b()){var h=a(d(g,"ngfDropAvailable"));c(function(){h(e),h.assign&&h.assign(e,!0)})}}}])}();

@@ -5,3 +5,3 @@ /**!

* @author Danial <danial.farid@gmail.com>
* @version 6.1.2
* @version 6.2.0
*/

@@ -8,0 +8,0 @@

@@ -1,2 +0,2 @@

/*! 6.1.2 */
/*! 6.2.0 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}}}}(),function(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!==navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}}(),window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(e=c("error",d),a.onerror&&a.onerror(e),a.dispatchEvent(e))};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}});
/**!
* AngularJS file upload/drop directive and service with progress and abort
* @author Danial <danial.farid@gmail.com>
* @version 6.1.2
* @version 6.2.0
*/

@@ -25,6 +25,6 @@

ngFileUpload.version = '6.1.2';
ngFileUpload.version = '6.2.0';
ngFileUpload.defaults = {};
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
ngFileUpload.service('UploadBase', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {

@@ -202,30 +202,6 @@ config.method = config.method || 'POST';

this.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
callback(URL.createObjectURL(file));
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result);
});
};
}
});
} else {
callback(null);
}
};
this.setDefaults = function(defaults) {
ngFileUpload.defaults = defaults || {};
};
ngFileUpload.Upload = this;
}

@@ -236,3 +212,3 @@

(function () {
ngFileUpload.getAttrWithDefaults = function(attr, name) {
ngFileUpload.getAttrWithDefaults = function (attr, name) {
return attr[name] != null ? attr[name] :

@@ -243,6 +219,7 @@ (ngFileUpload.defaults[name] == null ?

var getAttr = ngFileUpload.getAttrWithDefaults;
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile', 'Upload',
function ($parse, $timeout, $compile, Upload) {
uploadService = Upload;
return {

@@ -267,4 +244,5 @@ restrict: 'AEC',

/** @namespace attr.ngfValidate */
/** @namespace attr.ngfMaxSize */
/** @namespace attr.ngfMinSize */
/** @namespace attr.ngfDuration*/
/** @namespace attr.ngfWidth*/
/** @namespace attr.ngfHeight*/
/** @namespace attr.ngfResetOnClick */

@@ -293,30 +271,13 @@ /** @namespace attr.ngfResetModelOnClick */

var isUpdating = false;
function changeFn(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
elem.$$ngfHasFile = true;
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
var fileList = evt.__files_ || (evt.target && evt.target.files);
uploadService.validate(scope, $parse, attr, fileList, evt, function(files, rejFiles) {
elem.$$ngfHasFile = true;
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) {
// angular.element(evt.target).remove();
// }
} finally {
isUpdating = false;
}
}
});
}

@@ -370,3 +331,3 @@

if (elem.$$ngfHasFile) {
updateModel($parse, $timeout, scope, ngModel, attr,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true);

@@ -378,2 +339,3 @@ delete elem.$$ngfHasFile;

var initialTouchStartY = 0;
function clickHandler(evt) {

@@ -406,3 +368,3 @@ if (elem.attr('disabled') || disabled) return false;

fileElem[0].click();
$timeout(function() {
$timeout(function () {
delete elem.$$ngfProgramClick;

@@ -457,62 +419,2 @@ }, 500);

ngFileUpload.validate = function (scope, $parse, attr, file, evt) {
if (file == null) {
return false;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
var custom = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (custom != null && (custom === false || custom.length > 0)) {
file.$error = custom ? custom : 'validate';
return false;
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt});
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991;
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1;
if (accept != null && angular.isString(accept)) {
var regexp = new RegExp(globStringToRegex(accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return false;
}
} else {
if (accept === false) {
file.$error = 'accept';
return false;
}
}
if (file.size == null) return true;
if (file.size > fileSizeMax) {
file.$error = 'maxSize';
return false;
}
if (file.size < fileSizeMin) {
file.$error = 'minSize';
return false;
}
return true;
};
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange,

@@ -543,4 +445,6 @@ files, rejFiles, evt, noDelay) {

if (ngModel) {
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && ! getAttr(attr, 'multiple') && !keep;
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && !getAttr(attr, 'multiple') && !keep;
$timeout(function() {
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
});
$timeout(function () {

@@ -579,18 +483,52 @@ if (ngModel) {

var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
})();
(function () {
var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
var getAttr = ngFileUpload.getAttrWithDefaults;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
ngFileUpload.service('UploadDataUrl', ['UploadBase', '$timeout', function(UploadBase, $timeout) {
UploadBase.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
var url;
try {
url = URL.createObjectURL(file);
} catch(e) {
callback('', file);
}
if (url) callback(url, file);
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result, file);
});
};
}
});
} else {
callback(null, file);
}
};
return UploadBase;
}]);
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('src', '{{(' + attr.ngfSrc + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}');
attr.$set('ngfSrc', null);
$compile(elem)(scope);
});
}

@@ -600,2 +538,273 @@ };

/** @namespace attr.ngfBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
$timeout(function() {
elem.attr('style', elem.attr('style') + ';background-image:url(\'{{(' + attr.ngfBackground + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}\')');
attr.$set('ngfBackground', null);
$compile(elem)(scope);
});
}
};
}]);
ngFileUpload.config(['$compileProvider', function ($compileProvider) {
$compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
}]);
ngFileUpload.filter('ngfDataUrl', ['UploadDataUrl', '$sce', function (UploadDataUrl, $sce) {
return function (file, disallowObjectUrl) {
//return 'aaaa' + file + disallowObjectUrl + $sce + UploadDataUrl;
if (file && !file.dataUrl && !angular.isString(file)) {
if (file.dataUrl === undefined && angular.isObject(file)) {
file.dataUrl = null;
UploadDataUrl.dataUrl(file, function (url, file) {
file.dataUrl = url;
}, disallowObjectUrl);
}
return '';
}
return (file && file.dataUrl ? $sce.trustAsResourceUrl(file.dataUrl) : file) || '';
};
}]);
})();
(function () {
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
function translateScalars(str) {
if (angular.isString(str)) {
if (str.search(/kb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000);
} else if (str.search(/mb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000);
} else if (str.search(/gb/i) === str.length - 2) {
return parseFloat(str.substring(0, str.length - 2) * 1000000000);
} else if (str.search(/b/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/s/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1));
} else if (str.search(/m/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 60);
} else if (str.search(/h/i) === str.length - 1) {
return parseFloat(str.substring(0, str.length - 1) * 3600);
}
}
return str;
}
ngFileUpload.service('Upload', ['UploadDataUrl', function (UploadDataUrl) {
var getAttr = ngFileUpload.getAttrWithDefaults;
UploadDataUrl.validate = function (scope, $parse, attr, files, evt, callback) {
if (getAttr(attr, 'ngfValidate') == null && getAttr(attr, 'ngfAccept') == null) {
return callback(files);
}
var accFiles = [], rejFiles = [];
function fileCallback(file, accepted) {
if (accepted) {
accFiles.push(file);
} else {
rejFiles.push(file);
}
validated++;
if (validated === files.length) {
callback(accFiles, rejFiles);
}
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$event: evt});
var validated = 0;
for (var i = 0; i < files.length; i++) {
var file = files[i];
var validator = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (validator != null && (validator === false || angular.isString(validator))) {
file.$error = 'validate';
file.$errorParam = validator;
fileCallback(file, false);
} else if (validator != null || accept != null) {
validator = validator || {};
if (accept != null) validator.accept = accept;
this.validateFile(file, validator, fileCallback);
} else {
fileCallback(file, true);
}
}
};
UploadDataUrl.validateFile = function (file, constraints, callback) {
if (file == null) {
return callback(file, false);
}
var accept = constraints.accept;
if (constraints.accept != null && angular.isString(constraints.accept)) {
var regexp = new RegExp(globStringToRegex(constraints.accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return callback(file, false);
}
} else {
if (accept === false) {
file.$error = 'accept';
return callback(file, false);
}
}
if (file.size != null && constraints.size && (constraints.size.max || constraints.size.min)) {
if (file.size > translateScalars(constraints.size.max)) {
file.$error = 'size.max';
file.$errorParam = constraints.size.max;
return callback(file, false);
}
if (file.size < translateScalars(constraints.size.min)) {
file.$error = 'size.min';
file.$errorParam = constraints.size.min;
return callback(file, false);
}
}
if ((constraints.width || constraints.height) && file.type.indexOf('image') === 0) {
this.imageDimensions(file, function (width, height) {
file.width = width;
file.height = height;
if (constraints.width && (constraints.width.min || constraints.width.max)) {
if (constraints.width.max && width > translateScalars(constraints.width.max)) {
file.$error = 'width.max';
file.$errorParam = constraints.width.max;
}
if (constraints.width.min && width < translateScalars(constraints.width.min)) {
file.$error = 'width.min';
file.$errorParam = constraints.width.min;
}
if (!width && !constraints.width.soft) {
file.$error = constraints.width.min ? 'width.min' : 'width.max';
file.$errorParam = constraints.width.min || constraints.width.max;
}
}
if (constraints.height && (constraints.height.min || constraints.height.max)) {
if (constraints.height.max && height > translateScalars(constraints.height.max)) {
file.$error = 'height.max';
file.$errorParam = constraints.height.max;
}
if (constraints.height.min && height < translateScalars(constraints.height.min)) {
file.$error = 'height.min';
file.$errorParam = constraints.height.min;
}
if (!height && !constraints.height.soft) {
file.$error = constraints.height.min ? 'height.min' : 'height.max';
file.$errorParam = constraints.height.min || constraints.height.max;
}
callback(file, !file.$error);
}
});
if ((constraints.width && (constraints.width.min || constraints.width.max)) ||
(constraints.height && (constraints.height.min || constraints.height.max))) return;
}
if ((constraints.duration) &&
(file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0)) {
this.mediaDuration(file, function (duration) {
file.duration = duration;
if (constraints.duration.min || constraints.duration.max) {
if (constraints.duration.max && duration > translateScalars(constraints.duration.max)) {
file.$error = 'duration.max';
file.$errorParam = constraints.duration.max;
}
if (constraints.duration.min && duration < translateScalars(constraints.duration.min)) {
file.$error = 'duration.min';
file.$errorParam = constraints.duration.min;
}
if (!duration && !constraints.duration.soft) {
file.$error = constraints.duration.min ? 'duration.min' : 'duration.max';
file.$errorParam = constraints.duration.min || constraints.duration.max;
}
callback(file, !file.$error);
}
});
if (constraints.duration.min || constraints.duration.max) return;
}
return callback(file, true);
};
UploadDataUrl.imageDimensions = function (file, callback) {
if (file.type.indexOf('image') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var img = angular.element('<img>').attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
img.on('load error', function () {
var width = img[0].clientWidth;
var height = img[0].clientHeight;
img.remove();
callback(width, height, file);
});
angular.element(document.body).append(img);
}, true);
} else {
return false;
}
};
UploadDataUrl.mediaDuration = function (file, callback) {
if (file.type.indexOf('audio') === 0 || file.type.indexOf('video') === 0) {
UploadDataUrl.dataUrl(file, function (dataUrl) {
var el = angular.element(file.type.indexOf('audio') === 0 ? '<audio>' : '<video>')
.attr('src', dataUrl).css('visibility', 'none').css('position', 'fixed');
el.on('loadedmetadata error', function () {
var duration = el[0].duration;
el.remove();
callback(duration, file);
});
angular.element(document.body).append(el);
});
} else {
return false;
}
};
return UploadDataUrl;
}]);
})();
(function () {
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', 'Upload',
function ($parse, $timeout, $location, Upload) {
uploadService = Upload;
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
};
}]);
ngFileUpload.directive('ngfNoFileDrop', function () {

@@ -641,3 +850,3 @@ return function (scope, elem) {

if (getAttr(attr, 'ngfDrop').search(/\W+\$files\W+/) === -1) {
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) {
scope.$watch(getAttr(attr, 'ngfDrop'), function (val) {
disabled = val === false;

@@ -662,6 +871,9 @@ });

$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
if (!actualDragOverClass) {
actualDragOverClass = 'C';
calculateDragOverClass(scope, attr, evt, function (clazz) {
actualDragOverClass = clazz;
elem.addClass(actualDragOverClass);
});
}
elem.addClass(actualDragOverClass);
}, false);

@@ -687,5 +899,5 @@ elem[0].addEventListener('dragenter', function (evt) {

extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));

@@ -695,37 +907,39 @@ }, false);

if (elem.attr('disabled') || disabled) return;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, false, getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));
var files = [];
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
files.push(clipboard.items[k].getAsFile());
}
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
});
}
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
function calculateDragOverClass(scope, attr, evt, callback) {
var items = evt.dataTransfer.items, files = [];
if (items != null) {
for (var i = 0; i < items.length && accepted; i++) {
accepted = accepted &&
(items[i].kind === 'file' || items[i].kind === '') &&
validate(scope, $parse, attr, items[i], evt);
for (var i = 0; i < items.length; i++) {
if (items[i].kind === 'file' || items[i].kind === '') {
files.push(items[i]);
}
}
}
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover';
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = !rejFiles || !rejFiles.length ? clazz.accept : clazz.reject;
}
callback(clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover');
});
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], processing = 0;
var files = [], processing = 0;
function addFile(file) {
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
function traverseFileTree(files, entry, path) {

@@ -735,3 +949,3 @@ if (entry != null) {

var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
files.push({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();

@@ -767,3 +981,3 @@ var entries = [];

file.path = (path ? path : '') + file.name;
addFile(file);
files.push(file);
} catch (e) {

@@ -780,60 +994,50 @@ processing--;

if (evt.type === 'paste') {
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
addFile(clipboard.items[k].getAsFile());
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) files.push(f);
}
callback(files, rejFiles);
if (!multiple && files.length > 0) break;
}
} else {
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
files.push(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
addFile(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
});
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}, delay || 0);
})();
}
}
}, delay || 0);
})();
}

@@ -848,66 +1052,1 @@ }

})();
(function () {
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) {
if (defaultName) {
callback($parse(defaultName)(scope));
}
scope.$watch(name, function (file) {
if (!angular.isString(file)) {
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) {
Upload.dataUrl(file, function (url) {
if (callback) {
callback(url);
} else {
file.dataUrl = url || $parse(defaultName)(scope);
}
}, $parse(attr.ngfNoObjectUrl)(scope));
}
} else {
callback(file);
}
});
}
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfDefaultSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) {
elem.attr('src', url);
});
}
};
}]);
/** @namespace attr.ngfBackground */
/** @namespace attr.ngfDefaultBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) {
elem.css('background-image', 'url(' + url + ')');
});
}
};
}]);
/** @namespace attr.ngfDataUrl */
/** @namespace attr.ngfDefaultDataUrl */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl);
}
};
}]);
})();

@@ -1,2 +0,2 @@

/*! 6.1.2 */
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.1.2",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var k=b.__files_||b.target&&b.target.files,l=[],m=[],n=0;n<k.length;n++){var o=k.item(n);d(a,i,g,o,b)?l.push(o):m.push(o)}f.$$ngfHasFile=!0,e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),l,m,b),0===l.length&&(b.target.value=l)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&((null==e.value||""===e.value)&&("required"===e.name&&(e.value="required"),"multiple"===e.name&&(e.value="multiple")),b.attr(e.name,e.value))}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;if(f.$$ngfProgramClick)return f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){f.$$ngfHasFile&&(e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0),delete f.$$ngfHasFile)}function q(d){function e(a){a&&!f.$$ngfProgramClick&&(f.$$ngfProgramClick=!0,s[0].click(),j(function(){delete f.$$ngfProgramClick},500)),!l()&&a||!n||f.bind("click touchstart touchend",q)}if(f.attr("disabled")||r)return!1;if(null!=d){var h=d.changedTouches||d.originalEvent&&d.originalEvent.changedTouches;if("touchstart"===d.type)return t=h?h[0].clientY:0,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var k=h?h[0].clientY:0;if(Math.abs(k-t)>20)return!1}}var n=i(c(g,"ngfResetOnClick"))(a)!==!1,s=o(d,n);return s&&((!d||n)&&s.bind("change",m),d&&n&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){function g(a){if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])return a.substring(1,a.length-1);var b=a.split(","),c="";if(b.length>1)for(var d=0;d<b.length;d++)c+="("+g(b[d])+")",d<b.length-1&&(c+="|");else 0===a.indexOf(".")&&(a="*"+a),c="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",c=c.replace(/\\\*/g,".*").replace(/\\\?/g,".");return c}if(null==e)return!1;var h=b(c(d,"ngfValidate"))(a,{$file:e,$event:f});if(null!=h&&(h===!1||h.length>0))return e.$error=h?h:"validate",!1;var i=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),j=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,k=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=i&&angular.isString(i)){var l=new RegExp(g(i),"gi");if(i=null!=e.type&&l.test(e.type.toLowerCase())||null!=e.name&&l.test(e.name.toLowerCase()),!i)return e.$error="accept",!1}else if(i===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>j?(e.$error="maxSize",!1):e.size<k?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){var k=a(c(f,"ngfKeep"))(d);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(c(f,"ngfMultiple"))(d)&&!c(f,"multiple")&&!k;a(c(f,"ngModel")).assign(d,q?p:h),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=c(f,"ngfModel");r&&a(r).assign(d,h),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];o++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");o--}}catch(h){o--,console.error(h)}},function(){o--})};g()}else o++,b.file(function(a){try{o--,a.path=(c?c:"")+a.name,h(a)}catch(b){o--,console.error(b)}},function(){o--})}var m=[],n=[],o=0;if("paste"===b.type){var p=b.clipboardData||b.originalEvent.clipboardData;if(p&&p.items){for(var q=0;q<p.items.length;q++)-1!==p.items[q].type.indexOf("image")&&h(p.items[q].getAsFile());d(m,n)}}else{var r=b.dataTransfer.items;if(r&&r.length>0&&"file"!==k.protocol())for(var s=0;s<r.length;s++){if(r[s].webkitGetAsEntry&&r[s].webkitGetAsEntry()&&r[s].webkitGetAsEntry().isDirectory){var t=r[s].webkitGetAsEntry();if(t.isDirectory&&!e)continue;null!=t&&l(m,t)}else{var u=r[s].getAsFile();null!=u&&h(u)}if(!f&&m.length>0)break}else{var v=b.dataTransfer.files;if(null!=v)for(var w=0;w<v.length&&(h(v.item(w)),f||!(m.length>0));w++);}var x=0;!function y(a){j(function(){if(o)10*x++<2e4&&y(10);else{if(!f&&m.length>1){for(s=0;"directory"===m[s].type;)s++;m=[m[s]]}d(m,n)}},a||0)}()}}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1),f[0].addEventListener("paste",function(b){f.attr("disabled")||o||m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){f&&g(c(f)(b)),b.$watch(e,function(e){angular.isString(e)?g(e):window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}();
/*! 6.2.0 */
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="6.2.0",ngFileUpload.defaults={},ngFileUpload.service("UploadBase",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progressFunc=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}},ngFileUpload.Upload=this}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){var j=b.__files_||b.target&&b.target.files;c.validate(a,h,f,j,b,function(c,j){e.$$ngfHasFile=!0,ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),c,j,b),0===c.length&&(b.target.value=c)})}function m(b){d(f,"ngfMultiple")&&b.attr("multiple",h(d(f,"ngfMultiple"))(a)),d(f,"ngfCapture")&&b.attr("capture",h(d(f,"ngfCapture"))(a)),d(f,"accept")&&b.attr("accept",d(f,"accept"));for(var c=0;c<e[0].attributes.length;c++){var g=e[0].attributes[c];(k()&&"type"!==g.name||"type"!==g.name&&"class"!==g.name&&"id"!==g.name&&"style"!==g.name)&&((null==g.value||""===g.value)&&("required"===g.name&&(g.value="required"),"multiple"===g.name&&(g.value="multiple")),b.attr(g.name,g.value))}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;if(e.$$ngfProgramClick)return e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){e.$$ngfHasFile&&(ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfSelect"),[],[],b,!0),delete e.$$ngfHasFile)}function p(c){function g(a){a&&!e.$$ngfProgramClick&&(e.$$ngfProgramClick=!0,t[0].click(),i(function(){delete e.$$ngfProgramClick},500)),!k()&&a||!s||e.bind("click touchstart touchend",p)}if(e.attr("disabled")||q)return!1;if(null!=c){var j=c.changedTouches||c.originalEvent&&c.originalEvent.changedTouches;if("touchstart"===c.type)return r=j?j[0].clientY:0,!0;if(c.stopPropagation(),c.preventDefault(),"touchend"===c.type){var m=j?j[0].clientY:0;if(Math.abs(m-r)>20)return!1}}var s=h(d(f,"ngfResetOnClick"))(a)!==!1,t=n(c,s);return t&&((!c||s)&&t.bind("change",l),c&&s&&h(d(f,"ngfResetModelOnClick"))(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){g(c)},0):g(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===d(f,"ngfSelect").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfSelect"),function(a){q=a===!1});var r=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.updateModel=function(a,b,c,e,f,g,h,i,j,k){function l(){var k=a(d(f,"ngfKeep"))(c);if(k===!0){var l=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(d(f,"ngfKeepDistinct"))(c)===!0){for(var m=l.length,n=0;n<h.length;n++){for(var o=0;m>o&&h[n].name!==l[o].name;o++);o===m&&l.push(h[n])}h=l}else h=l.concat(h);else h=l}var p=h&&h.length?h[0]:null;if(e){var q=!a(d(f,"ngfMultiple"))(c)&&!d(f,"multiple")&&!k;b(function(){a(d(f,"ngModel")).assign(c,q?p:h)}),b(function(){e&&e.$setViewValue(q?p:null!=h&&0===h.length?null:h)})}var r=d(f,"ngfModel");r&&a(r).assign(c,h),d(f,"ngModelRejected")&&a(d(f,"ngModelRejected")).assign(c,i),g&&a(g)(c,{$files:h,$file:p,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})}}(),function(){ngFileUpload.service("UploadDataUrl",["UploadBase","$timeout",function(a,b){return a.dataUrl=function(a,c,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?b(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d){var f;try{f=e.createObjectURL(a)}catch(g){c("",a)}f&&c(f,a)}else{var h=new FileReader;h.readAsDataURL(a),h.onload=function(d){b(function(){c(d.target.result,a)})}}}):c(null,a)},a}]),ngFileUpload.directive("ngfSrc",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("src","{{("+f.ngfSrc+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}"),f.$set("ngfSrc",null),b(e)(d)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","$compile","$timeout",function(a,b,c){return{restrict:"AE",link:function(d,e,f){c(function(){e.attr("style",e.attr("style")+";background-image:url('{{("+f.ngfBackground+") | ngfDataUrl"+(a(f.ngfNoObjectUrl)(d)===!0?":true":"")+"}}')"),f.$set("ngfBackground",null),b(e)(d)})}}}]),ngFileUpload.config(["$compileProvider",function(a){a.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/),a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/)}]),ngFileUpload.filter("ngfDataUrl",["UploadDataUrl","$sce",function(a,b){return function(c,d){return!c||c.dataUrl||angular.isString(c)?(c&&c.dataUrl?b.trustAsResourceUrl(c.dataUrl):c)||"":(void 0===c.dataUrl&&angular.isObject(c)&&(c.dataUrl=null,a.dataUrl(c,function(a,b){b.dataUrl=a},d)),"")}}])}(),function(){function a(b){if(b.length>2&&"/"===b[0]&&"/"===b[b.length-1])return b.substring(1,b.length-1);var c=b.split(","),d="";if(c.length>1)for(var e=0;e<c.length;e++)d+="("+a(c[e])+")",e<c.length-1&&(d+="|");else 0===b.indexOf(".")&&(b="*"+b),d="^"+b.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",d=d.replace(/\\\*/g,".*").replace(/\\\?/g,".");return d}function b(a){if(angular.isString(a)){if(a.search(/kb/i)===a.length-2)return parseFloat(1e3*a.substring(0,a.length-2));if(a.search(/mb/i)===a.length-2)return parseFloat(1e6*a.substring(0,a.length-2));if(a.search(/gb/i)===a.length-2)return parseFloat(1e9*a.substring(0,a.length-2));if(a.search(/b/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/s/i)===a.length-1)return parseFloat(a.substring(0,a.length-1));if(a.search(/m/i)===a.length-1)return parseFloat(60*a.substring(0,a.length-1));if(a.search(/h/i)===a.length-1)return parseFloat(3600*a.substring(0,a.length-1))}return a}ngFileUpload.service("Upload",["UploadDataUrl",function(c){var d=ngFileUpload.getAttrWithDefaults;return c.validate=function(a,b,c,e,f,g){function h(a,b){b?i.push(a):j.push(a),l++,l===e.length&&g(i,j)}if(null==d(c,"ngfValidate")&&null==d(c,"ngfAccept"))return g(e);for(var i=[],j=[],k=b(d(c,"ngfAccept"))(a,{$event:f}),l=0,m=0;m<e.length;m++){var n=e[m],o=b(d(c,"ngfValidate"))(a,{$file:n,$event:f});null==o||o!==!1&&!angular.isString(o)?null!=o||null!=k?(o=o||{},null!=k&&(o.accept=k),this.validateFile(n,o,h)):h(n,!0):(n.$error="validate",n.$errorParam=o,h(n,!1))}},c.validateFile=function(c,d,e){if(null==c)return e(c,!1);var f=d.accept;if(null!=d.accept&&angular.isString(d.accept)){var g=new RegExp(a(d.accept),"gi");if(f=null!=c.type&&g.test(c.type.toLowerCase())||null!=c.name&&g.test(c.name.toLowerCase()),!f)return c.$error="accept",e(c,!1)}else if(f===!1)return c.$error="accept",e(c,!1);if(null!=c.size&&d.size&&(d.size.max||d.size.min)){if(c.size>b(d.size.max))return c.$error="size.max",c.$errorParam=d.size.max,e(c,!1);if(c.size<b(d.size.min))return c.$error="size.min",c.$errorParam=d.size.min,e(c,!1)}if(!((d.width||d.height)&&0===c.type.indexOf("image")&&(this.imageDimensions(c,function(a,f){c.width=a,c.height=f,d.width&&(d.width.min||d.width.max)&&(d.width.max&&a>b(d.width.max)&&(c.$error="width.max",c.$errorParam=d.width.max),d.width.min&&a<b(d.width.min)&&(c.$error="width.min",c.$errorParam=d.width.min),a||d.width.soft||(c.$error=d.width.min?"width.min":"width.max",c.$errorParam=d.width.min||d.width.max)),d.height&&(d.height.min||d.height.max)&&(d.height.max&&f>b(d.height.max)&&(c.$error="height.max",c.$errorParam=d.height.max),d.height.min&&f<b(d.height.min)&&(c.$error="height.min",c.$errorParam=d.height.min),f||d.height.soft||(c.$error=d.height.min?"height.min":"height.max",c.$errorParam=d.height.min||d.height.max),e(c,!c.$error))}),d.width&&(d.width.min||d.width.max)||d.height&&(d.height.min||d.height.max))||d.duration&&(0===c.type.indexOf("audio")||0===c.type.indexOf("video"))&&(this.mediaDuration(c,function(a){c.duration=a,(d.duration.min||d.duration.max)&&(d.duration.max&&a>b(d.duration.max)&&(c.$error="duration.max",c.$errorParam=d.duration.max),d.duration.min&&a<b(d.duration.min)&&(c.$error="duration.min",c.$errorParam=d.duration.min),a||d.duration.soft||(c.$error=d.duration.min?"duration.min":"duration.max",c.$errorParam=d.duration.min||d.duration.max),e(c,!c.$error))}),d.duration.min||d.duration.max)))return e(c,!0)},c.imageDimensions=function(a,b){return 0!==a.type.indexOf("image")?!1:void c.dataUrl(a,function(c){var d=angular.element("<img>").attr("src",c).css("visibility","none").css("position","fixed");d.on("load error",function(){var c=d[0].clientWidth,e=d[0].clientHeight;d.remove(),b(c,e,a)}),angular.element(document.body).append(d)},!0)},c.mediaDuration=function(a,b){return 0!==a.type.indexOf("audio")&&0!==a.type.indexOf("video")?!1:void c.dataUrl(a,function(c){var d=angular.element(0===a.type.indexOf("audio")?"<audio>":"<video>").attr("src",c).css("visibility","none").css("position","fixed");d.on("loadedmetadata error",function(){var c=d[0].duration;d.remove(),b(c,a)}),angular.element(document.body).append(d)})},c}])}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,e,f){var g=e.dataTransfer.items,i=[];if(null!=g)for(var j=0;j<g.length;j++)("file"===g[j].kind||""===g[j].kind)&&i.push(g[j]);c.validate(a,h,b,i,e,function(c,g){var i=h(d(b,"ngfDragOverClass"))(a,{$event:e});i&&(i.delay&&(r=i.delay),i.accept&&(i=g&&g.length?i.reject:i.accept)),f(i||d(b,"ngfDragOverClass")||"dragover")})}function l(b,d,e,g){function k(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;a.push({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];m++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)k(a,f[e],(c?c:"")+b.name+"/");m--}}catch(h){m--,console.error(h)}},function(){m--})};g()}else m++,b.file(function(b){try{m--,b.path=(c?c:"")+b.name,a.push(b)}catch(d){m--,console.error(d)}},function(){m--})}var l=[],m=0,n=b.dataTransfer.items;if(n&&n.length>0&&"file"!==j.protocol())for(var o=0;o<n.length;o++){if(n[o].webkitGetAsEntry&&n[o].webkitGetAsEntry()&&n[o].webkitGetAsEntry().isDirectory){var p=n[o].webkitGetAsEntry();if(p.isDirectory&&!e)continue;null!=p&&k(l,p)}else{var q=n[o].getAsFile();null!=q&&l.push(q)}if(!g&&l.length>0)break}else{var r=b.dataTransfer.files;if(null!=r)for(var s=0;s<r.length&&(l.push(r.item(s)),g||!(l.length>0));s++);}var t=0;!function u(e){i(function(){if(m)10*t++<2e4&&u(10);else{if(!g&&l.length>1){for(o=0;"directory"===l[o].type;)o++;l=[l[o]]}c.validate(a,h,f,l,b,function(a,b){d(a,b)})}},e||0)}()}var m=b();if(d(f,"dropAvailable")&&i(function(){a[d(f,"dropAvailable")]?a[d(f,"dropAvailable")].value=m:a[d(f,"dropAvailable")]=m}),!m)return void(h(d(f,"ngfHideOnDropNotAvailable"))(a)===!0&&e.css("display","none"));var n=!1;-1===d(f,"ngfDrop").search(/\W+\$files\W+/)&&a.$watch(d(f,"ngfDrop"),function(a){n=a===!1});var o,p=null,q=h(d(f,"ngfStopPropagation")),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),o||(o="C",k(a,f,b,function(a){o=a,e.addClass(o)}))}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)},h(d(f,"ngfAllowDir"))(a)!==!1,d(f,"multiple")||h(d(f,"ngfMultiple"))(a)))},!1),e[0].addEventListener("paste",function(b){if(!e.attr("disabled")&&!n){var j=[],k=b.clipboardData||b.originalEvent.clipboardData;if(k&&k.items){for(var l=0;l<k.items.length;l++)-1!==k.items[l].type.indexOf("image")&&j.push(k.items[l].getAsFile());c.validate(a,h,f,j,b,function(c,e){ngFileUpload.updateModel(h,i,a,g,f,d(f,"ngfChange")||d(f,"ngfDrop"),c,e,b)})}}},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c,d=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location","Upload",function(b,d,e,f){return c=f,{restrict:"AEC",require:"?ngModel",link:function(c,f,g,h){a(c,f,g,h,b,d,e)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(e,f,g){if(b()){var h=a(d(g,"ngfDropAvailable"));c(function(){h(e),h.assign&&h.assign(e,!0)})}}}])}();

@@ -17,3 +17,3 @@ 'use strict';

files: {
'dist/ng-file-upload.js': ['src/upload.js', 'src/select.js', 'src/drop.js', 'src/data-url.js'],
'dist/ng-file-upload.js': ['src/upload.js', 'src/select.js', 'src/data-url.js', 'src/validate.js', 'src/drop.js'],
'dist/ng-file-upload-shim.js': ['src/shim-upload.js', 'src/shim-elem.js', 'src/shim-filereader.js'],

@@ -20,0 +20,0 @@ 'dist/ng-file-upload-all.js': ['dist/ng-file-upload-shim.js', 'dist/ng-file-upload.js']

{
"name": "ng-file-upload",
"version": "6.1.2",
"version": "6.2.0",
"devDependencies": {

@@ -5,0 +5,0 @@ "grunt": "^0.4.5",

(function () {
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) {
if (defaultName) {
callback($parse(defaultName)(scope));
ngFileUpload.service('UploadDataUrl', ['UploadBase', '$timeout', function(UploadBase, $timeout) {
UploadBase.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
var url;
try {
url = URL.createObjectURL(file);
} catch(e) {
callback('', file);
}
if (url) callback(url, file);
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result, file);
});
};
}
});
} else {
callback(null, file);
}
scope.$watch(name, function (file) {
if (!angular.isString(file)) {
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) {
Upload.dataUrl(file, function (url) {
if (callback) {
callback(url);
} else {
file.dataUrl = url || $parse(defaultName)(scope);
}
}, $parse(attr.ngfNoObjectUrl)(scope));
}
} else {
callback(file);
}
});
}
};
return UploadBase;
}]);
/** @namespace attr.ngfSrc */
/** @namespace attr.ngfDefaultSrc */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) {
ngFileUpload.directive('ngfSrc', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) {
elem.attr('src', url);
$timeout(function() {
elem.attr('src', '{{(' + attr.ngfSrc + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}');
attr.$set('ngfSrc', null);
$compile(elem)(scope);
});

@@ -39,10 +54,12 @@ }

/** @namespace attr.ngfBackground */
/** @namespace attr.ngfDefaultBackground */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) {
ngFileUpload.directive('ngfBackground', ['$parse', '$compile', '$timeout', function ($parse, $compile, $timeout) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) {
elem.css('background-image', 'url(' + url + ')');
$timeout(function() {
elem.attr('style', elem.attr('style') + ';background-image:url(\'{{(' + attr.ngfBackground + ') | ngfDataUrl' +
($parse(attr.ngfNoObjectUrl)(scope) === true ? ':true' : '') + '}}\')');
attr.$set('ngfBackground', null);
$compile(elem)(scope);
});

@@ -53,14 +70,23 @@ }

/** @namespace attr.ngfDataUrl */
/** @namespace attr.ngfDefaultDataUrl */
/** @namespace attr.ngfNoObjectUrl */
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) {
return {
restrict: 'AE',
link: function (scope, elem, attr) {
ngFileUpload.config(['$compileProvider', function ($compileProvider) {
$compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|local|file|data|blob):/);
}]);
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl);
ngFileUpload.filter('ngfDataUrl', ['UploadDataUrl', '$sce', function (UploadDataUrl, $sce) {
return function (file, disallowObjectUrl) {
//return 'aaaa' + file + disallowObjectUrl + $sce + UploadDataUrl;
if (file && !file.dataUrl && !angular.isString(file)) {
if (file.dataUrl === undefined && angular.isObject(file)) {
file.dataUrl = null;
UploadDataUrl.dataUrl(file, function (url, file) {
file.dataUrl = url;
}, disallowObjectUrl);
}
return '';
}
return (file && file.dataUrl ? $sce.trustAsResourceUrl(file.dataUrl) : file) || '';
};
}]);
})();
(function () {
var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
var getAttr = ngFileUpload.getAttrWithDefaults;
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
};
}]);
ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', 'Upload',
function ($parse, $timeout, $location, Upload) {
uploadService = Upload;
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
};
}]);

@@ -56,3 +56,3 @@ ngFileUpload.directive('ngfNoFileDrop', function () {

if (getAttr(attr, 'ngfDrop').search(/\W+\$files\W+/) === -1) {
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) {
scope.$watch(getAttr(attr, 'ngfDrop'), function (val) {
disabled = val === false;

@@ -77,6 +77,9 @@ });

$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
if (!actualDragOverClass) {
actualDragOverClass = 'C';
calculateDragOverClass(scope, attr, evt, function (clazz) {
actualDragOverClass = clazz;
elem.addClass(actualDragOverClass);
});
}
elem.addClass(actualDragOverClass);
}, false);

@@ -102,5 +105,5 @@ elem[0].addEventListener('dragenter', function (evt) {

extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false,
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));

@@ -110,37 +113,39 @@ }, false);

if (elem.attr('disabled') || disabled) return;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
}, false, getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope));
var files = [];
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
files.push(clipboard.items[k].getAsFile());
}
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt);
});
}
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
function calculateDragOverClass(scope, attr, evt, callback) {
var items = evt.dataTransfer.items, files = [];
if (items != null) {
for (var i = 0; i < items.length && accepted; i++) {
accepted = accepted &&
(items[i].kind === 'file' || items[i].kind === '') &&
validate(scope, $parse, attr, items[i], evt);
for (var i = 0; i < items.length; i++) {
if (items[i].kind === 'file' || items[i].kind === '') {
files.push(items[i]);
}
}
}
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover';
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = !rejFiles || !rejFiles.length ? clazz.accept : clazz.reject;
}
callback(clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover');
});
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], processing = 0;
var files = [], processing = 0;
function addFile(file) {
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
function traverseFileTree(files, entry, path) {

@@ -150,3 +155,3 @@ if (entry != null) {

var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
files.push({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();

@@ -182,3 +187,3 @@ var entries = [];

file.path = (path ? path : '') + file.name;
addFile(file);
files.push(file);
} catch (e) {

@@ -195,60 +200,50 @@ processing--;

if (evt.type === 'paste') {
var clipboard = evt.clipboardData || evt.originalEvent.clipboardData;
if (clipboard && clipboard.items) {
for (var k = 0; k < clipboard.items.length; k++) {
if (clipboard.items[k].type.indexOf('image') !== -1) {
addFile(clipboard.items[k].getAsFile());
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) files.push(f);
}
callback(files, rejFiles);
if (!multiple && files.length > 0) break;
}
} else {
var items = evt.dataTransfer.items;
if (items && items.length > 0 && $location.protocol() !== 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
files.push(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var j = 0; j < fileList.length; j++) {
addFile(fileList.item(j));
if (!multiple && files.length > 0) {
break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type === 'directory') i++;
files = [files[i]];
}
uploadService.validate(scope, $parse, attr, files, evt, function (files, rejFiles) {
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
});
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}, delay || 0);
})();
}
}
}, delay || 0);
})();
}

@@ -255,0 +250,0 @@ }

(function () {
ngFileUpload.getAttrWithDefaults = function(attr, name) {
ngFileUpload.getAttrWithDefaults = function (attr, name) {
return attr[name] != null ? attr[name] :

@@ -8,6 +8,7 @@ (ngFileUpload.defaults[name] == null ?

var getAttr = ngFileUpload.getAttrWithDefaults;
var getAttr = ngFileUpload.getAttrWithDefaults, uploadService;
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
ngFileUpload.directive('ngfSelect', ['$parse', '$timeout', '$compile', 'Upload',
function ($parse, $timeout, $compile, Upload) {
uploadService = Upload;
return {

@@ -32,4 +33,5 @@ restrict: 'AEC',

/** @namespace attr.ngfValidate */
/** @namespace attr.ngfMaxSize */
/** @namespace attr.ngfMinSize */
/** @namespace attr.ngfDuration*/
/** @namespace attr.ngfWidth*/
/** @namespace attr.ngfHeight*/
/** @namespace attr.ngfResetOnClick */

@@ -58,30 +60,13 @@ /** @namespace attr.ngfResetModelOnClick */

var isUpdating = false;
function changeFn(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (validate(scope, $parse, attr, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
elem.$$ngfHasFile = true;
updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
var fileList = evt.__files_ || (evt.target && evt.target.files);
uploadService.validate(scope, $parse, attr, fileList, evt, function(files, rejFiles) {
elem.$$ngfHasFile = true;
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt);
if (files.length === 0) evt.target.value = files;
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) {
// angular.element(evt.target).remove();
// }
} finally {
isUpdating = false;
}
}
});
}

@@ -135,3 +120,3 @@

if (elem.$$ngfHasFile) {
updateModel($parse, $timeout, scope, ngModel, attr,
ngFileUpload.updateModel($parse, $timeout, scope, ngModel, attr,
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true);

@@ -143,2 +128,3 @@ delete elem.$$ngfHasFile;

var initialTouchStartY = 0;
function clickHandler(evt) {

@@ -171,3 +157,3 @@ if (elem.attr('disabled') || disabled) return false;

fileElem[0].click();
$timeout(function() {
$timeout(function () {
delete elem.$$ngfProgramClick;

@@ -222,62 +208,2 @@ }, 500);

ngFileUpload.validate = function (scope, $parse, attr, file, evt) {
if (file == null) {
return false;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|';
}
}
} else {
if (str.indexOf('.') === 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}
var custom = $parse(getAttr(attr, 'ngfValidate'))(scope, {$file: file, $event: evt});
if (custom != null && (custom === false || custom.length > 0)) {
file.$error = custom ? custom : 'validate';
return false;
}
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt});
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991;
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1;
if (accept != null && angular.isString(accept)) {
var regexp = new RegExp(globStringToRegex(accept), 'gi');
accept = (file.type != null && regexp.test(file.type.toLowerCase())) ||
(file.name != null && regexp.test(file.name.toLowerCase()));
if (!accept) {
file.$error = 'accept';
return false;
}
} else {
if (accept === false) {
file.$error = 'accept';
return false;
}
}
if (file.size == null) return true;
if (file.size > fileSizeMax) {
file.$error = 'maxSize';
return false;
}
if (file.size < fileSizeMin) {
file.$error = 'minSize';
return false;
}
return true;
};
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange,

@@ -308,4 +234,6 @@ files, rejFiles, evt, noDelay) {

if (ngModel) {
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && ! getAttr(attr, 'multiple') && !keep;
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
var singleModel = !$parse(getAttr(attr, 'ngfMultiple'))(scope) && !getAttr(attr, 'multiple') && !keep;
$timeout(function() {
$parse(getAttr(attr, 'ngModel')).assign(scope, singleModel ? file : files);
});
$timeout(function () {

@@ -344,5 +272,2 @@ if (ngModel) {

var validate = ngFileUpload.validate;
var updateModel = ngFileUpload.updateModel;
})();

@@ -28,3 +28,3 @@ /**!

ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
ngFileUpload.service('UploadBase', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {

@@ -202,32 +202,8 @@ config.method = config.method || 'POST';

this.dataUrl = function (file, callback, disallowObjectUrl) {
if (window.FileReader && file &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
$timeout(function () {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = window.URL || window.webkitURL;
if (URL && URL.createObjectURL && !disallowObjectUrl) {
callback(URL.createObjectURL(file));
} else {
var fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = function (e) {
$timeout(function () {
callback(e.target.result);
});
};
}
});
} else {
callback(null);
}
};
this.setDefaults = function(defaults) {
ngFileUpload.defaults = defaults || {};
};
ngFileUpload.Upload = this;
}
]);

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc