formvalidation
Version:
The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks
125 lines (112 loc) • 5.11 kB
JavaScript
/**
* stringLength validator
*
* @link http://formvalidation.io/validators/stringLength/
* @author https://twitter.com/nghuuphuoc
* @copyright (c) 2013 - 2015 Nguyen Huu Phuoc
* @license http://formvalidation.io/license/
*/
(function($) {
FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {
'en_US': {
stringLength: {
'default': 'Please enter a value with valid length',
less: 'Please enter less than %s characters',
more: 'Please enter more than %s characters',
between: 'Please enter value between %s and %s characters long'
}
}
});
FormValidation.Validator.stringLength = {
html5Attributes: {
message: 'message',
min: 'min',
max: 'max',
trim: 'trim',
utf8bytes: 'utf8Bytes'
},
enableByHtml5: function($field) {
var options = {},
maxLength = $field.attr('maxlength'),
minLength = $field.attr('minlength');
if (maxLength) {
options.max = parseInt(maxLength, 10);
}
if (minLength) {
options.min = parseInt(minLength, 10);
}
return $.isEmptyObject(options) ? false : options;
},
/**
* Check if the length of element value is less or more than given number
*
* @param {FormValidation.Base} validator The validator plugin instance
* @param {jQuery} $field Field element
* @param {Object} options Consists of following keys:
* - min
* - max
* At least one of two keys is required
* The min, max keys define the number which the field value compares to. min, max can be
* - A number
* - Name of field which its value defines the number
* - Name of callback function that returns the number
* - A callback function that returns the number
*
* - message: The invalid message
* - trim: Indicate the length will be calculated after trimming the value or not. It is false, by default
* - utf8bytes: Evaluate string length in UTF-8 bytes, default to false
* @returns {Object}
*/
validate: function(validator, $field, options) {
var value = validator.getFieldValue($field, 'stringLength');
if (options.trim === true || options.trim === 'true') {
value = $.trim(value);
}
if (value === '') {
return true;
}
var locale = validator.getLocale(),
min = $.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min),
max = $.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max),
// Credit to http://stackoverflow.com/a/23329386 (@lovasoa) for UTF-8 byte length code
utf8Length = function(str) {
var s = str.length;
for (var i = str.length - 1; i >= 0; i--) {
var code = str.charCodeAt(i);
if (code > 0x7f && code <= 0x7ff) {
s++;
} else if (code > 0x7ff && code <= 0xffff) {
s += 2;
}
if (code >= 0xDC00 && code <= 0xDFFF) {
i--;
}
}
return s;
},
length = options.utf8Bytes ? utf8Length(value) : value.length,
isValid = true,
message = options.message || FormValidation.I18n[locale].stringLength['default'];
if ((min && length < parseInt(min, 10)) || (max && length > parseInt(max, 10))) {
isValid = false;
}
switch (true) {
case (!!min && !!max):
message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].stringLength.between, [parseInt(min, 10), parseInt(max, 10)]);
break;
case (!!min):
message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].stringLength.more, parseInt(min, 10));
break;
case (!!max):
message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].stringLength.less, parseInt(max, 10));
break;
default:
break;
}
return {
valid: isValid,
message: message
};
}
};
}(jQuery));