/**
* jQuery Form Validator Module: File
* ------------------------------------------
* Created by Victor Jonsson <http://www.victorjonsson.se>
*
* The following validators will be added by this module:
* - mime type
* - file size
* - file extension
*
* @website http://formvalidator.net/
* @license Dual licensed under the MIT or GPL Version 2 licenses
* @version 2.1.66
*/
(function($, window) {
var SUPPORTS_FILE_READER = typeof window.FileReader != 'undefined',
/**
* @return {Array}
*/
_getTypes = function($input) {
var allowedTypes = $.split( ($input.valAttr('allowing') || '').toLowerCase() );
if( $.inArray('jpg', allowedTypes) > -1 && $.inArray('jpeg', allowedTypes) == -1)
allowedTypes.push('jpeg');
else if( $.inArray('jpeg', allowedTypes) > -1 && $.inArray('jpg', allowedTypes) == -1)
allowedTypes.push('jpg');
return allowedTypes;
};
/*
* Validate mime type (falls back on validate_extension in older browsers)
*/
$.formUtils.addValidator({
name : 'mime',
validatorFunction : function(str, $input) {
var files = $input.get(0).files || [];
if( SUPPORTS_FILE_READER ) {
var valid = true,
mime = '',
allowedTypes = _getTypes($input);
$.each(files, function(i, file) {
valid = false;
mime = file.type || '';
$.each(allowedTypes, function(j, type) {
valid = mime.indexOf(type) > -1;
if( valid ) {
return false;
}
});
return valid;
});
return valid;
} else {
return $.formUtils.validators.validate_extension.validatorFunction(str, $input);
}
},
errorMessage : 'The file you are trying to upload is of wrong type',
errorMessageKey: 'wrongFileType'
});
/**
* Validate file extension
*/
$.formUtils.addValidator({
name : 'extension',
validatorFunction : function(value, $input) {
var valid = true,
types = _getTypes($input);
$.each($input.get(0).files || [], function(i, file) {
var val = file.value,
ext = val.substr( val.lastIndexOf('.')+1 );
if( $.inArray(ext.toLowerCase(), types) == -1 ) {
valid = false;
return false;
}
});
return valid;
},
errorMessage : 'The file you are trying to upload is of wrong type',
errorMessageKey: 'wrongFileType'
});
/**
* Validate file size
*/
$.formUtils.addValidator({
name : 'size',
validatorFunction : function(val, $input) {
var maxSize = $input.valAttr('max-size');
if( !maxSize ) {
console.log('Input "'+$input.attr('name')+'" is missing data-validation-max-size attribute');
return true;
} else if( !SUPPORTS_FILE_READER ) {
return true; // no fallback available
}
var maxBytes = $.formUtils.convertSizeNameToBytes(maxSize),
valid = true;
$.each($input.get(0).files || [], function(i, file) {
valid = file.size <= maxBytes;
return valid;
});
return valid;
},
errorMessage : 'The file you are trying to upload is too large',
errorMessageKey: 'wrongFileSize'
});
/**
* Make this function accessible via formUtils for unit tests
* @param {String} sizeName
* @return {Number}
*/
$.formUtils.convertSizeNameToBytes = function(sizeName) {
sizeName = sizeName.toUpperCase();
if( sizeName.substr(sizeName.length-1, 1) == 'M' ) {
return parseInt(sizeName.substr(0, sizeName.length-1), 10) * 1024 * 1024;
} else if( sizeName.substr(sizeName.length-2, 2) == 'MB' ) {
return parseInt(sizeName.substr(0, sizeName.length-2), 10) * 1024 * 1024;
} else if( sizeName.substr(sizeName.length-2, 2) == 'KB' ) {
return parseInt(sizeName.substr(0, sizeName.length-2), 10) * 1024;
} else if( sizeName.substr(sizeName.length-1, 1) == 'B' ) {
return parseInt(sizeName.substr(0, sizeName.length-1), 10);
} else {
return parseInt(sizeName, 10);
}
};
/*
* This event listener will remove error messages for file
* inputs when file changes
*/
$(window).one('validatorsLoaded formValidationSetup', function(evt, $form) {
var $inputs;
if( $form ) {
$inputs = $form.find('input[type="file"]');
} else {
$inputs = $('input[type="file"]');
}
$inputs.filter('*[data-validation]').bind('change', function() {
$(this)
.removeClass('error')
.parent()
.find('.form-error').remove();
});
});
})(jQuery, window);