/*-----------------------------------------------------------------------------
		GLOBAL Variables
	-----------------------------------------------------------------------------*/
		var Cards = new makeArray(3);
		Cards[0] = new CardType("Visa", "4", "16");
		var Visa = Cards[0];
		Cards[1] = new CardType("MC", "51,52,53,54,55", "16");
		var MC = Cards[1];
		Cards[2] = new CardType("AMEX", "34,37", "15");
		var AMEX = Cards[2];
	/*-----------------------------------------------------------------------------
		METHODS
	-----------------------------------------------------------------------------*/
	function makeArray(size){
		this.size = size;
		return this;
	}
	function CardType(){
		var n;
		var argv = CardType.arguments;
		var argc = CardType.arguments.length;
		
		this.objname = "object CardType";
		var tmpcardtype = (argc > 0) ? argv[0] : "CardObject";
		var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
		var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";

		this.setCardNumber = setCardNumber; 
		this.setCardType = setCardType;
		this.setLen = setLen; 
		this.setAtrib = setAtrib;
		
		this.setCardType(tmpcardtype);
		this.setLen(tmplen);
		this.setAtrib(tmprules);
		
		this.checkCardNumber = checkCardNumber;
		
		this.getCardType = getCardType;
		this.isCardNumber = isCardNumber;
		this.luhnCheck = luhnCheck;
		return this;
	}
	function checkCardNumber(){
		var argv = checkCardNumber.arguments;
		var argc = checkCardNumber.arguments.length;
		var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
		
		this.setCardNumber(cardnumber);
		if (!this.isCardNumber()) return false;
		
		return true;
	}
	function getCardType(){
		return this.cardtype;
	}
	function setCardType(cardtype){
		this.cardtype = cardtype;
		return this;
	}
	function setCardNumber(cardnumber){
		this.cardnumber = cardnumber;
		return this;
	}
	function setLen(len){
		if (len.length == 0 || len == null) len = "13,14,15,16,19";
		var tmplen = len;
		n = 1;
		while (tmplen.indexOf(",") != -1){
			tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
			n++;
		}
		this.len = new makeArray(n);
		n = 0;
		while (len.indexOf(",") != -1){
			var tmpstr = len.substring(0, len.indexOf(","));
			this.len[n] = tmpstr;
			len = len.substring(len.indexOf(",") + 1, len.length);
			n++;
		}
		this.len[n] = len;
		return this;
	}
	function setAtrib(Atrib){
		if (Atrib.length == 0 || Atrib == null) Atrib = "0,1,2,3,4,5,6,7,8,9";
		var tmprules = Atrib;
		n = 1;
		while (tmprules.indexOf(",") != -1){
			tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
			n++;
		}
		this.Atrib = new makeArray(n);
		n = 0;
		while (Atrib.indexOf(",") != -1){
			var tmpstr = Atrib.substring(0, Atrib.indexOf(","));
			this.Atrib[n] = tmpstr;
			Atrib = Atrib.substring(Atrib.indexOf(",") + 1, Atrib.length);
			n++;
		}
		this.Atrib[n] = Atrib;
		return this;
	}
	function luhnCheck(){
		var argv = luhnCheck.arguments;
		var argc = luhnCheck.arguments.length;
		
		var CardNumber = argc > 0 ? argv[0] : this.cardnumber;
		if (! isNum(CardNumber)) return false;
		 
		
		var no_digit = CardNumber.length;
		var oddoeven = no_digit & 1;
		var sum = 0;
		
		for (var count = 0; count < no_digit; count++){
			var digit = parseInt(CardNumber.charAt(count));
			if (!((count & 1) ^ oddoeven)){
				digit *= 2;
				if (digit > 9) digit -= 9;
			}
			sum += digit;
		}
		if (sum % 10 == 0)
			return true;
		else
			return false;
	}
	function isCardNumber()
	{
		var argv = isCardNumber.arguments;
		var argc = isCardNumber.arguments.length;
		var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
		
		if (!this.luhnCheck())return false;
		
		for (var n = 0; n < this.len.size; n++)
		{
			if (cardnumber.toString().length == this.len[n])
			{
				for (var m = 0; m < this.Atrib.size; m++)
				{
					var headdigit = cardnumber.substring(0, this.Atrib[m].toString().length);
					if (headdigit == this.Atrib[m])return true;
				}
				return false;
			}
			return false;
		}
	}
	function isNum(argvalue){
		argvalue = argvalue.toString();
		if (argvalue.length == 0) return false;
		for (var n = 0; n < argvalue.length; n++){
			if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n, n+1) > "9") return false;
		}
		return true;
	}
	/*-----------------------------------------------------------------------------
		CHECKS WHETHER ENTERED MONTH IS VALID OR NOT FOR CC
	-----------------------------------------------------------------------------*/
	function ValidMonth(M, Y)
	{
		var Mon = (new Date()).getMonth() + 1 + "";
		var Yr = (new Date()).getFullYear();
		if(Mon.length < 2) Mon = "0" + Mon;
		if(Y > Yr) return true;
		
		if(M < Mon) 
			return false
		else
			return true;
	}

