181 lines
6.0 KiB
JavaScript
Executable File
181 lines
6.0 KiB
JavaScript
Executable File
/**
|
|
* FormValidation (http://formvalidation.io)
|
|
* The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit frameworks
|
|
*
|
|
* @author https://twitter.com/nghuuphuoc
|
|
* @copyright (c) 2013 - 2015 Nguyen Huu Phuoc
|
|
* @license http://formvalidation.io/license/
|
|
*/
|
|
|
|
(function(root, factory) {
|
|
|
|
"use strict";
|
|
|
|
// AMD module is defined
|
|
if (typeof define === "function" && define.amd) {
|
|
define("helper", ["jquery", "base"], factory);
|
|
} else {
|
|
// planted over the root!
|
|
factory(root.jQuery, root.FormValidation);
|
|
}
|
|
|
|
}(this, function ($, FormValidation) {
|
|
|
|
// 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);
|
|
}
|
|
};
|
|
return FormValidation.Helper;
|
|
})); |