﻿//=========================================================
// 文件说明：提供常用的字符串格式验证方法。 
// -------------------------------------------------------
// 作者：serafin
// 说明：封装原型并创建原型对象，用于通过对象直接调用方法
// 示例：vHelper.isNull("#####"),返回false
//=========================================================

var o = {};

o.checkTwoDate = function (startDate, endDate) { return v_checkTwoDate(startDate, endDate); }
o.isChinaOrNumOrLett = function (str) { return v_isChinaOrNumOrLett(str); }
o.isDate = function (str) { return v_isDate(str); }
o.isDateTime = function (str) { return v_isDateTime(str); }
o.isDecimal = function (str) { return v_isDecimal(str); }
o.isEmail = function (str) { return v_isEmail(str); }
o.isFirstMatch = function (str1, str2) { return v_isFirstMatch(str1, str2); }
o.isEmail = function (str) { return v_isEmail(str); }
o.isFirstMatch = function (str1, str2) { return v_isFirstMatch(str1, str2); }
o.isInt = function (str) { return v_isInt(str); }
o.isIP = function (str) { return v_isIP(str); }
o.isURL = function (str) { return v_isURL(str); }
o.isLastMatch = function (str1, str2) { return v_isLastMatch(str1, str2); }
o.isLeapYear = function (str) { return v_isLeapYear(str); }
o.isMatch = function (str1, str2) { return v_isMatch(str1, str2); }
o.isMobileNum = function (str) { return v_isMobileNum(str); }
o.isMoney = function (str) { return v_isMoney(str); }
o.isNulls = function (str) { return v_isNulls(str); }
o.isMobileNo = function (str, cmsg, emsg) { return v_isMobileNo(str, cmsg, emsg); }
o.isNull = function (str, cmsg, emsg) { return v_isNull(str, cmsg, emsg); }
o.checkDate = function (cBeginDate, cEndDate, cMsg, eMsg) { return v_Date(cBeginDate, cEndDate, cMsg, eMsg); }
o.checkDateVale = function (BeginDae, EndDate) { return v_DateVale(BeginDae, EndDate); }
o.compareNum = function (cNum1, symbol, cNum2, cMsg, eMsg) { return v_CompareNum(cNum1, symbol, cNum2, cMsg, eMsg); }
o.compareStr = function (str1, str2, spId, eMsg) { return v_CompareStr(str1, str2, spId, eMsg); }
o.isNumOrLetter = function (str) { return v_isNumOrLetter(str); }
o.isNumOrLetter2 = function (str) { return v_isNumOrLetter2(str); }
o.isPort = function (str) { return v_isPort(str); }
o.isPostalCode = function (str) { return v_isPostalCode(str); }
o.isTime = function (str) { return v_isTime(str); }
o.isUnsignedInt = function (str) { return v_isUnsignedInt(str); }
o.checkIDcardGetInfo = function (str) { return v_checkIDcardGetInfo(str); }
o.iSInNumRange = function (num, start, end) { return ISInNumRange(num, start, end); }
o.isCardNo = function (objId, spId, emsg) { return IsCardNo(objId, spId, emsg); }
o.isBankAccount=function(objId,spId,emsg){return v_IsBankAccount(objId,spId,emsg);}
o.isNaN = function (objId, spId, emsg) { return v_IsNaN(objId, spId, emsg); }

o.checkNullAndShowMsg = function (objId, msgId, msgContent) { return vf_checkNullAndShowMsg(objId, msgId, msgContent); }

o.checkPostalCodeAndShowMsg = function (objId, msgId, msgContent) { return vf_checkPostalCodeAndShowMsg(objId, msgId, msgContent); }
o.checkNumAndShowMsg = function (objId, msgId, msgContent) { return vf_checkNumAndShowMsg(objId, msgId, msgContent); }
o.checkIDcardGetInfo = function (objId, msgId, msgContent) { return vf_checkIDcardGetInfo(objId, msgId, msgContent); }
o.checkShowMsg = function (boolobj, msgId, msgContent) { return vf_checkShowMsg(boolobj, msgId, msgContent); }
o.checkValidateResult = function (vResult) { return v_checkValidateResult(vResult); }

o.ShowSuccess = function (spId, msg) { v_ShowSuccess(spId, msg); }
o.ShowError = function (spId, msg) { v_ShowError(spId, msg); }
var ValidateHelper = new Function();
ValidateHelper.prototype = o;

var vHelper = new ValidateHelper();

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

var onSuccess = "<img src='Images/onSuccess.gif'/>";
var onError = "<span><img src='Images/onError.gif'/>";
var onEnd = "</span>";

/*
* 【函数】：判断字符串是否为空
* 【参数】：str 输入的字符串
* 【返回】：如果全是空返回true,否则返回false
*/
function v_isNulls(str) {
    if (str == ""||str==null||str==undefined) {
        return true;
    }
    var regu = "^[ ]+$";
    var re = new RegExp(regu);
    return re.test(str);
}

/*
*Function:验证手机号码
*Author:Kenny
*CreateDate:2010-01-07
*Param:cName(要被验证的控件ID)
*Param:cMsg(验证后显示信息的标签ID)
*Param:eMsg(显示的错误信息)
*/
function v_isMobileNo(cName, cMsg, eMsg) {
    var mobileNo = $("#" + cName).val();
    var eMessage = $("#" + cMsg);

    var regu = /^1[3,5,8]\d{9}$/;
    var re = new RegExp(regu);
    if (re.test(mobileNo)) {
        eMessage.text("");
        return true;
    } else {
        eMessage.html(onError + eMsg + onEnd);
        return false;
    }
}

/*
*Function:验证是否为空值
*Author:Kenny
*CreateDate:2009-09-29
*Param:cName(要被验证的控件ID)
*Param:cMsg(验证后显示信息的标签ID)
*Param:eMsg(显示的错误信息)
*/
function v_isNull(cName, cMsg, eMsg) {
    var controlValue = $("#" + cName).val();
    var eMessage = $("#" + cMsg);
    if (controlValue == "" || controlValue == null || controlValue == undefined) {
        eMessage.html(onError + eMsg + onEnd);
        return false;
    }
    else {
        eMessage.text("");
        return true;
    }
};

/*
*Function:验证两个日期
*Author:Kenny
*CreateDate:2009-10-06
*Param:cBeginDate(起初日期的控件ID)(如果等空,则为今天日期)
*Param:cEndDate(结束日期的控件ID)
*Param:cMsg(验证后显示信息的标签ID)
*Param:eMsg(显示的错误信息)
*/
function v_Date(cBeginDate, cEndDate, cMsg, eMsg) {

    var eMessage = $("#" + cMsg);
    var beginDate = $("#" + cBeginDate).val();
    var endDate = $("#" + cEndDate).val();

    // 当天日期
    if (cBeginDate == '') {
        var today = new Date();
        beginDate = today.getYear() + "-" + (today.getMonth() + 1) + "-" + today.getDate();
    }
    beginDate = new Date(Date.parse(beginDate.replace(/-/g, "/")));

    endDate = new Date(Date.parse(endDate.replace(/-/g, "/")));

    if (beginDate > endDate) {
        eMessage.html(onError + eMsg + onEnd);
        return false;
    }
    else {
        eMessage.text("");
        return true;
    }
}

/*
*Function:验证两个日期
*Author:Kenny
*CreateDate:2009-10-06  :2009/10/06
*Param:BeginDate(开始日期)
*Param:EndDate(结束日期)
*/
function v_DateVale(BeginDate, EndDate) {

    var beginDate = BeginDate;
    var endDate = EndDate;
    beginDate = new Date(Date.parse(BeginDate.replace(/-/g, "/")));
    endDate = new Date(Date.parse(endDate.replace(/-/g, "/")));

    if (beginDate > endDate) {
        return false;
    }
    else {
        return true;
    }
}


/*
*Function:两个数值大小比较
*Author:Kenny
*CreateDate:2009-10-07
*Param:cNum1(要被验证的控件1ID)
*Param:symbol(符号,分别有:>、>=、< 或<= )
*Param:cNum2(要被验证的控件2ID)
*Param:cMsg(验证后显示信息的标签ID)
*Param:eMsg(显示的错误信息)
*/
function v_CompareNum(cNum1, symbol, cNum2, cMsg, eMsg) {
    var eMessage = $("#" + cMsg);
    var num1 = $("#" + cNum1).val();
    var num2 = $("#" + cNum2).val();

    num1 = new Number(num1);
    num2 = new Number(num2);

    switch (symbol) {
        case ">":
            if (num1 > num2) {
                eMessage.html(onError + eMsg + onEnd);
                return false;
            }
            else {
                eMessage.text("");
                return true;
            }
        case ">=":
            if (num1 >= num2) {
                eMessage.html(onError + eMsg + onEnd);
                return false;
            }
            else {
                eMessage.text("");
                return true;
            }
        case "<":
            if (num1 < num2) {
                eMessage.html(onError + eMsg + onEnd);
                return false;
            }
            else {
                eMessage.text("");
                return true;
            }
        case "<=":
            if (num1 <= num2) {
                eMessage.html(onError + eMsg + onEnd);
                return false;
            }
            else {
                eMessage.text("");
                return true;
            }
    }
}
/* 
* 【函数】：判断两个字符串是否想等
* 【参数】：str1第一个字符串控件Id,str2第二个字符串Id，spId显示消息的Id,eMsg提示消息
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_CompareStr(str1, str2, spId, eMsg) {
    var value1 = $("#" + str1).val();
    var value2 = $("#" + str2).val();
    if (value1 != value2) {
        $("#" + spId).html(onError + eMsg + onEnd);
        return false;
    }
    return true;
}

/* 
* 【函数】：判断IP地址
* 【参数】：strIP ip地址
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isIP(strIP) {
    var re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g //匹配IP地址的正则表达式
    if (re.test(strIP)) {
        if (RegExp.$1 < 256 && RegExp.$2 < 256 && RegExp.$3 < 256 && RegExp.$4 < 256) return true;
    }
    return false;
}




/*
* 【函数】：判断整数
* 【参数】：str 输入的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isInt(str) {
    var regu = /^[-]{0,1}[0-9]{1,}$/;
    return regu.test(str);
}


/*
* 【函数】：判断手机号码
* 【参数】：str 输入的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isMobileNum(str) {
    var regu = /^1[3,5,8]\d{9}$/;
    var re = new RegExp(regu);
    return re.test(str);
}


/*
* 【函数】：检查字符串是否符合正整数格式
* 【参数】：str 输入的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isUnsignedInt(str) {
    var regu = "^[0-9]+$";
    var re = new RegExp(regu);
    return re.test(str);
}


/*
* 【函数】：检查字符串是否是带小数的数字格式,可以是负数
* 【参数】：str 输入的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isDecimal(str) {
    if (v_isInt(str)) {
        return true;
    }
    var re = /^[-]{0,1}(\d+)[\.]+(\d+)$/;
    if (re.test(str)) {
        if (RegExp.$1 == 0 && RegExp.$2 == 0) {
            return false;
        }
        return true;
    }
    else {
        return false;
    }
}


/*
* 【函数】：检查对象的值是否符合端口号格式
* 【参数】：str 输入的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isPort(str) {
    return (isNaN(str) && str < 65536);
}


/*
* 【函数】：检查对象的值是否符合E-Mail格式
* 【参数】：str 输入的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isEmail(str) {
    var re = /^[-_A-Za-z0-9]+@([_A-Za-z0-9]+\.)+[A-Za-z0-9]{2,3}$/;
    return (re.test(str));
}


/*
* 【函数】：检查对象的值是否符合邮政编码（中国）格式
* 【参数】：str 输入的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isPostalCode(str) {
    var pattern = /^[0-9]{6}$/;
    if (!pattern.exec(str)) {
        return false;
    }
    return true;
}


/*
* 【函数】：检查字符串是否符合金额格式，格式定义为带小数的正数，小数点后最多三位（如：123.321）
* 【参数】：str 输入的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isMoney(str) {
    var regu = "^[0-9]+[\.][0-9]{0,3}$";
    var re = new RegExp(regu);
    if (re.test(str)) return true;
    else return false;
}


/*
* 【函数】：检查字符串是否只由英文字母和数字和下划线组成
* 【参数】：str 输入的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isNumOrLetter(str) {
    var regu = "^[0-9a-zA-Z\_]+$";
    var re = new RegExp(regu);
    return (re.test(str));
}


/*
* 【函数】：检查字符串是否只由英文字母和数字组成
* 【参数】：str 字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isNumOrLetter2(str) {//判断是否是数字或字母
    var regu = "^[0-9a-zA-Z]+$";
    var re = new RegExp(regu);
    return (re.test(str));
}


/*
* 【函数】：检查字符串是否只由汉字、字母、数字组成
* 【参数】：str 字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isChinaOrNumOrLett(str) {
    var regu = "^[0-9a-zA-Z\u4e00-\u9fa5]+$";
    var re = new RegExp(regu);
    return (re.test(str));
}


/*
* 【函数】：判断是否是时间（正确的格式如："11:11:111"）
* 【参数】：str 日期字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isTime(str) {
    var a = str.match(/^(\d{0,2}):(\d{0,2}):(\d{0,3})$/);
    if (a == null) {
        return false;
    }
    if (a[1] >= 24 || a[2] >= 60) {
        return false;
    }
    return true;
}


/*
* 【函数】：判断是否是日期（正确的格式如："2009-11-11" or "2009/11/11"）
* 【参数】：str 时间字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isDate(str) {
    var tempCount = 0;
    while (v_isMatch(str, "/")) {
        str = str.replace('/', '-');
        tempCount++;
    }
    if (tempCount == 1) {
        return false;
    }
    var a = str.match(/^(\d{0,4})-(\d{0,2})-(\d{0,2})$/);
    if (a == null) {
        return false;
    }
    var monDays = getMaxDay(a[1], a[2]);
    if (a[3] > monDays) {
        return false;
    }
    return true;
}

/*
* 【函数】：判断是否是日期时间（正确的格式如："2009-11-11 11:11:111" or "2009/11/11 11:11:111"）
* 【参数】：str 日期时间字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isDateTime(str) {
    var tempCount = 0;
    while (v_isMatch(str, "/")) {
        str = str.replace('/', '-');
        tempCount++;
    }
    if (tempCount == 1) {
        return false;
    }
    var a = str.match(/^(\d{0,4})-(\d{0,2})-(\d{0,2}) (\d{0,2}):(\d{0,2}):(\d{0,3})$/);
    if (a == null || !v_isDate(a[1] + "-" + a[2] + "-" + a[3]) || a[4] >= 24 || a[5] >= 60) {
        return false;
    }
    return true;
}


/*
* 【函数】：判断是否是闰年
* 【参数】：str 年份
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isLeapYear(year) {
    if (v_isNulls(year) || year.length != 4) {
        return false;
    }
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        return true;
    }
    else {
        return false;
    }
}


/*
* 【函数】：字符1是否以字符串2结束
* 【参数】：str1：字符串；str2：被包含的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isLastMatch(str1, str2) {
    var index = str1.lastIndexOf(str2);
    if (str1.length == index + str2.length) {
        return true;
    }
    else {
        return false;
    }
}


/*
* 【函数】：字符1是否以字符串2开始
* 【参数】：str1：字符串；str2：被包含的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isFirstMatch(str1, str2) {
    var index = str1.indexOf(str2);
    if (index == 0) {
        return true;
    }
    else {
        return false;
    }
}


/*
* 【函数】：字符1是包含字符串2
* 【参数】：str1：字符串； str2：被包含的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isMatch(str1, str2) {
    var index = str1.indexOf(str2);
    if (index == -1) {
        return false;
    }
    else {
        return true;
    }
}


/*
* 【函数】：检查起止日期是否正确，规则为两个日期的格式正确，且结束如期>=起始日期
* 【参数】：startDate：起始日期(字符串)； endDate：结束如期(字符串)
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_checkTwoDate(startDate, endDate) {
    if (!v_isDate(startDate)) {
        return false;
    }
    else if (!v_isDate(endDate)) {
        return false;
    }
    else {
        var starInt = DateToInt(startDate);
        var endInt = DateToInt(endDate);
        if (starInt > endInt) {
            return false;
        }
    }
    return true;
}

/*
* 【函数】：检查身份证号码是否正确
* 【参数】：str:身份证号码字符串
* 【返回】：校验信息（null=无误；"msg"=有误，其中的msg表示错误信息）
*/
function v_checkIDcardGetInfo(str) {
    var ID_card = "";         //用于存放身份证
    var fMod = 11; 	          //身份证算法求模关键值
    var oldIDLen = 15; 	      //旧身份证长度  
    var newIDLen = 18;  	  //新身份证长度
    var yearFlag = "19"; 	  //新身份证年份标志   
    var Wi = new Array();     //位权值数组
    var varArray = new Array();
    var birthday = ''; 	      //生日
    var checkDigit = ''; 	  //校验位
    var numSum = 0; 		  //数字和
    var regStr = /^\d{15,17}([\dxX]{1})?$/;     //身份证验证的正则表达式
    var msg = null;           //返回的信息

    // 检查输入值是否为空
    if (v_isNulls(str)) {
        msg = "输入为空";
        return msg;
    }
    else {
        ID_card = str;
    }

    // 检查长度
    var IDcardLen = ID_card.length;
    if ((IDcardLen != 15) && (IDcardLen != 18)) {
        msg = "身份证长度必须为15或18位";
        return msg;
    }
    // 匹配正则表达式
    if (!regStr.test(ID_card)) {
        msg = "身份证号码必须为数字(18位的新身份证最后一位可以是x)";
        return msg;
    }

    // 验证身份证中的日期部分
    if (IDcardLen == 15) {
        birthday = "19" + ID_card.substring(6, 8) + "-" + ID_card.substring(8, 10) + "-" + ID_card.substring(10, 12);
    }
    else {
        birthday = ID_card.substring(6, 10) + "-" + ID_card.substring(10, 12) + "-" + ID_card.substring(12, 14);
    }
    if (!v_isDate(birthday)) {
        msg = "身份证号码中的日期格式不对(第6-12位)";
        return msg;
    }

    if (IDcardLen == 18) {
        for (var i = 0; i < newIDLen - 1; i++) {
            var k = Math.pow(2, newIDLen - 1 - i);
            Wi[i] = k % 11;
        }
        for (var i = 0; i < IDcardLen - 1; i++) {
            varArray[i] = ID_card.charAt(i);
            varArray[i] = varArray[i] * Wi[i];
            numSum = numSum + varArray[i];
        }
        checkDigit = 12 - numSum % 11;
        switch (checkDigit) {
            case 10:
                checkDigit = 'X';
                break;
            case 11:
                checkDigit = 0;
                break;
            case 12:
                checkDigit = 1;
                break;
        }

        // 检查最后一位（校验位）
        if (ID_card.charAt(17).toUpperCase() != checkDigit) {
            msg = "身份证最后一位校验码不对，应该为" + checkDigit;
            return msg;
        }
    }
    return msg;
}


/*
* 【函数】：检查验证结果
* 【参数】：vResult：Json（格式为如：var validateResult = {Items: [
{ Key: "OwnerName", Value: false },
{ Key: "OwnerCard", Value: false },
{ Key: "StoreName", Value: false },
{ Key: "Address", Value: false },
{ Key: "Zipcode", Value: false },
{ Key: "Tel", Value: false }
]};）
* 【返回】：验证通过返回true，否则返回false
*/
function v_checkValidateResult(vResult) {

    for (var i = 0; i < vResult.Items.length; i++) {
        if (vResult.Items[i].Value == false) {
            return false;
        }
    }
    return true;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*
* 【函数】：判断控件（一般是文本框）的值是否是空，为空的话在指定的控件上显示信息
* 【参数】：objId：要进行验证的控件的id；
*           msgId：要显示验证信息的控件的id；
*           msgContent:验证不通过要显示的信息
* 【返回】：通过验证返回true,否则返回false
*/
function vf_checkNullAndShowMsg(objId, msgId, msgContent) {
    var obj = document.getElementById(objId);
    var msg = document.getElementById(msgId);
    if (v_isNulls(obj.value)) {
        msg.innerHTML = msgContent;
        return false;
    }
    else {
        msg.innerHTML = "";
        return true;
    }
}


/*
* 【函数】：判断控件（一般是文本框）的值是否是（中国）邮编，不是的话在指定的控件上显示信息
* 【参数】：objId：要进行验证的控件的id；
*           msgId：要显示验证信息的控件的id；
*           msgContent:验证不通过要显示的信息
* 【返回】：通过验证返回true,否则返回false
*/
function vf_checkPostalCodeAndShowMsg(objId, msgId, msgContent) {
    var obj = document.getElementById(objId);
    var msg = document.getElementById(msgId);
    if (v_isPostalCode(obj.value)) {
        msg.innerHTML = "";
        return true;
    }
    else {
        msg.innerHTML = msgContent;
        return false;
    }
}


/*
* 【函数】：判断控件（一般是文本框）的值是否是数字，不是的话在指定的控件上显示信息
* 【参数】：objId：要进行验证的控件的id；
*           msgId：要显示验证信息的控件的id；
*           msgContent:验证不通过要显示的信息
* 【返回】：通过验证返回true,否则返回false
*/
function vf_checkNumAndShowMsg(objId, msgId, msgContent) {
    var obj = document.getElementById(objId);
    var msg = document.getElementById(msgId);
    if (isNaN(obj.value) || v_isNulls(obj.value)) {
        msg.innerHTML = msgContent;
        return false;
    }
    else {
        msg.innerHTML = "";
        return true;
    }
}

/*
* 【函数】：显示提示错误信息
* 【参数】：boolobj：验证数据是否正确；
*           msgId：要显示验证信息的控件的id；
*           msgContent:验证不通过要显示的信息
* 【返回】：通过验证返回true,否则返回false
*/
function vf_checkShowMsg(boolobj, msgId, msgContent) {

    var msg = document.getElementById(msgId);
    if (!boolobj) {
        msg.innerHTML = (onError + msgContent + onEnd);  //msgContent;
        return false;
    }
    else {
        msg.innerHTML = "";
        return true;
    }
}

/*
* 【函数】：判断控件（一般是文本框）的值是否是身份证号，不是的话在指定的控件上显示信息
* 【参数】：objId：要进行验证的控件的id；
*           msgId：要显示验证信息的控件的id；
*           msgContent:验证不通过要显示的信息
* 【返回】：通过验证返回true,否则返回false
*/
function vf_checkIDcardGetInfo(objId, msgId, msgContent) {
    var obj = document.getElementById(objId);
    var msg = document.getElementById(msgId);
    if (v_checkIDcardGetInfo(obj.value) || v_isNulls(obj.value)) {
        msg.innerHTML = msgContent;
        return false;
    }
    else {
        msg.innerHTML = "";
        return true;
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/*
* 【函数】：获取每月的最后一天日期值.
* 【参数】：date：年份； month：月份
* 【返回】：如果通过验证返回true,否则返回false
*/
function getMaxDay(year, month) {
    if (month == 2) {
        // 如果是2月份，那么要考虑闰年
        return v_isLeapYear(year) ? "29" : "28";
    }
    else if (month == 4 || month == 6 || month == 9 || month == 11) {
        // 是小月，那么有30天
        return "30";
    }
    else {
        return "31";
    }
}

/*
* 【函数】：按照年日月将日期格式的字符串转为整形（如："2009-11-11"转为20091111）
* 【参数】：str 日期格式的字符串
* 【返回】：如果通过验证返回true,否则返回false
*/
function DateToInt(str) {
    while (v_isMatch(str, "/")) {
        str = str.replace('/', '');
    }
    while (v_isMatch(str, "-")) {
        str = str.replace('-', '');
    }
    return str;
}

/*
* 【函数】：判断输入的数字是否在范围内
* 【参数】：num输入的数字，start 起始位置，end 终止位置
* 【返回】：如果通过验证返回true,否则返回false
*/
function ISInNumRange(num, start, end) {
    if ((Number(num) >= start) && (Number(num) <= end)) {
        return true;
    }
    else {
        return false;
    }
}
//身份证号码严格验证
function IsCardNo(objId, spId, msg) {
    var cardNo = $("#" + objId).val();
    var objSp = $("#" + spId);
    if (cardNo == "" || cardNo == null || cardNo == undefined) {
        objSp.html(onError + msg + onEnd);  //msgContent;
        return false;
    }
    //---------------------------------------
    var Errors = new Array(
            "验证通过!",
            "身份证号码位数不对!",
            "身份证号码出生日期超出范围或含有非法字符!",
            "身份证号码校验错误!",
            "身份证地区非法!"
             );
    var area = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北", 43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏", 61: "陕西", 62: "甘肃", 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外" }

    var idcard, Y, JYM;
    var S, M;
    var idcard_array = new Array();
    idcard_array = cardNo.split("");
    /*地区检验*/
    if (area[parseInt(cardNo.substr(0, 2))] == null) {
        objSp.html(onError + msg + onEnd);  //msgContent;
        return false;
    }
    if (cardNo.length != 18) {
        objSp.html(onError + msg + onEnd);  //msgContent;
        return false;
    }
    //18位身份号码检测
    //出生日期的合法性检查 
    //闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
    //平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
    if (parseInt(cardNo.substr(6, 4)) % 4 == 0 || (parseInt(cardNo.substr(6, 4)) % 100 == 0 && parseInt(cardNo.substr(6, 4)) % 4 == 0)) {
        ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/; //闰年出生日期的合法性正则表达式
    } else {
        ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/; //平年出生日期的合法性正则表达式
    }
    if (ereg.test(cardNo)) {//测试出生日期的合法性
        //计算校验位
        S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
                   + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
                   + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
                   + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
                   + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
                   + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
                   + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
                   + parseInt(idcard_array[7]) * 1
                   + parseInt(idcard_array[8]) * 6
                   + parseInt(idcard_array[9]) * 3;
        Y = S % 11;
        M = "F";
        JYM = "10X98765432";
        M = JYM.substr(Y, 1);
        if (M != idcard_array[17]) {
            objSp.html(onError + msg + onEnd);  //msgContent;
            return false;
        }
        return true;
    }
    objSp.html(onError + msg + onEnd);
    return false;
}

/* 
* 【函数】：判断网址
* 【参数】：str ip地址
* 【返回】：如果通过验证返回true,否则返回false
*/
function v_isURL(cName) {

    var strURL = $("#" + cName).val();
    var strRegex = "^((https|http|ftp|rtsp|mms)?://)"
        + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@ 
            + "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184 
            + "|" // 允许IP和DOMAIN（域名）
            + "([0-9a-z_!~*'()-]+\.)*" // 域名- www. 
            + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二级域名 
            + "[a-z]{2,6})" // first level domain- .com or .museum 
            + "(:[0-9]{1,4})?" // 端口- :80 
            + "((/?)|" // a slash isn't required if there is no file name 
            + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
    var re = new RegExp(strRegex);

    if (re.test(strURL)) {

        return (true);
    } else {

        return false;
    }

}
/*
*【函数】判断16或19位银行卡账号
*【参数】objId:文本框控件Id;spId:文本域Id;emsg：提示消息
*【返回】验证通过返回true;否则返回false
*/
function v_IsBankAccount(objId,spId,emsg){
    var obj = document.getElementById(objId);
    var msg = document.getElementById(spId);
    var reg = /^\d{19}$/g;   // 以19位数字开头，以19位数字结尾
    var shortReg=/^\d{16}$/g;   // 以16位数字开头，以16位数字结尾
    if( !reg.test(obj.value)&&!shortReg.test(obj.value))
    {
        msg.innerHTML =onError + emsg + onEnd;
        return false;
    }
    else {
        msg.innerHTML = "";
        return true;
    }
}

function v_IsNaN(objId, spId, emsg) {
    var obj = document.getElementById(objId);
    var msg = document.getElementById(spId);
    if (isNaN(obj.value)) {
        msg.innerHTML = onError + emsg + onEnd;
        return false;
    }
    else {
        msg.innerHTML = "";
        return true;
    }
}

function v_ShowSuccess(cName, msg) {
    $("#" + cName).html(onSuccess + msg + onEnd);
}
function v_ShowError(cName, msg) {
    $("#" + cName).html(onError + msg + onEnd);
}
