/*☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
☆★
☆★		文件名：		checkform.js
☆★
☆★		功能描述：		客户端表单输入验证
☆★
☆★		版本相关：
☆★			v1.0		2006.05.02	hellen
☆★		调用范例：	
☆★
☆★		  <script src="http://yourwebroot/checkform.js"></script>
☆★		   <form action=".." method="post" onsubmit="return checkform(this)">
☆★			<input type="text" name="name" value="value" jscheckname="姓名" jscheckrule="notnull" />				此项不能为空
☆★			<input type="text" name="year" value="year" jscheckname="年级" jscheckrule="notnull,mustnum" />		此项不能为空，而且必须是数字格式
☆★			<input type="text" name="age" value="age" jscheckname="年龄" jscheckrule="notnull,mustmore|20" />此项不能为空，而且必须是数字格式，而且数字的值必须大于20
☆★		   </form>
☆★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★*/

/*
	名称：主函数
	参数：obj	表单对象
	返回：布尔值 true false
*/
function checkform( obj )
{
	first_error_obj		= "";
	error_msg			= "对不起，您没有按要求填写表单，详情如下：";

	//遍历所有需要验证的对象
	for(i=0;i<obj.elements.length;i++)
	{
		el		= obj.elements[i];
		tp1	= typeof(el.jscheckrule);
		tp2	= typeof(el.jscheckname);

		if( tp1=="undefined" || tp2=="undefined" )
			continue;

		cf_check(el);
	}
	if( first_error_obj!="" )
	{
		alert(error_msg);
		first_error_obj.focus();
		return false;
	}
	else
	{
		return true;
	}
}

/*
	名称：验证函数
	参数：obj 要验证的对象
	返回：无
*/
function cf_check(obj)
{
	checkreturn	= "";
	
	//拆分规则
	rules	= obj.jscheckrule.split(",");
	//遍历验证规则
	for(j=0;j<rules.length;j++)
	{
		//规则有参数时
		if( rules[j].indexOf("|")>-1 )
		{
			ruleinfo	= rules[j].split("|");
			func		= "cf_"+ruleinfo[0];
			exp		= func+"('"+obj.value+"','"+ruleinfo[1]+"')";
		}
		//当规则是处理单/复选框是否选中时
		else if(rules[j]=="mustcheck")
		{
			func		= "cf_mustcheck";
			exp		= func+"("+(obj.checked?1:0)+")";
		}
		else
		{
			func		= "cf_"+rules[j];
			exp		= func+"('"+obj.value+"')";
		}
		//判断函数是否存在
		if( eval( "typeof("+func+")=='function'" ) )
		{
			expreturn	= eval(exp);
		}
		else
		{
			//否则置之不理，防止因为出错导致正确的验证不起作用
			continue;
		}

		if(expreturn!="")
		{
			checkreturn	+= "\n　　※"+expreturn;
			break;	//只要有错，就不再检查当前对象下一规则
		}
	}
	//构建error_msg
	if( checkreturn!="" )
	{
		error_msg	+= "\n\n------------------------------------\n·"+obj.jscheckname;
		error_msg	+= checkreturn;
		if( first_error_obj=="" ) first_error_obj=obj;
	}
}

////////////////////////////////////////////* 验证功能函数组 *//////////////////////////////////////////////
/*
	描述：	字符串不得为空
	参数：	str	字符串
	返回：	errormsg
*/
function cf_notnull(str)
{
	if( str=="" )
		return "不允许为空！";
	else
		return "";
}
/*
	描述：	字符串最小长度
	参数：	str 字符串
				num 最小长度值
	返回：	errormsg
*/
function cf_length_min(str,num)
{
	if( str.length<num )
		return "长度不允许少于"+num+"！";
	else
		return "";
}
//取小数
function cf_isMoney( str ){   
 var regu = "^[0-9]+[\.]?[0-9]{0,3}$";
 var re = new RegExp(regu);
 if (!re.test(str)) {
    return "价格输入错误！";
 } else {
    return "";
 }
}


/*
	描述：	字符串最大长度
	参数：	str 字符串
				num 最大长度值
	返回：	errormsg
*/
function cf_length_max(str,num)
{
	if( str.length>num )
		return "长度不允许大于"+num+"！";
	else
		return "";
}
/*
	描述：	邮件格式
	参数：	email地址
	返回：	errormsg
*/
function cf_email(email)
{
	var regexp=/^[\.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})$/g;
    if(!regexp.test(email))
	{
		return "不是正确的邮件地址！";
	}
	else
		return "";
}
/*
	描述：	判断二者是否一样
	参数：	str		字符串
				obj	要比较的对象
	返回：	errormsg
*/
function cf_samevalue(str,obj)
{
	if( str!=document.all[obj].value)
		return "输入值与要求不一样！";
	else
		return "";
}
/*
	描述：	只能为英文和数字
	参数：	str		字符串
	返回：	errormsg
*/
function cf_must_en_num(str)
{
	var regexp=/^[0-9a-zA-Z]*$/g;

    if(!regexp.test(str))
		return "只能为英文和数字组合！";
	else
		return "";
}
/*
	描述：	只能为数字
	参数：	str		字符串
	返回：	errormsg
*/
function cf_mustnum(str)
{
	var regexp=/^[0-9]*$/g;

    if(!regexp.test(str))
		return "只能为数字！";
	else
		return "";
}
/*
	描述：	必须选中
	参数：	str		字符串
	返回：	errormsg
*/
function cf_mustcheck(str)
{
    if(!str)
		return "必须选中！";
	else
		return "";
}
