//	Form validation
//	Written by G.R. Computers and Electronics
GRCValidation =
{
	patterns:null,
	wasInit:false,
	validating:false,
	errMsg:null,
	errMustInsert:'"%n%" value must be entered',
	errMustSelect:'Please select an "%n%" option',
	firstResult:null,
	firstError:null,
	/*	Descriptions classes	*/
	clsPrefix:'grcV',	/*	Validation classes prefix	*/
	clsReadonly:'grcReadOnly',
	clsEmpty:'grcEmpty',
	clsResult:'grcResult',
	clsMust:'grcMust',
	clsError:'grcError',
	errorElm:'p',
	/*	Type elements	*/
	typHidden:'hidden',
	typCheckbox:'checkbox',
	/*	Constants	*/
	prfCheckbox:'chk_',
	prfResult:'Res',
	tagNames:null,
	copyFields:null,
	/*	Event elements	*/
	tagCheckList:["input","check","select","textarea"],
	otherFormElements:["form","fieldset","button","option"],
	/*	Get an element by Name or by Id		*/
	getElm:function(elmName)
	{
		var tmpElm = null;
		
		if(document.getElementById && document.createTextNode)
		{
			tmpElm = document.getElementsByName(elmName);
			if (tmpElm.length>0)
			{
				tmpElm=tmpElm[0];	//	return only the first element found
			}
			else
			{
				tmpElm = document.getElementById(elmName);	//	in case element does not have name
			}
		}
		return(tmpElm);
	},
	getFirstResult:function()
	{
		return (GRCValidation.firstResult);
	},
	getFirstError:function()
	{
		return (GRCValidation.firstError);
	},
	copyIdName:function(elm)
	{
		if (elm.name!=undefined)
		{
			if (elm.id=="")
			{
				if (elm.name!="")
					elm.id=elm.name;
			}
			else if (elm.name=="")
				elm.name=elm.id;
		}
		tmpId=elm.id;
		with (GRCValidation)
		{
			if (!tagNames[tmpId])
			{
				tagNames[tmpId]=true;
			}
		}	//	with
	},
	dupliacteTagsName: function(formTags)
	{
		for (var t=0 ; t<formTags.length ; t++)
		{
			var allElms=document.getElementsByTagName(formTags[t]);
			for (var e=0; e<allElms.length; e++)
			{
				GRCValidation.copyIdName(allElms[e]);
			}
		}
	},
	makeCopyFieldsList:function()
	{
		with (GRCValidation)
		{
			copyFields=new Array();
//			for (var n=0; n<tagNames.length; n++)
			for (var n in tagNames)
			{
				if (tagNames[prfResult + n])
				{
					i=copyFields.length;
					copyFields[i]=new Array();
					copyFields[i]['from']=getElm(n);
					copyFields[i]['to']=getElm(prfResult + n);
				}
			}
			tagNames=null;
		}
	},
	duplicateAllInputName:function()
	{
		GRCValidation.dupliacteTagsName(GRCValidation.otherFormElements);
		GRCValidation.dupliacteTagsName(GRCValidation.tagCheckList);
	},
	copyToResults:function(formId)
	{
		var	formElm;
		
		formElm=GRCValidation.getFormById(formId);
		if (!formElm) return;
		
	},
	addChkboxForm:function(elms)
	{
		with (GRCValidation)
		{
			var fElmName;
			var elm;
			for (var e=0; e<elms.length; e++)
			{
				elm=getElm(elms[e]);
				if (elm)
				{
					fElmName=prfCheckbox + elms[e].id;
					if (getElm(fElmName))
						return;
					var fElm=document.createElement('input');
					fElm.type=typHidden;
					fElm.id=prfCheckbox + elm.id;
					fElm.name=prfCheckbox + elm.name;
					fElm.value=(elm.checked) ? 'Yes' : 'No';
					fElm.defaultValue=fElm.value;
					DOMhelp.addEvent(elm,'change',GRCValidation.updateChkboxForm,false);
					elm.parentNode.insertBefore(fElm,elm);
				}
			}	//	for elms
		}	//	with
	},
	updateChkboxForm:function(e)
	{
		var elm=DOMhelp.getTarget(e);
		var fElmName=GRCValidation.prfCheckbox + elm.id;
		var fElm=GRCValidation.getElm(fElmName);
		if (fElm)
			fElm.value=(elm.checked) ? 'Yes' : 'No';
	},
	addEvents:function(formElm,tagName)
	{
		var	formElms;
		var checkboxes=new Array;
		formElms=formElm.getElementsByTagName(tagName);
		if (!formElms) return(false);
		with (GRCValidation)
		{
			var objClasses;
			var elm;
			for (e=0, eLen=formElms.length; e<eLen; e++)
			{
				copyIdName(formElms[e]);
				if (formElms[e].type==typHidden) continue;
				if (formElms[e].type==typCheckbox)
				{
					checkboxes[checkboxes.length]=formElms[e].id;
				}
				objClasses=formElms[e].className.split(' ');
				for (var cls=0; cls<objClasses.length; cls++)
				{
					switch (objClasses[cls])
					{
						case clsEmpty:
							break;
						case clsResult:
							if (GRCValidation.firstResult==null)
							{
								GRCValidation.firstResult=formElms[e];
							}
						case clsReadonly:
							formElms[e].readonly=true;
							break;
						default:
							DOMhelp.addEvent(formElms[e],'change',GRCValidation.clearErrorEvent,false);
							break;
					}	//	switch
				}	//	class loop
			}	//	Elms loop
			addChkboxForm(checkboxes);
		}	//	with
	},
	addError:function(elm,errMsg)
	{
		var errElm=document.createElement(GRCValidation.errorElm);
		errElm.className=GRCValidation.clsError;
		errElm.appendChild(document.createTextNode(errMsg));
		elm.parentNode.appendChild(errElm,elm);
	},
	clearError:function(elm)
	{
		var x=DOMhelp.lastSibling(elm);
		if (!x)
			return(false);
		if (DOMhelp.cssjs('check',x,GRCValidation.clsError))
		{
			x.parentNode.removeChild(x);
		}
	},
	clearErrorEvent:function(e)
	{
		var	elm=DOMhelp.getTarget(e);
		GRCValidation.clearError(elm);
	},
	clearTagErrors:function(formElm,tagName)
	{
		formElms=formElm.getElementsByTagName(tagName);
		if (!formElms) return(false);
		for (e=0, eLen=formElms.length; e<eLen; e++)
		{
			GRCValidation.clearError(formElms[e]);
		}
	},
	getFormById:function(formId)
	{
		if (!document.getElementById || !document.createTextNode) return(null);
		var formElm=document.getElementById(formId);
		if (!formElm)
		{
			var allForms=document.getElementsByTagName('form');
			for (var f=0; f<allForms.length; f++)
			{
				if ((allForms[f].id==formId) || (allForms[f].name==formId))
				{
					formElm=allForms[f];
					break;
				}
			}
		}
		return(formElm);
	},
	clearAllErrors:function(formId)
	{
		var	formElm;
		
		formElm=GRCValidation.getFormById(formId);
		if (!formElm) return(false);
		with (GRCValidation)
		{
			for (var t=0; t<tagCheckList.length; t++)
			{
				clearTagErrors(formElm,tagCheckList[t]);
			}
		}
	},
	init:function(formId)
	{
		var	formElm;
		
		if (!document.getElementById || !document.createTextNode) return(false);
		with (GRCValidation)
		{
			if (wasInit) return(false);
			tagNames=null;
			tagNames=new Array();
			wasInit=true;
			errMsg=null;
			formElm=getFormById(formId);
			if (!formElm) return(false);
			for (var t=0; t<tagCheckList.length; t++)
			{
				addEvents(formElm,tagCheckList[t]);
			}
			duplicateAllInputName();
			makeCopyFieldsList();
			validating=false;
		}	//	with
	},
	getFldName:function(elm)
	{
		var elmName='Unknown';
		var lbls=elm.parentNode.getElementsByTagName('label');
		if (lbls)
		{
			if (lbls.length==1)
			{
				elmName=lbls[0].innerHTML;
			}
			else
			{
				for (l=0; l<lbls.length; l++)
				{
					if (lbls[l].htmlFor==elm.name)
					{
						elmName=lbls[l].innerHTML;
					}
				}
			}
			var par=elmName.indexOf("(");
			if (par>-1)
			{
				elmName=elmName.substr(0,par);
				while (elmName.charAt(elmName.length-1)==" ")	//	Trim spaces
					elmName=elmName.substr(0,elmName.length-1);
			}
		}
		else
		{
			elmName=formatName(elm.id);
		}
		return(elmName);
	},
	formatName:function(elmName)
	{
		var upper=new RegExp("[A-Z]","g");

		var mt=elmName.match(upper);
		var sp=elmName.split(upper);
		var ret='';
		for (var i=0; i<sp.length; i++)
			ret+=mt[i] + sp[i] + ' ';
		if (ret.substr(ret.length-1)==' ')
			ret=ret.substr(0,ret.length-1);
		return(ret);
	},
	checkText:function(elm,elmClass)
	{
		var validatePattern;
		var desc;
		
		if (elm.value=='')
			return('');
		with (GRCValidation)
		{
			validatePattern=grc_vMasks[elmClass]['mask'];
			desc=grc_vMasks[elmClass]['error'];
		}	//	with
		if (validatePattern!="")
		{
//			validatePattern=new RegExp(validatePattern);
			if (!(validatePattern.test(elm.value)))
			{
				return(desc);
			}
		}
		return('');
	},
	mustCheck:function(elm)
	{
		if (elm.value=="")
			return (GRCValidation.errMustInsert);
		return('');
	},
	//	Validate a field
	validateField:function(elm)
	{
		with (GRCValidation)
		{
			errMsg='';
			if (elm.className=='')
			{
				resetCheck();
				return(true);
			}
			if (elm.disabled)
			{
				resetCheck();
				return(true);
			}
			switch (elm.type)
			{
				case 'button':
					resetCheck();
					return(true);
			}	//	switch
			var elmClasses=elm.className.split(" ");
			classLoop:
			for (var cls=0; cls<elmClasses.length; cls++)
			{
				switch (elmClasses[cls])
				{
					case clsEmpty:
						break classLoop;
					case clsMust:
					case clsResult:
						errMsg=mustCheck(elm);
						break;
					case clsReadonly:
						continue;
					default:
						if (elmClasses[cls].substr(0,clsPrefix.length)==clsPrefix)	/*	ignore non grc classes	*/
							errMsg=checkText(elm,elmClasses[cls]);
				}	//	class switch
				if (errMsg!='')
				{
					errMsg=errMsg.replace('%n%',getFldName(elm));
//					errMsg=errMsg.replace('%n%',formatName(elm.name));
					GRCValidation.addError(elm,errMsg);
					return(false);
				}
			}	//	classes loop
			resetCheck();
			return(true);
		}
	},
	//	Validate a field from event
	checkField:function(e)
	{
		var elm;
		with (GRCValidation)
		{
			if (validating) return(false);
			validating=true;
			elm=DOMhelp.getTarget(e);
			if (validateField(elm))
			{
				validating=false;
			}
			else
			{
				setTimeout(function() { resetCheck(); }, 200);
			}
		}
		return(false);
	},
	//	Validates a list of fields IGNORING readonly fields
	validateList:function(lst)
	{
		var	listOk=true;
		GRCValidation.firstError=null;
		GRCValidation.duplicateValues();
		if (lst.length == 0)
			return(listOk);
		for (var e=0; e<lst.length; e++)
		{
			GRCValidation.clearError(lst[e]);
			if (lst[e].readonly)
				continue;	//	Skip readonly fields
			if (!GRCValidation.validateField(lst[e]))
			{
				if (GRCValidation.firstError==null)
					GRCValidation.firstError=lst[e];
				listOk=false;
			}
		}
		if (!listOk)
			GRCValidation.firstError.focus();
		return(listOk);
	},
	duplicateValues:function()
	{
		with (GRCValidation)
		{
			for (var f=0; f<copyFields.length;f++)
			{
				copyFields[f]['to'].value=copyFields[f]['from'].value
				if ((copyFields[f]['to'].size) && (copyFields[f]['from'].value.length>0))
					copyFields[f]['to'].size=copyFields[f]['from'].value.length;
			}
		}
	},
	validateForm:function(formId)
	{
		var	formElm;
		var	formOk=true;
		
		if (!document.getElementById || !document.createTextNode) return(false);
		with (GRCValidation)
		{
			errMsg=null;
			firstError=null;
			clearAllErrors(formId);
			duplicateValues();
			formElm=getFormById(formId);
			if (!formElm) return(false);
			for (var t=0; t<tagCheckList.length; t++)
			{
				var elms=formElm.getElementsByTagName(tagCheckList[t]);
				if (!elms)
					continue;
				for (e=0, eLen=elms.length; e<eLen; e++)
				{
					if (!GRCValidation.validateField(elms[e]))
					{
						if (GRCValidation.firstError==null)
							GRCValidation.firstError=elms[e];
						formOk=false;
					}
				}
			}	//	loop on fields
		}	//	with
		if (!formOk)
			GRCValidation.firstError.focus();
		return(formOk);
	},
	resetCheck:function(e)
	{
		GRCValidation.validating=false;
	},
	getDocName:function()
	{
		var	fn=document.URL;
		if (fn.indexOf('/')!=-1)
		{
			fn=fn.substr(fn.lastIndexOf('/')+1);
		}
		if (fn.indexOf('\\')!=-1)
		{
			fn=fn.substr(fn.lastIndexOf('\\')+1);
		}
		if (fn.indexOf('.')!=-1)
		{
			fn=fn.substr(0,fn.lastIndexOf('.'));
		}
//		fn=fn.replace('_',' ');
		return(fn);
	}
}
