/*************************************************
Validator v2.0
cody by www.phppx.com 新程php培训
date : 2011-12
*************************************************/
Validator = {

	Require : /.+/, //一定有值
	Username : /^[\u4E00-\u9FA5\w]{3,20}$/, //用户名
	Password : /^[\w-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/'\"]{6,16}$/, //密码
	V_code : /^[a-zA-Z0-9]{4}$/, //验证码
	Email    : /^[0-9a-zA-Z]+([-\._][0-9a-zA-Z]+)*@([0-9a-zA-Z][0-9a-zA-Z-]*\.)+([a-zA-Z]{2,})+$/,
	Domain   : /^([0-9a-zA-Z][0-9a-zA-Z-]*\.)+([a-zA-Z]{2,})+$/,  //域名
	Phone    : /^\d{3,4}-\d{7,8}(-\d{1,5})?$/, //固定电话
	Mobile   : /^1\d{10}$/, //手机号码
	Url      : /^http:\/\/([0-9a-zA-Z][0-9a-zA-Z-]*\.)+([a-zA-Z]{2,})+/, //url
	IdCard : /^\d{15}(\d{2}[X0-9])?$/, //身份证
	zipCode : /^\d{6}$/, //邮编
	Currency : /^\d+\.\d{2}$/, //货币
	Number : /^\d+$/, //数字
	QQ : /^[1-9]\d{5,11}$/, //QQ
	Integer : /^[-\+]?\d+$/, //有正负的数字
	Double : /^[-\+]?\d+(\.\d+)?$/, //有正负的小数
	English : /^[A-Za-z]+$/, //英文
	Chinese  : /^[\u4E00-\u9FA5]+$/, //中文
	Lblank   : /^\s+/, //左空格
	Rblank   : /\s+$/, //右空格
	UnLblank : /^[^\s]+/,
	UnRblank : /[^\s]+$/,
	regexp   : /^\/.+\/i?m?g?$/, //正则
	date     : /^(?:(?!0000)[0-9]{4}([-/.]?)(?:(?:0?[1-9]|1[0-2])([-/.]?)(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])([-/.]?)(?:29|30)|(?:0?[13578]|1[02])([-/.]?)31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]?)0?2([-/.]?)29)$/,
	dateB    : /^(?:(?:1[6-9]|[2-9][0-9])[0-9]{2}([-/.]?)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:(?:1[6-9]|[2-9][0-9])(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)([-/.]?)0?2\2(?:29))$/,
	datetime : /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)\s+([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/,
	time     : /^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/,
	ipv4     : /^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/, //ip地址
	UnSafe : /[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"\s]/, //特殊字符
	IsSafe : function(str){return !this.UnSafe.test(str);}, //非特殊字符
	SafeString : "this.IsSafe(value)",
	Limit : "this.limit(obj.value.length,_element.min,_element.max)",
	LimitB : "this.limit(this.LenB(value), _element.min, _element.max)",
	Repeat : "obj.value == document.getElementById(_element.to).value",
	Range : "Number(_element.min) < obj.value && obj.value < Number(_element.max)",
	Compare : "this.compare(obj.value,_element.operator,Number(_element.to))",
	Custom : "_element.regexp.test(obj.value)",
	Group : "this.MustChecked(_element.name, _element.min, _element.max)",

	okElements : [],
	errorElements : [],

	Validate : function(){
		for(var id in this.Element){

			var _element = this.Element[id];
			var obj = document.getElementById(id);
			var _dataType = _element.dataType;
			var _okMsg = _element.okMsg;
			var _errorMsg = _element.errorMsg;


			this.ClearState(id); //清理当前元素状态
			if(_element.require == "false" && obj.value == "") continue; //如果不是require,value为空则不做验证
			switch(_dataType){
				case "Repeat" :
				case "Range" :
				case "Compare" :
				case "Custom" :
				case "Group" :
				case "Limit" :
				case "LimitB" :
				case "SafeString" :

				if(!eval(this[_dataType])) { //如果没有通过验证
					this.AddError(id);
				} else  {
					this.AddOk(id);
				}
				break;
				default :
				if(!this[_dataType].test(obj.value)) { //其余的用正则做验证
					this.AddError(id);
				} else  {
					this.AddOk(id);
				}
				break;


			}
		}
		this.ShowOkMsg();
		return(this.ShowErrorMsg());
	},
	ValidateOne : function(obj,id){
		this.okElements = [];
		this.errorElements = [];

		var _element = eval("this.Element."+id); //获取到当前元素的相关资料
		var _dataType = _element.dataType; //获取单个的dataType的值
		var _okMsg = _element.okMsg;
		var _errorMsg = _element.errorMsg;

		this.ClearState(id); //清理状态
		if(_element.require == "false" && obj.value == ""){ //如果require这个属性为false,并且value为空,就不做验证
			var b;	//do nothing;
		} else {
			switch(_dataType){
				case "Repeat" :
				case "Range" :
				case "Compare" :
				case "Custom" :
				case "Group" :
				case "Limit" :
				case "LimitB" :
				case "SafeString" :
				if(!eval(this[_dataType]))	{ //如果验证失败
					this.AddError(id);
				} else { //如果验证成功
					this.AddOk(id);
				}
				break;
				default : //做正则验证
				if(!this[_dataType].test(obj.value)){ //如果验证失败
					this.AddError(id);
				} else { //如果验证成功
					this.AddOk(id);
				}
				break;
			}


		}

		this.ShowOkMsg();
		return( this.ShowErrorMsg() );
	},


	AddError: function (id){
		this.errorElements[this.errorElements.length] = id;
	},

	AddOk: function (id){
		this.okElements[this.okElements.length] = id;
	},


	//打印错误信息
	ShowErrorMsg : function(){

		var errorElements = this.errorElements;
		if(errorElements.length > 0){

			var errCount = this.errorElements.length;

			for(var i=0;i 0){
			for(i=0;i op2);
			case "GreaterThanEqual":
			return (op1 >= op2);
			case "LessThan":
			return (op1 < op2);
			case "LessThanEqual":
			return (op1 <= op2);
			default:
			return (op1 == op2);
		}
	},

	//判断单选,复选的选择情况
	MustChecked : function(name, min, max){
		var groups = document.getElementsByName(name);
		var hasChecked = 0;
		min = min || 1;
		max = max || groups.length;
		for(var i=groups.length-1;i>=0;i--)
		if(groups[i].checked) hasChecked++;
		return min <= hasChecked && hasChecked <= max;
	},
	//判断长度
	limit : function(len,min, max){
		min = min || 0;
		max = max || Number.MAX_VALUE;
		return min <= len && len <= max;
	},

	//双字节算2个字符
	LenB : function(str){
		return str.replace(/[^\x00-\xff]/g,"**").length;
	}
}