var FormValid = function() {
    this.errName = new Array();
	this.errMsg = new Array();
	this.addErrorMsg = function(name,str)
	{
        this.errName.push(name);
		this.errMsg.push(str);
    }
	this.passed = function()
	{
		for (key in this.allName) 
		{
			if(key=="contains")
			{
				continue;
			}
			$('#errMsg_'+this.allName[key]).html('');			  
		}
        if(this.errName.length>0)
		{			
		    for (key in this.errName) 
			{
			if(key=="contains")
			{
				continue;
			}
			   $('#errMsg_'+this.errName[key]).html("<span class='formvalid_error'>"+this.errMsg[key]+"</span>");
		    }
			return false;
		}
		else
		{
			 return true;
		}
	}
    this.allName = new Array();
	this.addAllName = function(name)
	{
		this.allName.push(name);
    }
	this.CompareValue = function(leftvalue,rightvalue,compareType)
	{
		if(compareType=="isEq")
		{
			return leftvalue == rightvalue;
		}
		else if(compareType =="isNeq")
		{
			return leftvalue != rightvalue;
		}
		else if(compareType =="isLeq")
		{
			return leftvalue <= rightvalue;
		}
		else if(compareType =="isRi")
		{
			return leftvalue > rightvalue;
		}
		else if(compareType =="isReq")
		{
			return leftvalue >= rightvalue;
		}
		else if(compareType =="isLt")
		{
			return leftvalue.length >= rightvalue;
		}		
		else
		{
			return false;
		}		
	}
	
	this.ValidatorConvert = function(_str, dataType) 
	{
        if(dataType=="required")
		{
			var tmp_str = jQuery.trim(_str);
            return tmp_str.length != 0 ;
		}
		else if(dataType=="isInt")
        {
			if(_str.length >0 )
			{
              var regText =/^[-\+]?\d+$/;
               return regText.test(_str);
			}
            return true;
        }
        else if(dataType =="isNumber")
        {
			if(_str.length >0 )
			{
				var regText =/^[-\+]?\d+(\.\d+)?$/;
				return regText.test(_str);
			}
			return true;
        }
		else if(dataType =="isURL")
        {
           var regText =/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/;
           return regText.test(_str);
        }
		else if(dataType =="isPhone")
        {
			if(_str.length >0 )
			{
				var regText =/^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/;
				return regText.test(_str);
			}
			return true;
        }
		else if(dataType =="isMobile")
        {
           var regText =/^((\(\d{2,3}\))|(\d{3}\-))?(13|15|18|16)\d{9}$/;
           return regText.test(_str);
        }
		else if(dataType =="isQQ")
        {
           var regText =/^[1-9]\d{4,10}$/;
           return regText.test(_str);
        }
		else if(dataType =="isEmail")
        {
           var regText =/([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)/;
           return regText.test(_str);
        }
		else if(dataType =="isPwd")
        {
           var regText =/^[\w\D]{6,30}$/;
           return regText.test(_str);
        }
		else if(dataType =="isRealName")
        {
           var regText =/^([\u4E00-\u9FA5]{2,20}|[a-zA-z]+)$/;
           return regText.test(_str);
        }
        else if(dataType == "isCardNum")
        {
            var regText =/^[1-9][0-9]{17}$/;
            return regText.test(_str);
        }
	else if(dataType=="isLe20")
	{
		return _str.length< 20;
	}
        else if(dataType =="isDate")
        {
			if(_str.length >0 )
			{
                 var regText =/((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))/;
                return regText.test(_str);
			}
            return true;            
		}
		//zg add ajax request
		else if(dataType.indexOf("fun:")==0)
		{
			var dty = dataType.split(':'); 
			var funName=dty[1];
			eval(funName);
			return true;
		}
		else
		{
			var dty = dataType.split(':'); 
			return this.CompareValue(_str,$('#'+dty[1]).val(),dty[0]);			
		}
		
	}
   
}
function validator(frm){	
    var formElements = frm.elements;
	var fv = new FormValid();
	for (var i=0; i<formElements.length;i++) 
	{		
		sType = formElements[i].type;
		switch(sType)
		{
			case "text":
			case "hidden":
			case "password":
			case "textarea":
			case "file":				
				var validType = formElements[i].getAttribute('valid');
				var errorMsg = formElements[i].getAttribute('errmsg');
				if (validType==null) continue;
				fv.addAllName(formElements[i].id);
				var vts = validType.split('|');
				var ems = errorMsg.split('|');
				for (var j=0; j<vts.length; j++) 
				{
					var curValidType = vts[j];
					var curErrorMsg = ems[j];
					if(fv.ValidatorConvert(formElements[i].value,curValidType)==false)
					{
						fv.addErrorMsg(formElements[i].id,curErrorMsg);
						break;
					}	
				}				
				break;			
			case "select-one":
			    var validType = formElements[i].getAttribute('valid');
				var errorMsg = formElements[i].getAttribute('errmsg');
				if (validType==null) continue;
				fv.addAllName(formElements[i].id);
				if(fv.ValidatorConvert(formElements[i].value,validType)==false)
				{
					fv.addErrorMsg(formElements[i].id,errorMsg);
				}
				break;
			case "checkbox":
			case "radio": 
			    var errorMsg = formElements[i].getAttribute('errmsg');
			    if(jQuery.trim(errorMsg).length != 0)
				{
					fv.addAllName(formElements[i].name);
					len = $("input[@type='"+sType+"'][@name='"+formElements[i].name+"'][@checked]").length;
					if(len==0)
					{
						fv.addErrorMsg(formElements[i].name,errorMsg);
					}
				}				
				break;
		}
	}
	return fv.passed();
}

function validInput(ipt) 
{
	var fv = new FormValid();
	var validType = ipt.getAttribute('valid');
	var errorMsg = ipt.getAttribute('errmsg');
	var vts = validType.split('|');
	var ems = errorMsg.split('|');
	for (var j=0; j<vts.length; j++) 
	{	
		var curValidType = vts[j];
		var curErrorMsg = ems[j];
		if(fv.ValidatorConvert(ipt.value,curValidType)==false)
		{
			$('#errMsg_'+ipt.id).html("<span class='formvalid_error'>"+curErrorMsg+"</span>");			
			break;
		}
		else
		{
		   $('#errMsg_'+ipt.id).html('');		   
		}
	}
}

function initValid(frm) {	
	var formElements = frm.elements;	
	for (var i=0; i<formElements.length;i++) {
		var validType = formElements[i].getAttribute('valid');
		if (validType==null) continue;
		formElements[i].onblur = (function (a) {
			return function (){validInput(a)}
		})(formElements[i]);
	}
}


$(document).ready(
	function()
	{
		var frm=document.getElementsByTagName("form");		
		for(i=0;i<frm.length;i++)
		{
			initValid(frm[i]);
		}
	}
)
