/*
Developed by Paul Giles
May 5, 2007
*/
function SetFormValue(FrmElem_str, newval){
	FrmElem = document.getElementById(FrmElem_str);
	if(!FrmElem){ return false; }
	switch(FrmElem.type) {
	case "button":
	case "submit":
	case "text":
	case "textarea":
	case "hidden":
		FrmElem.value = newval;
		break;
	case "select-one":
	case "select-multiple":
		for (var i=0;i<FrmElem.options.length;i++){
			if (FrmElem.options[i].value == newval){
				FrmElem.selectedIndex=i;
				break;
			}
		}
		if (i==FrmElem.options.length)
			FrmElem.options[FrmElem.options.length] = new Option(newval,newval,false,true);
		break;
	case "checkbox":
	case "radio":
		FrmElem = document.getElementsByName(FrmElem_str);
		//alert(FrmElem.length);
	default:
		if(FrmElem.length>0){
			for (var i=0; i<FrmElem.length; i++) {
				FrmElem[i].checked=FrmElem[i].value==newval ? true : false;
			}
			break;
		}
	}
	return false;
}

function GetFormValue(FrmElem_str){
	var FrmElem = document.getElementById(FrmElem_str);
	if(!FrmElem){return "";}
	switch(FrmElem.type) {
	case "button":
	case "submit":
	case "text":
	case "hidden":
	case "textarea":
		return FrmElem.value;
	case "select-one":
		if(FrmElem.selectedIndex!=-1){return FrmElem.options[FrmElem.selectedIndex].value;}
	case "select-multiple":
		if(FrmElem.selectedIndex!=-1){
			var retVal="";
			for (var i=0;i<FrmElem.length;i++){
				if(FrmElem.options[i].selected) retVal=(retVal>"" ? retVal+", " : "") + FrmElem.options[i].value;
			}
			return retVal;
		}
	case "checkbox":
	case "radio":
		FrmElem = document.getElementsByName(FrmElem_str);
	default:
		var retVal="";
		if(FrmElem.length>0){
			for (var i = 0; i < FrmElem.length; i++) {
				if(FrmElem[i].checked==true){
					retVal=(retVal>"" ? retVal+", " : "") + FrmElem[i].value;
				}
			}
		}
		return retVal;
	}
	return "";
}
var Cards = new Array(7);
Cards[0] = new CardType("Mastercard", "51,52,53,54,55", "16");
Cards[1] = new CardType("Visa", "4", "13,16");
Cards[2] = new CardType("American Express", "34,37", "15");
Cards[3] = new CardType("Diners Club", "30,36,38", "14");
Cards[4] = new CardType("Discover", "6011", "16");
Cards[5] = new CardType("enRoute", "2014,2149", "15");
Cards[6] = new CardType("JCB", "3088,3096,3112,3158,3337,3528", "16");

function checkCardNum(fNameType, fNameNum, ErrName){
	//passed the field name for type and number
	var strType = GetFormValue(fNameType);
	var strNum = GetFormValue(fNameNum);
	if (strNum.length==0) return false;
	strNum = FixCardNumber(strNum);
	SetFormValue(fNameNum, strNum);
	
	var isValid = false;
	if (strNum.length>0){
		for (var i=0; i<Cards.length; i++){
			if (Cards[i].cardtype==strType || strType==""){
				isValid = Cards[i].isCardNumber(strNum);
			}
		}
	}
	if (ErrName.length>0 && document.getElementById(ErrName)!=null)
		document.getElementById(ErrName).innerHTML=(isValid ? "" : "&nbsp;<img src='/images/alert.gif' border='0' align='absmiddle' alt='Not a valid Credit Card Number'>&nbsp;");
	else if(!isValid){
		alert("This is not a valid Credit Card Number");
	}
	return isValid;
}

function checkExpDate(fNameMo, fNameYr, ErrName){
	var strMo = GetFormValue(fNameMo);
	var strYr = GetFormValue(fNameYr);
	if (strMo.length==0 || strYr.length==0) return false;
	var isValid = isExpiryDate(strMo, strYr);
	if (ErrName.length>0 && document.getElementById(ErrName)!=null)
		document.getElementById(ErrName).innerHTML=(isValid ? "" : "&nbsp;<img src='/images/alert.gif' border='0' align='absmiddle' alt='Not a valid Expiry Date'>&nbsp;");
	else if(!isValid)
		alert("This is not a valid Expiry Date");
	return isValid;
}

function checkMask(fName, mask, ErrName){
	var str = GetFormValue(fName);
	var isValid = true;
	//mask should be a regular expression
	return isValid;
}

function checkField(fName, ErrName){
	var isValid = GetFormValue(fName).length>0;
	if (ErrName.length>0 && document.getElementById(ErrName)!=null)
		document.getElementById(ErrName).innerHTML=(isValid ? "" : "&nbsp;<img src='/images/alert.gif' border='0' align='absmiddle' alt='This must not be empty'>&nbsp;");
	return isValid;
}

function checkEmail(fNameEmail, ErrName){
	var strEmail = GetFormValue(fNameEmail);
	var isValid = true;
	if (strEmail.length >0){
		i=strEmail.indexOf("@");
		j=strEmail.indexOf(".",i);
		k=strEmail.indexOf(",");
		kk=strEmail.indexOf(" ");
		jj=strEmail.lastIndexOf(".")+1;
		len=strEmail.length;
		if ((i>0) && (j>(i+1)) && (k==-1) && (kk==-1) && (len-jj >=2) && (len-jj<=3))
			isValid = true;
		else
			isValid = false;
	} else {
		isValid = false;
	}
	if (ErrName.length>0 && document.getElementById(ErrName)!=null)
		document.getElementById(ErrName).innerHTML=(isValid ? "" : "&nbsp;<img src='/images/alert.gif' border='0' align='absmiddle' alt='Not a valid Email Address'>&nbsp;");
	else if(!isValid)
		alert("This is not a valid Email Address");
	return isValid;
}

function ShowDivError(fName, ErrStr){
	if (ErrStr.length==0)
		document.getElementById(fName).innerHTML="";
	else
		document.getElementById(fName).innerHTML="&nbsp;<img src='/images/alert.gif' border='0' align='absmiddle' alt='" + ErrStr + "'>&nbsp;";
}

function FixCardNumber(cardnumber) {
	var a_ccNum = cardnumber.toString();
	var s_ccNum = "";
	for (var n = 0; n < a_ccNum.length; n++)
		if (a_ccNum.substring(n, n+1) >= "0" && a_ccNum.substring(n, n+1) <= "9")
			s_ccNum+=a_ccNum.substring(n, n+1);
	return s_ccNum;
}


/*************************************************************************\
Object CardType([String cardtype, String rules, String len, int year, int month])
cardtype    : type of card, eg: MasterCard, Visa, etc.
rules       : rules of the cardnumber, eg: "4", "6011", "34,37".
len         : valid length of cardnumber, eg: "16,19", "13,16".
year        : year of expiry date.
month       : month of expiry date.
eg:
var VisaCard = new CardType("Visa", "4", "16");
var AmExCard = new CardType("AmEx", "34,37", "15");
\*************************************************************************/
function CardType() {
	var n;
	var argv = CardType.arguments;
	var argc = CardType.arguments.length;
	
	this.objname = "object CardType";
	
	this.cardtype = (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.setLen = setLen;  // setLen method.
	this.setRules = setRules;  // setRules method.
	
	this.setLen(tmplen);
	this.setRules(tmprules);
	this.isCardNumber = isCardNumber;  // isCardNumber method.
	this.isExpiryDate = isExpiryDate;  // isExpiryDate method.
	this.luhnCheck = luhnCheck;// luhnCheck method.
	return this;
}

/*************************************************************************\
boolean isCardNumber([String cardnumber])
return true if cardnumber pass the luhncheck and the rules, else return false.
\*************************************************************************/
function isCardNumber(cardnumber) {
	if (!this.luhnCheck(cardnumber))
		return false;
	for (var n = 0; n < this.len.length; n++)
		if (cardnumber.toString().length == this.len[n]) {
			for (var m = 0; m < this.rules.length; m++) {
				var headdigit = cardnumber.substring(0, this.rules[m].toString().length);
				if (headdigit == this.rules[m])
					return true;
			}
			return false;
		}
	return false;
}

/*************************************************************************\
boolean isExpiryDate([int year, int month])
return true if the date is a valid expiry date,
else return false.
\*************************************************************************/
function isExpiryDate(month, year) {
	if (month.length==0 || year.length==0) return;
	if (!isNum(year+""))	return false;
	if (!isNum(month+""))	return false;
	today = new Date();
	expiry = new Date("20"+year, month);
	if (today.getTime() > expiry.getTime())
		return false;
	else
		return true;
}

/*************************************************************************\
boolean isNum(String argvalue)
return true if argvalue contains only numeric characters,
else 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;
}

/*************************************************************************\
boolean luhnCheck([String CardNumber])
return true if CardNumber pass the luhn check else return false.
Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
\*************************************************************************/
function luhnCheck(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;
}

/*************************************************************************\
CardType setLen(len)
return the CardType object.
\*************************************************************************/
function setLen(len) {
	// Create the len array.
	if (len.length == 0 || len == null) len = "13,14,15,16,19";
	this.len = len.split(',');
	return this;
}

/*************************************************************************\
CardType setRules()
return the CardType object.
\*************************************************************************/
function setRules(rules) {
	// Create the rules array.
	if (rules.length == 0 || rules == null) rules = "0,1,2,3,4,5,6,7,8,9";
	this.rules = rules.split(',');
	return this;
}