function isIDCard(num, sExam) {
    num = num.toUpperCase();
    //身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X。  
    if (! (/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
        return false;
    } else {
        if (sExam == 1) {
            //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。 
            //下面分别分析出生日期和校验位 
            var len, re;
            len = num.length;
            if (len == 15) {
                re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
                var arrSplit = num.match(re);

                //检查生日日期是否正确 
                var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
                var bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
                if (!bGoodDay) {
                    return false;
                } else {
                    //将15位身份证转成18位 
                    //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。 
                    var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                    var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
                    var nTemp = 0, i;
                    num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
                    for (i = 0; i < 17; i++) {
                        nTemp += num.substr(i, 1) * arrInt[i];
                    }
                    num += arrCh[nTemp % 11];
                    return true;
                }
            }
            if (len == 18) {
                re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
                var arrSplit = num.match(re);

                //检查生日日期是否正确 
                var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
                var bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
                if (!bGoodDay) {
                    return false;
                } else {
                    //检验18位身份证的校验码是否正确。 
                    //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。 
                    var valnum;
                    var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                    var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
                    var nTemp = 0, i;
                    for (i = 0; i < 17; i++) {
                        nTemp += num.substr(i, 1) * arrInt[i];
                    }
                    valnum = arrCh[nTemp % 11];
                    if (valnum != num.substr(17, 1)) {
                        return false;
                    }
                    return true;
                }
            }
            return false;
        } else {
            return true;
        }
    }
}

/**/
/**
 * 通过身份证号的得到出生日期函数
 * 参数：iIdNo 身份证号码
 *       iBS 指定返回的类型,1为出生日期，2为性别
 * 返回   出生日期或性别
*/
function getBirthdat(iIdNo, iBS) {
    var tmpStr = "";
    var idDate = "";
    var tmpInt = 0;
    var strReturn = "";

    if ((iIdNo.length != 15) && (iIdNo.length != 18)) {
        strReturn = "";
        return strReturn;
    }

    if (iIdNo.length == 15) {
        if (iBS == 1) {
            tmpStr = iIdNo.substring(6, 12);
            tmpStr = "19" + tmpStr;
            tmpStr = tmpStr.substring(0, 4) + "-" + tmpStr.substring(4, 6) + "-" + tmpStr.substring(6)
        } else {
            tmpStr = (parseInt(iIdNo.charAt(14) / 2) * 2 != iIdNo.charAt(14)) ? "男" : "女";
        }
        return tmpStr;
    } else { // if(iIdNo.length==18)
        if (iBS == 1) {
            tmpStr = iIdNo.substring(6, 14);
            tmpStr = tmpStr.substring(0, 4) + "-" + tmpStr.substring(4, 6) + "-" + tmpStr.substring(6)
        } else {
            tmpStr = (parseInt(iIdNo.charAt(16) / 2) * 2 != iIdNo.charAt(16)) ? "男" : "女";
        }
        return tmpStr;
    }
}

function isValidEmail(email) {
    invalid = "";

    if (!email) {
        invalid = "请输入您的Email地址。";
        //return false;
    } else {
        if ((email.indexOf("@") == -1) || (email.indexOf(".") == -1)) invalid += "\n\nEmail地址不合法。应当包含'@'和'.'；例如('.com')。请检查后再递交。";

        if (email.indexOf("your email here") > -1) invalid += "\n\nEmail地址不合法，请检测您的Email地址，在域名内应当包含'@'和'.'；例如('.com')。";

        if (email.indexOf("\\") > -1) invalid += "\n\nEmail地址不合法，含有非法字符(\\)。";

        if (email.indexOf("/") > -1) invalid += "\n\nEmail地址不合法，含有非法字符(/)。";

        if (email.indexOf("'") > -1) invalid += "\n\nEmail地址不合法，含有非法字符(')。";

        if (email.indexOf("!") > -1) invalid += "\n\nEmail地址不合法，含有非法字符(!)。";

        if ((email.indexOf(",") > -1) || (email.indexOf(";") > -1)) invalid += "\n\n只输入一个Email地址，不要含有分号和逗号。";

        if (email.indexOf("?subject") > -1) invalid += "\n\n不要加入'?subject=...'。";

    }

    if (invalid == "") {
        return true;
    } else {
        return false;
    }
}

//验证手机号
String.prototype.isMobile = function() {
    return (/^(?:13\d|15\d|18[0-9])-?\d{5}(\d{3}|\*{3})$/.test(this));
}

//验证电话
String.prototype.isTel = function() {
    //"兼容格式: 国家代码(2到3位)-区号(2到3位)-电话号码(7到8位)-分机号(3位)"
    return (/^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/.test(this));
}

/**
*校验字符串是否为日期型
*返回值：
*DateString日期字符串，Dilimeter分隔符
*如果为空，定义校验通过，           返回false
*如果字串为日期型，校验通过，       返回true
*如果日期不合法，                   返回false    参考提示信息：输入域的时间不合法！（yyyy-MM-dd）
*/
function isDate(str) {
    var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/;
    var r = str.match(reg);
    if (r == null) {
        return false;
    } else {
        var d = new Date(r[1], r[3] - 1, r[4]);
        var newStr = d.getFullYear() + r[2] + (d.getMonth() + 1) + r[2] + d.getDate();
		return true;
    }
}
