/* 
	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
	18May09 DM Date, radio/checkbox mandatory checks
	26Jun09 maxLength, maxLengthPaste - for textarea - in this .js rather that webContent.js as it's common to both popup and inline forms
	06Apr10 DM ToDate is compared with a possible FromDate value - fail if toDate<FromDate
	03Nov10 AP Added RemoveHTMLTags function to strip out HTML in prompts on the alert
*/

/*
	*File : gen_validation.js 
	*
	*Author : Prasanth M J 
	*Email : prasanth@creativeprogrammers.com
	*
	*Modified : McRae D M (June 2003)
	*Email : dave.mcrae@compucraft.com.au
*/

//global vars
var dFromDateValue=null

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;
		}

		if (strError.length > 1)
		{
			strError = removeHTMLTags(strError);
		}

		switch(command) 
		{
				case "req": 
				case "required": 
				{
					//alert(objValue.name+' '+objValue.value+' '+objValue.type)
					if(eval(objValue.value.length) == 0) 
					{
							if(!strError || strError.length ==0) 
							{ 
								strError = removeHTMLTags(objValue.name) + " : Required Field"; 
							}//if 
							alert(strError); 
							return false; 
					}//if 
					if((objValue.type=='radio')||(objValue.type=='checkbox')){
						var bRadioChecked=false;
						//alert(objValue.form.elements[objValue.name].length)
						for(var k=0; k<objValue.form.elements[objValue.name].length; k++){
							bRadioChecked=(objValue.form.elements[objValue.name][k].checked);
							if(bRadioChecked){break}
						}
						if(!bRadioChecked){
							if(!strError || strError.length ==0) 
							{ 
								strError = removeHTMLTags(objValue.name) + " : Required Field"; 
							}//if 
							alert(strError); 
							return false; 
						}
					}
					break;
				}//case required 
				case "maxlength": 
				case "maxlen": 
					{
						if(eval(objValue.value.length) > eval(cmdvalue)) 
						{ 
							if(!strError || strError.length ==0) 
							{ 
								 strError = removeHTMLTags(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 = removeHTMLTags(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 = removeHTMLTags(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 = removeHTMLTags(objValue.name)+": Only digits allowed "; 
								}//if
								alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
								return false; 
							}//if 
							break;
					}//numeric 
				case "int": 
				case "integer": 
					{
							//alert(objValue.name+' '+objValue.value+' '+objValue.type)
							var charpos = objValue.value.search("[^0-9]"); 
							if(objValue.value.length > 0 && charpos >= 0) 
							{ 
								if(!strError || strError.length ==0) 
								{ 
									strError = removeHTMLTags(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 = removeHTMLTags(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 = removeHTMLTags(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(removeHTMLTags(objValue.name)+": Should be a number ");
							return false; 
						}//if 
						if(eval(objValue.value) > eval(cmdvalue))
						{
							if(!strError || strError.length ==0) 
							{
								strError = removeHTMLTags(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(removeHTMLTags(objValue.name)+": Should be a number ");
							return false;
						}//if 
						if(eval(objValue.value) < eval(cmdvalue))
						{ 
							if(!strError || strError.length ==0)
							{
								strError = removeHTMLTags(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 = removeHTMLTags(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 = removeHTMLTags(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]+'\n'+objValue.value.length)
					if(!Dt[0] && (objValue.value.length) ){
						if(!strError || strError.length ==0){
							strError = removeHTMLTags(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;
					}else{
						//6Apr10 we have valid date but now we want to see if this field is ToDate and is >= FromDate if it exists
						if(objValue.name.toLowerCase()=='fromdate'){
							if(Dt[0]) dFromDateValue=Dt[1]
						}
						if(objValue.name.toLowerCase()=='todate'){
							//alert(document.getElementById('ToDate'));alert(document.getElementById('toDate'))
							//interesting - getElementById is NOT case sensitive in IE6 and 7
							if(dFromDateValue){
								if (Dt[0] && (objValue.value.length) ){
									if( Dt[1]<dFromDateValue ){
										//if(!strError || strError.length ==0){
											strError = objValue.name+": Date not valid. This date is before the From Date.";
										//}
										alert(strError);
										return false;
									}
								}
							}
						}
						//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 = removeHTMLTags(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 = removeHTMLTags(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){
	var sName,oFldElement
	for(var itrobj=0; itrobj < arrObjDesc.length; itrobj++){
		if(arrObjDesc[itrobj]){
			sName=arrObjDesc[itrobj][0]
			oFldElement=objFrm.elements[sName]
			//alert(itrobj+'-'+sName+'+'+oFldElement.name+'='+arrObjDesc[itrobj].length)
			if(oFldElement){
				for(var itrdesc=1; itrdesc < arrObjDesc[itrobj].length ;itrdesc++){
					//alert(arrObjDesc[itrobj][itrdesc][0]+'-'+oFldElement+'-'+arrObjDesc[itrobj][itrdesc][1])
					if(validateData(arrObjDesc[itrobj][itrdesc][0], oFldElement, arrObjDesc[itrobj][itrdesc][1]) == false){
						oFldElement.focus();
						return false;
					}
				}
			}
		}
	}
}

function validateFormOld(objFrm,arrObjDesc) 
{
	//alert(arrObjDesc.length)
	for(var itrobj=0; itrobj < arrObjDesc.length; itrobj++) 
	{
		//alert(itrobj+' array length='+arrObjDesc.length+' objForm.elements.length='+objFrm.elements.length)
		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++) 
			{
				alert('XX'+itrobj+' - '+itrdesc+' - '+objFrm[itrobj].id)
				if(validateData(arrObjDesc[itrobj][itrdesc][0], 
									 objFrm[itrobj],arrObjDesc[itrobj][itrdesc][1]) == false) 
				{
					objFrm[itrobj].focus();
					return false; 
				}//if 
			}//for
		}//if object test
	}//for 
} 

/*
added 26Jun09 common to both popup and inline forms, maxLength functionality for textarea
maxLengthPaste only works for IE  http://www.codeproject.com/KB/scripting/TEXTAREA_Maxlenth_check.aspx

function maxLength(field,maxChars){
	if(field.value.length >= maxChars) {
		event.returnValue=false;
		return false;
	}
}
function maxLengthPaste(field,maxChars){
	event.returnValue=false;
	if((field.value.length +  window.clipboardData.getData("Text").length) > maxChars) {
		return false;
	}
	event.returnValue=true;
}

the above is only good for IE
<textarea rows="5" cols="50" onchange='return maxLength2(this,"5");' onkeypress='return maxLength3(this,"5");'></textarea>
*/

function maxLength2(field,maxChars){
	if(field.value.length >= maxChars) {
		if(field.value.length > maxChars){
			alert('The maximum length of '+maxChars+' has been exceeded. Excess has been removed.');
			field.focus(); //onchange brings us here - lets go back
		}
		field.value=field.value.substring(0,maxChars-1)
		return false;
	}
}

function maxLength3(field,maxChars){
	if(field.value.length >= maxChars) {
		if(field.value.length > maxChars){
			alert('The maximum length of '+maxChars+' was exceeded. Excess has been removed.');
			field.focus(); //onchange brings us here - lets go back
		}
		field.value=field.value.substring(0,maxChars)
		if(navigator.appVersion.indexOf('MSIE 7.')>0)return false; //firefox grumbles on the last character
	}
}


function removeHTMLTags(htmlString){
	if(htmlString){
		var mydiv = document.createElement("div");
		mydiv.innerHTML = htmlString;
 
 		if (document.all) // IE Stuff
		{
			return mydiv.innerText;
		}else // Mozilla does not work with innerText
		{
			return mydiv.textContent;
		}
	}
}

