Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (function() {
- var $, Range, Trie,
- indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
- Trie = (function() {
- function Trie() {
- this.trie = {};
- }
- Trie.prototype.push = function(value) {
- var char, i, j, len, obj, ref, results;
- value = value.toString();
- obj = this.trie;
- ref = value.split('');
- results = [];
- for (i = j = 0, len = ref.length; j < len; i = ++j) {
- char = ref[i];
- if (obj[char] == null) {
- if (i === (value.length - 1)) {
- obj[char] = null;
- } else {
- obj[char] = {};
- }
- }
- results.push(obj = obj[char]);
- }
- return results;
- };
- Trie.prototype.find = function(value) {
- var char, i, j, len, obj, ref;
- value = value.toString();
- obj = this.trie;
- ref = value.split('');
- for (i = j = 0, len = ref.length; j < len; i = ++j) {
- char = ref[i];
- if (obj.hasOwnProperty(char)) {
- if (obj[char] === null) {
- return true;
- }
- } else {
- return false;
- }
- obj = obj[char];
- }
- };
- return Trie;
- })();
- Range = (function() {
- function Range(trie1) {
- this.trie = trie1;
- if (this.trie.constructor !== Trie) {
- throw Error('Range constructor requires a Trie parameter');
- }
- }
- Range.rangeWithString = function(ranges) {
- var j, k, len, n, r, range, ref, ref1, trie;
- if (typeof ranges !== 'string') {
- throw Error('rangeWithString requires a string parameter');
- }
- ranges = ranges.replace(/ /g, '');
- ranges = ranges.split(',');
- trie = new Trie;
- for (j = 0, len = ranges.length; j < len; j++) {
- range = ranges[j];
- if (r = range.match(/^(\d+)-(\d+)$/)) {
- for (n = k = ref = r[1], ref1 = r[2]; ref <= ref1 ? k <= ref1 : k >= ref1; n = ref <= ref1 ? ++k : --k) {
- trie.push(n);
- }
- } else if (range.match(/^\d+$/)) {
- trie.push(range);
- } else {
- throw Error("Invalid range '" + r + "'");
- }
- }
- return new Range(trie);
- };
- Range.prototype.match = function(number) {
- return this.trie.find(number);
- };
- return Range;
- })();
- $ = jQuery;
- $.fn.validateCreditCard = function(callback, options) {
- var bind, card, card_type, card_types, get_card_type, is_valid_length, is_valid_luhn, j, len, normalize, ref, validate, validate_number;
- card_types = [
- {
- name: 'amex',
- range: '34,37',
- valid_length: [15]
- }, {
- name: 'diners_club_carte_blanche',
- range: '300-305',
- valid_length: [14]
- }, {
- name: 'diners_club_international',
- range: '36',
- valid_length: [14]
- }, {
- name: 'jcb',
- range: '3528-3589',
- valid_length: [16]
- }, {
- name: 'laser',
- range: '6304, 6706, 6709, 6771',
- valid_length: [16, 17, 18, 19]
- }, {
- name: 'visa_electron',
- range: '4026, 417500, 4508, 4844, 4913, 4917',
- valid_length: [16]
- }, {
- name: 'visa',
- range: '4',
- valid_length: [13, 14, 15, 16, 17, 18, 19]
- }, {
- name: 'mastercard',
- range: '51-55,2221-2720',
- valid_length: [16]
- }, {
- name: 'discover',
- range: '6011, 622126-622925, 644-649, 65',
- valid_length: [16]
- }, {
- name: 'dankort',
- range: '5019',
- valid_length: [16]
- }, {
- name: 'maestro',
- range: '50, 56-69',
- valid_length: [12, 13, 14, 15, 16, 17, 18, 19]
- }, {
- name: 'uatp',
- range: '1',
- valid_length: [15]
- }
- ];
- bind = false;
- if (callback) {
- if (typeof callback === 'object') {
- options = callback;
- bind = false;
- callback = null;
- } else if (typeof callback === 'function') {
- bind = true;
- }
- }
- if (options == null) {
- options = {};
- }
- if (options.accept == null) {
- options.accept = (function() {
- var j, len, results;
- results = [];
- for (j = 0, len = card_types.length; j < len; j++) {
- card = card_types[j];
- results.push(card.name);
- }
- return results;
- })();
- }
- ref = options.accept;
- for (j = 0, len = ref.length; j < len; j++) {
- card_type = ref[j];
- if (indexOf.call((function() {
- var k, len1, results;
- results = [];
- for (k = 0, len1 = card_types.length; k < len1; k++) {
- card = card_types[k];
- results.push(card.name);
- }
- return results;
- })(), card_type) < 0) {
- throw Error("Credit card type '" + card_type + "' is not supported");
- }
- }
- get_card_type = function(number) {
- var k, len1, r, ref1;
- ref1 = (function() {
- var l, len1, ref1, results;
- results = [];
- for (l = 0, len1 = card_types.length; l < len1; l++) {
- card = card_types[l];
- if (ref1 = card.name, indexOf.call(options.accept, ref1) >= 0) {
- results.push(card);
- }
- }
- return results;
- })();
- for (k = 0, len1 = ref1.length; k < len1; k++) {
- card_type = ref1[k];
- r = Range.rangeWithString(card_type.range);
- if (r.match(number)) {
- return card_type;
- }
- }
- return null;
- };
- is_valid_luhn = function(number) {
- var digit, k, len1, n, ref1, sum;
- sum = 0;
- ref1 = number.split('').reverse();
- for (n = k = 0, len1 = ref1.length; k < len1; n = ++k) {
- digit = ref1[n];
- digit = +digit;
- if (n % 2) {
- digit *= 2;
- if (digit < 10) {
- sum += digit;
- } else {
- sum += digit - 9;
- }
- } else {
- sum += digit;
- }
- }
- return sum % 10 === 0;
- };
- is_valid_length = function(number, card_type) {
- var ref1;
- return ref1 = number.length, indexOf.call(card_type.valid_length, ref1) >= 0;
- };
- validate_number = function(number) {
- var length_valid, luhn_valid;
- card_type = get_card_type(number);
- luhn_valid = false;
- length_valid = false;
- if (card_type != null) {
- luhn_valid = is_valid_luhn(number);
- length_valid = is_valid_length(number, card_type);
- }
- return {
- card_type: card_type,
- valid: luhn_valid && length_valid,
- luhn_valid: luhn_valid,
- length_valid: length_valid
- };
- };
- validate = (function(_this) {
- return function() {
- var number;
- number = normalize($(_this).val());
- return validate_number(number);
- };
- })(this);
- normalize = function(number) {
- return number.replace(/[ -]/g, '');
- };
- if (!bind) {
- return validate();
- }
- this.on('input.jccv', (function(_this) {
- return function() {
- $(_this).off('keyup.jccv');
- return callback.call(_this, validate());
- };
- })(this));
- this.on('keyup.jccv', (function(_this) {
- return function() {
- return callback.call(_this, validate());
- };
- })(this));
- callback.call(this, validate());
- return this;
- };
- }).call(this);
Add Comment
Please, Sign In to add comment