function ExpCheck() {

	this.ERROR = Object();

	this.selected = false;
	/*
	 * 加入新的错误类型 包含的错误对象属性: title:错误名称,定义新的错误,错误名称时头三个字符必须是DEF. code:错误代码
	 * rule:匹配规则 desc:错误描述
	 */
	this.pushError = function(title, code, rule, desc) {
		eval("this.ERROR." + title + "=new  Object()");
		eval("this.ERROR." + title + ".CODE=" + code);
		eval("this.ERROR." + title + ".RULE='" + rule + "'");
		eval("this.ERROR." + title + ".DESC='" + desc + "'");
	}
	// 添加错误类型
	this.pushError("DEF_CHAR_COUNT_MAX_50", "110", "^.{0,50}$",
			"该字字段内容不能超过50个字符！");
	this.pushError("DEF_CHAR_COUNT_MAX_30", "109", "^.{0,30}$", "该字段内容不能超过32个字符！");
	this.pushError("DEF_CHAR_COUNT_MIN_4", "108", ".{4,}", "该字段最少需要4个字符！");
	this.pushError("DEF_NOT_NULL", "100", ".+", "该字段不能为空!");// 非空约束
	this.pushError("DEF_CHAR_COUNT_MAX_10", "101", "^.{0,10}$",
			"该字段填写内容不应超过10个字符！");// 字数限制,限定为10个字符DEF_CHAR_COUNT_10最后的数字10为限制数量
	this.pushError("DEF_CHAR_COUNT_MIN_6", "102", ".{6,}", "该字段最少需要6位！")// 字符限定，最少为6位
	this.pushError("DEF_EMAIL", "103",
			"^[A-Za-z0-9._\-]*[@]{1}[A-Za-z0-9_-]+[A-Za-z0-9.]+[A-Za-z]+$",
			"填写的Email格式错误！");// 邮件格式限定
	this.pushError("DEF_NUMBER", "104", "^[0-9-]+$", "该字段只能填写数字！");// 输入只能为数字
	this.pushError("DEF_POST_NUM", "105", "^[0-9]{6}$", "填写的邮政编码格式有误！");// 邮政编码的校验
	this.pushError("DEF_USERNAME", "106", "^[-A-Za-z0-9_]+[-A-Za-z0-9_@.]*$",
			"只能包含数字字母和下划线，并且开始字符必须是字母!");// 用户名的校验
	this.pushError("DEF_PASSWORD_CHAR", "106",
			"^[a-zA-Z0-9\-\!\@\#\$\%\^\*\.]{6,32}$", "密码中包含不合法的字符，请尝试使用其他密码!");// 密码的校验
	this.pushError("DEF_PRICE", "106", "^(-)?([0-9])*(\.([0-9]){2})?$",
			"错误的价格格式!");// 价格的校验
	this
			.pushError(
					"DEF_URL",
					"106",
					"^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:([0-9]+))?\/?",
					"错误的网址格式!");// 网址的校验
	this.pushError("DEF_CHAR_CN", "107", "^[\u4e00-\u9fa5]+$", "必须填写汉字！");// 只能填写汉字
	this.pushError("DEF_CHAR", "108", "^[\-A-Za-z0-9_\. \u4e00-\u9fa5\\']+$",
			"不能特殊字符！");
	this.pushError("DEF_NOT_CONFIRM", "108", "", "2次输入不一致！");
	this.pushError("DEF_DATE", "108", "^([0-9]{4})-([0-9]{2})-([0-9]{2})$",
			"错误的日期格式！");
	/*
	 * 解析正则规则数组 如果正则规则数组项中使用预定义的错误类型, 那么的使用预定义的正则规则做匹配. 否则使用用户自定义的正则规则.
	 */
	this.parseRule = function(rule) {
		if (rule.length == 0) {
			alert("没有制定匹配规则!");
			return;
		}
		for ( var i = 0; i < rule.length; i++) {
			// if(rule[i].substr(0,3)=="DEF"){
			// rule[i]=eval("this.ERROR."+rule[i]+".RULE");
			// }
			if (rule[i].substr(0, 14) == "DEF_CHAR_COUNT") {
				var comp = rule[i].substr(15, 3);
				var limit = rule[i].substr(19);
				if (comp == "MAX") {
					rule[i] = ".{0," + limit + "}";
				} else if (comp == "MIN") {
					rule[i] = ".{" + limit + ",}";
				} else {
				}
			} else if (rule[i].substr(0, 16) == "DEF_NOT_CONFIRM_") {
				rule[i] = eval("this.ERROR.DEF_NOT_CONFIRM.RULE");
			} else if (rule[i].substr(0, 4) == "AJAX") {
				rule[i] = eval("this.ERROR.DEF_NOT_CONFIRM.RULE");
			} else {
				rule[i] = eval("this.ERROR." + rule[i] + ".RULE");
			}

		}
		return rule;
	}

	/*
	 * 解析错误描述数组 如果错误描述数组项中使用预定义的错误类型, 那么打印出定义此错误类型时对应的错误描述. 否则打印出用户自定义的错误描述.
	 */
	this.parseMsg = function(msg) {
		if (msg.length == 0) {
			alert("没有制定规则描述!");
			return;
		}
		/*
		 * for(var i=0;i<msg.length;i++){ if(msg[i].substr(0,3)=="DEF"){
		 * msg[i]=eval("this.ERROR."+msg[i]+".DESC"); } }
		 */
		return msg;
	}
	// 去掉首位空格的方法
	this.trim = function(str) {
		if (!str)
			str = "";
		return str.replace(/(^\s*)|(\s*$)/g, "");
	}
	/*
	 * 验证表单项数据合法性 成功返回true否则返回错误代码和错误描述
	 */
	this.validForm = function(fm, r) {
		var len = fm.length;

		var rel = 0;
		for ( var i = 0; i < len; i++) {
			
			if (fm[i].type.toLowerCase() != "password" && fm[i].type.toLowerCase() != "file") {
				fm[i].value = this.trim(fm[i].value);
			}
			
			if (fm[i].getAttribute('valid') == 1) {
				if (!this.checkValid(fm[i], fm[i].name + "_validator",
						fm[i].value, true))
					rel = 1;
			}
		}

		if (rel == 1 || r == 1)
			return false;
		// fm.submit();
		return true;
	}

	this.validField = function(field) {
		this.checkValid(field, field.name + "_validator", field.value, false);
	}
	/*
	 * 检测字符串长度
	 */
	this.utf8 = 3;
	this.gbk = 2;

	this.len = function(str, entype) {
		var s = escape(str);
		var array = s.split("%u");
		var total = str.length;
		var noascii = array.length - 1;
		var ascii = total - noascii;
		return noascii * entype + ascii;
		// alert("none ascii:"+noasc+"\nascii:"+asc+"\ntotal:"+t);
	}
	/*
	 * 判断数据项是否符合正则规则 输入区域的值做trim处理,判断密码区域的值不做trim处理 obj 要校验的数据项的校验器 val 要校验的内容
	 */
	this.checkValid = function(inf, objname, val, isfocus) {

		var obj = document.getElementById(objname);

		var rulres = obj.getAttribute("rule").split("|");

		var rul = this.parseRule(obj.getAttribute("rule").split("|"));
		var msg = this.parseMsg(obj.getAttribute("message").split("|"));
		if (rul.length != msg.length) {
			alert("验证约束和错误描述对应不符合!");
			return false;
		}

		for ( var i = 0; i < rul.length; i++) {
			if (rulres[i].substr(0, 14) == "DEF_CHAR_COUNT") {
				var comp = rulres[i].substr(15, 3);
				var limit = rulres[i].substr(19);
				if (comp == "MAX") {
					if (this.len(val, this.utf8) >= parseInt(limit)) {
						obj.innerHTML = "<font class=\"wrong\">" + msg[i]
								+ "</font>";
						inf.value = val;
						obj.className = '';
						// inf.select();
						// inf.focus();
						if (isfocus)
							this.select(inf);
						return false;
					} else {
						obj.className = 'none';
						obj.innerHTML = "";
					}
				} else if (comp == "MIN") {
					if (this.len(val, this.utf8) < parseInt(limit)) {
						obj.innerHTML = "<font class=\"wrong\">" + msg[i]
								+ "</font>";
						inf.value = val;
						obj.className = '';
						if (isfocus)
							this.select(inf);
						return false;
					} else {
						obj.className = 'none';
						obj.innerHTML = "";
					}
				}
			} else if (rulres[i].substr(0, 16) == "DEF_NOT_CONFIRM_") {
				var comp = rulres[i].substr(16);

				if (val != document.getElementById(comp).value || (inf.type.toLowerCase()=='radio' && !inf.checked)) {
					obj.innerHTML = "<font class=\"wrong\">" + msg[i]
							+ "</font>";
					inf.value = val;
					obj.className = '';
					// inf.select();
					// inf.focus();
					if (isfocus)
						this.select(inf);
					return false;
				} else {
					
					obj.className = 'none';
					obj.innerHTML = "";
				}

			} else if (rulres[i].substr(0, 4) == "AJAX") {
				var comp = rulres[i].substr(5);

				var isreg = true;

				var url = '/ajax/' + comp + '.php?text=' + val;

				new Ajax.Request(url, {
					method : 'get',
					// onLoading:function(){obj.innerHTML="<font
					// class=\"wrong\">正在加载。。</font>";},
					onComplete : function(res) {
						if (res.responseText) {
							isreg = false;
							obj.innerHTML = "<font class=\"wrong\">"
									+ res.responseText + "</font>";
							obj.className = '';
						} else {
							isreg = true;
							obj.className = 'none';
							obj.innerHTML = "";
						}
					}
				});

				if (!isreg) {
					return false;
				} else {
					obj.className = 'none';
					obj.innerHTML = "";
				}

			} else {
				if (rulres[i] != "DEF_NOT_NULL" && val.length == 0)
					continue;

				if (rulres[i] == 'DEF_NOT_NULL' && inf.type == 'checkbox'
						&& inf.checked == false) {
					obj.innerHTML = "<font class=\"wrong\">" + msg[i]
							+ "</font>";
					inf.value = val;
					obj.className = '';
					if (isfocus)
						this.select(inf);

					return false;
				}
				var re = new RegExp(rul[i], "ig");
				if (!re.test(val)) {
					obj.innerHTML = "<font class=\"wrong\">" + msg[i]
							+ "</font>";
					inf.value = val;
					obj.className = '';
					if (isfocus && inf.type.toLowerCase() != 'hidden')
						this.select(inf);

					return false;
				} else {
					obj.className = 'none';
					obj.innerHTML = "";
				}
			}
		}
		return true;
	}

	this.select = function(inf) {
		if (!this.selected) {
			inf.select();
			inf.focus();
			this.selected = true;
		}
	}

	this.checkArray = function(array) {
		eval("var ay=document.all[\"" + array + "[]\"];");
		for ( var i = 0; i < ay.length; i++) {
			if (ay[i].checked)
				return true;
		}
		return false;
	}
}