	function formValid(formName,classErr,errStr,validElements,onSkip) {
		this.errStr = errStr;
		this.formName = formName;
		this.validElements = validElements;
		this.classErr = classErr;
		document.forms[formName].validForm = this;
		document.forms[formName].onsubmit = function() {
			if(onSkip && onSkip()) {
				return true;
			} else {
				return this.validForm.valid();
			}
		}
		var i;
		for(i=0;i<this.validElements.length;i++) {
			this.validElements[i].formName = formName;
			this.validElements[i].classErr = classErr;
		}
		this.valid = function() {
			var i,j;
			var errorStr = "";
			for(i=0;i<this.validElements.length;i++) {
				if(this.validElements[i].name) {
					var names = typeof this.validElements[i].name=='function' ? this.validElements[i].name(this):[this.validElements[i].name];
					for(j=0;j<names.length;j++) {
						document.forms[this.formName].elements[names[j]].className = "";
					}
				}
			}
			for(i=0;i<this.validElements.length;i++) {
				if(!this.validElements[i].valid()) {
					if(this.validElements[i].name) {
						var names = typeof this.validElements[i].name=='function' ? this.validElements[i].name(this):[this.validElements[i].name];
						for(j=0;j<names.length;j++) {
							document.forms[this.formName].elements[names[j]].className = classErr;
						}
					}
					errorStr+=this.validElements[i].errorStr()+"\n";
				}
			}
			if(errorStr.length>0) {
				alert(this.errStr+"\n"+errorStr);
				return false;
			} else {
				return true;
			}
		}
	}
	function formValidInput(name,errStr) {
		this.name = name;
		this.errStr = errStr;
		this.valid = function() {
			return document.forms[this.formName].elements[name].value.length>0;
		}
		this.errorStr = function() {
			return this.errStr;
		}
	}
	function formValidInputNum(name,errStr) {
		this.name = name;
		this.errStr = errStr;
		this.valid = function() {
			return document.forms[this.formName].elements[name].value.match(/^[\d\.:-]+$/)!=null;
		}
		this.errorStr = function() {
			return this.errStr;
		}
	}

	function formValidInputNumE(name,errStr) {
		this.name = name;
		this.errStr = errStr;
		this.valid = function() {
			return ( document.forms[this.formName].elements[name].value.match(/^[\d\.:-]+$/)!=null  || document.forms[this.formName].elements[name].value.length==0) ;
		}
		this.errorStr = function() {
			return this.errStr;
		}
	}
	function formValidEmail(name,errStr) {
		this.name = name;
		this.errStr = errStr;
		this.valid = function() {
			var str = document.forms[this.formName].elements[name].value;
			var splitted = str.match("^(.+)@(.+)$");
			if(splitted !== null && splitted[1] !== null) {
				var regexp_user=/^\"?[\w-_\.]*\"?$/;
				if(splitted[1].match(regexp_user) !== null && splitted[2] !== null) {
					var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
					var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
					if((splitted[2].match(regexp_domain) !== null) || (splitted[2].match(regexp_ip) !== null)) {
						return true;
					}
				}
			}
			return false;
		}
		this.errorStr = function() {
			return this.errStr;
		}
	}
	function formValidBigDate(name,name2,format,errStr) {
		this.name = name;
		this.name2 = name2;
		this.errStr = errStr;
		this.valid = function() {
			var date1 = Date.parseDate(document.forms[this.formName].elements[name].value,format);
			var date2 = Date.parseDate(document.forms[this.formName].elements[name2].value,format);
			if(date1<=date2) {
				return true;
			} else {
				document.forms[this.formName].elements[name2].className = this.classErr;
			}
			return false;
		}
		this.errorStr = function() {
			return this.errStr;
		}
	}
	function formValidCustom(name,valid,errStr) {
		this.name = name;
		this.errStr = errStr;
		this.valid = function() {
			return valid(this);
		}
		this.errorStr = function() {
			return ((typeof this.errStr=='function') ? this.errStr(this):this.errStr);
		}
	}
