
/*
Validator是基于JavaScript技术的伪静态类和对象的自定义属性，可以对网页中的表单项输入进行相应的验证，允许同一页面中同时验证多个表单，熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。因为是伪静态类，所以在调用时不需要实例化，直接以"类名+.语法+属性或方法名"来调用。此外，Validator还提供3种不同的错误提示模式，以满足不同的需要。 
Validator目前可实现的验证类型有： 
1.是否为空 				:Require；
2.数字					:Number；
3.整数					:Integer；
4.Email地址 				:Email；
5.电话号码 				:Phone；
6.货币 					:Currency
7.手机号码 				:Mobile；
8.邮政编码；			:Zip
9.身份证号码 			:IdCard；
10.日期					:Date；
11.符合安全规则的密码		:SafeString；
12.某项的重复值			:Repeat；
13.两数的关系比较		:Range；
14.判断输入值是否在(n, m)区间				:Range；
15.输入字符长度限制(可按字节比较)			:Limit(LimitB)；
16.对于具有相同名称的单选按钮的选中判断	:Group；
17.限制具有相同名称的多选按钮的选中数目	:Group；
18.自定义的正则表达式验证 				:Custom； 
19.根据条件获取字符串长度					:
20.时间类型								：Time
21.中文或英文字符         :CN_EN
22.Float
23.QQ
24.Password
25.MemberName
26.UnitName
27.URL
28.英文或数字:EN_NUM
29.中文、英文、数字、空格
:CN_EN_NUM_SPACE:
:*/
Validator = {
CN_EN:/^(\s)*([a-zA-Z\u4E00-\u9FFF])+(\s)*$/,
EN_NUM:/^(\s)*([a-zA-Z0-9])+(\s)*$/,
Float:/^[-\+]?\d+(\\.\\d+)?$/,
QQ:/^(\s)*[1-9]\d{4,11}(\s)*$/,
Password:/^[a-zA-Z\-0-9]{6,32}$/,
BankAcct:/^\d{8,24}$/,
MemberName:/^(\s)*([\u4E00-\u9FFF]{1,50}|([a-zA-Z\s0-9]{1,100}))(\s)*$/,
CN_EN_NUM_SPACE:/^(\s)*([a-zA-Z\u4E00-\u9FFF\s0-9])+(\s)*$/,
UnitName:/^(\s)*([a-zA-Z\u4E00-\u9FFF\s])+(\s)*$/,
EN_NUM:/^(\s)*([a-zA-Z0-9])+(\s)*$/,
Require:/^(\s)*.+(\s)*/, 
//URL:/^(\s)*(http(s)?:\/\/)?([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?(\s)*$/,
URL:/^(\s)*(http(s)?:\/\/)?([\w-]+\.)+[\w-]+(:(\d{1,4}))?(\/[\w-.\/?%&=]*)?(\s)*$/,
Email:/^(\s)*([\w]+([-_.][\w]+)*@[-\w]+([.][\w]+)*\.[\w]+([.][\w]+)*)(\s)*$/, 
Phone:/^[\s]*((1[35]\d{9})|(0\d{2,4}\-){1}[1-9]{1}\d{6,9}(\-\d{1,5})?)[\s]*$/, 
Mobile:/^(\s)*(1[35]\d{9})(\s)*$/,
Fax:/^[\s]*(0\d{2,4}\-){1}[1-9]{1}\d{6,9}[\s]*$/,
IdCard:/^(\s)*(\d{15}|\d{18}|\d{7}x)(\s)*$/i, 
Currency:/^(0(\.\d{0,2})?|([1-9]+[0]*)+(\.\d{0,2})?)$/, 
Number:/^[-\+]?\d+$/, 
Zip:/^(\s)*\d{6}(\s)*$/, 
Integer:/^[-\+]?\d+$/, 
UnSafe:/^(\s)*(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/, 
Time:/^(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23):[0-5]?[0-9]$/, 
IsSafe:function (str) {
	return !this.UnSafe.test(str);
}, 
SafeString:"this.IsSafe(value)", 
Limit:"this.limit(value.length,getAttribute('min'),getAttribute('max'))", 
LimitB:"this.limit(this.LenB(value),getAttribute('min'),getAttribute('max'))", 
LimitUTF8:"this.limit(this.LenUTF8(value), getAttribute('min'), getAttribute('max'))", 
Date:"this.IsDate(value, 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:["\u4ee5\u4e0b\u539f\u56e0\u5bfc\u81f4\u63d0\u4ea4\u5931\u8d25\uff1a\t\t\t\t"], 
Validate:function (theForm, mode, pageCode, scenarioCode) {
	
	var obj = theForm || event.srcElement;
	var count = obj.elements.length;
	//alert("count:"+count);
	this.ErrorMessage.length = 1;
	this.ErrorItem.length = 1;
	this.ErrorItem[0] = obj;
	var statusStr = "false";
	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]);
			//alert(getAttribute("name")+"=="+getAttribute("require"));
			if (getAttribute("require") == "false" && value == "") {
				continue;
			} else {
				if (obj.name == "type") {
					continue;
				}
			}
			switch (_dataType) {
			  case "Date":
			  case "Repeat":
			  case "Range":
			  case "Compare":
			  case "Custom":
			  case "Group":
			  case "Limit":
			  case "LimitB":
			  case "LimitUTF8":
			  case "SafeString":
			  var r1 = /^()$/;
				if (!eval(this[_dataType])) {
					var _msg = getAttribute("msg");
					if (typeof (_msg) != "object" || typeof (this[_msg]) != "undefined") {
						if (_msg != null || _msg.length != 0) {
							this.AddError(i, _msg);
							statusStr = "true";
							break;
						}
					}
					var mapobj = eval(pageCode + "Object");
					var keyobj = scenarioCode + "." + obj.elements[i].getAttribute("name");
							 _msg = this.GetValidateResult(_dataType, obj.elements[i].value, obj.elements[i].getAttribute("min"), obj.elements[i].getAttribute("max"),mapobj.get(keyobj));
							 if(_msg == null){
							   		_msg = mapobj.get(keyobj) ;
							  }
					this.AddError(i, _msg);
					statusStr = "true";
				}
				break;
			  default:
				if (!eval(this[_dataType].test(value))) {
					var _msg = getAttribute("msg");
					if (typeof (_msg) != "object" || typeof (this[_msg]) != "undefined") {
						if (_msg != null || _msg.length != 0) {
							this.AddError(i, _msg);
							statusStr = "true";
							break;
						}
					}
					if (pageCode != "") {
						var mapobj = eval(pageCode + "Object");
						//alert(mapobj);
						var keyobj = scenarioCode + "." + obj.elements[i].getAttribute("name");
						_msg = this.GetValidateResult(_dataType, obj.elements[i].value, obj.elements[i].getAttribute("min"), obj.elements[i].getAttribute("max"),mapobj.get(keyobj));
						if(_msg==mapobj.get(keyobj)){
							break;
						}
						if(_msg == null){
							   		_msg = mapobj.get(keyobj) ;
							  }
						this.AddError(i, _msg);
						statusStr = "true";
					}
				}else{
					if (pageCode != "") {
						var mapobj = eval(pageCode + "Object");
						var keyobj = scenarioCode + "." + obj.elements[i].getAttribute("name");
						_msg = this.GetValidateResult(_dataType, obj.elements[i].value, obj.elements[i].getAttribute("min"), obj.elements[i].getAttribute("max"),mapobj.get(keyobj));
						if(_msg == mapobj.get(keyobj)){
							   		break ;
							  }
						this.AddError(i, _msg);
						statusStr = "true";
					}
				}
				break;
			}
		}
		//alert("status:"+(statusStr=="true"));
		if (statusStr == "true") {
			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:
		  	var errMsg = document.getElementById("wrongWhole1");
			errMsg.style.display="block";
			errMsg.innerHTML=this.ErrorMessage + "<br/>";
			//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;
		  case 4:
			//alert(this.ErrorMessage[0] + "\n" + this.ErrorMessage[1]);
			var errMsg = document.getElementById("wrongWhole1");
			errMsg.style.display="block";
			errMsg.innerHTML=this.ErrorMessage[1];
			if(this.ErrorItem[1].getAttribute("type")!="hidden"){
				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] = "  " + 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;
}, LenUTF8:function (str) {
	return ("" + str).replace(/[^\u0000-\u007f]/g,"\u0061\u0061\u0061").length;
}, IsDate:function (op, formatString) {
	formatString = formatString || "ymd";
	if (formatString == "%Y-%m-%d" || formatString == "%Y%m%d") {
		formatString = "ymd";
	}
	if (formatString == "%d-%m-%Y" || formatString == "%d/%m/%Y") {
		formatString = "dmy";
	}
	var m, year, month, day;
	switch (formatString) {
	  case "ymd":
		m = op.match(new RegExp("^(\\d{4})([-]?)(\\d{1,2})([-]?)(\\d{1,2})$"));
		if (m == null) {
			return false;
		}
		day = m[6];
		month = m[5]--;
		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]--;
		year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
		break;
	  default:
		break;
	}
	if (!parseInt(month)) {
		return false;
	}
	month = month == 12 ? 0 : month;
	var date = new Date(year, month, day);
	return (typeof (date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate());
	function GetFullYear(y) {
		return ((y < 30 ? "20" : "19") + y) | 0;
	}
},  GetValidateResult:function (type, obj, min, max,msg) {
	//alert(obj);
	var map = eval("commonObject");
	var result = msg;
	var _length = this.LenUTF8(obj);
	switch (type) {
	  case "Require":
	  if (isEmpty(obj)) {
			return map.get("string.empty").replace("{0}", msg);
		}
		break;
		
	  case "Password":
	 	return this.testPwd(obj,msg);
	  case "IdCard":
	  case "Zip":
	  case "QQ":
	  case "Phone":
	  case "Fax":	  
	  case "Mobile":
	  if (isEmpty(obj)) {
			return map.get("string.empty").replace("{0}", msg);
		}
	  if(eval(this[type].test(obj))){
			break;
		}else{
	 	 return map.get("string.style").replace("{0}", msg);
	  }
	  case "MemberName":
	  case "UnitName":
	  case "Email":
	  case "URL":
	  case "CN_EN":
	  case "EN_NUM":
	  case "CN_EN_NUM_SPACE":
	  min = min || 1;
		max = max || _length;
		//alert("I'm here!");
		if (isEmpty(obj)) {
			return map.get("string.empty").replace("{0}", msg);
		} else {
			if (_length < 1 || _length > max) {
				result = map.get("string.length").replace("{0}", msg);
				result = result.replace("{max}",max);
			} else {
				if(!eval(this[type].test(obj))){
					return map.get("string.style").replace("{0}", msg);
				}
			}
		}
		break;
	  case "Limit":
	  case "LimitB":
	  case "LimitUTF8":
	  case "SafeString":
	  case "Custom":
		min = min || 1;
		max = max || _length;
		
		if (isEmpty(obj)) {
			return map.get("string.empty").replace("{0}", msg);
		} else {
			if (_length < 1 || _length > max) {
				result = map.get("string.length").replace("{0}", msg);
				result = result.replace("{max}",max);
			} else{
				return map.get("string.style").replace("{0}", msg);
			}
		}
		break;
	  case "Date":
		if (isEmpty(obj)) {
			return map.get("date.empty").replace("{0}", msg);
		} else {
			if(!eval(this[type].test(obj))){
			return map.get("date.dateStyle").replace("{0}", msg);
			}
		}
		break;
	  case "Time":
	   
		if (isEmpty(obj)) {
			return map.get("date.empty").replace("{0}", msg);
		} else {
			if(!eval(this[type].test(obj))){
				return map.get("date.timeStyle").replace("{0}", msg);
			}
		}
		break;
		case "Currency":
		min = min || 1;
		max = max || _length;
		return this.testCurrency(obj,msg);
		
	  case "Number":
	  case "Integer":
	  case "QQ":
	  min = min || 1;
		max = max || _length;
	  	if (obj.length < 1 || obj.length > max) {
				result = map.get("number.validatebit").replace("{0}", msg);
				result = result.replace("{min}",min);
				return result.replace("{max}",max);
				break;
			}
		if(eval(this[type].test(obj))){
			break;
		
		}
	  case "Range":
	  
	  //alert(max);
	  min = min || 1;
			max = max || _length;
		if (isEmpty(obj)) {
			return map.get("number.empty").replace("{0}", msg);
		} else {
			if (obj.length < 1 || obj.length > max) {
				result = map.get("number.validatebit").replace("{0}", msg);
				return result.replace("{max}",max);
			} else {
						return map.get("number.type").replace("{0}", msg);
			}
		}
		break;
	}
	
	return result;
},
isPwdValidate:function (objValue){	
	var r1 = /^([a-zA-Z0-9_])*$/;
	var r2 = /^([a-zA-Z])*$/; 
	var r3 = /^([0-9])*$/;
	var r4 = /^([_])*$/;
	
	if(objValue.length < 6 || objValue.length > 32){
		return false;
	}
	
	if(r1.test(objValue)== false){
		return false;
	}
	
	if(this.isRepetitive(objValue)){
		return false;
	}
	
	if(this.isOrder(objValue)||this.isReverseOrder(objValue)){
		return false;
	}
	
	return true;
},
testPwd:function (objValue,str){	
	var r1 = /^([a-zA-Z0-9_])*$/;
	var r2 = /^([a-zA-Z])*$/; 
	var r3 = /^([0-9])*$/;
	var r4 = /^([_])*$/;
	var result = str;
	if(objValue.length < 6 || objValue.length > 32){
		result = str + "至少6位以上,长度不超过32位";
		return result;
	}
	if(r1.test(objValue)== false){
	 	result = str + "只能由字母，下划线和数字组成";
	 	return result;
	}
	
	/*不允许使用重复字符*/
	if(this.isRepetitive(objValue)){
		window.str +  "不符合安全规则，请重新输入！";
		return result;
	} 	
	/*不允许使用顺序序列*/
	if(this.isOrder(objValue)||this.isReverseOrder(objValue)){
		result = str + "不符合安全规则，请重新输入！";
		return result;
	}	
	
	if(r2.test(objValue)||r3.test(objValue)||r4.test(objValue)){
		if(window.confirm(str + "建议设置为数字和字母的组合")){
			result ="您输入的"+ str + "安全级别不高,建议设置为数字和字母的组合,您要重新输入吗?" ;
			return result;
		};
		return result;
	}
	
	return result;		
},	
isRepetitive:function(objValue){
	var temp = objValue.charAt(0);
	for(var i = 0; i < objValue.length;i++){
		if(temp != objValue.charAt(i)){
			return false;
		} 
	} 
	return true;
},
isOrder:function(objValue)
 { 
 				
	for(var i = 1; i < objValue.length;i++){
	if(objValue.charCodeAt(i-1) + 1 != objValue.charCodeAt(i)){
			return false;
		} 
	} 
	return true;
},
isReverseOrder:function(objValue){
	for(var i = 1; i < objValue.length;i++){
	if(objValue.charCodeAt(i-1) - 1 != objValue.charCodeAt(i)){
			return false;
		} 
	} 
	return true;
},
/*Currency*/
testCurrency:function (objValue,str){
		var r1 = /^(0|([1-9]+[0]*)+)$/;
		var result =  str;
		 if(!r1.test(objValue)){
    	result  = str + "格式不正确";
    	return result;
    }	
   if(objValue >= 1000000000000){
    	result = str + "不能大于1000000000";
    	return result;
    }
    return result;	
}
};

