function multivalidate(x,val)
{
	
	// validation messages
	
	var msg = new Array();
	msg['general'] = "Form incomplete, please:";
	msg['mailrequired'] = "Enter e-mail adress";
	msg['badmail'] = "Enter valid e-mail adress";
	msg['paswrequired'] = "Enter password";
	msg['differentpasw'] = "Re-enter password";
	msg['shortpasw'] = "Enter at least 6 characters at password";
	
	msg['fieldrequired'] = "Enter {name}";
	
	msg['alphanumeric'] = "{name} can be only characters and numbers";
	msg['alphabetic'] = "{name} can be only characters";
	msg['numeric'] = "{name} can be only numbers";
	
	msg['mustcontain'] = "{name} must include {value}";
	msg['mustnotcontain'] = "{name} must not include {value}";
	
	msg['minlength'] = "{name} must be at least {value} characters";
	msg['maxlength'] = "{name} must be shorter than {value} characters";
	
	// validation with regexp
	
	var numbercheck=/^[0-9\s\.\-\+\(\)]+$/;
	var alphabetcheck=/^[a-zA-Z\s\.\-\,\']+$/;
	var alphanumcheck=/^[0-9a-zA-Z\s\.\-\,\'\+\(\)]+$/;
	
	
	// VALIDATION PROCESS STARTS HERE
	submitOK		= "True";
	var message 	= msg['general'] + "\n\n";

	var i = 0;
	for (i=1; i<val.length+1; i++) {
		var vertiba = '';
		if (typeof val[i] !="undefined"){
			if(x[val[i]['name']]){
				
				if(x[val[i]['name']].value){
				vertiba = x[val[i]['name']].value;
				}
				
				if(val[i]['spec'] == "email"){
					//check
					if(vertiba.length<1){
						submitOK="False";
						message = message + "- " + msg['mailrequired'] + "\n";
					}else{
						if(!isValidEmails(vertiba)){
							submitOK="False";
							message = message + "- " + msg['badmail'] + "\n";
						}
					}
				}else if(val[i]['spec'] == "pass"){
					//check
					var name2 = val[i]['name'] + "again";
					var vertiba2 = x[name2].value;
					if(vertiba.length<1){
						submitOK="False";
						message = message + "- " + msg['paswrequired'] + "\n";
					}else{
						if(vertiba != vertiba2){
							submitOK="False";
							message = message + "- " + msg['differentpasw'] + "\n";
						}
						if(vertiba.length<6){
							submitOK="False";
							message = message + "- " + msg['shortpasw'] + "\n";
						}
					}
					
				}
				
				if(val[i]['req'] == "true"){
					
					if(val[i]['com'] == "specreq"){
						
						var liobj = document.getElementById("subs" + val[i]['id']);
				
						var nodes = liobj.getElementsByTagName("input");
						
						var iecek = 0;
						
						for(z=0; z<nodes.length;z++){
							if(nodes[z].checked){
								iecek = 9;
							}
							
						}
						
						if(iecek != 9){
							submitOK="False";
							var msg2 = msg['fieldrequired'].replace('{name}',val[i]['label']);
							message = message + "- " + msg2 + "\n";
						}
						
						
					}else{
					
					//check
					if(vertiba.length<1){
						submitOK="False";
						var msg2 = msg['fieldrequired'].replace('{name}',val[i]['label']);
						message = message + "- " + msg2 + "\n";
					}
					
					}
					
				}
				
				if(val[i]['validate'] == "true"){
				
					if(val[i]['vtype'] == "numeric"){
						//check
						
						if(!vertiba.match(numbercheck)){
							submitOK="False";
							var msg2 = msg['numeric'].replace('{name}',val[i]['label']);
							message = message + "- " + msg2 + "\n";
						}
					}else if(val[i]['vtype'] == "alphabetic"){
						//check
						if(!vertiba.match(alphabetcheck)){
							submitOK="False";
							var msg2 = msg['alphabetic'].replace('{name}',val[i]['label']);
							message = message + "- " + msg2 + "\n";
						}
					}else if(val[i]['vtype'] == "alphanumeric"){
						//check
						
						if(!vertiba.match(alphanumcheck)){
							submitOK="False";
							var msg2 = msg['alphanumeric'].replace('{name}',val[i]['label']);
							message = message + "- " + msg2 + "\n";
						}
					}
					
					
					if(val[i]['mcontain']){
						//check
						var res = vertiba.search(val[i]['mcontain']);
						if(res == -1){
							submitOK="False";
							var msg2 = msg['mustcontain'].replace('{name}',val[i]['label']);
							var msg3 = msg2.replace('{value}',val[i]['mcontain']);
							message = message + "- " + msg3 + "\n";
						}
					}
					if(val[i]['mncontain']){
						//check
						var res = vertiba.search(val[i]['mncontain']);
						if(res != -1){
							submitOK="False";
							var msg2 = msg['mustnotcontain'].replace('{name}',val[i]['label']);
							var msg3 = msg2.replace('{value}',val[i]['mncontain']);
							message = message + "- " + msg3 + "\n";
						}

					}
					if(val[i]['minl']){
						//check
						if(vertiba.length<val[i]['minl']){
							submitOK="False";
							var msg2 = msg['minlength'].replace('{name}',val[i]['label']);
							var msg3 = msg2.replace('{value}',val[i]['minl']);
							message = message + "- " + msg3 + "\n";
						}
					}
					if(val[i]['maxl']){
						//check
						if(vertiba.length>val[i]['maxl']){
							submitOK="False";
							var msg2 = msg['maxlength'].replace('{name}',val[i]['label']);
							var msg3 = msg2.replace('{value}',val[i]['maxl']);
							message = message + "- " + msg3 + "\n";
						}
					}
					
				}
			
			}
		}
	}
	
	
	if (submitOK=="False") {
 		alert(message)
 		return false;
 	}
	

	
	return true;


} /* end of function */

function isValidEmails(address) {

	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	  
	   if(reg.test(address) == false) {
	     
	      return false;
	   }else{
		   return true;
	   }

} <!-- end of function -->




function trim (strText) {

		// this will get rid of leading spaces 
		while (strText.substring(0,1) == ' ') 
    		strText = strText.substring(1, strText.length);

		// this will get rid of trailing spaces 
		while (strText.substring(strText.length-1,strText.length) == ' ')
    		strText = strText.substring(0, strText.length-1);

		return strText;

} <!-- end of function -->