/* Copyright (c) 2004-2006, The Dojo Foundation All Rights Reserved. Licensed under the Academic Free License version 2.1 or above OR the modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml */ dojo.provide('dojo.validate.creditCard'); dojo.require("dojo.lang.common"); dojo.require("dojo.validate.common"); /* Validates Credit Cards using account number rules in conjunction with the Luhn algorigthm */ dojo.validate.isValidCreditCard = function(/*String|Int*/value, /*String*/ccType){ //Summary: // checks if type matches the # scheme, and if Luhn checksum is accurate (unless its an Enroute card, the checkSum is skipped) //Value: Boolean if(value&&ccType&&((ccType.toLowerCase()=='er'||dojo.validate.isValidLuhn(value))&&(dojo.validate.isValidCreditCardNumber(value,ccType.toLowerCase())))){ return true; //Boolean } return false; //Boolean } dojo.validate.isValidCreditCardNumber = function(/*String|Int*/value,/*String?*/ccType) { //Summary: // checks if the # matches the pattern for that card or any card types if none is specified // value == CC #, white spaces and dashes are ignored // ccType is of the values in cardinfo -- if Omitted it it returns a | delimited string of matching card types, or false if no matches found //Value: Boolean if(typeof value!='string'){ value = String(value); } value = value.replace(/[- ]/g,''); //ignore dashes and whitespaces /* FIXME: not sure on all the abbreviations for credit cards,below is what each stands for atleast to my knowledge mc: Mastercard ec: Eurocard vi: Visa ax: American Express dc: Diners Club bl: Carte Blanch di: Discover jcb: JCB er: Enroute */ var results=[]; var cardinfo = { '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}' }; if(ccType&&dojo.lang.has(cardinfo,ccType.toLowerCase())){ return Boolean(value.match(cardinfo[ccType.toLowerCase()])); // boolean }else{ for(var p in cardinfo){ if(value.match('^'+cardinfo[p]+'$')!=null){ results.push(p); } } return (results.length)?results.join('|'):false; // string | boolean } } dojo.validate.isValidCvv = function(/*String|Int*/value, /*String*/ccType) { //Summary: // returns true if the security code (CCV) matches the correct format for supplied ccType //Value: Boolean if(typeof value!='string'){ value=String(value); } var format; switch (ccType.toLowerCase()){ case 'mc': case 'ec': case 'vi': case 'di': format = '###'; break; case 'ax': format = '####'; break; default: return false; //Boolean } var flags = {format:format}; //FIXME? Why does isNumberFormat take an object for flags when its only parameter is either a string or an array inside the object? if ((value.length == format.length)&&(dojo.validate.isNumberFormat(value, flags))){ return true; //Boolean } return false; //Boolean }