/***************************************
***************************************/

function v8()
{
	return v8array(arguments);
}

/**************************************************/

function v8array(acheck,errormessage)
{
	var i=0;
	var foc=false;
	var err='';
	while (i<acheck.length)
	{
		if (acheck[i].v==false)
		{
			if (err!='')
			{
				err+='\n';
			}
			err+='-  '+acheck[i].m;
			if (acheck[i].f)
			{
				if (acheck[i].f.type!='hidden' && foc==false)
				{
					acheck[i].f.focus();
					foc=true;
				}
			}
		}
		i++;
	}
	if (err!='')
	{
		if (errormessage==null)
		{
			alert('The following fields are incomplete or incorrect:\n'+err+'\n\nPlease correct and resubmit form.');
		}
		else
		{
			alert(errormessage);
		}
		return false;
	}
	return true;
}

/**************************************************/

function findfield(name)
{
	var f,i,c;
	i=0;
	while (i<document.forms.length)
	{
		f=document.forms[i];
		c=0;
		while (c<f.length)
		{
			if (f[c].name.toLowerCase()==name.toLowerCase())
			{
				return f[c];
			}
			c++;
		}
		i++;
	}
}

/**************************************************/

function check()
{
	var i;
	var fields=new Array();
	var tests=new Array();
	var err=new Array();
	i=0;
	while (i<arguments.length)
	{
		if (arguments[i].type=='field')
		{
			if (arguments[i].obj)
			{
				fields[fields.length]=arguments[i];
			}
			else
			{
				err[err.length]=arguments[i].name;
			}
		}
		else if (arguments[i].type=='test')
		{
			tests[tests.length]=arguments[i];
		}
		i++;
	}
	if (err.length>0)
	{
		var o=new Object();
		o.v=false;
		o.f=null;
		o.m='Code Error (Fields Not Found: ';
		for (i=0; i<err.length; i++)
		{
			if (i>0)
			{
				o.m+=', '
			}
			o.m+=err[i];
		}
		o.m+=')';
		return o;
	}
	if (fields.length==0 || tests.length==0)
	{
		var o=new Object();
		o.v=false;
		o.f=null;
		o.m='Code Error (validation syntax may be incorrect)';
		return o;
	}
	var o=new Object();
	i=0;
	o.v=false;
	o.f=null;
	o.m='';
	while (i<tests.length)
	{
		var fo=fields[0].obj;
		o.f=fo;
		if (fo.type=='select-one' || fo.type=='select-multiple')
		{
			if (fo.selectedIndex>-1)
			{
				var val=fo.options[fo.selectedIndex].value;
			}
			else
			{
				var val='';
			}
		}
		else
		{
			var val=fo.value;
		}
		var arg=tests[i].args;
		switch (arg[0].toLowerCase())
		{
			case 'r':
				if (arg.length>1)
				{
					if (arg[1]=='select' && (fo.type=='select-one' || fo.type=='select-multiple'))
					{
						if (fo.options.length>0)
						{
							break;
						}
					}
				}
				if (fo.type=="radio")
				{
					var chk=false;
					var ff=0;
					while (ff<document.forms.length)
					{
						var rf=document.forms[ff][fields[0].name];
						if (rf)
						{
							if (isNaN(rf.length) || typeof(rf.value)!='undefined')
							{
								if (rf.checked==true)
								{
									chk=true;
								}
								break;
							}
							var rc=0;
							while (rc<rf.length)
							{
								if (rf[rc].checked==true)
								{
									chk=true;
									break;
								}
								rc++;
							}
						}
						ff++;
					}
					if (chk==true)
					{
						break;
					}
				}
				else if (fo.type=="checkbox")
				{
					if (fo.checked==true)
					{
						break;
					}
				}
				else if (val!='')
				{
					break;
				}
				o.f=fo;
				o.m=fields[0].label+' is required';
				return o;
			case 'date':
				var fs=val.indexOf('/');
				var ls=val.lastIndexOf('/');
				var zd=val.substr(0,fs);
				var zm=val.substr(fs+1,ls-fs-1);
				var zy=val.substr(ls+1);
				if (checkdate(zd,zm,zy))
				{
					break;
				}
				o.m=fields[0].label+' must be a valid DD/MM/YYYY date';
				return o;
			case 'time':
				var zh=val.substr(0,val.indexOf(':'));
				var zm=val.substr(val.indexOf(':')+1);
				if (zh!='' && zm!='' && allowchar('1234567890',zh)==true && allowchar('1234567890',zm)==true)
				{
					if (zh>=0 && zh<=23 && zm>=0 && zm<=59)
					{
						break;
					}
				}
				o.m=fields[0].label+' must be a valid HH:MM time';
				return o;
			case 'str':
				if (arg[1]==null)
				{
					if (val.length>arg[2])
					{
						o.m=fields[0].label+' must be less than '+(arg[2]+1)+' characters';
						return o;
					}
				}
				else if (arg[2]==null)
				{
					if (val.length<arg[1])
					{
						o.m=fields[0].label+' must be greater than '+(arg[1]-1)+' characters';
						return o;
					}
				}
				else
				{
					if (val.length<arg[1] || val.length>arg[2])
					{
						o.m=fields[0].label+' must be between '+arg[1]+' and '+arg[2]+' characters';
						return o;
					}
				}
				break;
			case 'email':
				if (val.indexOf('@')>0 && val.indexOf('.')>0 && val.lastIndexOf('.')<(val.length-2) && val.indexOf('@')==val.lastIndexOf('@') && val.indexOf('@')<val.lastIndexOf('.') && allowchar(' <>,;:',val)==false && val.indexOf('..')==-1 && val.indexOf('.@')==-1 && val.indexOf('@.')==-1)
				{
					break;
				}
				o.m=fields[0].label+' must be a valid email address';
				return o;
			case 'allow':
				if (allowchar(arg[1],val)==true)
				{
					break;
				}
				o.m=fields[0].label+' contains invalid characters';
				return o;
			case 'deny':
				if (denychar(arg[1],val)==true)
				{
					break;
				}
				o.m=fields[0].label+' contains invalid characters';
				return o;
			case 'int':
				if (allowchar('0123456789-',val)==true && !isNaN(parseInt(val)))
				{
					val=parseInt(val);
					fo.value=val;
					if ((arg[1]==null || val>=arg[1]) && (arg[2]==null || val<=arg[2]))
					{
						break;
					}
				}
				else
				{
					o.m=fields[0].label+' must be an Integer';
					return o;
				}
				if (arg[1]!=null && arg[2]!=null)
				{
					o.m=fields[0].label+' must be an Integer between '+arg[1]+' and '+arg[2];
				}
				else if (arg[1]!=null)
				{
					o.m=fields[0].label+' must be an Integer greater than or equal to '+arg[1];
				}
				else
				{
					o.m=fields[0].label+' must be an Integer less than or equal to '+arg[2];
				}
				return o;
			case 'float':
				if (allowchar('0123456789.',val)==true && val.indexOf('.')==val.lastIndexOf('.'))
				{
					val=parseFloat(val);
					fo.value=val;
					if ((arg[1]==null || val>=arg[1]) && (arg[2]==null || val<=arg[2]))
					{
						break;
					}
				}
				else
				{
					o.m=fields[0].label+' must be a Number';
					return o;
				}
				if (arg[1]!=null && arg[2]!=null)
				{
					o.m=fields[0].label+' must be a Number between '+arg[1]+' and '+arg[2];
				}
				else if (arg[1]!=null)
				{
					o.m=fields[0].label+' must be a Number greater than or equal to '+arg[1];
				}
				else
				{
					o.m=fields[0].label+' must be a Number less than or equal to '+arg[2];
				}
				return o;
			case 'compare':
				var c=1;
				var vid=false;
				var fns='';
				o.f=null;
				while (c<fields.length)
				{
					if (!eval('fields[0].obj.value'+arg[1]+'fields[c].obj.value'))
					{
						if (fns!='')
						{
							fns+=', ';
						}
						fns+=fields[c].label;
						vid=true;
						if (o.f==null)
						{
							o.f=fields[c].obj;
						}
					}
					c++;
				}
				if (vid==true)
				{
					if (arg[1]=="==")
					{
						arg[1]="equal to"
					}
					else if (arg[1]=="!=")
					{
						arg[1]="not equal to"
					}
					else if (arg[1]=="<>")
					{
						arg[1]="greater than or less than"
					}
					else if (arg[1]==">")
					{
						arg[1]="greater than"
					}
					else if (arg[1]=="<")
					{
						arg[1]="less than"
					}
					o.m=fns+' must be '+arg[1]+' '+fields[0].label;
					return o;
				}
				break;
		}
		i++;
	}
	o.v=true;
	o.f=null;
	o.m='';
	return o;
}

/**************************************************/

function field(name,label)
{
	var o=new Object();
	o.name=name;
	if (label)
	{
		o.label=label;
	}
	else
	{
		o.label=name;
	}
	o.type='field';
	o.obj=findfield(name);
	return o;
}

/**************************************************/

function formfield(formname,name,label)
{
	var o=new Object();
	o.name=name;
	if (label)
	{
		o.label=label;
	}
	else
	{
		o.label=name;
	}
	o.type='field';
	o.obj=false;
	if (document.forms[formname])
	{
		if (document.forms[formname][name])
		{
			o.obj=document.forms[formname][name];
		}
	}
	return o;
}

/**************************************************/

function test()
{
	var obj=new Object();
	obj.args=arguments;
	obj.type='test';
	return obj;
}

/**************************************************/

function allowchar(allow,str)
{
	var v=true;
	var i=0;
	while (i<str.length)
	{
		if (allow.indexOf(str.charAt(i))==-1)
		{
			v=false;
		}
		i++;
	}
	return v;
}

/**************************************************/

function denychar(allow,str)
{
	var v=true;
	var i=0;
	while (i<str.length)
	{
		if (allow.indexOf(str.charAt(i))!=-1)
		{
			v=false;
		}
		i++;
	}
	return v;
}

/**************************************************/

function realdate(dname,mname,yname,label,req)
{
	var dm=new Array(31,29,31,30,31,30,31,31,30,31,30,31);
	
	var dobj=field(dname,"Day Part of "+label).obj;
	var mobj=field(mname,"Month Part of "+label).obj;
	var yobj=field(yname,"Year Part of "+label).obj;

	var o=new Object();
	o.v=true;
	o.f=dobj;
	o.m=label+' must be a valid date';

	if (dobj.selectedIndex>-1 && mobj.selectedIndex>-1 && yobj.selectedIndex>-1)
	{
		var dval=parseInt(dobj.options[dobj.selectedIndex].value);
		var mval=parseInt(mobj.options[mobj.selectedIndex].value);
		var yval=parseInt(yobj.options[yobj.selectedIndex].value);
	}
	else
	{
		if (req)
		{
			o.v=false;
		}
		return o;
	}
	
	if (isNaN(dval) || isNaN(mval) || isNaN(yval))
	{
		if (req)
		{
			o.v=false;
		}
		return o;
	}

	if (dval<1 || dval>dm[mval-1])
	{
		o.v=false;
		return o;
	}
	if (mval==2 && dval>28)
	{
		if ((yval/4)!=Math.round(yval/4))
		{
			o.v=false;
			return o;
		}
	}
	o.f=null;
	o.m=null;
	o.v=true;
	return o;
}

/**************************************************/

function checkdate(dval,mval,yval)
{
	var dm=new Array(31,29,31,30,31,30,31,31,30,31,30,31);
	
	if (isNaN(dval) || isNaN(mval) || isNaN(yval))
	{
		return false;
	}

	if (dval<1 || dval>dm[mval-1])
	{
		return false;
	}
	if (mval==2 && dval>28)
	{
		if ((yval/4)!=Math.round(yval/4))
		{
			return false;
		}
	}
	return true;
}

/**************************************************/

function vobj(valid,message,focusobject)
{
	var o=new Object();
	o.f=(focusobject)?focusobject:null;
	o.m=message;
	o.v=valid;
	return o;
}
