﻿Luhn = function(cardNumber) {
	this.cardNumber = cardNumber.replace(/\D/gi, "");
	this.patterns = [
		/^5(1|2|3|4|5)\d{14}$/gi,
		/^4(\d{12}|\d{15})$/gi,
		/^3(4|7)\d{13}$/gi,
		/^6011\d{12}$/gi
	];
};

Luhn.prototype = {
	getCardName : function() {
		var x = this.cardNumber,
			names = [ "MasterCard", "VISA", "American Express", "Discover" ],
			result = null;
		
		for (var a = 0; a < this.patterns.length; a++) {
			if (x.search(this.patterns[a]) != -1) {
				result = names[a];
				break;
			}
		}
		
		return (result);
	},
	
	getCardCode : function() {
		var x = this.cardNumber,
			names = [ "MC", "VISA", "AMEX", "DISC" ],
			result = null;
			
		for (var a = 0; a < this.patterns.length; a++) {
			if (x.search(this.patterns[a]) != -1) {
				result = names[a];
				break;
			}
		}
		
		return (result);
	},
	
	isValid		: function() {
		var ref = this.cardNumber;
		
		var buffer = [],
			total = 0,
			bufferItem = 0,
			index = 1,
			weighted = (ref.length % 2 != 0),
			test = [];
		
		for (var a = 0; a < ref.length; a++) {
			bufferItem = parseInt(ref.substr(a, 1));
			if ((weighted && index % 2 == 0) || (!weighted && index % 2 != 0)) {
				bufferItem = bufferItem * 2;
				if (bufferItem >= 10) bufferItem -= 9;
			}
			buffer.push(bufferItem);
			index += 1;
		}
		
		buffer.forEach(function() { total += this; });
		return (total % 10 == 0);
	}
};
