// 12-Jan-2006 new validation with images by gaz


function validationError(i,n) {
	alert ("validation error("+i+") "+n);
	return false;
}

function validate(f,a) {
	if (!f["__validation"]) return validationError(0);

	var ok=true;
	var bad=null;
	var temp=f["__validation"].value.split("\n");

	for (var t=temp.length-1; t>=0; t--) {
		var p=temp[t].toString().split("|");
		if (p.length<4) return validationError(1,p);
		var n=p[1];
		if (!f[n]) return validationError(2,p[1]);

		f[n].onkeyup = function() {validate(f,0);}
		f[n].onchange = function() {validate(f,0);}
		f[n].onblur = function() {validate(f,0);}

		var v=f[n].value;

		switch (f[n].type) {
			case undefined:
				for (j=0;j<f[n].length;j++) v=(f[n][j].checked)?f[n][j].value:v;
				break;
			case "select-one":
				v=(f[n].selectedIndex<0)? "":f[n].options[f[n].selectedIndex].value;
				break;
			case "checkbox":
				v=(f[n].checked)?f[n].value:"";
		}

		var re=/oops/;
		switch(p[0].toUpperCase()) {
			case "ADDRESS":		re=/^[\s]*[\w\-']+([\s\., ]+[\w\-']+){3,30}\s*$/; break;
			case "ALPHA": 		re=/^[a-zA-Z0-9]+$/; break;
			case "BOOLEAN": 	re=/^[0-1]+$/; break;
			case "CHECK":		re=/^.+$/; break;
			case "CITY":		re=/^[a-zA-Z]{2,}([-' ][a-zA-Z]+)*$/; break;
			case "CURRENCY":	re=/^\+?\d{1,}\.?\d*$/; break;
			case "DATE":		re=/\d{1,2}\/\d{1,2}\/(19|20)\d\d/; break;
			case "DOB":			re=/\d{1,2}\/\d{1,2}\/(19|20)\d\d/; break;
			case "EMAIL":		re=/^[\w-\._]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]{2,3}$/; break;
			case "EMAILLIST":	re=/^[\w-\._]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]{2,3}(,[\w-\._]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]{2,3})*$/; break;
			case "FILENAME":	re=/^[\w\-_ \.\(\)]{1,}.[\w]$/; break;
			case "FULLADDRESS": re=/^[\w]+(\s+[\w\-\.]+){2,10}$/; break;
			case "FULLNAME":	re=/^[a-zA-Z]{1,}[ a-zA-Z'\-]{1,}$/; break;
			case "SURNAME":		re=/^[a-zA-Z]{1,}[ a-zA-Z'\-]{1,}$/; break;
			case "HEADING":		re=/^[\w\W]+/; break;
			case "ID":			re=/^\d+$/; break;
			case "IDLIST":		re=/^\d+(,\d+)*$/; break;
			case "IDNAME":		re=/^[\w\/\-': ]+$/; break;
			case "INTEGER":		re=/(^[-+]?\d\d*$)/; break;
			case "KEYWORDS":	re=/^\w+(,[\w]+)*$/; break;
			case "LOCALPATH":	re=/^[\w\W]+$/; break;
			case "MENU":		re=/^.+$/; break;
			case "SELECT":		re=/^[^0].*$/; break;
			case "MONTHS":		re=/^([0-9])|(1[12])$/; break;
			case "NAME":		re=/^[a-zA-Z][a-zA-Z'\- ]{1,}$/; break;
			case "NOTES":		re=/^[\w\W]*$/; break;
			case "NUMBER":		re=/(^-?\+?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/; break;
			case "PASSKEY":		re=/^\w{8,50}$/; break;
			case "PASSWORD":	re=/^[\w\-_ ]{6,}$/; break;
			case "PATH":		re=/^[A-Za-z]:\\([\w\.\-\(\)\&_\\]+)*$/; break;
			case "PHONE":		re=/^\+?[-\d\(\) ]{5,}$/; break;
			case "POSTCODE":	re=/^[\w- ]{4,10}$/; break;
			case "PRICE":		re=/^\+?\d{1,}(,\d\d\d)*(\.\d{1,2})?$/; break;
			case "RADIO":		re=/.+/; break;
			case "STOCKCODE":	re=/^[\w\/\-'+ #\(\)\.]+$/; break;
			case "STREET":		re=/^[\w',\-\.\f\r ]{2,}$/; break;
			case "TEXT":		re=/^[\w\s]+[ -~\s]*$/; break;
			case "TIME":		re=/^([1-9]|[1-2][0-9]):[0-5]\d(:[0-5]\d(\.\d{1,3})?)?$/; break;
			case "TITLE":		re=/^[a-zA-Z]{2,10}\.?$/; break;
			case "TRACKCODE":	re=/^[\w]{1,}[\w_\@\.,\{\}\#\+\-\/]*$/; break;
			case "URL":			re=/^(ftp|http|https):\/\/([\w-]+\.?)+(\/[\w- .\/?%&=]*)?/; break;
			case "USERNAME":	re=/^[\w\-_]{6,}$/; break;
			case "YEARS":		re=/^[1-9]+\d*$/; break;

			return validationError(1,p);
		}

		if (re.test(v) ||(v==""&&p[3].substr(0,1)=='1')) {
			var g=true;
		} else {
			var g=false;
			var b=t;
			ok=false;
		}

		var cn = (g)? "valid" : "bad";

		if (f[n].className!=cn) f[n].className=cn;

		if (document.getElementById) {
			var e=document.getElementById(["img_" + n]);
			if (e) {
				s = e.src.substr(0,e.src.lastIndexOf(".")-1);
				s = (g)? s+"1.gif" : s+"2.gif";
				if (e.className!=cn) e.className = cn;
				if (e.src!=s)e.src=s;
				if (e.alt!=p[2]) e.alt = p[2];
			}
		}
	}

	if (!ok&&a) {
		var p=temp[b].toString().split("|");
		alert (p[2]);
		if (a && f[p[1]].focus) f[p[1]].focus();
	}

	return ok;
}
