
	var fields = new Array();
	var cform;
	var errorclass, field;

function ltrim(str) { 
  for (var k=0; k<str.length && str.charAt(k)<=" " ; k++);
  return str.substring(k,str.length);
  }
  
function rtrim(str) {
  for (var j=str.length-1; j>=0 && str.charAt(j)<=" " ; j--);
  return str.substring(0,j+1);
  }
  
function trim(str) {
  return ltrim(rtrim(str));
  }

// ==================================================================== form validation:
  

function checkForm(formitem) {
	var i1 = 0;
	fields = new Array();
	cform = formitem;
	for (i1 = 0; i1 < cform.elements.length; i1++) {
		getValidationVars(cform.elements[i1]);	
		}
	return(doValidation());
	}

function getValidationVars(el) {
	var i1 = 0;
	if (el.getAttribute('valtype')) {
		if (!fields[el.nodeName.toUpperCase()]) {
	    fields[el.nodeName.toUpperCase()] = new Array();
	    }
		var vtypes 			= el.getAttribute('valtype').split(',');
		for (i1 = 0; i1 < vtypes.length; i1++) {
			var check      = new Array();
			check['name']  = el.name;
			check['type']  = vtypes[i1];
			check					 = getNewErrorMsg(check, el);
			check					 = resetOldErrorMsg(check, el);
			if (el.getAttribute('valcustom')) { 
				check['valcustom'] = el.getAttribute('valcustom'); 
				}
		  fields[el.nodeName.toUpperCase()].push(check);
		  }
		}
	}

function resetOldErrorMsg(check, el) {
	if (el.getAttribute('valgroup')) {
		document.getElementById(check['valgroup'] + 'm').innerHTML = '';
		}
	else {
		document.getElementById(check['name'] + 'm').innerHTML = '';
		}
	switch (el.nodeName.toUpperCase()) {
	  case "INPUT":
			switch (el.getAttribute('type')) {
	  		case "text":
					el.className = 'textbox';
	  			break;
	  		case "file":
					el.className = 'textbox';
	  			break;
	  		}
	    break;
	  case "TEXTAREA":
			el.className = 'textar';
	    break;
		case "SELECT":
		  break;
		}	 
	return(check);
	}

function getNewErrorMsg(check, el) {
	check['msg']	 = 'invalid value';
	if (el.getAttribute('valmsg')) {
		check['msg'] = el.getAttribute('valmsg');
		}
	if (el.getAttribute('valgroup')) {
		check['valgroup'] = el.getAttribute('valgroup');
	  }
	return(check);
	}

function doValidation() {
	var retval = true;
	var i1 = 0;
	for (var key in fields) {
		for (i1 = 0; i1 < fields[key].length; i1++) {			   
	    if (!checkElement(fields[key][i1], key)) {
	    	retval = false;
	    	}	    
	    }
	  }
	return(retval);
	}

// ==================================================================== field validation:

function checkElement(check, eltagname) {
	var ok 		 = false;	
	errorclass = false;
	field 		 = cform.elements[check['name']];
	val 			 = getElementValue(eltagname, field.getAttribute('type')); 	
	ok				 = checkValue(check, val);
	if (!ok) {
		printErrorMsg(check);
		}
	return(ok);
	}

function getElementValue(eltagname, eltype) {
	val = false;
	switch (eltagname) {
	  case "INPUT":
			switch (eltype) {
	  		case "checkbox":
			    val				 = field.checked;	
	  			break;
	  		case "text":
			    errorclass = 'textboxerr';
			    val				 = field.value;	
	  			break;
	  		case "file":
			    errorclass = 'textboxerr';
			    val				 = field.value;	
	  			break;
	  		}
	    break;
	  case "TEXTAREA":
	    errorclass = 'textarerr';
	    val				 = field.value;	
	    break;
		case "SELECT":
		  val = field.options[field.selectedIndex].value;
		  break;
		}	
  return(val);
  }

function printErrorMsg(check) {	
	var fieldmsg, comma = '';
	if (errorclass) {
    field.className = errorclass;
		}
	if (check['valgroup']) {
	  fieldmsg  = document.getElementById(check['valgroup'] + 'm');
  	if (fieldmsg.innerHTML) {
  	  comma = ', ';
  	  }
	  fieldmsg.innerHTML += '<font class=\"errorfont\">'+ comma + check['msg'] + '</font>';
	  }
	else {
	  fieldmsg  = document.getElementById(check['name'] + 'm');
	  fieldmsg.innerHTML = '<font class=\"errorfont\">' + check['msg'] + '</font>';
		}		
	}

function checkValue(check, val) {	
	switch (trim(check['type'].toLowerCase())) {
	  case "mandatory":
	    ok = checkMandatory(val);
	    break;
	  case "number":
	    ok = checkNumber(val);
	    break;
	  case "integer":
	    ok = checkInteger(val);
	    break;
	  case "email":
	    ok = checkEmail(val);
	    break;
		case "custom":
			ok = checkCustom(val, check['valcustom']);
		  break;
		}	  	
	return(ok);
	}


// ==================================================================== check routines:
		
function checkMandatory(val) {
	return(val != '');
	}

function checkNumber(val) {
	return(!isNaN(val));
	}

function checkInteger(val) {
  var res;
  res = !isNaN(val);	
	if (res) {
		var mod = val % 1;
		res = (mod == 0);
		}	
	return(res);
	}

function checkEmail(val) {
	var at="@"
	var dot="."
	var lat=val.indexOf(at)
	var lstr=val.length
	var ldot=val.indexOf(dot)
	if (val.indexOf(at)==-1)																							 		{ return false; }
	if (val.indexOf(at)==-1 || val.indexOf(at)==0 || val.indexOf(at)==lstr)		{ return false; }
	if (val.indexOf(dot)==-1 || val.indexOf(dot)==0 || val.indexOf(dot)==lstr){ return false; }
	if (val.indexOf(at,(lat+1))!=-1)																					{ return false; }
	if (val.substring(lat-1,lat)==dot || val.substring(lat+1,lat+2)==dot)			{ return false; }
	if (val.indexOf(dot,(lat+2))==-1)																					{ return false; }	
	if (val.indexOf(" ")!=-1)																									{ return false; }
  return true;
  }				

function checkCustom(val, expression) {
	return(eval(val + expression));
	}			
