ソースを参照

#97: Add creditCardField option

phuoc 12 年 前
コミット
bdf75db434

+ 3 - 1
dist/css/bootstrapValidator.css

@@ -7,5 +7,7 @@
  * @copyright   (c) 2014 Nguyen Huu Phuoc
  * @license     MIT
  */
+
 .bootstrap-validator-form .help-block {
-  margin-bottom: 0; }
+    margin-bottom: 0;
+}

+ 81 - 1
dist/js/bootstrapValidator.js

@@ -767,6 +767,7 @@
          * @param {BootstrapValidator} 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}
          */
@@ -776,7 +777,86 @@
                 return true;
             }
 
-            return /^[0-9]{3,4}$/.test(value);
+            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();
+
+            // Supported credit card types
+            var cards = {
+                AMERICAN_EXPRESS: {
+                    length: [15],
+                    ccv: ['34', '37']
+                },
+                DINERS_CLUB: {
+                    length: [14],
+                    ccv: ['300', '301', '302', '303', '304', '305', '36']
+                },
+                DINERS_CLUB_US: {
+                    length: [16],
+                    ccv: ['54', '55']
+                },
+                DISCOVER: {
+                    length: [16],
+                    ccv: ['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],
+                    ccv: ['3528', '3529', '353', '354', '355', '356', '357', '358']
+                },
+                LASER: {
+                    length: [16, 17, 18, 19],
+                    ccv: ['3528', '3529', '353', '354', '355', '356', '357', '358']
+                },
+                MAESTRO: {
+                    length: [12, 13, 14, 15, 16, 17, 18, 19],
+                    ccv: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']
+                },
+                MASTERCARD: {
+                    length: [16],
+                    ccv: ['51', '52', '53', '54', '55']
+                },
+                SOLO: {
+                    length: [16, 18, 19],
+                    ccv: ['6334', '6767']
+                },
+                UNIONPAY: {
+                    length: [16, 17, 18, 19],
+                    ccv: ['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'],
+                    ccv: ['4']
+                }
+            };
+            var type, prefix, creditCardType = null;
+            for (type in cards) {
+                for (prefix in cards[type]['ccv']) {
+                    if (creditCard.substr(0, prefix.length) == prefix                // Check the prefix
+                        && cards[type]['length'].indexOf(creditCard.length) != -1)   // and length
+                    {
+                        creditCardType = type;
+                    }
+                }
+            }
+
+            return (creditCardType == null)
+                        ? false
+                        : (('AMERICAN_EXPRESS' == creditCardType) ? (value.length == 4) : (value.length == 3));
         }
     };
 }(window.jQuery));

ファイルの差分が大きいため隠しています
+ 1 - 1
dist/js/bootstrapValidator.min.js


+ 81 - 1
src/js/validator/cvv.js

@@ -6,6 +6,7 @@
          * @param {BootstrapValidator} 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}
          */
@@ -15,7 +16,86 @@
                 return true;
             }
 
-            return /^[0-9]{3,4}$/.test(value);
+            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();
+
+            // Supported credit card types
+            var cards = {
+                AMERICAN_EXPRESS: {
+                    length: [15],
+                    ccv: ['34', '37']
+                },
+                DINERS_CLUB: {
+                    length: [14],
+                    ccv: ['300', '301', '302', '303', '304', '305', '36']
+                },
+                DINERS_CLUB_US: {
+                    length: [16],
+                    ccv: ['54', '55']
+                },
+                DISCOVER: {
+                    length: [16],
+                    ccv: ['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],
+                    ccv: ['3528', '3529', '353', '354', '355', '356', '357', '358']
+                },
+                LASER: {
+                    length: [16, 17, 18, 19],
+                    ccv: ['3528', '3529', '353', '354', '355', '356', '357', '358']
+                },
+                MAESTRO: {
+                    length: [12, 13, 14, 15, 16, 17, 18, 19],
+                    ccv: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']
+                },
+                MASTERCARD: {
+                    length: [16],
+                    ccv: ['51', '52', '53', '54', '55']
+                },
+                SOLO: {
+                    length: [16, 18, 19],
+                    ccv: ['6334', '6767']
+                },
+                UNIONPAY: {
+                    length: [16, 17, 18, 19],
+                    ccv: ['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'],
+                    ccv: ['4']
+                }
+            };
+            var type, prefix, creditCardType = null;
+            for (type in cards) {
+                for (prefix in cards[type]['ccv']) {
+                    if (creditCard.substr(0, prefix.length) == prefix                // Check the prefix
+                        && cards[type]['length'].indexOf(creditCard.length) != -1)   // and length
+                    {
+                        creditCardType = type;
+                    }
+                }
+            }
+
+            return (creditCardType == null)
+                        ? false
+                        : (('AMERICAN_EXPRESS' == creditCardType) ? (value.length == 4) : (value.length == 3));
         }
     };
 }(window.jQuery));