    var valid = new Object();

    // REGEX Elements
	valid.text = /^\w+$/;
	valid.textFA = /[^ ]/;

	valid.free = /[^ ]/;

	valid.password = /^.{6,16}$/;

	valid.name = /^[a-z]+( [a-z]+)*$/i;
	valid.nameFA = /[^ ]/;
	valid.nameAR = /[^ ]/;

	valid.integer = /^-?\d+$/;    
	valid.currency = /^-?(\d+(,\d{3})*(\.\d{1,2})?)$/;    
	valid.cNumber = /^\d(\d|[,\-\.\/\\_])*$/;
	valid.float = /^\d*(\.\d+)?$/;
        
	valid.phone = /^\+\d{1,3}\-\d{1,5}\-\d{3,9}$/;
	valid.date = /^\d{1,4}\-\d{1,2}\-\d{1,4}$/;
	valid.fullDate = /^\d{4}\-\d{1,2}\-\d{1,2}$/,
	valid.captcha = /^[a-z0-9]{3}$/i;
	valid.email = /^[a-z0-9\-\._]+\@(\[?)[a-z0-9\-\.]+\.([a-z]{2,4}|[0-9]{1,3})(\]?)$/i;
    
	valid.file = /[^ ]/;
function validateRules_(theForm, na) {
	X = '';
	var elArr = theForm.elements;
	for(var i = 0; i < elArr.length; i++) {
		with(elArr[i]) {
			v = elArr[i].rule;
			if(!v) continue;
			X+= "|"+elArr[i].name+","+elArr[i].rule+","+(elArr[i].op?1:0);
		}
	}
	document.write(X);
	return false;
}
function validateForm(F, rules, na) {
	rules = rules?rules.split('|'):[];
	if(rules[0]=='')rules.splice(0,1);

	var obj, value, r, j, t;
	for (var i=0; i<rules.length; i++){
		value = ''; obj = null;
		var re = rules[i].split(',');

		
		if(F[re[0]]){
			obj = F[re[0]];
		}else{
			//alert(re[0]+': '+'E2');
			continue;
		}
		if(obj.length && !obj.name){
			//alert(re[0]+': '+'Collection ');
			r = false;
			for(j=0; j<obj.length; j++)
				if((obj[j].type!='checkbox' && obj[j].type!='radio') || obj[j].checked){
					obj = obj[j];
					r = true;
					value = obj.value;
					break;
				}
			if(!r)obj = obj[0];
		}else{
			//alert(re[0]+': '+'Normal: '+value);
			if((obj.type!='checkbox' && obj.type!='radio') || obj.checked)value = obj.value;
		}
		//alert(re[0]+': ['+obj+'] ('+value+') '+obj.type);

		c = re[1].substr(0,1);
		if(c=='='){
			re[1] = re[1].substr(1);
			if(F[re[1]].value!=value){
				xAlert(F, obj, na);
				return false;
			}
			continue;
		}

		var m = value&&valid[re[1]]?value.match(valid[re[1]]):false;
		if(!(m || (re[2]==1 && value == '') || obj.style.display == 'none')){
			//alert(re[0]+' : '+obj.name+' : '+value+' : '+re[1][1]+' : '+value.match(valid[re[1][1]]));
			var obj0 = obj;
			for(p=0; obj0!=F && obj0.style.display!='none' && p<10; p++){
				obj0 = obj0.parentNode;
			}
			if(obj0.style.display != 'none'){
				xAlert(F, obj, value, na);
				return false;
			}
		}
	}	
	return true;
}

function xAlert(F, obj, value, na){
	F = F.getAttribute('id');
	try{obj.focus();} catch(e){}
//	try{window.self.scrollTo(window.self.document.body.scrollLeft, window.self.document.body.scrollTop-50);} catch(e){}
	$(obj).addClass('vC');
	//pClass = obj.className=='vC'?pClass:obj.className;
	//obj.className = 'vC';
	window.setTimeout("$(\"#"+F+" [name='"+obj.name+"']\").removeClass('vC');", 1500);
	if(na)alert("Failure to match " + obj.name + " to '" + value +"'");
	//alert(obj.type);
	if(obj.type!="select-one" && obj.type!="select-multiple")obj.select()
}

function validateServer(errors){
	if(!errors)return false;
	errors=errors.substr(1).split('|');
	for(i in errors){
		v = errors[i].split('^');
		if(v[0])
			$("[name='"+v[0]+"']:first").addClass('vS').parent().append($('<em></em>').addClass('vS').html(v[1]));
		else if(v[1])
			$('ul.vS').append('<li>'+v[1]+'</li>');
	}
}
