formvalidation
Version:
The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks
164 lines (153 loc) • 6.41 kB
JavaScript
/**
* cvv validator
*
* @link http://formvalidation.io/validators/cvv/
* @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': {
cvv: {
'default': 'Please enter a valid CVV number'
}
}
});
FormValidation.Validator.cvv = {
html5Attributes: {
message: 'message',
ccfield: 'creditCardField'
},
/**
* Bind the validator on the live change of the credit card field
*
* @param {FormValidation.Base} validator The validator plugin instance
* @param {jQuery} $field Field element
* @param {Object} options Consists of the following key:
* - creditCardField: The credit card number field
*/
init: function(validator, $field, options) {
if (options.creditCardField) {
var creditCardField = validator.getFieldElements(options.creditCardField);
validator.onLiveChange(creditCardField, 'live_cvv', function() {
var status = validator.getStatus($field, 'cvv');
if (status !== validator.STATUS_NOT_VALIDATED) {
validator.revalidateField($field);
}
});
}
},
/**
* Unbind the validator on the live change of the credit card field
*
* @param {FormValidation.Base} validator The validator plugin instance
* @param {jQuery} $field Field element
* @param {Object} options Consists of the following key:
* - creditCardField: The credit card number field
*/
destroy: function(validator, $field, options) {
if (options.creditCardField) {
var creditCardField = validator.getFieldElements(options.creditCardField);
validator.offLiveChange(creditCardField, 'live_cvv');
}
},
/**
* Return true if the input value is a valid CVV number.
*
* @param {FormValidation.Base} validator The validator plugin instance
* @param {jQuery} $field Field element
* @param {Object} options Can consist of the following keys:
* - creditCardField: The credit card number field. It can be null
* - message: The invalid message
* @returns {Boolean}
*/
validate: function(validator, $field, options) {
var value = validator.getFieldValue($field, 'cvv');
if (value === '') {
return true;
}
if (!/^[0-9]{3,4}$/.test(value)) {
return false;
}
if (!options.creditCardField) {
return true;
}
// Get the credit card number
var creditCard = validator.getFieldElements(options.creditCardField).val();
if (creditCard === '') {
return true;
}
creditCard = creditCard.replace(/\D/g, '');
// Supported credit card types
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, creditCardType = null;
for (type in cards) {
for (i in cards[type].prefix) {
if (creditCard.substr(0, cards[type].prefix[i].length) === cards[type].prefix[i] // Check the prefix
&& $.inArray(creditCard.length, cards[type].length) !== -1) // and length
{
creditCardType = type;
break;
}
}
}
return (creditCardType === null)
? false
: (('AMERICAN_EXPRESS' === creditCardType) ? (value.length === 4) : (value.length === 3));
}
};
}(jQuery));