////////////////////////////////////////////////////////////////////////////////
//功能:通用表单验证
//说明:需要配合KiCommon.js,需要库一起使用
//使用:
//		步骤一:
//
//		在表单控件里添加自定义元素check,tip才会验证,如
//		<input type="text" check="RF" tip="不能为空!">
//
//		RF - 必须输入数据
//				格式：check="RF"
//				示例：check="RF" tip="不能为空!"

//		CV - 两控件作比较
//				格式：check="CV$控件1$控件2$匹配"
//				匹配：== - 相等 <> - 不相等 LN - 行数必须相等
//				示例：check="CV$==$Pwd$RePwd" tip="两次密码不同!"

//		RV - 数据范围
//				格式：check="RV$匹配$最小值$最大值"
//				匹配：L - 字符串长度 N - 数字大小
//				示例：check="RV$L$0$5" tip="长度只能为0-5!"

//		RE - 符合正则表达式
//				格式：check="RE$匹配$表达式"
//				匹配：T - 必须符合匹配表达式2的条件 F - 与T相反
//				表达式：为RegExpTest(Str, Style)函数中Style参数的值
//				示例：check="RE$T$MAIL" tip="Email地址有误!"
//		UV - 符合自定义函数
//				格式: check="UV$函数名"
//
//		步骤二:(任选一种触发条件)
//		1.<form onsubmit="CheckForm(this)">
//		2.<form onsubmit="CheckForm("name|password|sex|age")"> 需要验证的控件ID用"|"隔开,暂不支持控件组(通过name查找的控件)
//		3.<input onclick="CheckForm('formID')">
//		4.<input onclick="CheckForm('name|password|sex|age')">
//		
////////////////////////////////////////////////////////////////////////////////
function CheckForm(obj)
{
	//直接提交form集合
    var arrEls = obj.elements;
    if (!arrEls){
		//通过form的id提交集合
		if (!arrEls || arrEls.tagName.toUpperCase() != "FORM"){
			//提交字符串合并为集合
			var ac = obj.split("|");
			arrEls = new Array();
			for (var i = 0;i < ac.length; i++)
			{
				arrEls[i] = $$(ac[i]);
			}
			if (!arrEls)
			{
				ShowDialog("提交数据验证失败!");
			}
		}
	}
	
    //遍历所有表元素或指定的所有元素
    for (var i = 0;i < arrEls.length; i++)
    {
        //是否需要验证
        if (arrEls[i].getAttribute("check")){
            //取得控件的值
            var elValue = GetValue(arrEls[i]);
			
			//将验证框的值编成数组
			aCheck = arrEls[i].getAttribute("check").split("|");
			//将提示框的值编成数组
			aTip = arrEls[i].getAttribute("tip").split("|");
			
			//根据aCheck数组的长度循环检测
			for (j = 0; j < aCheck.length; j ++) {

			    aMethod = aCheck[j].split("$");
				
				//取出check中的宏,转为数字代码,再根据数字代码转为提示消息
				var outTip = CodeToTip(aTip[j]);
				
				//根据元素ID获取元素
				//var g_el = arrEls[i].getAttribute("id");
				g_el = arrEls[i];
				
				switch (aMethod[0])
				{
					//必须输入数据
					case "RF":
						if(elValue == "" || elValue == null){
							ShowDialog(outTip, "GoBack()");
							return false;
						}
						break;
					//两控件作比较
					case "CV":
						switch (aMethod[1])
						{
							//两控件的值必须相等
							case "==":
								if(document.getElementsByName(aMethod[2])[0].value != document.getElementsByName(aMethod[3])[0].value){
									ShowDialog(outTip, "GoBack()");
									return false;
								}
								break;
							//两控件的值必须不相等
							case "<>":
								if(document.getElementsByName(aMethod[2])[0].value == document.getElementsByName(aMethod[3])[0].value){
									ShowDialog(outTip, "GoBack()");
									return false;
								}
								break;
							//两控件的行数必须相等
							case "LN":
								nGetNum1 = GetStrNum(document.getElementsByName(aMethod[2])[0].value, "\n")
								nGetNum2 = GetStrNum(document.getElementsByName(aMethod[3])[0].value, "\n")
								if(nGetNum1 != nGetNum2){
									ShowDialog(outTip, "GoBack()");
									return false;
								}
								break;
							//报错
							default:
								ShowDialog("子参数传递错误," + aMethod[1] + "为未知参数!");
								return false;
								break;
						}
						break;
					//数据范围
					case "RV":
						if(elValue != "" && elValue != null){
							switch (aMethod[1])
							{
								//字符长度必须符合
								case "L":
									if(GetStrLen(elValue) < aMethod[2] || GetStrLen(elValue) > aMethod[3]){
										ShowDialog(outTip, "GoBack()");
										return false;
									}
									break;
								//数字大小必须符合
								case "N":
									if(Number(elValue) < aMethod[2] || Number(elValue) > aMethod[3]){
										ShowDialog(outTip, "GoBack()");
										return false;
									}
									break;
								//报错
								default:
									ShowDialog("子参数传递错误," + aMethod[1] + "为未知参数!");
									return false;
									break;
							}
						}
						break;
					//符合正则表达式
					case "RE":
						if(elValue != "" && elValue != null){
							switch (aMethod[1])
							{
								case "T":
									if (!RegExpTest(elValue, aMethod[2])) {
										ShowDialog(outTip, "GoBack()");
										return false;
									}
									break;
								case "F":
									if (RegExpTest(elValue, aMethod[2])) {
										ShowDialog(outTip, "GoBack()");
										return false;
									}
									break;
								default:
									ShowDialog("子参数传递错误," + aMethod[1] + "为未知参数!");
									return false;
									break;
							}
						}
						break;
					//符合自定义函数
					case "UV":
						if(elValue != "" && elValue != null){
							if (!eval(aMethod[1])) {
								ShowDialog(outTip, "GoBack()");
								return false;
							}
						}
						break;
					default:
						ShowDialog("主参数传递错误," + aMethod[0] + "为未知参数!");
						return false;
						break;
				}
			}
        }
    }
	return true;
}
//通用表单验证取值
function GetValue(el)
{
    //取得表单元素的类型
    var elType = el.type;
    switch(elType)
    {
        case "text":
        case "password":
        case "file":
        case "textarea": return el.value;break;
        case "checkbox":
        case "radio": return GetValueChoose();break;
        case "hidden": if (el.editor) {return Htext.getHTML()}else{return el.value;};break;
        case "select-one":
        case "select-multiple": return GetValueSel();
    }
    //取得radio,checkbox的选中数
    function GetValueChoose()
    {
        var selectNum = 0;
        //取得第一个元素的name,搜索这个元素组
        var tmpels = document.getElementsByName(el.name);
        for(var i=0;i<tmpels.length;i++)
        {
            if(tmpels[i].checked)
            {
                selectNum++;
            }
        }
        return selectNum;
    }
    //取得select的选中数
    function GetValueSel()
    {
        var selectNum = 0;
        for(var i=0;i<el.options.length;i++)
        {
            //单选下拉框提示选项设置为value=""
            if(el.options[i].selected && el.options[i].value!="")
            {
                selectNum++;
            }
        }
        return selectNum;
    }
}
//通用表单验证返回
function GoBack()
{
	RemoveDialog();
    var elType = g_el.type;

	if(g_el.style.display!="none"){
		switch(elType)
		{
			case "text":
			case "password":
			case "file":
			case "textarea": g_el.focus;var rng = g_el.createTextRange(); rng.collapse(false); rng.select();break;
			case "checkbox":
			case "radio": var radioEls = document.getElementsByName(g_el.name);radioEls[0].focus();break;
			case "select-one":
			case "select-multiple":g_el.focus();
		}
	}
}