function __ValidatorStruct(n,v,c,r)
	{
		this.name=''+n;
		this.validator=''+v;
		this.validconstraints=''+c;
		this.response=''+r
	}

function ValidateForm()
{
	var i,j
	var a=ValidateForm.arguments
	var vlist=new Array()
	if(a.length<5||((a.length-1)/4)!=Math.floor((a.length-1)/4)) return false
	for(i=1,j=0;i<a.length;i+=4,j++) vlist[j]=new __ValidatorStruct(a[i],a[i+1],a[i+2],a[i+3])
	formnumber=a[0]
	for(i=0;i<vlist.length;i++)
	{
  	n=''+vlist[i].name
  	v=(''+vlist[i].validator).toLowerCase()
  	p=(''+vlist[i].validconstraints).toLowerCase()
  	r=(''+vlist[i].response) //.toLowerCase()
  	if(!r)r='Please fill in "'+n+'" correctly.'
  	var el=document.forms[formnumber].elements[n]
  
  	if(!__vfyFunctions[v]||!el)continue
		if(!el.type&&el.length)
		{
			var ckd=0
			for( var x=0; x<el.length; x++ ) if(el[x].checked&&__vfyFunctions[v](el[x].value,p)) ckd++
  		if( !ckd ) { alert(r); return false	}
			continue
		}
		if(el.type=='select-one') val=el.selectedIndex
		else val=el.value
  	if(!__vfyFunctions[v](val,p))
  		{
  		el.focus()
  		alert(r);
  		return false
  		}
	}
	return true
}

/***\ 
|***|  LOW LEVEL FUNCTIONS
\***/

var __temp
__temp=window.__DefaultMaxLength;var __DefaultMaxLength = (__temp)?__temp:250
__temp=window.__LegalChars;var __LegalChars = (__temp)?__temp:"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890 !?/\\()-_=+[]{}#@,.:&\n\r"
__temp=window.__LCurrencies;var __LCurrencies = (__temp)?__temp:new Array("£","$","USD","GBP")
__temp=window.__RCurrencies;var __RCurrencies = (__temp)?__temp:new Array("USD","GBP")
__temp=window.__Letters;var __Letters = (__temp)?__temp:"abcdefghijklmnopqrstuvwxyz"
__temp=window.__Numbers;var __Numbers = (__temp)?__temp:"0123456789"

function __GetP(p,n,d){return (p[n])?((''+p[n]).toLowerCase()):d}
function __TrimSpaces(v){v=''+v;while(v.substring(0,1)==' ')v=v.substring(1,v.length);while(v.substring(v.length-1,v.length)==' ')v=v.substring(0,v.length-1);return v}
function __Strip(v,w){v=''+v;var l;while((l=v.indexOf(w))>=0){v=v.substring(0,l)+v.substring(l+1,v.length)};return v}
function __Replace(v,o,n){v=''+v;var l;while((l=v.indexOf(o))>=0){v=v.substring(0,l)+n+v.substring(l+1,v.length)};return v}
function __Range(l,h){this.low=l;this.high=h;}
function __SplitParams(p){p=(p)?''+p:'';var params1=p.split(';');var params2=new Array();for(var i in params1){var params=''+params1[i];var temp=params.split('=');if(temp.length==2)params2[__TrimSpaces(temp[0].toLowerCase())]=__TrimSpaces(temp[1].toLowerCase())}for(var i in params2){return params2}return 0}
function __SplitRanges(p){p=''+p;var params1=p.split(',');var params2=new Array();for(var i in params1){var params=''+params1[i];var temp=params.split('to');if(temp.length==2){var l=__TrimSpaces(temp[0])*1;var h=__TrimSpaces(temp[1])*1;if(isNaN(l)||isNaN(h))continue;if(l<h)params2[params2.length]=new __Range(l,h);else params2[params2.length]=new __Range(h,l)}else if(temp.length==1){var l=__TrimSpaces(temp[0])*1;if(isNaN(l))continue;params2[params2.length]=new __Range(l,l);}}for(var i in params2){return params2}return 0}
function __Len(a,n,x){a=''+a;if((n&&a.length<n)||(x&&a.length>x))return true;return false}
function __Illegal(a){a=''+a;for(var i=0;i<a.length;i++){if(__LegalChars.indexOf(a.substring(i,i+1))<0)return true}return false}
function __StripLCurrency(a){for(var i in __LCurrencies){if((a.substring(0,__LCurrencies[i].length).toLowerCase()) == (__LCurrencies[i].toLowerCase())){a=a.substring(__LCurrencies[i].length,a.length);break}}return a}
function __StripRCurrency(a){for(var i in __RCurrencies){if((a.substring(a.length-__RCurrencies[i].length,a.length).toLowerCase())==(__RCurrencies[i].toLowerCase())){a=a.substring(0,a.length-__RCurrencies[i].length);break}}return a}
function __IsLCurrency(a){for(var i in __LCurrencies)if((a.substring(0,__LCurrencies[i].length).toLowerCase())==(__LCurrencies[i].toLowerCase()))return true;return false}
function __IsRCurrency(a){for(var i in __RCurrencies)if((a.substring(a.length-__RCurrencies[i].length,a.length).toLowerCase())==(__RCurrencies[i].toLowerCase()))return true;return false}
function __IsLetter(s,n){if(__Letters.indexOf((s.substring(n,n+1)).toLowerCase())>=0)return true;return false}
function __IsNumber(s,n){if(__Numbers.indexOf(s.substring(n,n+1))>=0)return true;return false}

function __vfyString(a,p)
{
	if(__Illegal(a))return false
	p=__SplitParams(p)
	pMinL=__GetP(p,'minlength',1)
	pMaxL=__GetP(p,'maxlength',__DefaultMaxLength)
	var pNulls=__GetP(p,'nulls','no')
	if(a==''&&pNulls=='yes')return true
	if(__Len(a,pMinL,pMaxL))return false
	return true
}

function __vfyEmail(a,p)
{
	if(__Illegal(a))return false
	p=__SplitParams(p)
	var pMinL=__GetP(p,'minlength',1)
	var pMaxL=__GetP(p,'maxlength',__DefaultMaxLength)
	var pNulls=__GetP(p,'nulls','no')
	if(a==''&&pNulls=='yes')return true
	if(__Len(a,pMinL,pMaxL))return false
	a=__TrimSpaces(a)
	if(a.indexOf(' ')>=0)return false
	var temp=a.split('@')
	if(temp.length!=2)return false
	var l=temp[0]
	if(l.length<1||l.substring(0,1)=='.')return false
	var r=temp[1].split('.')
	if(r.length<2)return false
	for(var i in r)if(r[i].length<1)return false
	return true
}

function __vfyPhone(a,p)
{
	if(__Illegal(a))return false
	p=__SplitParams(p)
	var pMinL=__GetP(p,'minlength',1)
	var pMaxL=__GetP(p,'maxlength',__DefaultMaxLength)
	var pNulls=__GetP(p,'nulls','no')
	var pAllowShort=__GetP(p,'short','no')
	if(a==''&&pNulls=='yes')return true
	if(__Len(a,pMinL,pMaxL)) return false
	a=__Strip(__Strip(__Strip(__Strip(a,'('),')'),'-'),' ')
	if(a.substring(0,1)=='+')a=a.substring(1,a.length)
	else if(pAllowShort!='yes'&&a.substring(0,1)!='0')return false
	return __vfyNumber(a,"integer=yes")
}

function __vfyPostcode(a,p)
{
	if(__Illegal(a))return false
	p=__SplitParams(p)
	var pAllowShort=__GetP(p,'short','yes')
	var pMinL=__GetP(p,'minlength',2)
	var pMaxL=__GetP(p,'maxlength',8)
	var pNulls=__GetP(p,'nulls','no')
	if(a==''&&pNulls=='yes')return true
	if(__Len(a,pMinL,pMaxL))return false
	a=__Strip(a,' ')
	if(a.length<2)return false;
	if(a.length>4)
	{
		var end=a.substring(a.length-3,a.length)
		if(!(__IsNumber(end,0)&&__IsLetter(end,1)&&__IsLetter(end,2)))return false
		a=a.substring(0,a.length-3)
	}
	else if(!pAllowShort)return false;
	if(a.length>4) return false;
	while(a.length>=2)
	{
		if(!(__IsLetter(a,0)&&__IsNumber(a,a.length-1)))return false;
		a=a.substring(1,a.length-1)
	}
	if(a.length==1&&(__IsLetter(a,0)||__IsNumber(a,0)))return true;
	else if(a.length==0)return true;return false
}

function __vfyNumber(a,p)
{
	if(__Illegal(a))return false
	p=__SplitParams(p)
	var pMinL=__GetP(p,'minlength',1)
	var pMaxL=__GetP(p,'maxlength',__DefaultMaxLength)
	var pNulls=__GetP(p,'nulls','no')
	var pCommas=__GetP(p,'commas','no')
	var pCurrency=__GetP(p,'currency','no')
	var pRange=__GetP(p,'range','')
	var pOutrange=__GetP(p,'outrange','')
	var pZero=__GetP(p,'zero','yes')
	var pNegative=__GetP(p,'negative',__GetP(p,'neg','no'))
	var pInteger=__GetP(p,'integer',__GetP(p,'int','no'))
	var pCent=__GetP(p,'cent','no')
	var pMin=__GetP(p,'min',null)
	var pMax=__GetP(p,'max',null)
	if(a==''&&pNulls=='yes')return true
	if(__Len(a,pMinL,pMaxL))return false

	a=__TrimSpaces(a);
	if(pCommas=='yes')a=__Strip(a,',');
	if(pCurrency!='no')
	{
		if(__IsLCurrency(a)&&__IsRCurrency(a)){return false}
		else if(__IsLCurrency(a)||__IsRCurrency(a))
		{
			if(pCurrency=='any'||pCurrency=='dontcare')
			{
				a=__StripLCurrency(a)
				a=__StripRCurrency(a)
			}
			else if(pCurrency=='left') a=__StripLCurrency(a)
			else if(pCurrency=='right') a=__StripRCurrency(a)
		}
		else if(pCurrency!='no'&&pCurrency!='dontcare')return false
		a=__TrimSpaces(a)
	}
	a=a*1;
	if(isNaN(a))return false;
	if(pRange!='')
	{
		var ranges=__SplitRanges(pRange);
		if(ranges)
		{
			var ok=0;
			for(var i in ranges){if(a>=ranges[i].low&&a<=ranges[i].high){ok=-1;break}}
			if(!ok)return false
		}
	}
	if(pOutrange!='')
	{
		var ranges=__SplitRanges(pOutrange);
		if(ranges)
		{
			var ok=0;
			for(var i in ranges){if(a>=ranges[i].low&&a<=ranges[i].high){ok=-1;break}}
			if(ok)return false
		}
	}
	if(pZero=='no'&&a==0)return false;
	if(pNegative=='no'&&a<0)return false;
	if(pInteger=='yes'&&a!=Math.floor(a))return false;
	if(pCent=='yes'&&a!=(Math.floor(a*100)/100))return false;
	if(pMax!=null&&a>pMax)return false
	if(pMin!=null&&a<pMin)return false
	return true
}


function __vfyTime(a,p)
{
	if(__Illegal(a))return false
	var h,m,twelve=0
	p=__SplitParams(p)
	var pMinL=__GetP(p,'minlength',1)
	var pMaxL=__GetP(p,'maxlength',__DefaultMaxLength)
	var pNulls=__GetP(p,'nulls','no')
	var pAllowPoint=__GetP(p,'allowpoint','no')
	var pAllowComma=__GetP(p,'allowpoint','no')
	var pNoColon=__GetP(p,'nocolon','no')
	var pAllow24Plus=__GetP(p,'allow24plus','no')
	
	if(a==''&&pNulls=='yes')return true
	if(__Len(a,pMinL,pMaxL))return false;

	a=__TrimSpaces(a)
	if(pAllowPoint=='yes') a=__Replace(a,'.',':')
	if(pAllowComma=='yes') a=__Replace(a,',',':')
	
	if(a.indexOf(':')>=0)
	{
		if(pNoColon=='yes')return false
		var temp=split(a,':')
		if(temp.length!=2) return false
		h=temp[0]
		m=temp[1]
		if(m.indexOf('am')>=0||m.indexOf('pm')>=0)
		{
			m=m.substring(m.length-2,m.length)
			m=__trimSpaces(m)
			if(m.length!=2) return false
			m*=1
			if(isNaN(m))return false
			twelve=-1
		}
		if(h.length<1) return false
		h*=1
		if(isNaN(h)) return false
		if(twelve&&(h<1||h>12)) return false
	}
	else
	{
		if(pNoColon=='no') return false
		if(a.length<3) return false
		if(isNaN(a)) return false
		h=Math.floor(a/100)
		m=a-(h*100)
	}
	if(h<0)return false
	if(m<0||m>=60) return false
	if(pAllow24Plus=='yes')return true
	if(h<24)return true
	return false
}


function __vfyCCDate(a,p){a=a.split('/');if(a.length==1){b=(''+a[0]);if(b.length==4||b.length==6)a=new Array(b.substring(0,2),b.substring(2,b.length))}if(a.length!=2)return false;return (__vfyNumber(a[0],'integer=yes;negative=no;min=1;max=12;minlength=2;maxlength=2')&&(__vfyNumber(a[1],'integer=yes;negative=no;min=0;max=99;minlength=2;maxlength=2')||__vfyNumber(a[1],'integer=yes;negative=no;min=2000;max=2099;minlength=4;maxlength=4')))}
function __vfyCurrency(a,p){return __vfyNumber(a,p+';currency=yes;cent=yes')}
function __vfyPosNum(a,p){return __vfyNumber(a,p+';negative=no')}
function __vfyInteger(a,p){return __vfyNumber(a,p+';integer=yes')}
function __vfyPosInt(a,p){return __vfyNumber(a,p+';integer=yes;negative=no')}
function __vfyNotBlank(a,p){return __vfyString(a,p+';maxlength=0')}
function __vfySimplePostcode(a,p){return __vfyString(a,p+';minlength=2;maxlength=8')}

var __vfyFunctions = new Array();
__vfyFunctions['postcode'] = __vfySimplePostcode // use vfyPostcode for strict or vfySimplePostcode for 2-8 char strings
__vfyFunctions['number'] = __vfyNumber
__vfyFunctions['num'] = __vfyNumber
__vfyFunctions['integer'] = __vfyInteger
__vfyFunctions['int'] = __vfyInteger
__vfyFunctions['posnum'] = __vfyPosNum
__vfyFunctions['posint'] = __vfyPosInt
__vfyFunctions['currency'] = __vfyCurrency
__vfyFunctions['time'] = __vfyTime 
__vfyFunctions['email'] = __vfyEmail
__vfyFunctions['string'] = __vfyString
__vfyFunctions['notblank'] = __vfyNotBlank
__vfyFunctions['phone'] = __vfyPhone
__vfyFunctions['tel'] = __vfyPhone
__vfyFunctions['ccdate'] = __vfyCCDate


