// ======================================================================== // SproutCore // copyright 2006-2007 Sprout Systems, Inc. // ======================================================================== require('validators/validator') ; // Force to be a valid credit card number. SC.Validator.CreditCard = SC.Validator.extend({ // expects a string of 16 digits. split into groups of 4 fieldValueForObject: function(object, form, field) { if (typeof(object) == "string" && object.length == 16) { object = [object.slice(0,4),object.slice(4,8),object.slice(8,12),object.slice(12,16)].join(' ') ; } return object ; }, // remove all whitespace to make a single number. objectForFieldValue: function(value, form, field) { return value.replace(/^\s+|\s+$/g,'') ; }, validate: function(form, field) { return this.checkNumber(field.get('fieldValue')) ; }, validateError: function(form, field) { var label = field.get('errorLabel') || 'Field' ; return $error("Invalid.CreditCard(%@)".loc(label), label); }, // Borrowed from: David Leppek :: https://www.azcode.com/Mod10 checkNumber: function(ccNumb) { var valid = "0123456789" // Valid digits in a credit card number var len = ccNumb.length; // The length of the submitted cc number var iCCN = parseInt(ccNumb); // integer of ccNumb var sCCN = ccNumb.toString(); // string of ccNumb sCCN = sCCN.replace (/^\s+|\s+$/g,''); // strip spaces var iTotal = 0; // integer total set at zero var bNum = true; // by default assume it is a number var bResult = false; // by default assume it is NOT a valid cc var temp; // temp variable for parsing string var calc; // used for calculation of each digit // Determine if the ccNumb is in fact all numbers for (var j=0; j= 15){ // 15 or 16 for Amex or V/MC for(var i=len;i>0;i--){ // LOOP throught the digits of the card calc = parseInt(iCCN) % 10; // right most digit calc = parseInt(calc); // assure it is an integer iTotal += calc; // running total of the card number as we loop - Do Nothing to first digit i--; // decrement the count - move to the next digit in the card iCCN = iCCN / 10; // subtracts right most digit from ccNumb calc = parseInt(iCCN) % 10 ; // NEXT right most digit calc = calc *2; // multiply the digit by two // Instead of some screwy method of converting 16 to a string and then parsing 1 and 6 and then adding them to make 7, // I use a simple switch statement to change the value of calc2 to 7 if 16 is the multiple. switch(calc){ case 10: calc = 1; break; //5*2=10 & 1+0 = 1 case 12: calc = 3; break; //6*2=12 & 1+2 = 3 case 14: calc = 5; break; //7*2=14 & 1+4 = 5 case 16: calc = 7; break; //8*2=16 & 1+6 = 7 case 18: calc = 9; break; //9*2=18 & 1+8 = 9 default: calc = calc; //4*2= 8 & 8 = 8 -same for all lower numbers } iCCN = iCCN / 10; // subtracts right most digit from ccNum iTotal += calc; // running total of the card number as we loop } // END OF LOOP if ((iTotal%10)==0){ // check to see if the sum Mod 10 is zero bResult = true; // This IS (or could be) a valid credit card number. } else { bResult = false; // This could NOT be a valid credit card number } } } return bResult; // Return the results } }) ;