//sdcheck.js   JS函数文件名
/*
 *--------------- 客户端表单通用验证sdcheckform(oForm) -----------------
 * 功能:通用验证所有的表单元素.
 * 使用:
 *    <form name="form1" onsubmit="return sdcheckform(this)">
 *    <input type="text" name="id" check="^[\S\s]+$" warning="id不能为空,且不能含有空格">
 *    <input type="submit">
 *    </form>
 * 已实现功能:
 * 对text,password,hidden,file,textarea,select,radio,checkbox进行合法性验证
 * 待实现功能:把正则表式写成个库.
 *
 *<input name="sdpassword" type="password" id="sdpassword" check="^[\S\s]+$" warning="密码不能为空" check2="ayu">-----------ayu添加
 *<input name="sdpassword2" type="password" id="sdpassword2" check="^[\S\s]+$" warning="密码不能为空" check2="ayu" warning2="两次输入的密码不一致">-----------ayu添加
 *上面２行为密码验证，同时实现２个密码一致性检测，它在原基础上加了新字段　check2,warning2,其中check2值不为空就能打开检测开关，warning2只在第二个密码框属性中加入即可-----------ayu添加
 *--------------- 客户端表单通用验证sdcheckform(oForm) -----------------
 */
////////////////////////////////////////////////////////////////////////////////

//主函数
function sdcheckform(oForm)
{
    var els = oForm.elements;
    //遍历所有表元素
	var ayu1=0;var ayu2="";//------------------------------------------此行　ayu添加
    for(var i=0;i<els.length;i++)
    {
                     //------------------------------------------此段开始　ayu添加
                     if((els[i].check2) && els[i].type=="password")
                     {ayu1++;if (ayu1==1){ayu2=GetValue(els[i]);}
                         if (ayu1>1 && ayu2!=GetValue(els[i])){alert(els[i].warning2);GoBack(els[i]);return false;}
                     }
                     //------------------------------------------此段结束
        //是否需要验证
        if(els[i].check && els[i].style.display!="none")//&& els[i].style.display!="none"  ayu添加，作用是对象隐藏时不测试
        {
			//取得验证的正则字符串
            var sReg = els[i].check;
            //取得表单的值,用通用取值函数
            var sVal = GetValue(els[i]);
            //字符串->正则表达式,不区分大小写
            var reg = new RegExp(sReg,"i");
            if(!reg.test(sVal))
            {
                //验证不通过,弹出提示warning
                alert(els[i].warning);
                //该表单元素取得焦点,用通用返回函数
                GoBack(els[i])  
                return false;
            }
        }
    }
}

//通用取值函数分三类进行取值
//文本输入框,直接取值el.value
//单多选,遍历所有选项取得被选中的个数返回结果"00"表示选中两个
//单多下拉菜单,遍历所有选项取得被选中的个数返回结果"0"表示选中一个
function GetValue(el)
{
    //取得表单元素的类型
    var sType = el.type;
    switch(sType)
    {
        case "text":
        case "hidden":
        case "password":
        case "file":
        case "textarea": return el.value;
        case "checkbox":
        case "radio": return GetValueChoose(el);
        case "select-one":
        case "select-multiple": return GetValueSel(el);
    }
    //取得radio,checkbox的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
    function GetValueChoose(el)
    {
        var sValue = "";
        //取得第一个元素的name,搜索这个元素组
        var tmpels = document.getElementsByName(el.name);
        for(var i=0;i<tmpels.length;i++)
        {
            if(tmpels[i].checked)
            {
                sValue += "0";
            }
        }
        return sValue;
    }
    //取得select的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
    function GetValueSel(el)
    {
        var sValue = "";
        for(var i=0;i<el.options.length;i++)
        {
            //单选下拉框提示选项设置为value=""
            if(el.options[i].selected && el.options[i].value!="")
            {
                sValue += "0";
            }
        }
        return sValue;
    }
}

//通用返回函数,验证没通过返回的效果.分三类进行取值
//文本输入框,光标定位在文本输入框的末尾
//单多选,第一选项取得焦点
//单多下拉菜单,取得焦点
function GoBack(el)
{
    //取得表单元素的类型
    var sType = el.type;
    switch(sType)
    {
        case "text":
        case "hidden":
        case "password":
        case "file":
        case "textarea": el.focus();var rng = el.createTextRange(); rng.collapse(false); rng.select();
        case "checkbox":
        case "radio": var els = document.getElementsByName(el.name);els[0].focus();
        case "select-one":
        case "select-multiple":el.focus();
    }
}
