//-------------------------------------------------------------------
// 功能说明	:	Form验证
// 编写人	:	董斌
// 编写日期	:	2005/08/19
// 修改记录	:	1.默认设置为单条弹出式验证方式        2005/08/19
//				2.修改getValue及setFocus以解决验证及定位combobox的问题        2005/08/22
//				3.添加check函数，用于验证ComboBox控件        2005/11/04
//				4.添加checkint函数，用于验证输入为整数			2005/11/05
//				5.修改checkForm函数，用于判断文本框控件的输入框为空时不予验证		2005/11/29
//-------------------------------------------------------------------
function CLASS_CHECK( )
{
    this.pass = true;    //是否通过验证
    this.showAll = true; //是否显示所有的验证错误
    this.alert = false;  //报警方式（默认alert报警）
    this.message = "";   //错误内容
    this.first = null;   //在显示全部验证错误时的第一个错误控件（用于回到焦点）
    this.cancel = false;

    //定义内置格式
    var aUsage = { "int": "^([+-]?)\\d+$",          //整数
                   "int+": "^([+]?)\\d+$",          //正整数
                   "int-": "^-\\d+$",               //负整数
                   "num": "^([+-]?)\\d*\\.?\\d+$",  //数字
                   "num+": "^([+]?)\\d*\\.?\\d+$",  //正数
                   "num-": "^-\\d*\\.?\\d+$",       //负数
                   "float": "^([+-]?)\\d*\\.\\d+$", //浮点数
                   "float+": "^([+]?)\\d*\\.\\d+$", //正浮点数
                   "float-": "^-\\d*\\.\\d+$",      //负浮点数
    //邮件
                   "email": "^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$",
                   "color": "^#[a-fA-F0-9]{6}",                                                                                                                           //颜色
                   "url": "^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$",                                                                                        //联接
                   "chinese": "^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$",                                                                                                      //仅中文
                   "ascii": "^[\\x00-\\xFF]+$",                                                                                                                           //仅ACSII字符
                   "zipcode": "^\\d{6}$",                                                                                                                                 //邮编
                   "mobile": "^0{0,1}13[0-9]{9}$",                                                                                                                        //手机
                   "ip4": "^\(([0-1]?\\d{0,2})|(2[0-5]{0,2}))\\.(([0-1]?\\d{0,2})|(2[0-5]{0,2}))\\.(([0-1]?\\d{0,2})|(2[0-5]{0,2}))\\.(([0-1]?\\d{0,2})|(2[0-5]{0,2}))$", //ip地址
                   "notempty": "^[^ ]+$",                                                                                                                                 //非空
                   "picture": "(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$",                                                                                       //图片
                   "rar": "(.*)\\.(rar|zip|7zip|tgz)$",                                                                                                                   //压缩文件
                   "date": "^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$"                                                                                                      //日期
    };

    //缺省消息
    var aMessage = { "int": "请输入整数",          //整数
                     "int+": "请输入正整数",        //正整数
                     "int-": "请输入负整数",        //负整数
                     "num": "请输入数字",          //数字
                     "num+": "请输入正数",         //正数
                     "num-": "请输入负整数",        //负数
                     "float": "请输入浮点数",       //浮点数
                     "float+": "请输入正浮点数",     //正浮点数
                     "float-": "请输入负浮点数",     //负浮点数
                     "email": "请输入正确的邮箱地址",   //邮件
                     "color": "请输入正确的颜色",     //颜色
                     "url": "请输入正确的连接地址",     //联接
                     "chinese": "请输入中文",      //中文
                     "ascii": "请输入ascii字符",   //仅ACSII字符
                     "zipcode": "请输入正确的邮政编码", //邮编
                     "mobile": "请输入正确的手机号码",  //手机
                     "ip4": "请输入正确的IP地址",     //ip地址
                     "notempty": "不能为空",      //非空
                     "picture": "请选择图片",      //图片
                     "rar": "请输入压缩文件",        //压缩文件
                     "date": "请输入正确的日期"       //日期
    }

    var me = this;

    function checkForm( oForm )
    {
        me.pass = true;
        me.message = "";
        me.first = null;

        if ( me.cancel == true )
        {
            return true;
        }

        var els = oForm.elements;

        //遍历所有表元素
        for ( var i = 0; i < els.length; i++ )
        {
        //取得格式
        var sUsage = els[i].getAttribute( "Usage" );
        var sReg = "";

        //如果设置Usage，则使用内置正则表达式，忽略Exp
        if ( typeof (sUsage) != "undefined" && sUsage != null )
        {
            //如果Usage在表达室里找到，则使用内置表达式，无则认为是表达式；表达式可以是函数；
            if ( aUsage[sUsage] != null )
            {
                sReg = aUsage[sUsage];
            }
            else
            {
                try
                {
                    if ( eval( sUsage ) == false )
                    {
                        me.pass = false;

                        if ( me.first == null )
                        {
                            me.first = els[i];
                        }

                        addMessage( getMessage( els[i] ) );

                        if ( me.showAll == false )
                        {
                            setFocus( els[i] );
                            break;
                        }
                    }
                }
                catch( e )
                {
                    alert( "表达式[" + sUsage + "]错误:" + e.description )
                    return false;
                }
            }
        }
        else
        {
            sReg = els[i].getAttribute( "Exp" );
        }

        if ( typeof (sReg) != "undefined" && sReg != null )
        {
            //对于失效状态不验证
            /***************/
            //董斌修改添加，用于判断文本框控件的输入框为空时不予验证
            if (els[i].type=="text" || els[i].type=="password") 
            {
				var scheck = els[i].getAttribute( "IsCheck" );
				var tValue= els[i].value;
			}
            if ( typeof (scheck) != "undefined" && scheck != null )
            {
				var Disable=isDisabled( els[i] ) || ( scheck=="0" && tValue=="");
            }
            else
            {
   				var Disable=isDisabled( els[i] );
            }
            if ( Disable == true )
//          if ( isDisabled( els[i] ) == true )
            {
                continue;
            }

            //取得表单的值,用通用取值函数
            var sVal = getValue( els[i] );
            //字符串->正则表达式,不区分大小写
            var reg = new RegExp( sReg, "i" );

            if ( !reg.test( sVal ) )
            {
                me.pass = false;

                if ( me.first == null )
                {
                    me.first = els[i];
                }

                //alert(reg);
                //验证不通过,弹出提示warning
                var sTip = getMessage( els[i] );

                if ( sTip.length == 0 && typeof (sUsage) != "undefined" && sUsage != null && aMessage[sUsage] != null )
                {
                    sTip = aMessage[sUsage];
                }

                addMessage( sTip );

                if ( me.showAll == false )
                {
                    //该表单元素取得焦点,用通用返回函数
                    setFocus( els[i] );
                    break;
                }
            }
        }
        }

        if ( me.pass == false )
        {
            showMessage();

            if ( me.first != null && me.showAll == true )
            {
                setFocus( me.first );
            }
        }

        return me.pass;
    }

    /*
     *	添加错误信息
     */
    function addMessage( msg )
    {
        if ( me.alert == true )
        {
            me.message += msg + "\n";
        }
        else
        {
            me.message += msg + "<br>";
        }
    }

    /*
     *	显示错误
     */
    function getMessage( els )
    {
        var sTip = els.getAttribute( "tip" );

        if ( typeof (sTip) != "undefined" && sTip != null )
        {
            return sTip;
        }
        else
        {
            return "";
        }
    }


    /*
     *	显示错误
     */
    function showMessage( )
    {
        //外接显示错误函数
        if ( typeof (me.showMessageEx) == "function" )
        {
            return me.showMessageEx( me.message );
        }

        if ( me.alert == true )
        {
            alert( me.message );
        }
        else
        {
            var divTip;
            divTip = document.getElementById( "divErrorMessage" );

            try
            {
                if ( typeof (divTip) == "undefined" || divTip == null )
                {
                    divTip = document.createElement( "div" );
                    divTip.id = "divErrorMessage";
                    divTip.name = "divErrorMessage";
                    divTip.style.color = "red";
                    document.body.appendChild( divTip );
                }

                divTip.innerHTML = me.message;
            }
            catch( e )
            {
            }
        }
    }

    /*
     *	获得元素是否失效（失效的元素不做判断）
     */
    function isDisabled( el )
    {
        //对于radio,checkbox元素，只要其中有一个非失效元素就验证
        if ( el.type == "radio" || el.type == "checkbox" )
        {
            //取得第一个元素的name,搜索这个元素组
            var tmpels = document.getElementsByName( el.name );

            for ( var i = 0; i < tmpels.length; i++ )
            {
            if ( tmpels[i].disabled == false )
            {
                return false;
            }
            }

            return true;
        }
        else
        {
            return el.disabled;
        }
    }


    /*
     *	取得对象的值（对于单选多选框把其选择的个数作为需要验证的值）
     */
    function getValue( el )
    {
        //取得表单元素的类型
        var sType = el.type;

        switch ( sType )
        {
            //文本输入框,直接取值el.value
            case "text":
            case "hidden":
            case "password":
            case "file":
            case "textarea":
                return el.value;

            //单多下拉菜单,遍历所有选项取得被选中的个数返回结果"0"表示选中一个，"00"表示选中两个
            case "checkbox":
            case "radio":
                return getRadioValue( el );

            case "select-one":
            case "select-multiple":
                return getSelectValue( el );
        }

        //取得radio,checkbox的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
        function getRadioValue( 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 getSelectValue( el )
        {
            var sValue = "";
            /***************/
            //董斌添加，用于判断combobox控件的输入框是否为空
            var sKey = "";

            if ( el.selectedIndex == -1 && typeof (el.textfield) != "undefined" && el.textfield != null )
                sKey = el.textfield.value;

            if ( sKey != "" )
                sValue = "0";
            /***************/
            for ( var i = 0; i < el.options.length; i++ )
            {
            //单选下拉框提示选项设置为value=""
            if ( el.options[i].selected && el.options[i].value != "" )
            {
                sValue += "0";
            }
            }

            return sValue;
        }
    }

    /*
     *	对没有通过验证的元素设置焦点
     */
    function setFocus( el )
    {
        //取得表单元素的类型
        var sType = el.type;

        switch ( sType )
        {
            //文本输入框,光标定位在文本输入框的末尾
            case "text":
            case "hidden":
            case "password":
            case "file":
            case "textarea":
                try
                {
                    el.focus();
                    var rng = el.createTextRange();
                    rng.collapse( false );
                    rng.select();
                }
                catch( e )
                {
                }

                ;
                break;

            //单多选,第一选项非失效控件取得焦点
            case "checkbox":
            case "radio":
                var els = document.getElementsByName( el.name );

                for ( var i = 0; i < els.length; i++ )
                {
                if ( els[i].disabled == false )
                {
                    els[i].focus();
                    break;
                }
                }

                break;

            case "select-one":
            case "select-multiple":
                /***************/
                //董斌添加，用于验证combobox控件
                if ( el.selectedIndex == -1 && typeof (el.textfield) != "undefined" && el.textfield != null )
                    el.textfield.focus();
                /***************/
                el.focus();
                break;
        }
    }


    //自动绑定到所有form的onsubmit事件
    if ( window.attachEvent )
    {
        window.attachEvent( "onload", function( )
        {
            for ( var i = 0; i < document.forms.length; i++ )
            {
            var theFrom = document.forms[i];

            if ( theFrom )
            {
                theFrom.attachEvent( "onsubmit", function( )
                {
                    return checkForm( theFrom );
                });

                theFrom.attachEvent( "onclick", function( )
                {
                    var o = event.srcElement;

                    if ( typeof (o.type) != "undefined" )
                    {
                        var check = o.getAttribute( "check" );

                        if ( typeof (check) != "undefined" && check != null && check.toLowerCase() == "false" )
                        {
                            me.cancel = true;
                        }
                    }
                });
            }
            }
        });
    }
    else
    {
        window.onsubmit = function( e )
        {
            var theFrom = e.target;

            if ( theFrom )
            {
                return checkForm( theFrom );
            }
        }

        window.addEventListener( "click", function( e )
        {
            var o = e.target;

            if ( typeof (o.type) != "undefined" )
            {
                var check = o.getAttribute( "check" );

                if ( typeof (check) != "undefined" && check != null && check.toLowerCase() == "false" )
                {
                    me.cancel = true;
                }
            }
        },                       false );
    }

    this.keyCheck = function( )
    {
        if ( window.attachEvent )
        {
            window.attachEvent( "onload", function( )
            {
                for ( var i = 0; i < document.forms.length; i++ )
                {
                var theFrom = document.forms[i];

                if ( theFrom )
                {
                    myKeyCheck( theFrom );
                }
                }
            });
        }
        else
        {
        //TOOD
        }

        function myKeyCheck( oForm )
        {
            var els = oForm.elements;

            //遍历所有表元素
            for ( var i = 0; i < els.length; i++ )
            {
            //取得格式
            var sUsage = els[i].getAttribute( "Usage" );

            //如果设置Usage，则使用内置正则表达式，忽略Exp
            if ( typeof (sUsage) != "undefined" && sUsage != null )
            {
                switch ( sUsage.toLowerCase() )
                {
                    case "zipcode":
                    case "int":
                        els[i].onkeypress = function( )
                        {
                            return /\d/.test( String.fromCharCode( event.keyCode ) ) || (this.value.indexOf( '+' ) < 0
                                                                                            ? String.fromCharCode( event.keyCode ) == "+"
                                                                                            : false)
                                || (this.value.indexOf( '-' ) < 0
                                       ? String.fromCharCode( event.keyCode ) == "-" : false);
                        }

                        els[i].onpaste = function( )
                        {
                            return !clipboardData.getData( 'text' ).match( /\D/ );
                        }

                        els[i].ondragenter = function( )
                        {
                            return false;
                        }

                        els[i].style.imeMode = "disabled";
                        break;

                    case "mobile":
                    case "int+":
                        els[i].onkeypress = function( )
                        {
                            return /\d/.test( String.fromCharCode( event.keyCode ) ) || (this.value.indexOf( '+' ) < 0
                                                                                            ? String.fromCharCode( event.keyCode ) == "+"
                                                                                            : false);
                        }

                        els[i].onpaste = function( )
                        {
                            return !clipboardData.getData( 'text' ).match( /\D/ );
                        }

                        els[i].ondragenter = function( )
                        {
                            return false;
                        }

                        els[i].style.imeMode = "disabled";
                        break;

                    case "int-":
                        els[i].onkeypress = function( )
                        {
                            return /\d/.test( String.fromCharCode( event.keyCode ) ) || (this.value.indexOf( '-' ) < 0
                                                                                            ? String.fromCharCode( event.keyCode ) == "-"
                                                                                            : false);
                        }

                        els[i].onpaste = function( )
                        {
                            return !clipboardData.getData( 'text' ).match( /\D/ );
                        }

                        els[i].ondragenter = function( )
                        {
                            return false;
                        }

                        els[i].style.imeMode = "disabled";
                        break;

                    case "float":
                    case "num":
                        els[i].onkeypress = function( )
                        {
                            return /[\+\-\.]|\d/.test( String.fromCharCode( event.keyCode ) );
                        }

                        els[i].onpaste = function( )
                        {
                            return !clipboardData.getData( 'text' ).match( /\D/ );
                        }

                        els[i].ondragenter = function( )
                        {
                            return false;
                        }

                        els[i].style.imeMode = "disabled";
                        break;

                    case "float+":
                    case "num+":
                        els[i].onkeypress = function( )
                        {
                            return /[\+\.]|\d/.test( String.fromCharCode( event.keyCode ) );
                        }

                        els[i].onpaste = function( )
                        {
                            return !clipboardData.getData( 'text' ).match( /\D/ );
                        }

                        els[i].ondragenter = function( )
                        {
                            return false;
                        }

                        els[i].style.imeMode = "disabled";
                        break;

                    case "float-":
                    case "num-":
                        els[i].onkeypress = function( )
                        {
                            return /[\-\.]|\d/.test( String.fromCharCode( event.keyCode ) );
                        }

                        els[i].onpaste = function( )
                        {
                            return !clipboardData.getData( 'text' ).match( /\D/ );
                        }

                        els[i].ondragenter = function( )
                        {
                            return false;
                        }

                        els[i].style.imeMode = "disabled";
                        break;

                    case "ascii":
                        els[i].style.imeMode = "disabled";

                        break;

                    case "ip4":
                        els[i].onkeypress = function( )
                        {
                            return /[\.]|\d/.test( String.fromCharCode( event.keyCode ) );
                        }

                        els[i].onpaste = function( )
                        {
                            return !clipboardData.getData( 'text' ).match( /\D/ );
                        }

                        els[i].ondragenter = function( )
                        {
                            return false;
                        }

                        els[i].style.imeMode = "disabled";
                        els[i].maxLength = 15;
                        break;

                    case "color":
                        els[i].onkeypress = function( )
                        {
                            return /[a-fA-Z]|\d/.test( String.fromCharCode( event.keyCode ) )
                                || (this.value.indexOf( '#' ) < 0
                                       ? String.fromCharCode( event.keyCode ) == "#" : false);
                        }

                        els[i].onpaste = function( )
                        {
                            return !clipboardData.getData( 'text' ).match( /\D/ );
                        }

                        els[i].ondragenter = function( )
                        {
                            return false;
                        }

                        els[i].maxLength = 7;
                        els[i].style.imeMode = "disabled";
                        break;

                    case "date":
                        els[i].onkeypress = function( )
                        {
                            return /[\/\-\.]|\d/.test( String.fromCharCode( event.keyCode ) );
                        }

                        els[i].onpaste = function( )
                        {
                            return !clipboardData.getData( 'text' ).match( /\D/ );
                        }

                        els[i].ondragenter = function( )
                        {
                            return false;
                        }

                        els[i].style.imeMode = "disabled";
                        break;
                }
            }
            }
        }
    }
}

//初始化
var g_check = new CLASS_CHECK();
g_check.keyCheck();

//董斌添加 默认设置为单条弹出式验证方式
g_check.alert = true;
g_check.showAll = false;

//董斌添加，用于验证ComboBox控件
function check( Form )
{
    var els = document.all( Form ).elements;

    for ( var i = 0; i < els.length; i++ )
    {
    var scheck = els[i].getAttribute( "check" );

    if ( typeof (scheck) != "undefined" && scheck != null )
    {
        var sType = els[i].type;

        if ( sType = "select-multiple" )
        {
            var sKey = "";

            if ( els[i].selectedIndex == -1 && typeof (els[i].textfield) != "undefined" && els[i].textfield != null )
                sKey = els[i].textfield.value;

            var reg = new RegExp( "^([+]?)\\d+$","i" );

			if (els[i].selectedIndex == -1)
			{
            if ( !reg.test( sKey ))
            {
                alert( "请输入您要查看的报表倍率（单位为百分比，数值为正整数，且必须介于10和400之间），或从下拉框中选择一个" );
                els[i].textfield.focus();
                return false;
            }
             if ( sKey<10 || sKey>400 )
            {
                alert( "请输入您要查看的报表倍率（单位为百分比，数值为正整数，且必须介于10和400之间），或从下拉框中选择一个" );
                els[i].textfield.focus();
                return false;
            }
            }
        }
    }
    }

    return true;
}

function checkint(e){
   if ((e.keyCode>=48) && (e.keyCode<=57))
       return true;
       else
           return false;
}
