﻿function validator() {
	for(var i = 0; i < document.forms.length; i++) {
		var f = document.forms[i];
		var needsValidation = false;
		for(j = 0; j < f.elements.length; j++) {
			//分析表单元素
			var e = f.elements[j];
			e.fatherForm = f;
			if (e.type == "submit") f.submitButton = e;
			if (e.type != "textarea" && e.type != "text" && e.type != "radio" && e.type != "checkbox" && e.type != "password" && e.type != "select-one") continue;
			if(e.type == "checkbox" || e.type == "radio")
			e.style.width = "auto";
			e.setAttribute("error", "false");
			//
			var pattern = e.getAttribute("pattern");
			var mx = e.getAttribute("max");
			var mn = e.getAttribute("min");
			var m = e.getAttribute("match");
			var action = e.getAttribute("action");
			var group = e.getAttribute("group");
			var required = e.getAttribute("required") != null;
			
			if (required && !pattern) {
				pattern = "\\S";
				e.setAttribute("pattern", pattern);
			}

			// 判断是否需要验证
			if (pattern || mx || mn || m || group) {
				e.onchange = validateOnChange;
				//e.onmouseover = validateOnChange;
				//e.change = validateOnChange;
				e.onblur = validateOnChange;
				//e.onkeyup = validateOnChange;
				
				// Remember to add an onsubmit handler to this form
				needsValidation = true;
			}
			//
			//
			// 判断是否需要使用ajax验证
			if(action){
				e.onblur = validateOnHttpRequest;
			}
		}
		if (needsValidation){
			f.onsubmit = validateOnSubmit;
		}
	}
}
///
//添加错误信息的警告框
function error(e){
	e.className = "invalid"; 
	if(e.getAttribute("error") =="false"){
		var messageNode = document.createElement("span");
		if(IE)messageNode.setAttribute("className","errorMsg");
		else messageNode.setAttribute("class","errorMsg");
		var cainter = e.parentNode;
		cainter.appendChild(messageNode);
		var message = (e.getAttribute("title"))?e.getAttribute("title"):"";
		messageNode.innerHTML = message;
		e.messageNode = messageNode;
		e.msgCainter = cainter;
		e.setAttribute("error", "true");
	}
}
//
//
//清除错误信息
function clearError(e){
	try{
	e.setAttribute("error", "false");
	e.msgCainter.removeChild(e.messageNode)
	}catch(e){}
	}
//
// ajax验证
//
var xmlHttp=false;
function validateOnHttpRequest(){
	var textfield = this;
	textfield.change()
	if (textfield.className == "invalid"){
		return
	}
	var value = this.value;
	var mx = textfield.getAttribute("max");
	var mn = textfield.getAttribute("min");
	var action = textfield.getAttribute("action");
	action +=value
	if(value){
		if(mx && value.length>mx){return}
		if(mn && value.length<mn){return}
		xmlHttp=CreateXmlRequest();
		xmlHttp.onreadystatechange=function(){
			StateContent(textfield);
		}
	xmlHttp.open('get',action,true);
	xmlHttp.send(null);
	}
}
function StateContent(formElement){
	if(xmlHttp.readyState==4){
		if(xmlHttp.status==200){
			error(formElement)
			if(xmlHttp.responseText){
				formElement.className="invalid"
				}
			}
	}
}
//
//
///对象列表验证
function validateOnClick(objList) {
	var invalid = false;  // Start by assuming everything is valid
	// Loop through all form elements
	var msg =""
	for(var i = 0; i < objList.length; i++) {
		var e = objList[i];
		if (e.className != "invalid"){
			e.onblur();
		}
		if (e.className == "invalid"){
			if(e.getAttribute("title")){
				msg = msg+e.getAttribute("title")+"\n"; 
			}else if(e.getAttribute("title")){
				msg = msg+e.getAttribute("title")+"\n"; 
			}
			invalid = true;
		}
	}

	// If the form is invalid, alert user and block submission
	if (invalid) {
		var value = GetCookie("lang")
		//value = decodeURIComponent(value)
		if(value!="en"){
			if(msg){
				alert(msg);
			}else{
				alert("表单输入错误，请检查高亮的输入框是否符合输入要求。");
			}
		}else{
			alert("The form is incompletely or incorrectly filled out.\n" +
		  "Please correct the  highlighted fields and try again.");
		}
		return false;
	}else{
				return true
			}
}
//
//
// JavaScript Document
//主验证程序
function validateOnChange() {
	var valiElement = this;
	var pattern = valiElement.getAttribute("pattern");
	var mx = valiElement.getAttribute("max");
	var mn = valiElement.getAttribute("min");
	var m = valiElement.getAttribute("match");
	var value = this.value;
	var required = valiElement.getAttribute("required") != null;
	valiElement.className = "valid";
	if(valiElement.type == "checkbox"){
		var check = valiElement.checked;
		if( required && !check){
			valiElement.style.width = "auto"
			error(this)
		}else{
			valiElement.className = "valid";
		}
		return
	}
	if(valiElement.type == "radio"){
		var groupName = valiElement.getAttribute("group");
		var group = valiElement.fatherForm[groupName]
		for(var i=0;i<group.length;i++)  {  
			  if(group[i].checked != true){
				valiElement.style.width = "auto"
				error(this)
			  }
		 }
		 return
	}
	if (valiElement.type == "select-one" ){
		if(pattern==value){
			error(this)
		}
		return
	}
	if (m && value != valiElement.fatherForm[m].value){		//匹配相同内容
		error(this)
		return
	}
	if (mn && value.length < mn){								//不能小于限定字符数
		error(this)
		return
	}
	if (mx && value.length > mx){								//不能大于限定字符数
		error(this)
		return
	}
	if(required && value.length==0){							//必须填写
		error(this)
		return
	}
	if(pattern && value.length!=0){												//匹配正则
		switch(pattern){
			case "UserID":
				pattern =/^[a-zA-Z0-9_]{3,15}$/
			break;
			case "alphanum":
				pattern =/^[a-zA-Z0-9_.]*$/
			break;
			case "number":
				pattern = /^\d+$/
			break;
			case "integer":
				pattern = /^[-\+]?\d+$/
			break;
			case "chinese":
				pattern = /^[\u4e00-\u9fa5_a-zA-Z0-9_.]+$/
			break;
			case "email":
				pattern = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
			break;
			case "url":
				pattern = /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/
			break;
			case "date":
				var re_dt = /^(\d{4})\-(\d{1,2})\-(\d{1,2})$/
				pattern = function (s_date) {
					if (!re_dt.test(s_date))
						return false;
					if (RegExp.$3 > 31 || RegExp.$2 > 12)
						return false;
					var dt_test = new Date(RegExp.$1, Number(RegExp.$2-1), RegExp.$3);
					if (dt_test.getMonth() != Number(RegExp.$2-1))
						return false;
					return true;
				}
			break;
			case "time":
				var re_tm = /^(\d{1,2})\:(\d{1,2})\:(\d{1,2})$/
				pattern = function (s_time) {
					if (!re_tm.test(s_time))
						return false;
					if (RegExp.$1 > 23 || RegExp.$2 > 59 || RegExp.$3 > 59)
						return false;
					return true;
				}
			break;
		}
		if(typeof(pattern)!="function"){
			if(value.search(pattern) == -1){
				error(this)
				return
			}
		}else if(!pattern(value)){
			error(this)
			return
		}
	}
	clearError(valiElement)
}	
//
//
// 提交时判断验证结果显示相关信息
function validateOnSubmit() {
	var invalid = false; 
	var msg =""
	
	for(var i = 0; i < this.elements.length; i++) {
		var e = this.elements[i];
		if ((e.type == "textarea" || e.type == "text" || e.type == "radio" || e.type == "checkbox" || e.type == "password" || e.type == "select-one") &&  e.onblur == validateOnChange) {
			try{e.onblur();}catch(e){alert(e + " :: validateOnSubmit")}
			if (e.className == "invalid"){
				if(e.getAttribute("title")){
					msg = msg+e.getAttribute("title")+"\n"; 
				}else if(e.getAttribute("title")){
					msg = msg+e.getAttribute("title")+"\n"; 
				}
				invalid = true;
			}
		}
	}
	if (invalid) {
		try{
			var value = GetCookie("lang")
			if(value!="en"){
				if(msg){
					alert(msg);
				}else{
					alert("表单输入错误，请检查高亮的输入框是否符合输入要求。");
				}
			}else{
				alert("The form is incompletely or incorrectly filled out.\n" +
			  "Please correct the  highlighted fields and try again.");
			}
		}catch(e){
			if(msg){
				alert(msg);
			}else{
				alert("表单输入错误，请检查高亮的输入框是否符合输入要求。");
			}
		}
		return false;
	}
	
}/*<a href="http://xmcyberpolice.cn/alert.asp" target=_blank><img src="http://xmcyberpolice.cn/image/gt.gif" width  ="30" border='0'></a>*/