﻿//验证类
function Validator()
{
	
	//常量
	Validator.ERROR_ISREQUIRED = "ErrorRequired";
	Validator.ERROR_DATATYPE = "ErrorDataType";
	Validator.ERROR_TOCOMPAREFAILD = "ErrorCompare";
	Validator.ISOK = "ISOK";
	Validator.NOCHANGE = "NoChange";
	//验证正则表达式
	Validator.RgExp = new Array();
	Validator.RgExp['username']=/^[a-zA-Z]+[a-zA-Z0-9]+$/
	Validator.RgExp["string"] = /.*/;
	Validator.RgExp["number"] = /^[-+]?\d*$/;
	Validator.RgExp["email"] = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
	Validator.RgExp["mobile"] = /^((\(\d{2,3}\))|(\d{3}\-))?(13\d{9})|(15\d{9})$/;
	Validator.RgExp["chinese"] = /^[\u0391-\uFFE5\s]+$/;
	Validator.RgExp["english"] = /^[A-Za-z\s]+$/;
	Validator.RgExp["datetime"] = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/;
	Validator.RgExp["float"] = /^([0-9]*[.0-9])$/;
	Validator.RgExp["money"] = /^[+-]?\d+(,\d{3})*(\.\d+)?$/g;
	Validator.RgExp["phone"] = /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/;
	Validator.RgExp["url"] = /((http|https|ftp):(\/\/|\\\\)((\w)+[.]){1,}([a-z]{1,10}|[0-9]{1,3})(((\/[\~]*|\\[\~]*)(\w)+)|[.](\w)+)*(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=]((\w)+|-|%|\+|\#|(\w)+)*)*))/gi;
	//属性
	this.ClassName = "Validator";
	this.FocusClassName = "ValidatorFocus";
	this.ErrorClassName = "ValidatorError";
	this.OkClassName = "ValidatorOk";
	this.ValidatorOkMessage = "√";	
	this.ValiSpanList = new Array();
	this.DefaultMsg = new Array();
	this.DefaultMsg["ErrorRequiredMsg"] = "请输入！";
	this.DefaultMsg["ErrorCompareMsg"] = "两次的输入不一致。";
	this.DefaultMsg["ErrorDataTypeMsg"] = "格式不正确。";
	this.IsOK = true;
    //事件
    this.OnCheckFail = null;
	//初始化
	Validator.prototype.Init = function(){
		this.getFieldList();
		this.initValidatorField();
	}
	
	//取得验证控件
	Validator.prototype.getFieldList = function()
	{
		var nodes = document.body.getElementsByTagName("span");
		for(var i = 0; i<nodes.length; i++)
		{
			var span = nodes[i];
			span.setAttribute("defaultMsg",span.innerHTML);
			span.setAttribute("lastInnerHtml",span.innerHTML);
			var attr = span.getAttribute("Format");
			if (attr != null)
			{
				this.ValiSpanList.push(span);
			}
		}
	}
	
	//初始化验证表单字段
	Validator.prototype.initValidatorField =  function(){
		for(var i = 0; i<this.ValiSpanList.length; i++)
		{
			var span = this.ValiSpanList[i];		
			var targetId = span.getAttribute("targetId");
            var ids = targetId.split(",");
            for(var j=0; j < ids.length; j++)
            {
                var id = ids[j]; 
			    var elts = $("#"+id);
                if (elts.length ==0)continue;
                ele = elts[0];
			    ele.setAttribute("ValiSpanId",span.id)
			    var focusClassName = this.FocusClassName;
			    var className = this.ClassName;
			    var validator = this;
			    
			    //添加取得焦点样式事件
			    $(ele).focus(function(event){
				    var elt = $(this)[0];//Event.element(event);
				    var span = $("#" + $(elt).attr("ValiSpanId"))[0];
				    span.className = focusClassName;
				    span.innerHTML = span.getAttribute("defaultMsg");
				    });   
			    
			    //添加失去焦点样式事件
			    $(ele).blur(function(event){
				    var elt = $(this)[0];//Event.element(event);
				    var span = $("#" +$(elt).attr("ValiSpanId"))[0];
				    var result = validator.checkValue(elt,span);
				    validator.renderStatus(span,result);
				    if (!result.Succeed)
				    {
					    validator.IsOK = false;
				    }});			
			    
			    //添加值修改事件
			    $(ele).change(function(event){
				    var elt = $(this)[0];//Event.element(event);
				    var span = $("#" + $(elt).attr("ValiSpanId"))[0];
				    var result = validator.checkValue(elt,span);
				    validator.renderStatus(span,result);
				    if (!result.Succeed)
				    {
					    validator.IsOK = false;
				    }
			    });
            }
		}
	}
	
	//验证所有值
	Validator.prototype.Check = function(groupName){
		this.IsOK = true;
		var checkInGroup = (groupName != null && groupName != "");
		for(var i = 0; i<this.ValiSpanList.length; i++)
		{
			var span = this.ValiSpanList[i];
			if (checkInGroup)
			{
				var gName = span.getAttribute("group");
				if (gName != groupName) continue;					
			}
			var targetId = span.getAttribute("targetId");
            var ids = targetId.split(",");
            var ele = $("#"+targetId)[0];
            var result = this.checkValue(ele,span);       
			this.renderStatus(span,result);	
			if (!result.Succeed)
			{
				this.IsOK = false;
                break;
			}
		}
        if (!this.IsOK && typeof(this.OnCheckFail) == "function")
        {
            this.OnCheckFail();
        }
		return this.IsOK;
	}
	
	//呈现验证状态
	Validator.prototype.renderStatus = function(span,result)
	{
			if (result.Succeed)
			{
				if(result.ErrorType == Validator.NOCHANGE)
				{
					span.className = this.ClassName;
					//span默认的信息
					span.innerHTML = span.getAttribute("defaultMsg");
				}else
				{
					span.className = this.OkClassName;
					span.innerHTML = this.ValidatorOkMessage;
				}
			}else
			{
				if (result.Message != null && result.Message != "")
				{
					span.className = this.ErrorClassName;
					span.innerHTML = result.Message;
				}else
				{
					var errmsg = this.getErrorMeg(span,result.ErrorType);
					span.className = this.ErrorClassName;
					span.innerHTML = errmsg;
				}
			}
			span.setAttribute("lastClassName",span.className);
			span.setAttribute("lastInnerHtml",span.innerHTML);
	}
	
	//取得错误信息
	Validator.prototype.getErrorMeg = function(span,errorType)
	{
		//优先去控件设定的错误信息
		var errmsg = span.getAttribute("" + errorType + "Msg");
		
		//如果控件没有设定相应的错误信息，则取验证对象(实例)默认的错误信息
		if (errmsg == null || errmsg == "")
		{
			errmsg = this.DefaultMsg["" + errorType + "Msg"];
		}
	
		return errmsg;
	}
	
    //验证必填           
    Validator.CheckValueRequired = function(ele,span)     
    {
       //取值    
        var value = Validator.GetValue(ele);
        var initValue = span.getAttribute("initValue");
        if (initValue == null) initValue = ""; 
        if (value == null || value == "" || value == initValue)
        {
           return {"Succeed":false,"ErrorType":Validator.ERROR_ISREQUIRED};
        }
        
        //执行外部函数不返回值
        var excute = span.getAttribute("Excute");
        if (excute != null) eval(excute + "()");    
          
         
        //验证外面的值
        var extVal = span.getAttribute("ExtValidator");
        if (extVal != null)
        {
            var extValResult = eval(extVal + "()");
            return extValResult;
        }
        
        return Validator.CheckValueFormat(ele,span) 
    }
    
    //相同验证           
    Validator.CheckValueFormat = function(ele,span)
    {
        var type = span.getAttribute("Format");
        var result = Validator.ValidatorDataType(ele,type);
        if (result)
            return {"Succeed":true,"ErrorType":Validator.ISOK};
        else
            return {"Succeed":false,"ErrorType":Validator.ERROR_DATATYPE};           
    }
    
    //默认验证           
    Validator.CheckValueDefault = function(ele,span)
    {
        //执行外部函数不返回值
        var excute = span.getAttribute("Excute");
        if (excute != null) eval(excute + "()");    
                   
        //验证外面的值
        var extVal = span.getAttribute("ExtValidator");
        if (extVal != null)
        {
            var extValResult = eval(extVal + "()");
            return extValResult;
        }
        
        return Validator.CheckValueFormat(ele,span);    
    } 
          
    //验证必填           
    Validator.CheckValueIsSame = function(ele,span)
    {
        //取值    
        var value = Validator.GetValue(ele);
        
        //如果有比较两个值是否一致          
        var toCompareTargetId = span.getAttribute("ToCompareTargetId");
        if (toCompareTargetId != null && toCompareTargetId != "")
        {
            var toCompareElt = $("#"+toCompareTargetId)[0];
            if (toCompareElt != null)
            {
                if (toCompareElt.value != value)
                    return {"Succeed":false,"ErrorType":Validator.ERROR_TOCOMPAREFAILD};    
                else
                    return {"Succeed":true,"ErrorType":Validator.ISOK};
            }
        }     
    }
    
    //验证任意必填           
    Validator.CheckValueAnyone = function(ele,span)
    {
        var ids = span.getAttribute("TargetId");
        var idArr = ids.split(",");
        var results = [];
        for(i = 0; i < idArr.length; i++)
        {
            var id = idArr[i];
            var elts = $("#"+id);  
            if (elts.length == 0) continue;
            results.push(Validator.CheckValueRequired(elts[0],span));
        }
        
        var issucceed=true;
        for(i = 0; i < results.length; i++)           
        {
            var r = results[i];
            if (r.Succeed) return r;            
        }
        return results[0];
    }
        
    
	//验证单个值
	Validator.prototype.checkValue = function(ele,span)
	{	
    
        var valiType = span.getAttribute("ValiType");
        valiType = valiType == null ? "" : valiType.toLowerCase();
        switch(valiType)
        {
            //验证必填
            case "required": 
                return Validator.CheckValueRequired(ele,span);                           
            //验证任意必填
            case "anyone":
                return Validator.CheckValueAnyone(ele,span);    
            case "same":
                return Validator.CheckValueIsSame(ele,span); 
            default:
                return Validator.CheckValueDefault(ele,span);             
        }
    
		 /* 
         //取值	
		var value = Validator.GetValue(ele);
        
        //如果有比较两个值是否一致          
		var toCompareTargetId = span.getAttribute("ToCompareTargetId");
		if (toCompareTargetId != null && toCompareTargetId != "")
		{
			var toCompareElt = $("#"+toCompareTargetId)[0];
			if (toCompareElt != null)
			{
				if (toCompareElt.value != value)
					return {"Succeed":false,"ErrorType":Validator.ERROR_TOCOMPAREFAILD};	
				else
					return {"Succeed":true,"ErrorType":Validator.ISOK};
			}
		}
		
       
		//检查是否是必须输入值
		var isReq =span.getAttribute("ValiType");
		if (isReq == null) 
			isReq = ""
		else
			isReq = isReq.toLowerCase();			
		var initValue = span.getAttribute("initValue");
		if (initValue == null) initValue = "";
		if (isReq == "true" || isReq == "yes" || isReq == "1")
		{
			if (value == null || value == "" || value == initValue)
				return {"Succeed":false,"ErrorType":Validator.ERROR_ISREQUIRED};
		}
		
		//执行外部函数不返回值
		var excute = span.getAttribute("Excute");
		if (excute != null)
		{
			eval(excute + "()");
		}		 
		 
		//验证外面的值
		var extVal = span.getAttribute("ExtValidator");
		if (extVal != null)
		{
			var extValResult = eval(extVal + "()");
			return extValResult;
		}
		
		//如果不是必须输入值，而已经有值的时候检查值得类型是否证确
		if (value == initValue)
		{
			return {"Succeed":true,"ErrorType":Validator.NOCHANGE};
		}else
		{
			var type = span.getAttribute("Format");
			var result = Validator.ValidatorDataType(ele,type);
			if (result)
				return {"Succeed":true,"ErrorType":Validator.ISOK};
			else
				return {"Succeed":false,"ErrorType":Validator.ERROR_DATATYPE};
		}
		
		return {"Succeed":false,"ErrorType":""};
        */
	}
	
	
	
	//取得控件值
	Validator.GetValue = function (obj)
	{
		switch(obj.type)
		{
			case "radio":
			case "checkbox":
				return obj.checked ? obj.value : "";
			default :
				return obj.value;			
		}	
	}

	//验证数据类型是否正确
	Validator.ValidatorDataType = function(obj,type)
	{
		type = type.toLowerCase();
		var value = Validator.GetValue(obj);
		
		/**
		 * 外部正则验证
		 */
		if (type=="pattern")
		{
			span=$("#"+obj.id+"Validator")[0];
			if (span!=null)
			{
				var pattern=eval(span.getAttribute("reg"));

				if (pattern) 
				{
					return pattern.test(value);
				}
			}
		}
		
		
		var pattern = Validator.RgExp[type];
		if (pattern != null)
			return pattern.test(value);
		else
		{
			return false;
		}
	}
	
	
	//是否数字
	Validator.IsNumber = function(number)
	{
		var pattern = Validator.RgExp["number"]; ///^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/; 
		return pattern.test(number); 
	}
	
	//是否电子邮件格式
	Validator.IsEmail = function(email)
	{
		var pattern = Validator.RgExp["email"]; ///^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/; 
		return pattern.test(email); 		
	}
	
	//是否手机号码
	Validator.IsMobile = function(str){
		var pattern = Validator.RgExp["mobile"]; ///^((\(\d{2,3}\))|(\d{3}\-))?(13\d{9})|(15\d{9})$/;
		return pattern.test(str);
	}
	
	//是否中文
	Validator.IsChinese = function(str){
		var pattern = Validator.RgExp["chinese"]; ///^[\u0391-\uFFE5\s]+$/;
		return pattern.test(str);
	}
	
	//是否英文
	Validator.IsEnglish = function(str){
    var pattern = Validator.RgExp["english"]; ///^[A-Za-z\s]+$/;
    return pattern.test(str);
	}
	
	//是否时间 
	Validator.IsDateTime = function(obj) 
	{ 
		var pattern = Validator.RgExp["datetime"]; ///^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/;
		return pattern.test(str);	
	} 
	
	
	
	// 验证是否 货币
	Validator.IsMoney = function( str )
	{
		// 货币必须是 -12,345,678.9 等格式 或者为空
		var pattern = Validator.RgExp["money"]; ///^[+-]?\d+(,\d{3})*(\.\d+)?$/g;
		return pattern.test(str);	

	}
	
	
	//是否浮点数
	Validator.IsFloat = function(strValue)
	{
		var pattern = Validator.RgExp["float"]; ///^([0-9]*[.0-9])$/;
		return pattern.test(str);	
}
	
	
	// 验证是否 电话
	Validator.IsPhone = function(strValue)
	{
		//电话格式 0755-88888888-8888 或 755-88888888 或 88888888
		var pattern = Validator.RgExp["phone"]; ///^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/;
		return pattern.test(strValue);
	}
	
	// 验证是否 URL
	Validator.IsURL = function(str)
	{
		// http://www.yysoft.com/ssj/default.asp?Type=1&ID=789
		var pattern = Validator.RgExp["url"]; ///((http|https|ftp):(\/\/|\\\\)((\w)+[.]){1,}([a-z]{1,10}|[0-9]{1,3})(((\/[\~]*|\\[\~]*)(\w)+)|[.](\w)+)*(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=]((\w)+|-|%|\+|\#|(\w)+)*)*))/gi;
		return pattern.test(str);
	}
	
	// 验证是否 为空
	Validator.isNullOrEmpty = function( strValue )
	{
		if(strValue == null || strValue == "" )
			return true;
		else
			return false;
	}
	
	// 使用正则表达式，检测 str 是否满足模式 re
	Validator.CheckExp = function(re, str)
	{
		return re.test( str );
	}
}


