/* 
	This is the source code for the validation function.
	Add the following code just after the </HEAD> in the files where the
	generalised validation functionality is required.
	<SCRIPT language="JavaScript1.2" src="gen_validation.js"></SCRIPT>
	Modified June 2003 - Date check, also date checks both in fixed date and days relative to 'today'
	15May06 DM Check if object exists in validateForm
	16Feb07 DM CreditCard Mod 10 check
	05Feb08 DM Fixed for non-mandatory empty date fields and checks on those fields
*/

/*
	*File : gen_validation.js 
	*
	*Author : Prasanth M J 
	*Email : prasanth@creativeprogrammers.com
	*
	*Modified : McRae D M (June 2003)
	*Email : dave.mcrae@compucraft.com.au
*/

function removeNonNumerics(s){
	// remove non-numerics
	var v = "0123456789";
	var result=""
	for (i=0; i < s.length; i++) {
		x = s.charAt(i);
		if (v.indexOf(x,0) != -1)
		result += x;
	}
	return result;
}

function cardval(s) {
	var w=removeNonNumerics(s)
	// validate number
	j = w.length / 2;
	if (j < 6.5 || j > 8 || j == 7) return false;
	k = Math.floor(j);
	m = Math.ceil(j) - k;
	c = 0;
	for (i=0; i<k; i++) {
		a = w.charAt(i*2+m) * 2;
		c += a > 9 ? Math.floor(a/10 + a%10) : a;
	}
	for (i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
	return (c%10 == 0);
}

//---------------------------------EMail Check ------------------------------------ 

/*	checks the validity of an email address entered 
*	 returns true or false 
*	 
*/ 

function validateEmail(email)
{
// a very simple email validation checking. 
// you can add more complex email checking if it helps 
		var splitted = email.match("^(.+)@(.+)$");
		if(splitted == null) return false;
		if(splitted[1] != null )
		{
			var regexp_user=/^\"?[\w-_\.]*\"?$/;
			if(splitted[1].match(regexp_user) == null) return false;
		}
		if(splitted[2] != null)
		{
			var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
			if(splitted[2].match(regexp_domain) == null) 
			{
				var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
				if(splitted[2].match(regexp_ip) == null) return false;
			}// if
			return true;
		}
return false;
}

/* function validateData 
*	Checks each field in a form 
*	Called from validateForm function 
*/ 
function validateData(strValidateStr,objValue,strError)
{
		var epos=strValidateStr.search("="); 
		var command="";
		var cmdvalue="";
		if(epos >= 0)
		{
			command = strValidateStr.substring(0,epos);
			cmdvalue = strValidateStr.substr(epos+1);
		}
		else
		{
			command = strValidateStr;
		}

		switch(command) 
		{
				case "req": 
				case "required": 
				{
					if(eval(objValue.value.length) == 0) 
					{
							if(!strError || strError.length ==0) 
							{ 
								strError = objValue.name + " : Required Field"; 
							}//if 
							alert(strError); 
							return false; 
					}//if 
					break;
				}//case required 
				case "maxlength": 
				case "maxlen": 
					{
						if(eval(objValue.value.length) > eval(cmdvalue)) 
						{ 
							if(!strError || strError.length ==0) 
							{ 
								 strError = objValue.name + " : "+cmdvalue+" characters maximum "; 
							}//if 
							alert(strError + "\n[Current length = " + objValue.value.length + " ]"); 
							return false; 
						}//if 
						break; 
					}//case maxlen 
				case "minlength": 
				case "minlen": 
					 { 
						if(eval(objValue.value.length) < eval(cmdvalue))
						{ 
							if(!strError || strError.length ==0) 
							{ 
								strError = objValue.name + " : " + cmdvalue + " characters minimum "; 
							}//if
							alert(strError + "\n[Current length = " + objValue.value.length + " ]"); 
							return false;
						}//if 
						break; 
						}//case minlen 
				case "alnum": 
				case "alphanumeric": 
					{ 
							var charpos = objValue.value.search("[^A-Za-z0-9]"); 
							if(objValue.value.length > 0 && charpos >= 0) 
							{
								if(!strError || strError.length ==0) 
								{
									strError = objValue.name+": Only alpha-numeric characters allowed "; 
								}//if 
								alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
								return false; 
							}//if 
							break; 
					 }//case alphanumeric 
				case "num": 
				case "numeric": 
					{
							var charpos = objValue.value.search("[^0-9.]"); 
							if(objValue.value.length > 0 && charpos >= 0) 
							{ 
								if(!strError || strError.length ==0) 
								{ 
									strError = objValue.name+": Only digits allowed "; 
								}//if
								alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
								return false; 
							}//if 
							break;
					}//numeric 
				case "int": 
				case "integer": 
					{
							var charpos = objValue.value.search("[^0-9]"); 
							if(objValue.value.length > 0 && charpos >= 0) 
							{ 
								if(!strError || strError.length ==0) 
								{ 
									strError = objValue.name+": Only digits allowed "; 
								}//if
								alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
								return false; 
							}//if 
							break;
					}//numeric 
				case "alphabetic": 
				case "alpha": 
					{ 
							var charpos = objValue.value.search("[^A-Za-z]"); 
							if(objValue.value.length > 0 && charpos >= 0) 
							{ 
								if(!strError || strError.length ==0) 
								{ 
									strError = objValue.name+": Only alphabetic characters allowed "; 
								}//if
								alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
								return false; 
							}//if 
							break; 
					 }//alpha 
				case "email": 
					{ 
							if(!validateEmail(objValue.value)) 
							{ 
								if(!strError || strError.length ==0) 
								{ 
										strError = objValue.name+": Enter a valid Email address "; 
								}//if
								alert(strError); 
								return false; 
							}//if 
					break; 
					}//case email 
				case "lt": 
				case "lessthan": 
				 { 
						if(isNaN(objValue.value)) 
						{ 
							alert(objValue.name+": Should be a number ");
							return false; 
						}//if 
						if(eval(objValue.value) > eval(cmdvalue))
						{
							if(!strError || strError.length ==0) 
							{
								strError = objValue.name + " : value should be less than "+ cmdvalue;
							}//if
							alert(strError);
							return false;
						}//if
						break;
				 }//case lessthan
				case "gt": 
				case "greaterthan":
				 {
						if(isNaN(objValue.value))
						{
							alert(objValue.name+": Should be a number ");
							return false;
						}//if 
						if(eval(objValue.value) < eval(cmdvalue))
						{ 
							if(!strError || strError.length ==0)
							{
								strError = objValue.name + " : value should be greater than "+ cmdvalue;
							}//if
							alert(strError);
							return false;
						 }//if
						break; 
				 }//case greaterthan 
				case "regexp": 
				{
					if(!objValue.value.match(cmdvalue))
					{ 
						if(!strError || strError.length ==0)
						{ 
							strError = objValue.name+": Invalid characters found ";
						}//if
						alert(strError);
						return false;
					}//if 
					break; 
				}//case regexp
				case "dontselect": 
				 { 
						if(objValue.selectedIndex == null) 
						{ 
							alert("BUG: dontselect command for non-select Item"); 
							return false; 
						} 
						if(objValue.selectedIndex == eval(cmdvalue)) 
						{ 
						 if(!strError || strError.length ==0) 
							{ 
							strError = objValue.name+": Please Select one option "; 
							}//if
							alert(strError); 
							return false;
						 } 
						 break; 
				 }//case dontselect
				case "date": 
				{
					var Dt=DatVal(objValue.value)
					//alert(objValue.value+'\n'+Dt[0]+'\n'+Dt[1])
					if(!Dt[0] && (Dt[1]>0) ){
						if(!strError || strError.length ==0){
							strError = objValue.name+": Date not valid. ";
							/*
							'Determine what date format for input.
							'0=         expects  Y+MMDD     e.g. 20030215          030215
							'1= (ISO)   expects  Y+_M+_D+   e.g. 2003-2-15    2003 Feb 15
							'2= (EU/AU) expects  D+_M+_Y+   e.g. 15 Okt, 2003    15.02.03
							'3= (NA)    expects  M+_D+_Y+   e.g. Feb 15th, 2003   2/15/03
							*/
							switch(F){
								case 0:{
									strError+="Expect value of type YMMDD";
									break;
								};
								case 1:{
									strError+="Expect value of type YY/MM/DD";
									break;
								};
								case 2:{
									strError+="Expect value of type D/M/YY";
									break;
								};
								case 3:{
									strError+="Expect value of type M/D/Y";
									break;
								};
							}//switch
						}//if
						alert(strError);
						return false;
					}
					break;
				}//case date
				case "datelt": 
				{
					var Dt=DatVal(objValue.value)
					//alert(Dt+'\n'+Dt[0]+'\n'+Dt[1])
					if(!Dt[0] && (Dt[1]>0) ){
						return false;
					};
					var sDtEval='var DtEval=new Date('+cmdvalue+')';
					eval(sDtEval);
					//alert(Dt+'\n'+DtEval+'\n'+(Dt[1]>DtEval)+'\n'+cmdvalue)
					if( (Dt[1]>DtEval) && (Dt[1]>0) ){
						if(!strError || strError.length ==0){
							strError = objValue.name + " : value should be less than "+ DtEval;
						}//if
						alert(strError);
						return false;
					}
					break;
				}//case datelt
				case "dategt":
				{
					var Dt=DatVal(objValue.value)
					if(!Dt[0] && (Dt[1]>0) ){
						return false;
					};
					var sDtEval='var DtEval=new Date('+cmdvalue+')';
					eval(sDtEval);
					//alert(Dt[1]+'\n'+DtEval+'\n'+(Dt[1]<DtEval))
					if( (Dt[1]<DtEval) && (Dt[1]>0) ){
						if(!strError || strError.length ==0){
							strError = objValue.name + " : value should be greater than "+ DtEval;
						}//if
						alert(strError);
						return false;
					}
					break;
				}//case dategt
				case "creditcard":
				{
					var CCVal=objValue.value;
					CCVal=removeNonNumerics(CCVal);
					if(!cardval(CCVal)){
						if(!strError || strError.length ==0){
							strError = "The Credit Card number entered is not valid";
						}
						alert(strError);
						return false;
					}
					break;
				}//case credit card
		}//switch 
		return submitClientConfirm();
} 

/* 
* function validateForm 
* the function that can be used to validate any form 
* returns false if the validation fails; true if success 
* arguments : 
*	 objFrm		 : the form object 
*	 arrObjDesc : an array of objects describing the validations to conduct on each 
*				input item. 
*					The array should consist of one object per input item in the order the input 
*					elements are present in the form. Each object consist of zero or more validation 
*					objects. Each of these validation object is a pair consisting of the validation 
*					descriptor string and an optional Error message. 
*/ 

function validateForm(objFrm,arrObjDesc) 
{
	//alert(arrObjDesc.length)
	for(var itrobj=0; itrobj < arrObjDesc.length; itrobj++) 
	{
		if(objFrm.elements.length <= itrobj) 
		{ 
			alert("BUG: Obj descriptor for a non existent form element"); 
			return false; 
		}//if 
		//alert(itrobj+' '+arrObjDesc[itrobj])
		if(arrObjDesc[itrobj]){ //necessary as count goes 1 above in non-input cases
			for(var itrdesc=0; itrdesc < arrObjDesc[itrobj].length ;itrdesc++) 
			{
				if(validateData(arrObjDesc[itrobj][itrdesc][0], 
									 objFrm[itrobj],arrObjDesc[itrobj][itrdesc][1]) == false) 
				{
					objFrm[itrobj].focus();
					return false; 
				}//if 
			}//for
		}//if object test
	}//for 
} 
