formvalidation
Version:
The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks
168 lines (151 loc) • 5.85 kB
JavaScript
/**
* FormValidation (http://formvalidation.io)
* The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks
*
* @author https://twitter.com/nghuuphuoc
* @copyright (c) 2013 - 2015 Nguyen Huu Phuoc
* @license http://formvalidation.io/license/
*/
(function($) {
// Helper methods, which can be used in validator class
FormValidation.Helper = {
/**
* Execute a callback function
*
* @param {String|Function} functionName Can be
* - name of global function
* - name of namespace function (such as A.B.C)
* - a function
* @param {Array} args The callback arguments
*/
call: function(functionName, args) {
if ('function' === typeof functionName) {
return functionName.apply(this, args);
} else if ('string' === typeof functionName) {
if ('()' === functionName.substring(functionName.length - 2)) {
functionName = functionName.substring(0, functionName.length - 2);
}
var ns = functionName.split('.'),
func = ns.pop(),
context = window;
for (var i = 0; i < ns.length; i++) {
context = context[ns[i]];
}
return (typeof context[func] === 'undefined') ? null : context[func].apply(this, args);
}
},
/**
* Validate a date
*
* @param {Number} year The full year in 4 digits
* @param {Number} month The month number
* @param {Number} day The day number
* @param {Boolean} [notInFuture] If true, the date must not be in the future
* @returns {Boolean}
*/
date: function(year, month, day, notInFuture) {
if (isNaN(year) || isNaN(month) || isNaN(day)) {
return false;
}
if (day.length > 2 || month.length > 2 || year.length > 4) {
return false;
}
day = parseInt(day, 10);
month = parseInt(month, 10);
year = parseInt(year, 10);
if (year < 1000 || year > 9999 || month <= 0 || month > 12) {
return false;
}
var numDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// Update the number of days in Feb of leap year
if (year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0)) {
numDays[1] = 29;
}
// Check the day
if (day <= 0 || day > numDays[month - 1]) {
return false;
}
if (notInFuture === true) {
var currentDate = new Date(),
currentYear = currentDate.getFullYear(),
currentMonth = currentDate.getMonth(),
currentDay = currentDate.getDate();
return (year < currentYear
|| (year === currentYear && month - 1 < currentMonth)
|| (year === currentYear && month - 1 === currentMonth && day < currentDay));
}
return true;
},
/**
* Format a string
* It's used to format the error message
* format('The field must between %s and %s', [10, 20]) = 'The field must between 10 and 20'
*
* @param {String} message
* @param {Array} parameters
* @returns {String}
*/
format: function(message, parameters) {
if (!$.isArray(parameters)) {
parameters = [parameters];
}
for (var i in parameters) {
message = message.replace('%s', parameters[i]);
}
return message;
},
/**
* Implement Luhn validation algorithm
* Credit to https://gist.github.com/ShirtlessKirk/2134376
*
* @see http://en.wikipedia.org/wiki/Luhn
* @param {String} value
* @returns {Boolean}
*/
luhn: function(value) {
var length = value.length,
mul = 0,
prodArr = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]],
sum = 0;
while (length--) {
sum += prodArr[mul][parseInt(value.charAt(length), 10)];
mul ^= 1;
}
return (sum % 10 === 0 && sum > 0);
},
/**
* Implement modulus 11, 10 (ISO 7064) algorithm
*
* @param {String} value
* @returns {Boolean}
*/
mod11And10: function(value) {
var check = 5,
length = value.length;
for (var i = 0; i < length; i++) {
check = (((check || 10) * 2) % 11 + parseInt(value.charAt(i), 10)) % 10;
}
return (check === 1);
},
/**
* Implements Mod 37, 36 (ISO 7064) algorithm
* Usages:
* mod37And36('A12425GABC1234002M')
* mod37And36('002006673085', '0123456789')
*
* @param {String} value
* @param {String} [alphabet]
* @returns {Boolean}
*/
mod37And36: function(value, alphabet) {
alphabet = alphabet || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var modulus = alphabet.length,
length = value.length,
check = Math.floor(modulus / 2);
for (var i = 0; i < length; i++) {
check = (((check || modulus) * 2) % (modulus + 1) + alphabet.indexOf(value.charAt(i))) % modulus;
}
return (check === 1);
}
};
}(jQuery));