/*******************************************************************************
 * 系统名称：会议通监控系统
 * 文件名  ：tools.js
 * 功  能  ：会议通监控系统画面字符串处理方法文件。
 * 版  本  ：V1.0
 * 日  期  ：2007/12/01
 * 作  者  ：
 * 版  权  ：信元公众信息发展有限责任公司
 * 修改历史
 * ---------------------------------------------------------
 * 修改日期         修改人           修改目的
 *
*******************************************************************************/

/*******************************************************************************

 * 下列函数返回值说明：
    凡是“is”开头的函数，如果是"Is"后指明的状态，则返回真，否则为假
        eg. isNum 如果是数字，返回真
    某些“Check”开头的函数，如果是"Check"后指明的状态，返回假，否则为真
    某些则相反,请具体查看函数说明
        eg. CheckEmpty 如果是空，返回假
 * 函数名解释：
    当有重载出现时
    NP 表示没有参数（no parameter）
    3P,4P 等表示参数个数(3 parameter,4 parameter)

 * 函数目录:
    ----------- 校验输入与工具类 -------------------------------------
    Trim(strSource)  清除左右两边空格
    IsValid(p, t, s)  检验正则表达式是否符合
    CheckInvalidString(fld, invalid, msg)  校验文本框输入内容的非法字符
    DispMessage( CheckCtl, Msg ) 显示信息的方法
    ReplaceDoubleQuotes(strValue)  替换双引号为&quot;
    CheckUnsafeMark(frm)  检查参数frm(form)对象里所有输入控件是否含有非法字符
    CheckKey(KeyCode)  检查输入键是否为0~9,a~z(A~Z),Del,-,.,
    CheckEmptyNP()  校验触发者的值是否为空
    CheckEmpty(CheckCtl,disptext) 校验输入值是否为空
    CheckCardNo(CheckCtl,disptext)  校验一个合法的身份证号码(15,18位)
    isSame(CheckCtl1, CheckCtl2, Mesg) 检查两次输入的密码是否一致
    IsCode(CheckCtl,s)  判断是否是数字编码组合
    isCodeNM(CheckCtl)  判断是否是数字编码组合，不弹出消息框
    isEmail(CheckCtl, s)  判断是否是正确的电子邮件地址
    IsImageFile(FilePath)  判断是否文件路径中文件是图像文件，路径可以是url或者file:\\
    IsLetter(CheckCtl,s)  判断是否是字母组合
    isMobil(CheckCtl,s)  校验手机号码：必须以数字开头，除数字外，可含有“-”
    isPhoneNumber(CheckCtl,s)  判断是否是正确的电话号码
        数字编码允许 000000010 ,不允许诸如: -1290092 ,23.,.3456等类型的值,而数字则认为是真
    IsUserName(CheckCtl,s)  判断是否是正确的用户名 用户名只能由小写英文字母、阿拉伯数字和下划线组成!s=null or s="" 时有默认的提示信息
    resetClear()  重填画面控件

    ----------- 数字操作相关类 ---------------------------------------
    Round(i,digit)  取整函数,digid为保留的小数位数
    CheckPositiveInt(CheckCtl,disptext,IsCanZero)  校验一个正整数
    CheckPositiveIntNP()  校验触发者的值是否为一个正整数
    CheckPositiveFloat(CheckCtl,disptext,floatcount)  校验一个合法的大于等于0的浮点数
    CheckPositiveFloatNP()  校验触发者的值是否一个合法的大于等于0的浮点数(2位小数)
    CheckPositiveFloat4P(CheckCtl,disptext,IsCanZero,floatcount)  校验一个合法的大于0的浮点数,是否可以等于零由参数IsCanZero决定
    CheckIntRange(CheckCtl,Min, Max,Msg)  校验一个合法的且在规定范围内的整数
    CheckFloatRange(CheckCtl,Min, Max,Msg)  校验一个合法的且在规定范围内的浮点数
    IsCost(Costctrl)  检查费用输入，小数位为2位，且不能超过SQL Server中数据字段money最大值
    isNum(txtctl,message,floatcount)  校验是否是数字
    isNumNM(txtctl,floatcount)  校验是否是数字，不弹出消息框
    isPercent(arg) 判断是否百分数表示,返回true or false
    unPercent(arg) 去掉百分数
    toPercent(arg)转成百分数表示

    ---------- 日期操作相关类 ----------------------------------------
    isDate(str)  判断一个字符串是否为有效的日期并且格式是否正确
    DateToStr(dateObj)  将一个日期对象转化为格式yyyy-MM-dd字符串
    DateTimeToStr(dateObj)  将一个日期时间对象转化为形如  yyyy-MM-dd HH:mm:ss 的字符串
    StrToDate(str)  yyyy-MM-dd 的字符串转化为日期对象
    StrToDateTime(str)  将一个yyyy-MM-dd HH:mm:ss 的字符串转化为日期时间对象
    StrToDateTime6P(year,month,day,hour,minute,second)  将一个参数构成的yyyy-MM-dd HH:mm:ss 的字符串转化为日期时间对象
    StrToStrYMD(str)  yyyy-MM-dd HH:mm:ss 的字符串转化为格式yyyy-MM-dd字符串
    AddDay(dateObj,days)  把一个日期加上n天
    GetDateDiff(strStart,strEnd)  计算两个日期间隔天数
    GetDayDiff(startDate,endDate) 计算两个日期间隔天数
    GetHourDiff(startDate,endDate)  计算两个日期间隔小时数
    GetMinuteDiff(startDate,endDate) 计算两个日期间隔分钟数
    CheckDiffDate(BDateCtl,EDateCtl,Msg)  比较两个日期的大小，如果开始日期大于结束日期，返回false;
    CheckYear(strYearInput)  检查输入是否是个有效年份

*******************************************************************************/

//********************************************************************
//常量定义
//********************************************************************

var maxpn=999999999999;
var maxfn=999999999999.9;
var numerrormsg0="请输入0-999999999999之内的数字";
var numerrormsg1="请输入1-999999999999之内的数字";
var overerrormsg="数值超过最大值999999999999";

//********************************************************************
//方法定义
//********************************************************************

//**************************************
//函数概要：去掉空格，等价于VBSCRIPT中的trim的方法。
//param   ：strSource   被操作字符串
//return  ：无
//**************************************
function Trim( strSource ) {

    return strSource.replace(/^\s*/,'').replace(/\s*$/,'');

}

//**************************************
//函数概要：检验正则表达式是否符合的方法。
//param   ：p           正则表达式
//param   ：t           被检验的文本框
//param   ：s           显示的信息
//return  ：true/false
//**************************************
function IsValid( p, t, s ) {

    if( p.test( t.value ) )
        return true;

    if( s != null ) {
        t.focus();
        alert( s );
    }

    return false;
}

//**************************************
//函数概要：校验文本框输入内容的非法字符的方法。
//          用户名只能由小写英文字母、阿拉伯数字和下划线组成
//param   ：fld         要校验的输入框
//param   ：invlid      非法字符串
//param   ：msg         出错显示的信息
//return  ：true/false(包含非法字符串/不包含)
//**************************************
function CheckInvalidString( fld, invalid, msg ) {

    if( fld.type == null || ( fld.type != 'text' && fld.type != 'password' ) )
        return false;

    var src=fld.value;

    if( src == null ||
        src.length == 0 ||
        invalid == null ||
        invalid.length == 0 )
        return false;

    if( fld.value.indexOf( invalid ) >= 0 ) {
        alert( msg );
        return true;
    }

    return false;
}

//**************************************
//函数概要：显示信息的方法。
//param   ：CheckCtl    要校验的输入框
//param   ：Msg         出错显示的信息
//return  ：无
//**************************************
function DispMessage( CheckCtl, Msg ) {

    if( Msg != "" ) {
        alert( Msg );

        CheckCtl.focus();
    }
}

//**************************************
//函数概要：将替换双引号为&quot;的方法。
//param   ：strValue       操作的对象
//return  ：变化后的strValue
//**************************************
function ReplaceDoubleQuotes( strValue ) {
    return strValue.replace( '"', '&quot;' );
}

//**************************************
//函数概要：检查FORM里所有输入控件是否含有非法字符的方法。
//param   ：frm       画面对象
//return  ：true/false
//**************************************
function CheckUnsafeMark(frm) {
    for(var i=0;i<frm.length;i++) {
        var edit = frm.item(i);
        var stag = edit.tagName;
        if( edit.type ) {
            var stype = edit.type;
            if( (stype.toLowerCase()!="password") && (stype.toLowerCase() != "text") ) {
                continue;
            }
    } else {
       var stag = edit.tagName;
       if(stag.toLowerCase()!="textarea") {
            continue;
       }
    }

    var s = Trim(edit.value);
    if( ( s.indexOf("\"") >= 0 ) ||
        ( s.indexOf("\'") >= 0 )||
        ( s.indexOf("<") >=0 )||
        ( s.indexOf(">")>=0 ) ) {
        alert("不能输入包含非法字符(如\", \', <, >)的文字!");
        edit.select();
        edit.focus();
        return false;
    } else
        continue;
    }//end of for
    return true;
}

//**************************************
//函数概要：检查输入键是否为0~9,a~z(A~Z),Del,-,.,的方法。
//          KeyDown 有效
//param   ：KeyCode 键盘值
//return  ：true/false
//**************************************
function CheckKey(KeyCode) {
    Zero=48;
    Nine=57;
    Delete=46;
    Minus=189;
    Dot=190;
    Divide=191;
    Key_a=65;
    Key_z=90;
    Zero=96;
    Nine=105;
    Divide=111;
    Minus=109;
    Dot=110;
    return ((KeyCode>=Key_a)&&(KeyCode<=Key_z))||((KeyCode>=Zero)&&(KeyCode<=Nine))||((KeyCode>=_Zero)&&(KeyCode<=_Nine))||(KeyCode==Delete)||(KeyCode==Dot)||(KeyCode==Minus)||(KeyCode==Divide)||(KeyCode==0)||(KeyCode==_Minus)||(KeyCode==_Divide)||(KeyCode==_Dot);
}

//**************************************
//函数概要：检查是否为空的方法。
//          不用任何参数,触发者为Text
//return  ：true/false
//**************************************
function CheckEmptyNP() {

    var CheckCtl = event.srcElement;

    if( Trim( CheckCtl.value ) == "" ) {

        CheckCtl.focus();
        return false;
    } else
        return true;

}

//**************************************
//函数概要：检查输入框的值是否为空的方法。
//param   ：CheckCtl    要校验的文本框控件
//param   ：disptext    显示的错误信息
//return  ：true/false
//**************************************
function CheckEmpty( CheckCtl, disptext ) {

    if( Trim( CheckCtl.value ) == "" ) {
        DispMessage( CheckCtl, disptext );
        return false;
    } else
        return true;
}

//**************************************
//函数概要：校验一个合法的身份证号码(15,18位)的方法。
//param   ：CheckCtl    要校验的输入框
//param   ：disptext    出错显示的信息
//return  ：true/false
//**************************************
function CheckCardNo( CheckCtl, disptext ) {

    var result = true;
    var strvalue = new String( Trim( CheckCtl.value ) );

    if( strvalue != "" ) {
        num = parseInt( strvalue );

        if( ( isNaN( num ) ) ||
            ( num < 100000000000000 ) ||
            ( strvalue.indexOf(".") >= 0 ) ||
            ( num != strvalue ) )
            result = false;
        else
            if( ( num > 999999999999999 ) && ( num<100000000000000000 ) )
                result = false;
            else
                if( num > 999999999999999999 )
                    result = false;
    }

    if( !result ) {
        DispMessage( CheckCtl, disptext );
    }
    return result;
}

//**************************************
//函数概要：检查两次输入的密码是否一致。
//param    :CheckCtl1    要校验的输入框１
//param    :CheckCtl2    要校验的输入框２
//param    :Mesg    　　    出错显示的信息
//return   :true/false
//**************************************
function isSame(CheckCtl1, CheckCtl2, Mesg) {
    var pwd1 = Trim(CheckCtl1.value);
    var pwd2 = Trim(CheckCtl2.value);
    if(pwd1 != pwd2) {
        DispMessage( CheckCtl1, Mesg );
        return false;
    } else {
        return true;
    }
}

//**************************************
//函数概要：判断是否是数字编码组合的方法。
//          数字和数字编码的区别:
//              数字编码允许  000000010 ,
//              不允许诸如: -1290092 ,23.,.3456等类型的值,而数字则认为是真
//param   ：CheckCtl    要校验的输入框
//param   ：s           出错显示的信息
//return  ：true/false
//**************************************
function IsCode( CheckCtl, s ) {

    try {
        var t =  Trim( CheckCtl.value );
        if( t == null || t == "" ) {
            return false;
        }

        for( var i = 0; i < t.length; i++ ) {

            var sss = t.charCodeAt( i );

            if( !( sss >= 48 && sss <= 57 ) ) {
                DispMessage( CheckCtl, s );
                return false;
            }
        }

        return true;
    } catch( x ) {
        return false;
    }
}

//**************************************
//函数概要：判断是否是数字编码组合的方法。
//          数字和数字编码的区别:
//              数字编码允许  000000010 ,
//              不允许诸如: -1290092 ,23.,.3456等类型的值,而数字则认为是真
//param   ：CheckCtl    要校验的输入框
//return  ：true/false
//**************************************
function isCodeNM( CheckCtl, s ) {

    try {

        var t =  Trim( CheckCtl.value );

        if( t == null || t == "" ) {
            return false;
        }

        for( var i = 0; i < t.length; i++ ) {

            var sss = t.charCodeAt( i );

            if( !( sss >= 48 && sss <= 57 ) ) {
                return false;
            }
        }

        return true;

    } catch( x ) {
        return false;
    }
}

//**************************************
//函数概要：判断是否是正确的电子邮件地址的方法。
//param   ：CheckCtl    要检验的输入框
//param   ：s           显示的信息
//return  ：true/false
//**************************************
function isEmail( CheckCtl, s ) {
    return IsValid( /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/, CheckCtl, s );
}

//**************************************
//函数概要：判断是否文件路径中文件是图像文件的方法。
//param   ：FilePath    文件路径（路径可以是url或者file:\\）
//return  ：true/false
//**************************************
function IsImageFile( FilePath ) {

    var aryimg = new Array( "ART",
                            "BMP",
                            "DJVU",
                            "EMF",
                            "GIF",
                            "ICN",
                            "ICO",
                            "IFF",
                            "JPEG",
                            "JPG",
                            "KDC",
                            "LDF",
                            "LWF",
                            "MAG",
                            "PBM",
                            "PIC",
                            "PICT",
                            "PIX",
                            "PNG",
                            "PPM",
                            "PSD",
                            "PSP",
                            "RAS",
                            "RS",
                            "SGI",
                            "TGA",
                            "TIFF",
                            "TTF",
                            "WMF",
                            "XBM",
                            "XPM" );

    var  str = FilePath;

    var  i = str.lastIndexOf(".");

    var  str1 = str.substring(i+1);

    for( var k = 0; k < aryimg.length; k++ ) {
        if( str1.toUpperCase() == aryimg[k] ) {
            return true;
        }
    }

    return false;
}

//**************************************
//函数概要：判断是否是字母组合的方法。
//param   ：CheckCtl    要校验的输入框
//param   ：s           出错显示的信息
//return  ：true/false
//**************************************
function IsLetter( CheckCtl, s ) {
    try {
        var t =  Trim( CheckCtl.value );

        if( t == null || t == "" ) {
            return false;
        }

        for( var i = 0; i < t.length; i++ ) {

            var sss = t.charCodeAt( i );

            if( !( sss >= 65 && sss <= 90 || sss >= 97 && sss <= 122 ) ) {
                DispMessage( CheckCtl, s );
                return false;
            }
        }
        return true;
    } catch( x ) {
        return false;
    }
}

//**************************************
//函数概要：校验手机号码的方法。
//          手机号码：必须以数字开头，除数字外，可含有“-”
//param   ：CheckCtl    要校验的输入框
//param   ：s           出错显示的信息
//return  ：true/false
//**************************************
function isMobil( CheckCtl, s ) {

    var patrn = /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;

    if( !patrn.exec( CheckCtl.value ) ) {
        DispMessage( CheckCtl, s );
        return false
    }
    return true
}

//**************************************
//函数概要：判断是否是正确的电话号码的方法。
//          电话号码仅允许：数字, (, ), - 等符号
//param   ：CheckCtl    要检验的输入框
//param   ：s           显示的信息
//return  ：true/false
//**************************************
function isPhoneNumber( CheckCtl, s ) {

    try {

        var t =  Trim( CheckCtl.value );

        if( t == null || t == "" ) {
            return false;
        }

        t = t.replace("-","");
        t = t.replace("*","");
        t = t.replace("(","");
        t = t.replace(")","");

        if(t.indexOf(".") >= 0 ) {
            DispMessage( CheckCtl, s );
            return false;
        }

        for( var i = 0; i < t.length; i++ ) {

            var c = t.charAt(i);

            if( isNaN( parseInt( c, 10 ) ) ) {
                DispMessage( CheckCtl, s );
                return false;
            }
        }

        return true;

    } catch( x ) {
        return false;
    }
}

//**************************************
//函数概要：判断是否是正确的用户名的方法。
//          用户名只能由小写英文字母、阿拉伯数字和下划线组成
//param   ：CheckCtl    要校验的输入框
//param   ：s           出错显示的信息(s=null or s="" 时有默认的提示信息)
//return  ：true/false
//**************************************
function IsUserName( CheckCtl, s ) {

    try {
        var t =  Trim( CheckCtl.value );

        if( t == null || t == "" ) {
            return false;
        }

        if( s == "" || s == null ) {
            s = "用户名只能由小写英文字母、阿拉伯数字和下划线组成!";
        }

        if( !IsValid( /[a-z]*|\d*|\_/, CheckCtl, s ) ) {
            return false;
        }

        return true;
    } catch( x ) {
        return false;
    }
}

//**************************************
//函数概要：重填画面控件的方法。
//param   ：无
//return  ：无
//**************************************
function resetClear(){

    for( var n = 0; n < arguments.length; n++ ) {
        document.getElementById( arguments[n] ).value = "";
    }

}

//**************************************
//函数概要：取整函数。
//          eg. Round(132.123456)   为 132.12
//          eg. Round(132.123456,4) 为 132.1234
//          eg. Round(132.123456,0) 为 132
//param   ：i       将要取整的数值
//param   ：digit   将要保留的小数位
//return  ：取整结果
//**************************************
function Round( i, digit ) {

    if( isNaN( parseFloat( i ) ) ) {
        return '0';
    }

    if( digit==0 )
        p=1;
    else {
        if( digit )
            p=Math.pow(10,digit);
        else
            p=100;
    }

    var mm = Math.round(i*p)/p;
    var strTmp = eval("'"+ mm +"'");
    var behind = '';

    if( strTmp.indexOf('.') >=0 ) {

       behind = strTmp.substring(strTmp.indexOf('.')+1,strTmp.length);

       while( digit-behind.length > 0 ) {
            behind += '0';
       }
       strTmp = strTmp.substring( 0, strTmp.indexOf('.') + 1 ) + behind;

    } else {
        for( var j = 0; j < digit; j++ ) {
            behind += '0';
        }
        if( digit > 0 ) {
            strTmp = strTmp + '.' + behind;
        }
    }
    return strTmp;

}

//**************************************
//函数概要：判断是否是数字的方法。
//param   ：txtctl      输入的文本控件
//param   ：message     显示的错误信息
//param   ：floatcount  小数的最高位数（如果没有该参数，则默认为4位）
//return  ：true/false（是数字返回true，不是返回false）
//使用举例：isNum(txtctl,"出错显示的信息",5);
//**************************************
function isNum( txtctl, message, floatcount ) {

    var s      = new String( Trim( txtctl.value ) );
    var num    = Number(s);
    var result = true;

    if( ( isNaN( num ) ) || ( s == "" ) ) {
        result = false;
    } else if( num > maxfn ) {
        // 超过最大值
        result = false;
    } else {
        limitcount = floatcount?floatcount:4;

        var array = s.split(".");

        if( array[1] == null )
            count = -1;
        else {
            var str = new String(array[1]);
            count = str.length;
        }

        if( count > limitcount ) {
            // 小数位数不正确
            result = false;
        }
    }

    if( !result ) {
        DispMessage( txtctl, message );
        return false;
    }

    return true;
}

//**************************************
//函数概要：判断是否是数字，不返回提示信息的方法。
//param   ：txtctl      输入的文本控件
//param   ：floatcount  小数的最高位数（如果没有该参数，则默认为4位）
//return  ：true/false（是数字返回true，不是返回false）
//使用举例：isNumNM(txtctl,5);
//**************************************
function isNumNM( txtctl, floatcount ) {

    var s      = new String( Trim( txtctl.value ) );
    var num    = Number(s);
    var result = true;

    if( ( isNaN( num ) ) || ( s == "" ) ) {
        result = false;
    } else if( num > maxfn ) {
        result = false;
    } else {

        limitcount = floatcount?floatcount:4;

        var array = s.split(".");

        if( array[1] == null )
            count = -1;
        else {
            var str = new String(array[1]);
            count = str.length;
        }

        if( count > limitcount ) {
            result = false;
        }
    }

    if( !result ) {
        return false;
    }

    return true;
}

//**************************************
//函数概要：校验一个正整数的方法。
//param   ：CheckCtl    要校验的输入框
//param   ：disptext    出错显示的信息
//param   ：IsCanZero   是否可以为零
//return  ：true/false
//**************************************
function CheckPositiveInt( CheckCtl, disptext, IsCanZero ) {

    var s = new String( Trim( CheckCtl.value ) );
    var temp = parseInt(s);
    var result = true;

    if( ( isNaN( temp ) ) ||
        ( temp < 0 ) ||
        ( s.indexOf(".") >= 0 ) ||
        ( temp != s ) ) {
        result=false;
    } else if( ( !IsCanZero ) && ( temp ==0 ) ) {
        result=false;
    }

    if( temp > maxpn ) {
        result   = false;
        disptext = overerrormsg;
    }

    if( !result ) {
        DispMessage(CheckCtl, disptext);
        return false;
    }

    return true;

}

//**************************************
//函数概要：不带参数的校验一个正整数的方法。
//return  ：true/false
//**************************************
function CheckPositiveIntNP()
{
    var o = event.srcElement;

    if( o ) {
        if( o.tagName == "INPUT" && !isNaN( parseFloat( o.value ) ) )
            return CheckPositiveInt( o, '请输入正整数!', true );
        else
            return true;
    } else
        return true;
}

//**************************************
//函数概要：校验一个合法的大于等于0的浮点数的方法。
//param   ：CheckCtl    要校验的输入框
//param   ：disptext    出错显示的信息
//param   ：floatcount  小数的最高位数（如果没有该参数，则默认为4位）
//return  ：true/false
//**************************************
function CheckPositiveFloat( CheckCtl, disptext, floatcount ) {

    var s = new String( Trim( CheckCtl.value ) );
    temp = parseFloat( s );

    var result = true;

    if( ( isNaN( temp ) ) ||
        ( temp < 0 )||
        ( temp !=s ) ) {

        result = false;

    } else if( temp > maxfn ) {

        result =false;
        disptext=overerrormsg;

    } else {
        limitcount=floatcount?floatcount:4;
        var array=s.split(".");
        if( array[1] == null )
            count = -1;
        else {
            var str = new String(array[1]);
            count = str.length;
        }
        if( count > limitcount ) {

            b = confirm("小数位数超过"+limitcount+"位,是否继续?");
            if( b ) {
                return true;
            } else {
                CheckCtl.select();
                CheckCtl.focus();
                return false;
            }
        }
    }

    if( !result ) {
        DispMessage(CheckCtl,disptext);
        return false;
    }

    return true;

}

//**************************************
//函数概要：不带参数校验一个合法的大于等于0的浮点数(2位小数)的方法。
//return  ：true/false
//**************************************
function CheckPositiveFloatNP() {

    var o = event.srcElement;

    if( o ) {
        if( o.tagName == "INPUT" && !isNaN( parseFloat( o.value ) ) )
            return CheckPositiveFloat( o, '请输入正确的数目!', 2 );
        else
            return true;
    } else
        return true;
}

//**************************************
//函数概要：校验一个合法的大于0的浮点数的方法。
//param   ：CheckCtl    要校验的输入框
//param   ：disptext    出错显示的信息
//param   ：IsCanZero   是否可以等于零
//param   ：floatcount  小数的最高位数（如果没有该参数，则默认为4位）
//return  ：true/false
//**************************************
function CheckPositiveFloat4P( CheckCtl, disptext, IsCanZero, floatcount ) {

    if( CheckPositiveFloat( CheckCtl, disptext, floatcount ) ) {
        if( ( parseFloat( CheckCtl.value ) == 0 ) &&( !IsCanZero ) ) {
            DispMessage(CheckCtl,disptext);
            return false;
        } else
            return true;
    } else
        return false;
}

//**************************************
//函数概要：校验一个合法的且在规定范围内的整数的方法。
//param   ：CheckCtl    文本框控件
//param   ：Min         整数的下限
//param   ：Max         整数的上限
//param   ：Msg         出错显示的信息
//return  ：true/false
//**************************************
function CheckIntRange( CheckCtl, Min, Max, Msg ) {

    if( !isNum( CheckCtl, Msg ) )
        return false;

    var s = new String( Trim( CheckCtl.value ) );
    v = parseInt(s);

    if ( ( v < Min ) || ( v > Max ) || ( s.indexOf( "." ) >= 0 ) ) {
        DispMessage( CheckCtl, Msg );
        return false;
    }
    return true;
}

//**************************************
//函数概要：校验一个合法的且在规定范围内的浮点数的方法。
//param   ：CheckCtl    文本框控件
//param   ：Min         整数的下限
//param   ：Max         整数的上限
//param   ：Msg         出错显示的信息
//return  ：true/false
//**************************************
function CheckFloatRange( CheckCtl, Min, Max, Msg ) {

    if( !isNum( CheckCtl, Msg ) )
       return false;
    v = parseFloat( Trim( CheckCtl.value ) );

    if ( ( v < Min ) || ( v > Max ) ) {
        DispMessage( CheckCtl, Msg );
        return false;
    }
    return true;
}

//**************************************
//函数概要：检查费用输入，小数位为2位，且不能超过数据字段money最大值的方法。
//param   ：Costctrl    要校验的输入框
//return  ：true/false
//**************************************
function IsCost( Costctrl ) {

    if( Costctrl.value != "") {
        if( isNum( Costctrl,"费用请填入金额！", 2 ) ) {
            if( !CheckFloatRange( Costctrl, -999999999.9999, 900337203685477.5807, "费用金额超出范围！" ) )
                return false;
            else
                return true;
        } else
            return false;
    } else
        return true;
}

//**************************************
//函数概要：判断是否是百分数的方法。
//param   ：arg         被判断对象
//return  ：true/false
//**************************************
function isPercent( arg ) {
    var strRegular = /^(\-)?(0|[1-9](\d)*)(\.(\d)+)?\%$/;
    return strRegular.test( arg );
}

//**************************************
//函数概要：把百分数转变为小数的方法。
//param   ：arg         被操作的百分数
//param   ：i           保留的小数位
//return  ：变化后的小数
//**************************************
function unPercent( arg, i ) {

    var ss = arg.substring( 0, arg.length - 1 );
    return Round( ss/100, i );

}

//**************************************
//函数概要：把小数转变为百分数的方法。
//param   ：arg         被操作的百分数（#.00%）
//return  ：变化后的百分数
//**************************************
function toPercent( arg ){

    var ss = parseFloat( arg, 10 ) * 100;

    ss =  Round(ss,2);

    return ss + "%";
}

//**************************************
//函数概要：判断一个字符串是否为有效的日期并且格式是否正确
//          日期格式：YYYY-MM-DD或者YYYY/MM/DD
//param   ：str         被检查的字符串
//return  ：true/false
//**************************************
function isDate( str ) {

    if( Trim( str ) == "" ) {
        return false;
    } else {

        try {

            // YYYY-MM-DD或者YYYY/MM/DD
            // r[1]=YYYY
            // r[2]="-"或者"/"
            // r[3]=MM
            // r[4]="-"或者"/"
            // r[5]=DD
            var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})(-|\/)(\d{1,2})$/);

            if( r == null ) {
                return false;
            }

            var d = new Date( r[1], r[3]-1, r[5] );

            if( d.getFullYear() == r[1] &&
                ( d.getMonth() + 1 ) == r[3] &&
                d.getDate() == r[5] ) {

                // 日期有效
                return true;
            } else {
                // 日期无效
                return false;
            }

        } catch( x ) {

            return false;
        }

    }
}

//**************************************
//函数概要：判断一个字符串是否为有效的日期时间并且格式是否正确
//          日期格式：YYYY-MM-DD hh:mm:ss或者YYYY/MM/DD hh:mm:ss
//param   ：str         被检查的字符串
//return  ：true/false
//**************************************
function isDateTime( str ) {

    if( Trim( str ) == "" ) {
        return false;
    } else {

        try {

            // YYYY-MM-DD hh:mm:ss或者YYYY/MM/DD hh:mm:ss
            // r[1]=YYYY
            // r[2]="-"或者"/"
            // r[3]=MM
            // r[4]="-"或者"/"
            // r[5]=DD
            // r[6]=hh
            // r[7]=mm
            // r[8]=ss
            var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})(-|\/)(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/);

            if( r == null ) {
                return false;
            }

            var d = new Date( r[1], r[3]-1, r[5], r[6], r[7], r[8] );

            if( d.getFullYear() == r[1] &&
                ( d.getMonth() + 1 ) == r[3] &&
                d.getDate() == r[5] &&
                d.getHours() == r[6] &&
                d.getMinutes() == r[7] &&
                d.getSeconds() == r[8] ) {

                // 日期时间有效
                return true;
            } else {
                // 日期时间无效
                return false;
            }

        } catch( x ) {

            return false;
        }

    }
}

//**************************************
//函数概要：将一个日期对象转化为格式yyyy-MM-dd字符串的方法。
//param   ：dateObj     日期对象
//return  ：日期对象
//**************************************
function DateToStr( dateObj ) {

    var im;
    var id;
    var paradate = new Date();

    paradate = dateObj;

    if( ( paradate.getMonth() + 1 ) < 10 ) {
        im = paradate.getMonth()+1;
        im = '0' + im;
    } else
        im = paradate.getMonth()+1;

    if( ( paradate.getDate() ) < 10 )
        id = "0" + paradate.getDate();
    else
        id = paradate.getDate();

    return paradate.getFullYear() + "-" + im + "-" + id;

}

//**************************************
//函数概要：将一个日期时间对象转化为字符串的方法。
//param   ：dateObj     日期对象
//return  ：形如 yyyy-MM-dd HH:mm:ss 的字符串
//**************************************
function DateTimeToStr( dateObj ) {

    var im;
    var id;
    var ih;
    var iminutes;
    var iseconds;
    var paradate = new Date();

    paradate = dateObj;

    if( ( paradate.getMonth() + 1 ) < 10 ) {
        im = paradate.getMonth()+1;
        im = '0' + im;
    } else
        im = paradate.getMonth() + 1;

    if( ( paradate.getDate() ) < 10 )
        id = "0"+paradate.getDate();
    else
        id = paradate.getDate();

    if( paradate.getHours() < 10 ) {
        ih = "0" + paradate.getHours();
    } else
        ih = paradate.getHours();

    if( paradate.getMinutes() < 10 ) {
        iminutes = "0" + paradate.getMinutes();
    } else
        iminutes = paradate.getMinutes();

    if( paradate.getSeconds() < 10 ) {
        iseconds = "0" + paradate.getSeconds();
    } else
        iseconds = paradate.getSeconds();

    var ret =  paradate.getFullYear() + "-" + im + "-"
         + id + " " + ih + ":" + iminutes + ":" + iseconds;

     return ret;

}

//**************************************
//函数概要：将字符串转化为日期对象的方法。
//param   ：str         日期字符串（格式：yyyy-MM-dd）
//return  ：date        日期对象
//**************************************
function StrToDate( str ) {
    var date = new Date();

    date = Date.parse(str);
    if( isNaN( date ) ) {

        // 识别日期格式：YYYY-MM-DD
        date = Date.parse(str.replace(/-/g,"/"));

        if( isNaN( date ) )
            date = 0;
    }

    date = new Date( date );

    return(date);
}

//**************************************
//函数概要：将一个字符串转化为日期时间对象的方法。
//param   ：str         日期字符串（格式：yyyy-MM-dd HH:mm:ss）
//return  ：date        日期对象
//**************************************
function StrToDateTime( str ) {

    var datTmp = new Date();

    try {

        var aryTmp    = str.split( ' ' );
        var aryTmpBig = aryTmp[0].split( '-' );
        var year      = aryTmpBig[0];
        var month     = aryTmpBig[1];
        var day       = aryTmpBig[2];
        var mm        =  month;

        if( mm.indexOf( '0' ) == 0 ) {
            mm = mm.substring( 1, mm.length );
        }

        var dd = day;

        if( mm == "1" )  { mm = "JAN"; }
        if( mm == "2" )  { mm = "FEB"; }
        if( mm == "3" )  { mm = "MAR"; }
        if( mm == "4" )  { mm = "APR"; }
        if( mm == "5" )  { mm = "MAY"; }
        if( mm == "6" )  { mm = "JUN"; }
        if( mm == "7" )  { mm = "JUL"; }
        if( mm == "8" )  { mm = "AUG"; }
        if( mm == "9" )  { mm = "SEP"; }
        if( mm == "10" ) { mm = "OCT"; }
        if( mm == "11" ) { mm = "NOV"; }
        if( mm == "12" ) { mm = "DEC"; }

        var expdate_string = mm + " " + dd + "," + year + " " + aryTmp[1];
        var mii = Date.parse(expdate_string);
        datTmp = new Date( mii );

    } catch(x) {
        alert('日期格式不正确！');
    }

    return datTmp;
}

//**************************************
//函数概要：将字符串转化为日期时间对象的方法。
//param   ：year        年参数
//param   ：month       月参数
//param   ：day         日参数
//param   ：hour        时参数
//param   ：minute      分参数
//param   ：second      秒参数
//return  ：date 日期对象
//**************************************
function StrToDateTime6P( year, month, day, hour, minute, second ) {

    var datTmp = new Date();
    var mm     = month;

    if( mm.indexOf('0') == 0 ) {
        mm = mm.substring( 1, mm.length );
    }

    var dd = day;

    if( mm == "1" )  { mm = "JAN"; }
    if( mm == "2" )  { mm = "FEB"; }
    if( mm == "3" )  { mm = "MAR"; }
    if( mm == "4" )  { mm = "APR"; }
    if( mm == "5" )  { mm = "MAY"; }
    if( mm == "6" )  { mm = "JUN"; }
    if( mm == "7" )  { mm = "JUL"; }
    if( mm == "8" )  { mm = "AUG"; }
    if( mm == "9" )  { mm = "SEP"; }
    if( mm == "10" ) { mm = "OCT"; }
    if( mm == "11" ) { mm = "NOV"; }
    if( mm == "12" ) { mm = "DEC"; }

    var expdate_string = mm + " " + dd + "," + year + " " +
                         hour + ":" + minute + ":" + second;

    try {
        var mii = Date.parse( expdate_string );
        datTmp  = new Date( mii );

    } catch( x ) {
        alert( '日期格式不正确！' );
    }

    return datTmp;
}

//**************************************
//函数概要：yyyy-MM-dd HH:mm:ss 的字符串转化为格式yyyy-MM-dd字符串
//param   ：str         日期字符串（格式：yyyy-MM-dd HH:mm:ss）
//return  ：strYMD      日期字符串（格式：yyyy-MM-dd）
//**************************************
function StrToStrYMD( str ) {

    // 返回的字符串
    var strYMD = "";

    if( str.length > 10 ) {
        strYMD = str.substring( 0, 10 );
    } else {
        strYMD = str;
    }

    return strYMD;
}

//**************************************
//函数概要：把一个日期加上n天的方法。
//param   ：dateObj     要计算的日期对象
//param   ：days        增加的天数
//return  ：增加后的新日期对象
//**************************************
function AddDay( dateObj, days ) {

    try {

        var lngDiff =  parseFloat(days);
        lngDiff = lngDiff*24*60*60*1000;
        dateObj = StrToDate(DateToStr(dateObj));
        var ret = new Date(dateObj.getTime()+lngDiff);
        return ret;
    } catch( x ) {
        return dateObj;
    }

}

//**************************************
//函数概要：自动计算两个日期间隔天数的方法。
//          先要检查开始日期是否大于截止日期,如果大于则中断函数返回。
//param   ：strStart     开始日期字符串（格式：yyyy-MM-dd）
//param   ：strEnd       截止日期字符串（格式：yyyy-MM-dd）
//return  ：overdue      两个日期间隔天数
//**************************************
function GetDateDiff( strStart, strEnd )　{

    var startdate = new Date();
    startdate = StrToDate( strStart );

    var enddate = new Date();
    enddate = StrToDate( strEnd );

    var overdue = parseFloat( enddate ) - parseFloat( startdate );

    overdue = overdue / ( 1000 * 24 * 60 * 60 );

    return overdue;

}

//**************************************
//函数概要：计算两个日期间隔天数。
//param   ：startDate    开始日期（日期类型）
//param   ：endDate      截止日期（日期类型）
//return  ：overdue     两个日期间隔小时数
//**************************************
function GetDayDiff( startDate, endDate ) {

    var overdue = Math.floor( ( endDate - startDate ) / ( 1000 * 24 * 60 * 60 ) );

    return overdue;

}

//**************************************
//函数概要：计算两个日期间隔小时数。
//param   ：startDate    开始日期（日期类型）
//param   ：endDate      截止日期（日期类型）
//return  ：overdue     两个日期间隔小时数
//**************************************
function GetHourDiff( startDate, endDate ) {

    var overdue = Math.floor( ( endDate - startDate ) / ( 1000 * 60 * 60 ) );

    return overdue;

}

//**************************************
//函数概要：计算两个日期间隔分钟数。
//param   ：startDate    开始日期（日期类型）
//param   ：endDate      截止日期（日期类型）
//return  ：overdue     两个日期间隔小时数
//**************************************
function GetMinuteDiff( startDate, endDate ) {

    var overdue = Math.floor( ( endDate - startDate ) / ( 1000 * 60 ) );

    return overdue;

}

//**************************************
//函数概要：比较两个日期的大小的方法。
//param   ：BDate       开始日期输入框（格式：yyyy-MM-dd）
//param   ：EDate       结束日期输入框（格式：yyyy-MM-dd）
//param   ：Msg         出错显示的信息
//return  ：true/false（如果开始日期大于结束日期，返回false）
//**************************************
function CheckDiffDate( BDate, EDate, Msg ) {

    if( ( !CheckEmpty( BDate, "请输入开始时间或日期！" ) ) ||
        ( !CheckEmpty( EDate, "请输入结束时间或日期！" ) ) )
        return false;

    str = BDate.value;

    if( !isDate( str ) ) {
        DispMessage( BDate, "开始时间或日期不是有效的日期" );
        return false;
    }

    aa     = str.split( "-" );
    BYear  = parseInt( aa[0], 10);
    BMonth = parseInt( aa[1], 10);
    BDay   = parseInt( aa[2], 10);
    str    = EDate.value;

    if( !isDate( str ) ) {
        DispMessage( EDate, "结束时间或日期不是有效的日期" );
        return false;
    }

    bb     = str.split( "-" );
    EYear  = parseInt( bb[0], 10);
    EMonth = parseInt( bb[1], 10);
    EDay   = parseInt( bb[2], 10);

    if( BYear < 1900 ) {
        DispMessage( BDate, "日期不能小于1900年！" );
        return false;
    }

    if( EYear < 1900 ) {
        DispMessage( EDate, "日期不能小于1900年！" );
        return false;
    }

    b = ( BYear*10000 ) + ( BMonth*100 ) + BDay;
    e = ( EYear*10000 ) + ( EMonth*100 ) + EDay;

    if( e == b )
        return true;
    else
        if( e > b )
            return true;
        else {
            DispMessage( BDate, Msg );
            return false;
        }
}

//**************************************
//函数概要：检查输入是否是个有效年份的方法。
//param   ：strYearInput  年份字符串（格式：yyyy）
//return  ：true/false
//**************************************
function CheckYear( strYearInput ) {

    var years = strYearInput;

    if( years != ""  && !isNaN( parseInt( years ) ) ) {
        if( parseInt(years) <= 3000 && parseInt( years ) >= 1900 ) {
            return true;
        } else {
            alert( '请输入合法年份!' );
            return false;
        }
    } else
        return true;

}

