Validator = {
Require1 :   /.+/,																					//????
Email :     /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,										//????
Phone :     /^((\(\d{3}\))|(\d{3}\-))?((\(0\d{2,3}\)|0\d{2,3})|(\(0\d{2,3}\)|0\d{2,3}-))?[1-9]\d{6,7}$/,		//????
Mobile :    /^((\(\d{3}\))|(\d{3}\-))?((13)|(15))\d{9}$/,													//????
Url :       /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,				//url
IdCard :    /^\d{15}(\d{2}[A-Za-z0-9])?$/,															
Currency :  /^\d+(\.\d+)?$/,
Number :    /^\d+$/,
Number1 :   /^([1-9]{1})|([1-9]{1}\d+)$/,  
DeptCode3 : /^\d{3}$/,
Zip :       /^[1-9]\d{5}$/,
QQ :        /^[1-9]\d{4,8}$/,
Integer :   /^[-\+]?\d+$/,
Double :    /^[-\+]?\d+(\.\d+)?$/,
English :   /^[A-Za-z]+$/,
IP :        /^([1-9]|[1-9]\d|1\d{2}|2[0-1]\d|22[0-3])(\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3}$/,
Chinese :   /^[\u0391-\uFFE5]+$/,
UnSafe :    /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
MonthDay:   /(0[1-9]{1}|1[0-2]{1})-(0?[1-9]|[1-2]\d|3[0-1])$/,
IsSafe :    function(str){
			   return !this.UnSafe.test(str);
		    },		    
Require: "this.trimRequire(value)",
SafeString : "this.IsSafe(value)",
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.getElementsByName(getAttribute('to'))[0].value",
Range      : "getAttribute('min') < value && value < 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 : ["Message:\t\t\t\t"],
Validate  : function(theForm, mode){
			var obj = theForm || event.srcElement;
			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;
					if(style.display == 'none') continue;
					if(disabled == true) continue;
					this.ClearState(obj.elements[i]);
					if(getAttribute("require") == "false" && value == "") continue;
					switch(_dataType){
						case "Date" :
						case "Repeat" :
						case "Range" :
						case "Compare" :
						case "Custom" :
						case "Group" : 
						case "Limit" :
						case "LimitB" :
						case "SafeString" :
						case "Require" :
						if(!eval(this[_dataType])) {
							this.AddError(i, getAttribute("msg"));
						}
						break;
						default :
						if(!this[_dataType].test(value)){
							this.AddError(i, getAttribute("msg"));
						}
						break;
					}
			   }
		   }
           if(this.ErrorMessage.length > 1){
				mode = mode || 1;
				var errCount = this.ErrorItem.length;
				switch(mode){
					case 2 :
					for(var i=1;i<errCount;i++)
						this.ErrorItem[i].style.color = "red";
					case 1 :
					alert(this.ErrorMessage.join("\n"));
						this.ErrorItem[1].focus();
					break;
					case 3 :
						for(var i=1;i<errCount;i++){
							try{
								var span = document.createElement("SPAN");
								span.id = "__ErrorMessagePanel";
								span.style.color = "red";
								this.ErrorItem[i].parentNode.appendChild(span);
								span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
							}catch(e){alert(e.description);
							}
				        }
						this.ErrorItem[1].focus();
						break;
					default :
						alert(this.ErrorMessage.join("\n"));
					break;
				}
				return false;
		}
		return true;
		},
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;
			  },
IsDate : function(op, formatString){
			var arr = op.split(/[-,/]/);
			if(!op.search(/^[0-9]{4}[-./](0[1-9]|[1-9]|1[0-2])[-./]((0[1-9]|[1-9])|1[0-9]|2[0-9]|3[0-1])$/) == 0){
				return false;
			}
			if(arr[1] > 12 || arr[2] > 31){
				return false;
			}
			var d = new Date(arr[0],arr[1]-1,arr[2]);
			var day = ''+arr[2];
			var m = '' + arr[1];
			if(m.length == 1){
				m = '0' + m;
			}	
			if(day.length == 1){
				day = '0' + day;
			}
			return d.getDate() == day || (d.getMonth() == arr[1] - 1);
		 },		 
trimRequire : function(val){

			val = val.replace(/(^\s*)|(\s*$)/g, "");
			val=val.replace(/(^[　]*)|([　]*$)/g, "");
			return this['Require1'].test(val);

	}
}