UNPKG

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
/** * 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));