125 lines
3.3 KiB
JavaScript
125 lines
3.3 KiB
JavaScript
|
dojo.provide("dojox.validate.creditCard");
|
||
|
/*=====
|
||
|
|
||
|
dojox.validate.creditCard = {
|
||
|
// summary:
|
||
|
// Module provides validation functions for Credit Cards, using account number
|
||
|
// rules in conjunction with the Luhn algorigthm, with a plugable card info database.
|
||
|
};
|
||
|
|
||
|
=====*/
|
||
|
dojo.require("dojox.validate._base");
|
||
|
|
||
|
dojox.validate._cardInfo = {
|
||
|
// summary: A dictionary list of credit card abbreviations
|
||
|
//
|
||
|
// description:
|
||
|
//
|
||
|
// A hash of valid CC abbreviations and regular expressions
|
||
|
//
|
||
|
// mc: Mastercard
|
||
|
// ec: Eurocard
|
||
|
// vi: Visa
|
||
|
// ax: American Express
|
||
|
// dc: Diners Club
|
||
|
// bl: Carte Blanch
|
||
|
// di: Discover
|
||
|
// jcb: JCB
|
||
|
// er: Enroute
|
||
|
//
|
||
|
// example:
|
||
|
// Define your own card, gift-card, whatever. Starts with 7,
|
||
|
// is 15 total length.
|
||
|
// | dojo.mixin(dojox.validate._cardInfo, {
|
||
|
// | "my":"7[0-9]{14}"
|
||
|
// | });
|
||
|
|
||
|
'mc':'5[1-5][0-9]{14}',
|
||
|
'ec':'5[1-5][0-9]{14}',
|
||
|
'vi':'4(?:[0-9]{12}|[0-9]{15})',
|
||
|
'ax':'3[47][0-9]{13}',
|
||
|
'dc':'3(?:0[0-5][0-9]{11}|[68][0-9]{12})',
|
||
|
'bl':'3(?:0[0-5][0-9]{11}|[68][0-9]{12})',
|
||
|
'di':'6011[0-9]{12}',
|
||
|
'jcb':'(?:3[0-9]{15}|(2131|1800)[0-9]{11})',
|
||
|
'er':'2(?:014|149)[0-9]{11}'
|
||
|
}
|
||
|
|
||
|
dojox.validate.isValidCreditCard = function(value, ccType){
|
||
|
// summary: Validate a credit card number by type with Luhn checking.
|
||
|
//
|
||
|
// description:
|
||
|
// Checks if a credit card type matches the # scheme in a passed value, and if
|
||
|
// the Luhn checksum is accurate (unless its an Enroute card, in which case
|
||
|
// the checkSum is skipped), returning a Boolean to check against.
|
||
|
//
|
||
|
// value: String|Int
|
||
|
// A Value (credit card number) to validate
|
||
|
//
|
||
|
// ccType: String
|
||
|
// A credit-card abbreviation.
|
||
|
//
|
||
|
// example:
|
||
|
// | if(dojox.validate.isValidCreditCard("12345", "mc")){
|
||
|
// | console.log('inconceivable');
|
||
|
// | }
|
||
|
|
||
|
return ((ccType.toLowerCase() == 'er' || dojox.validate.isValidLuhn(value)) &&
|
||
|
dojox.validate.isValidCreditCardNumber(value, ccType.toLowerCase())); // Boolean
|
||
|
}
|
||
|
|
||
|
dojox.validate.isValidCreditCardNumber = function(value, ccType){
|
||
|
// summary:
|
||
|
// Checks if value matches the pattern for that card or any card types if none is specified
|
||
|
//
|
||
|
// value: String|Int
|
||
|
// CC #, white spaces and dashes are ignored
|
||
|
//
|
||
|
// ccType: String?
|
||
|
// One of the abbreviation values in `dojox.validate._cardInfo` --
|
||
|
// if Omitted, function returns a `|` delimited string of matching card types,
|
||
|
// or false if no matches found.
|
||
|
|
||
|
value = String(value).replace(/[- ]/g,''); //ignore dashes and whitespaces
|
||
|
|
||
|
var cardinfo = dojox.validate._cardInfo, results = [];
|
||
|
if(ccType){
|
||
|
var expr = cardinfo[ccType.toLowerCase()];
|
||
|
return expr ? !!value.match(expr) : false; // boolean
|
||
|
}
|
||
|
|
||
|
for(var p in cardinfo){
|
||
|
if(value.match('^' + cardinfo[p] + '$')){
|
||
|
results.push(p);
|
||
|
}
|
||
|
}
|
||
|
return results.length ? results.join('|') : false; // String | boolean
|
||
|
}
|
||
|
|
||
|
dojox.validate.isValidCvv = function(/* String|Int */value, /* String */ccType) {
|
||
|
// summary:
|
||
|
// Validate the security code (CCV) for a passed credit-card type.
|
||
|
//
|
||
|
// description:
|
||
|
//
|
||
|
// value:
|
||
|
|
||
|
if(!dojo.isString(value)){
|
||
|
value = String(value);
|
||
|
}
|
||
|
var format;
|
||
|
switch (ccType.toLowerCase()){
|
||
|
case 'mc':
|
||
|
case 'ec':
|
||
|
case 'vi':
|
||
|
case 'di':
|
||
|
format = '###';
|
||
|
break;
|
||
|
case 'ax':
|
||
|
format = '####';
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return !!format && value.length && dojox.validate.isNumberFormat(value, { format: format }); // Boolean
|
||
|
}
|