/******** CLIENT SIDE FORM VALIDATION ROUTINES *******************************
	validate.js: include this script which requires Form field validations.
*******************************************************************************/

var True  = true;
var False = false;
var TRUE  = true;
var FALSE = false;
var newLineChar = String.fromCharCode(10);
var char10 = String.fromCharCode(10);
var char34 = String.fromCharCode(34);
var colorError = "#ffc0e0";

// LUHN Formula for validation of credit card numbers.
function mod10(cardNumber)
{
var ar = new Array(cardNumber.length);
var i = 0, sum = 0;
for (i=0;i<cardNumber.length;++i) {
	ar[i] = parseInt(cardNumber.charAt(i));
}
for (i=ar.length-2;i>=0;i-=2) {	// you have to start from the right, and work back.
	ar[i] *= 2;					// every second digit starting with the right most (check digit)
	if( ar[i] > 9 ) ar[i]-=9;	// will be doubled, and summed with the skipped digits.
}								// if the double digit is > 9, add those individual digits together 
for (i=0;i<ar.length;++i) {
	sum += ar[i];				// if the sum is divisible by 10 mod10 succeeds
}
return (((sum%10)==0)?true:false);
}

function expired(month, year)
{
var now = new Date();       // this function is designed to be Y2K compliant.
var thisMonth = (100* now.getFullYear()) + (now.getMonth()+1);
var cardMonth = 1* ("20" + year + month);

if (thisMonth<=cardMonth) return true;
return false;
}

function isEmpty(sText)
{
if ((sText==null) || (sText=="")) return(true);
else return(false);
}

function isLength(sText, nLength)
{
if ((sText==null) || (sText=="")) return(false);
if (sText.length==nLength) return(true);
return(false);
}

function isNumeric(sText, sDelimiters)
{
var chr;
var chr0=String.fromCharCode(48);
var chr9=String.fromCharCode(57);

if ((sText==null) || (sText=="")) return(false);
for (i=0;i<sText.length;i++) {
	chr = sText.charAt(i);
	if (!isEmpty(sDelimiters)) {
		if (sDelimiters.indexOf(chr)>=0) continue;
	}
	if ((chr<chr0)||(chr>chr9)) return(false);
}
return(true);
}

function isElementEquals(objFrm, sFieldName1, sFieldName2)
{
if (objFrm==null) return false;
var elem1 = objFrm.elements[sFieldName1];
if (elem1==null) return false;
var elem2 = objFrm.elements[sFieldName2];
if (elem2==null) return false;

if (elem1.value.toUpperCase()==elem2.value.toUpperCase()) {
	setValid(elem1);
	return setValid(elem2);
} else {
	setInvalid(elem1);
	return setInvalid(elem2);
}

}

function setValid(objElem, colorValid)
{
var objLen = objElem.length;
if ((objLen>1)&&(objElem.type==null)) {
	objElem = objElem[0];
	if (objElem==null) return;
}

if (colorValid==null) colorValid="#ffffff";
objElem.style.backgroundColor=colorValid;
return(true);
}

function setInvalid(objElem, colorNotValid)
{
var objLen = objElem.length;
if ((objLen>1)&&(objElem.type==null)) {
	objElem = objElem[0];
	if (objElem==null) return;
}

if (colorNotValid==null) colorNotValid=colorError;
objElem.style.backgroundColor=colorNotValid;
return(false);
}

function setPrompt(objFrm, sPromptMessage, bError, colorValid, colorNotValid)
{
if (objFrm==null) return false;
var objElem = objFrm.elements["promptLine"];
if (objElem==null) return false;
setInvalid(objElem);
if (bError) {
	if (sPromptMessage==null) sPromptMessage="Please specify a valid input in the highlighted field(s).";
	objElem.value=sPromptMessage;
	setInvalid(objElem, colorNotValid);
} else {
	if (sPromptMessage==null) sPromptMessage="";
	objElem.value=sPromptMessage;
	setValid(objElem, colorValid);
}
}

function isValidText(objFrm, sFieldName, colorValid, colorNotValid)
{
if (objFrm==null) return false;
var objElem = objFrm.elements[sFieldName];
if (objElem==null) return false;

var elemValue=objElem.value;
var objLen = objElem.length;
if ((objLen>1)&&((objElem[0].type=="radio")||(objElem[0].type=="checkbox"))) {
	elemValue="";
	for (var i = 0; i < objLen; i++) {
		if (objElem[i].checked==true) {
			elemValue=objElem[i].value; break;
		}
	}
}

if ((objElem.type=="radio")||(objElem.type=="checkbox")) {
	elemValue="";
	if (objElem.checked==true) {
		elemValue=objElem.value;
	}
}

if (!isEmpty(elemValue))
	return setValid(objElem, colorValid);
else
	return setInvalid(objElem, colorNotValid);
}

function isValidNumber(objFrm, sFieldName, colorValid, colorNotValid)
{
if (objFrm==null) return false;
var objElem = objFrm.elements[sFieldName];
if (objElem==null) return false;
if (isNumeric(objElem.value))
	return setValid(objElem, colorValid);
else
	return setInvalid(objElem, colorNotValid);
}

function isValidCardNumber(objFrm, sFieldName, colorValid, colorNotValid)
{
if (objFrm==null) return false;
var objElem = objFrm.elements[sFieldName];
if (objElem==null) return false;

var cardNumber = objElem.value;
if ((cardNumber.length>=14) && (cardNumber.length<=16) && isNumeric(cardNumber) && mod10(cardNumber))
	return setValid(objElem, colorValid);
else
	return setInvalid(objElem, colorNotValid);
}

function isValidCardType(objFrm, sFieldName, colorValid, colorNotValid)
{
if (objFrm==null) return false;
var objElem = objFrm.elements[sFieldName];
if (objElem==null) return false;

var bValidCard=true;
var cardType = objElem.value;
var cardNumber = objFrm.elements["card_no"].value;

var objLen = objElem.length;
if ((objLen>1)&&(objElem[0].type=="radio")) {
	for (var i = 0; i < objElem.length; i++) {
		if (objElem[i].checked == true) {
			cardType = objElem[i].value;
			break;
		} 
	}
}

var length = cardNumber.length;			//perform card specific length and prefix tests
switch( cardType ) 
{
	case 'A':

		if( length != 15 ) {
			bValidCard=false;
			break;
		}

		var prefix = parseInt( cardNumber.substring(0,2));
		if( prefix != 34 && prefix != 37 ) {
			bValidCard=false;
			break;
		}

		break;

	case 'D':

		if( length != 16 ) {
			bValidCard=false;
			break;
		}

		var prefix = parseInt( cardNumber.substring(0,4));
		if( prefix != 6011 ) {
			bValidCard=false;
			break;
		}

		break;

	case 'M':

		if( length != 16 ) {
			bValidCard=false;
			break;
		}

		var prefix = parseInt( cardNumber.substring(0,2));

		if( prefix < 51 || prefix > 55) {
			bValidCard=false;
			break;
		}

		break;

	case 'V':

		if( length != 16 && length != 13 ) {
			bValidCard=false;
			break;
		}

		var prefix = parseInt( cardNumber.substring(0,1));

		if( prefix != 4 ) {
			bValidCard=false;
			break;
		}

		break;
}

if (bValidCard)
	return setValid(objElem, colorValid);
else
	return setInvalid(objElem, colorNotValid);
}

function isValidCardDate(objFrm, sFieldNameMonth, sFieldNameYear)
{
if (objFrm==null) return false;
var elemMonth = objFrm.elements[sFieldNameMonth];
if (elemMonth==null) return false;
var elemYear = objFrm.elements[sFieldNameYear];
if (elemYear==null) return false;

var cardMonth = elemMonth.value;
var cardYear = elemYear.value;

if (expired(cardMonth, cardYear)) {
	setValid(elemMonth);
	return setValid(elemYear);
} else {
	setInvalid(elemMonth);
	return setInvalid(elemYear);
}

}

function isValidZipCode(objFrm, sFieldName, colorValid, colorNotValid)
{
if (objFrm==null) return false;
var objElem = objFrm.elements[sFieldName];
if (objElem==null) return false;

var zipCode = objElem.value;
if ((zipCode.length==5) && isNumeric(zipCode))
	return setValid(objElem, colorValid);
else
	return setInvalid(objElem, colorNotValid);
}

function isValidPhone(objFrm, sFieldName, colorValid, colorNotValid)
{
if (objFrm==null) return false;
var objElem = objFrm.elements[sFieldName];
if (objElem==null) return false;
if (isNumeric(objElem.value, " +-()"))
	return setValid(objElem, colorValid);
else
	return setInvalid(objElem, colorNotValid);
}

function isValidEmail(objFrm, sFieldName, colorValid, colorNotValid)
{
if (objFrm==null) return false;
var objElem = objFrm.elements[sFieldName];
if (objElem==null) return false;
if (!isEmpty(objElem.value)) {
	var atPos  = objElem.value.indexOf('@');
	var dotPos = objElem.value.indexOf('.', atPos);
	if ((atPos>0) && (dotPos>atPos) && (dotPos<objElem.value.length-2))
		return setValid(objElem, colorValid);
}
return setInvalid(objElem, colorNotValid);
}

