 Validator = {
	Require : /.+/,
	Any: /.+/,
	Password: /^[A-Za-z0-9]{6,20}$/,
	Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
	Phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
	Mobile : /^((\(\d{2,3}\))|(\d{3}\-))?1[35]\d{9}$/,
	Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
	IdCard : "this.IsIdCard(value)",
	Currency : /^\d+(\.\d+)?$/,
	Number : /^\d+$/,
	Zip : /^[1-9]\d{5}$/,
	QQ : /^[1-9]\d{4,8}$/,
	Integer : /^[-\+]?\d+$/,
	Double : /^[-\+]?\d+(\.\d+)?$/,
	English : /^[A-Za-z]+$/,
	Chinese :  /^[\u0391-\uFFE5]+$/,
	Username : /^[a-z0-9A-Z]{4,32}$/i,
	UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
	IsSafe : function(str){return !this.UnSafe.test(str);},
	SafeString : "this.IsSafe(value)",
	Filter : "this.DoFilter(value, getAttribute('accept'))",
	Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",
	LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
	Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
	Repeat : "value == document.getElementById(getAttribute('to')).value",
	Range : "getAttribute('min') < (value|0) && (value|0) < getAttribute('max')",
	Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
	Custom : "this.Exec(value, getAttribute('regexp'))",
	Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
	ErrorItem : [document.forms[0]],
	ErrorMessage : ["以下原因导致提交失败：\t\t\t\t"],
	UserName:/^\w{5,20}$/,//在字母、数字、下划线(_)、中可同时出现或不同是出现、但必需是这三个范围内的
	Username: "this.checkUserName(value)",
	
	
	onsubmit :function(v){
		var stat=true;
		var obj = v;
		var count = obj.elements.length;
		for(var i=0;i<count;i++){
			with(obj.elements[i]){
				var _dataType = getAttribute("dataType");
				if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined")  continue;
				if (!this.onfocusout(obj.elements[i])) {
					stat = false;
					//document.getElementById(obj.elements[i].name).focus();
					return stat;
				}
			}
		}	

		//document.writeln(stat);
		return stat;		
	},
	
	

	onfocusout: function(v){
		var nn=v.name;
		var correcttable=document.getElementById(nn+"correct");
		var wrongtable=document.getElementById(nn+"wrong");	
		var commontable=document.getElementById(nn+"common");
		var focustable=document.getElementById(nn+"focus");
		
		if (Validator.Validate(v)){
		correcttable.style.display="block";
		wrongtable.style.display="none";
		commontable.style.display="none";
		focustable.style.display="none";
		return true;		
		}else
		{
		correcttable.style.display="none";
		wrongtable.style.display="block";
		commontable.style.display="none";
		focustable.style.display="none";	
		return false;	
		}


		
	
	},

	
	onfocusin: function(v){
		var nn=v.name;
		var correcttable=document.getElementById(nn+"correct");
		var wrongtable=document.getElementById(nn+"wrong");	
		var commontable=document.getElementById(nn+"common");
		var focustable=document.getElementById(nn+"focus");
		//if (v.ischanged){
		//correcttable.style.display="none";
		//wrongtable.style.display="block";
		//commontable.style.display="none";
		//focustable.style.display="none";
		//}else{
		correcttable.style.display="none";
		wrongtable.style.display="none";
		commontable.style.display="none";
		focustable.style.display="block";		
		
		//}
	},

	init : function(theForm){
		var obj = theForm;
		obj.onsubmit=new Function("return(Validator.onsubmit(this))");
		var count = obj.elements.length;
		this.ErrorMessage.length = 1;
		this.ErrorItem.length = 1;
		this.ErrorItem[0] = obj;
		for(var i=0;i<count;i++){
			with(obj.elements[i]){
				var _dataType = getAttribute("dataType");
				if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined")  continue;
				this.ClearState(obj.elements[i]);
				obj.elements[i].ischanged=false;
				obj.elements[i].onfocusin=new Function("Validator.onfocusin(this)");
				obj.elements[i].onfocusout=new Function("Validator.onfocusout(this)");

			}
		}	
	
	
	},
	Validate : function(v){
			with (v){
				var _dataType = v.getAttribute("dataType");
				this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))

				if(v.getAttribute("require") == "false" && v.value == "") return true;
				if(v.getAttribute("len")>0){
					if (!this.limit(this.LenB(value),0 , v.getAttribute("len"))) return false;
				}
				switch(_dataType){
					case "IdCard" :
					case "Date" :
					case "Repeat" :
					case "Range" :
					case "Compare" :
					case "Custom" :
					case "Group" : 
					case "Limit" :
					case "LimitB" :
					case "SafeString" :
					case "Username" :
						if(!eval(this[_dataType]))	{
							return false;
						}
						break;
					case "Filter" :
						if(!eval(this[_dataType]))	{
							return false;
						}
						break;
					default :
						if(!this[_dataType].test(value)){
							return false;
						}
						break;
				}
			}
			return true;
				
	},
	checkUserName : function(value){
		// 这里写你检测的代码，首先是本地检测，然后才是服务器检测。
		var patrn=/^\w{5,20}$/;
		if(patrn.exec(value) != null)
		{
			searchUserNameIsReiteration(value);
			return true;
		}
		return false;
	},
	
	limit : function(len,min, max){
		min = min || 0;
		max = max || Number.MAX_VALUE;
		return min <= len && len <= max;
	},
	LenB : function(str){
		return str.replace(/[^\x00-\xff]/g,"**").length;
	},
	ClearState : function(elem){
		with(elem){
			if(style.color == "red")
				style.color = "";
			var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
			if(lastNode.id == "__ErrorMessagePanel")
				parentNode.removeChild(lastNode);
		}
	},
	AddError : function(index, str){
		this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
		this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
	},
	Exec : function(op, reg){
		return new RegExp(reg,"g").test(op);
	},
	compare : function(op1,operator,op2){
		switch (operator) {
			case "NotEqual":
				return (op1 != op2);
			case "GreaterThan":
				return (op1 > 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;
	},
	DoFilter : function(input, filter){
return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input);
	},
	
	
		IsIdCard : function(number){
	var cc=/^\d{15}(\d{2}[A-Za-z0-9])?$/;
	return cc.test(number);
	}, //?????
	
	
	IsDate : function(op, formatString){
		formatString = formatString || "ymd";
		var m, year, month, day;
		switch(formatString){
			case "ymd" :
				m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
				if(m == null ) return false;
				day = m[6];
				month = m[5]*1;
				year =  (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
				break;
			case "dmy" :
				m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
				if(m == null ) return false;
				day = m[1];
				month = m[3]*1;
				year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
				break;
			default :
				break;
		}
		if(!parseInt(month)) return false;
		month = month==0 ?12:month;
		var date = new Date(year, month-1, day);
        return (typeof(date) == "object" && year == date.getFullYear() && month == (date.getMonth()+1) && day == date.getDate());
		function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
	}
 }



var XMLHttpReq;
       var ResetItem = "";
       //创建XMLHttpRequest对象       
      function createXMLHttpRequest() {
              if(window.XMLHttpRequest) { //Mozilla 浏览器
                     XMLHttpReq = new XMLHttpRequest();
              }
              else if (window.ActiveXObject) { // IE浏览器
                     try {
                           XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
                     } catch(e){
                           try {
                              XMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
                           } catch (e) {}
                     }
              }
       }
       //发送请求函数
       function sendRequest(action,userName) {
              createXMLHttpRequest();
            var url = action + userName;
              XMLHttpReq.open("GET", url, true);
              XMLHttpReq.onreadystatechange = processResponse;//指定响应函数
              XMLHttpReq.send(null);  // 发送请求
       }
       // 处理返回信息函数
       function processResponse() {
       if (XMLHttpReq.readyState == 4) { // 判断对象状态
              if (XMLHttpReq.status == 200) { // 信息已经成功返回，开始处理信息
                        DisplayHot();
                        //setTimeout("sendRequest()", 5000);
              } else { //页面不正常
                    //window.alert("您所请求的页面有异常。");
              }
         }
      }
      // 显示更新数据信息的函数
      function DisplayHot() {
      		var content = XMLHttpReq.responseText;
			//303代表正确
			if(content != "303")
			{
				document.getElementById("namecorrect").innerHTML = content;
				document.getElementById("userNameFlag").innerHTML = "error";
			}else{
				document.getElementById("namecorrect").innerHTML = "<span class='song12blue'>（●输入正确）</span>";
				document.getElementById("userNameFlag").innerHTML = "ok";
			}
      }
      //查询用户名是否有重复的
      function searchUserNameIsReiteration(value)
      {
      	sendRequest("/checkuser?userName=",value);
      }

	  //最后提交时的一个验证/这个方法的目的是在不同浏览器中的效果一样
	  function checkUserTrue(frm)
			{
				/**
					修改建议，这里需要获取用户名值，然后在下面分支判断中在重新校验checkUserName(username.value)函数，本次校验是提交之前的校验,今晚回来后完成这部分的代码
				*/
				var name = document.getElementById("username").value;
				var onePwd = document.getElementById("passwords").value;
				var twoPwd = document.getElementById("confirmpassword").value;
				var email = document.getElementById("email").value;
				var telephone = document.getElementById("telephone").value;
				var cellphone = document.getElementById("cellphone").value;
				var zipcode = document.getElementById("zipcode").value;
				var content = document.getElementById("userNameFlag").innerHTML;//验证用户名是否合法、的保留信息

				if(content == "" || content == "error")
				{
					Validator.checkUserName(name);//校验用户名选项框
					Validator.onsubmit(frm);//onsubmit
					return false;
				}else{
					if(content == "ok"){
						Validator.onsubmit(frm);//onsubmit
						if(onePwd.length != 0 && twoPwd.length != 0 && onePwd.length >= 6 && onePwd == twoPwd && (email.length == 0 || Validator.Email.test(email) == true) && (telephone.length == 0 || Validator.Phone.test(telephone) == true) && (cellphone.length == 0 || Validator.Mobile.test(cellphone) == true) && (zipcode.length == 0 || Validator.Number.test(zipcode) == true))
						{
							frm.submit();
						}else{
							return false;
						}
					}else{
						Validator.checkUserName(name);//校验用户名选项框
						Validator.onsubmit(frm);//onsubmit
						return false;
					}
				}
				return false;
			}