formvalidation
Version:
The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks
119 lines (112 loc) • 4.53 kB
JavaScript
/**
* creditCard validator
*
* @link http://formvalidation.io/validators/creditCard/
* @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': {
creditCard: {
'default': 'Please enter a valid credit card number'
}
}
});
FormValidation.Validator.creditCard = {
/**
* Return true if the input value is valid credit card number
* Based on https://gist.github.com/DiegoSalazar/4075533
*
* @param {FormValidation.Base} validator The validator plugin instance
* @param {jQuery} $field Field element
* @param {Object} [options] Can consist of the following key:
* - message: The invalid message
* @returns {Boolean|Object}
*/
validate: function(validator, $field, options) {
var value = validator.getFieldValue($field, 'creditCard');
if (value === '') {
return true;
}
// Accept only digits, dashes or spaces
if (/[^0-9-\s]+/.test(value)) {
return false;
}
value = value.replace(/\D/g, '');
if (!FormValidation.Helper.luhn(value)) {
return false;
}
// Validate the card number based on prefix (IIN ranges) and length
var cards = {
AMERICAN_EXPRESS: {
length: [15],
prefix: ['34', '37']
},
DINERS_CLUB: {
length: [14],
prefix: ['300', '301', '302', '303', '304', '305', '36']
},
DINERS_CLUB_US: {
length: [16],
prefix: ['54', '55']
},
DISCOVER: {
length: [16],
prefix: ['6011', '622126', '622127', '622128', '622129', '62213',
'62214', '62215', '62216', '62217', '62218', '62219',
'6222', '6223', '6224', '6225', '6226', '6227', '6228',
'62290', '62291', '622920', '622921', '622922', '622923',
'622924', '622925', '644', '645', '646', '647', '648',
'649', '65']
},
JCB: {
length: [16],
prefix: ['3528', '3529', '353', '354', '355', '356', '357', '358']
},
LASER: {
length: [16, 17, 18, 19],
prefix: ['6304', '6706', '6771', '6709']
},
MAESTRO: {
length: [12, 13, 14, 15, 16, 17, 18, 19],
prefix: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']
},
MASTERCARD: {
length: [16],
prefix: ['51', '52', '53', '54', '55']
},
SOLO: {
length: [16, 18, 19],
prefix: ['6334', '6767']
},
UNIONPAY: {
length: [16, 17, 18, 19],
prefix: ['622126', '622127', '622128', '622129', '62213', '62214',
'62215', '62216', '62217', '62218', '62219', '6222', '6223',
'6224', '6225', '6226', '6227', '6228', '62290', '62291',
'622920', '622921', '622922', '622923', '622924', '622925']
},
VISA: {
length: [16],
prefix: ['4']
}
};
var type, i;
for (type in cards) {
for (i in cards[type].prefix) {
if (value.substr(0, cards[type].prefix[i].length) === cards[type].prefix[i] // Check the prefix
&& $.inArray(value.length, cards[type].length) !== -1) // and length
{
return {
valid: true,
type: type
};
}
}
}
return false;
}
};
}(jQuery));