/**
* 名称：SupFormChecker 超级表单验证系统 (jquery+javascript)
* 版本：V2.0
* 时间：2007.01.05
* 作者：Choy Lv
* 联系：mh30@163.com
*/
$( function(){ FormChecker();} );

function FormChecker()
{
	$("form").submit( function(){return check_submit(this);});
	$("input[@type=text],input[@type=password],input[@type=file],textarea")
	.focus(function(){$(this).addClass('jscInputBorder');})
	.blur(function(){$(this).removeClass('jscInputBorder');})

	function check_submit(obj)
	{
		var e_error		= "";
		var focus_obj	= "";			//第一个出现错误对像
		var theform	= obj;
		
		oel = obj.elements.length;

		for( fi=0; fi<oel; fi++ )
		{
			fo	= obj.elements[fi];

			jscheckrule		= $(fo).attr("jscheckrule");
			jscheckerror	= $(fo).attr("jscheckerror");

			if(	jscheckrule && jscheckerror )
			{
				if(!docheck(fo))
				{
					e_error	+= "\n--"+jscheckerror;	
					if( focus_obj=="" ) focus_obj=fo;								//聚焦第一个出现错误对象
					$(fo).addClass("jscInputBackgroud");							//高亮第一个错误表单对象
					
					alert(e_error);
					focus_obj.focus();
					return false;
				}
				else
				{
					$(fo).removeClass("jscInputBackground");						//还原底色
				}
			}
		}
	}

	function docheck(el)
	{
		var e_rules			= $(el).attr("jscheckrule").split(";");
		var e_rules_len	= e_rules.length
		for(k=0;k<e_rules_len;k++ )
		{
			if( e_rules[k].indexOf("=")>-1 )
			{
				e_rule	= e_rules[k].split("=");

				if( e_rule.length==2 )
				{
					e_rule_item		= e_rule[0];	
					e_rule_para		= e_rule[1];
					cf_func_name		= "cf_"+e_rule_item;
					cf_func				= cf_func_name+"( el,'"+e_rule_para+"')";

					try
					{
						if(!eval(cf_func)) return false;
					}
					catch(e)
					{
					}
				}
			}
		}
		return true;
	}
	//////////////////////////////////////////**** 检测功能函数组****///////////////////////////////////
	//判断是否为空
	function cf_null(obj,cannull){
		return cannull==1 || obj.value!="";
	}

	/****长度*****/
	//指定长度
	function cf_len(obj,num)
	{
		return obj.value=="" || obj.value.length==num;
	}

	//最小长度
	function cf_minlen(obj,num)
	{
		return obj.value=="" || obj.value.length>=num;
	}

	//最大长度
	function cf_maxlen(obj,num)
	{
		return obj.value=="" || obj.value.length<=num;
	}
	
	/***按字节检测长度,非ascii码字符按2字节计算,utf8系统下,要把下面的 ## 换成 ### ***/
	function cf_blen( obj,num )
	{
		bytes	 = obj.value.replace(/[^\x00-\xff]/g,"##").length;
		return obj.value=="" || bytes==num;
	}

	//最小长度
	function cf_minblen(obj,num)
	{
		bytes	 = obj.value.replace(/[^\x00-\xff]/g,"##").length;
		return obj.value=="" || bytes>=num;
	}

	//最大长度
	function cf_maxblen(obj,num)
	{
		bytes	 = obj.value.replace(/[^\x00-\xff]/g,"##").length;
		return obj.value=="" || bytes<=num;
	}

	/********大小比较********/
	//最小值
	function cf_min(obj,num)
	{
		return obj.value=="" || obj.value*1>=num;
	}

	//最大值
	function cf_max(obj,num)
	{
		return obj.value=="" || obj.value*1<=num;
	}

	//是否邮件地址
	function cf_email(obj,mustcheck)
	{
		if( obj.value=="" || !mustcheck )				return true;
		rx="^[\\.a-zA-Z0-9_-]{2,25}[@]([a-zA-z0-9-]{1,100}[.])+([a-zA-Z-]{2,4}|[a-zA-Z-]{2,4}[.][a-zA-Z]{2})$";
		return cf_regexp(obj,rx);
	}
	//与另一对象的值一致
	function cf_same(obj,el)
	{
		return obj.value=="" || obj.value==$("#"+el).val() || obj.value==document.all[el].value;
	}
	//与另一对象的值不一致
	function cf_different(obj,el)
	{
		return obj.value=="" || obj.value!=$("#"+el).val() ||  obj.value!=document.all[el].value;
	}
	//允许字符范围
	function cf_charset(obj,para)
	{
		if( obj.value=="" ) return true;
		c_rule		= '';
		p_arr			= para.split(",");
		p_arrlen		= p_arr.length;

		for( l=0;l<p_arrlen;l++ )
		{
			if( p_arr[l]=='en' )		c_rule	+= "a-zA-Z";
			if( p_arr[l]=='num' )	c_rule	+= "0-9";
			if( p_arr[l]=='cn' )		c_rule	+= "\\u4E00-\\u9FA5";
		}

		if( c_rule=="" )	return true;
		else
		{
			t_rule	= "^["+c_rule+"]*$";
			return cf_regexp(obj,t_rule);
		}
	}
	//自定义正则匹配
	function cf_regexp(obj,rx )
	{
		if( obj.value=="" ) return true;
		if( rx=="" )return true;
		r_exp	 = new RegExp(rx,"ig");
		return r_exp.test(obj.value);
	}
	//自定义扩展函数
	function cf_myfunc(obj,rl)
	{
		try
		{
			return eval(rl+"(obj)");
		}
		catch(e)
		{
			return true;
		}
	}
}