function jcv_isValidDate(day, month, year) {
    if (month < 1 || month > 12) {
        return false;
    }
    if (day < 1 || day > 31) {
        return false;
    }
    if ((month == 4 || month == 6 || month == 9 || month == 11) &&
        (day == 31)) {
        return false;
    }
    if (month == 2) {
        var leap = (year % 4 == 0 &&
                    (year % 100 != 0 || year % 400 == 0));
        if (day > 29 || (day == 29 && !leap)) {
            return false;
        }
    }
    return true;
}

function validateDate(datePattern, value) {
    var bValid = true;
    var isStrict = true;
    if ((value.length > 0) && (datePattern.length > 0)) {
        var MONTH = "MM";
        var DAY = "dd";
        var YEAR = "yyyy";
        var orderMonth = datePattern.indexOf(MONTH);
        var orderDay = datePattern.indexOf(DAY);
        var orderYear = datePattern.indexOf(YEAR);
        if ((orderDay < orderYear && orderDay > orderMonth)) {
            var iDelim1 = orderMonth + MONTH.length;
            var iDelim2 = orderDay + DAY.length;
            var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
            var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
            if (iDelim1 == orderDay && iDelim2 == orderYear) {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{2})(\\d{2})(\\d{4})$")
                        : new RegExp("^(\\d{1,2})(\\d{1,2})(\\d{4})$");
            } else if (iDelim1 == orderDay) {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$")
                        : new RegExp("^(\\d{1,2})(\\d{1,2})[" + delim2 + "](\\d{4})$");
            } else if (iDelim2 == orderYear) {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$")
                        : new RegExp("^(\\d{1,2})[" + delim1 + "](\\d{1,2})(\\d{4})$");
            } else {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$")
                        : new RegExp("^(\\d{1,2})[" + delim1 + "](\\d{1,2})[" + delim2 + "](\\d{4})$");
            }
            var matched = dateRegexp.exec(value);
            if (matched != null) {
                if (!jcv_isValidDate(matched[2], matched[1], matched[3])) {

                    bValid = false;
                }
            } else {

                bValid = false;
            }
        } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
            var iDelim1 = orderDay + DAY.length;
            var iDelim2 = orderMonth + MONTH.length;
            var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
            var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
            if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{2})(\\d{2})(\\d{4})$")
                        : new RegExp("^(\\d{1,2})(\\d{1,2})(\\d{4})$");
            } else if (iDelim1 == orderMonth) {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$")
                        : new RegExp("^(\\d{1,2})(\\d{1,2})[" + delim2 + "](\\d{4})$");
            } else if (iDelim2 == orderYear) {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$")
                        : new RegExp("^(\\d{1,2})[" + delim1 + "](\\d{1,2})(\\d{4})$");
            } else {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$")
                        : new RegExp("^(\\d{1,2})[" + delim1 + "](\\d{1,2})[" + delim2 + "](\\d{4})$");
            }
            var matched = dateRegexp.exec(value);
            if (matched != null) {
                if (!jcv_isValidDate(matched[1], matched[2], matched[3])) {

                    bValid = false;
                }
            } else {
                bValid = false;
            }
        } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
            var iDelim1 = orderYear + YEAR.length;
            var iDelim2 = orderMonth + MONTH.length;
            var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
            var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
            if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{4})(\\d{2})(\\d{2})$")
                        : new RegExp("^(\\d{4})(\\d{1,2})(\\d{1,2})$");
            } else if (iDelim1 == orderMonth) {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$")
                        : new RegExp("^(\\d{4})(\\d{1,2})[" + delim2 + "](\\d{1,2})$");
            } else if (iDelim2 == orderDay) {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$")
                        : new RegExp("^(\\d{4})[" + delim1 + "](\\d{1,2})(\\d{1,2})$");
            } else {
                dateRegexp = isStrict
                        ? new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$")
                        : new RegExp("^(\\d{4})[" + delim1 + "](\\d{1,2})[" + delim2 + "](\\d{1,2})$");
            }
            var matched = dateRegexp.exec(value);
            if (matched != null) {
                if (!jcv_isValidDate(matched[3], matched[2], matched[1])) {
                    bValid = false;
                }
            } else {
                bValid = false;
            }
        } else {
            bValid = false;
        }
    }
    return bValid;
}

function validateDateTime(dateFormat, dateValue){
  // 验证带时间格式的日期 addded by tpdgzl on 2010-08-24
  var time=dateValue;
  if(time=="") return;
  var reg=dateFormat;
  var reg=reg.replace(/yyyy/,"[0-9]{4}");
  var reg=reg.replace(/yy/,"[0-9]{2}");
  var reg=reg.replace(/MM/,"((0[1-9])|1[0-2])");
  var reg=reg.replace(/M/,"(([1-9])|1[0-2])");
  var reg=reg.replace(/dd/,"((0[1-9])|([1-2][0-9])|30|31)");
  var reg=reg.replace(/d/,"([1-9]|[1-2][0-9]|30|31))");
  var reg=reg.replace(/HH/,"(([0-1][0-9])|20|21|22|23)");
  var reg=reg.replace(/H/,"([0-9]|1[0-9]|20|21|22|23)");
  var reg=reg.replace(/mm/,"([0-5][0-9])");
  var reg=reg.replace(/m/,"([0-9]|([1-5][0-9]))");
  var reg=reg.replace(/ss/,"([0-5][0-9])");
  var reg=reg.replace(/s/,"([0-9]|([1-5][0-9]))");
  reg=new RegExp("^"+reg+"$");
  if(reg.test(time)==false){//验证格式是否合法
    //alert(alt);
    //date.focus();
    return false;
  }
  return true;
} 

//身份证号码校验
function validateIdentity(value) {
    var bValid = true;
    if (value.length) {
        bValid = /(^\d{15}$)|(\d{17}(?:\d|x|X)$)/.test(value);
        if (bValid && value.length == 18) {
            var s18 = value.slice(17, 18).toUpperCase();

            var LAST_STR = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
            var IDENTITY_CONSTANTS = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
            var tmp = 0;
            for (var i = 0; i < 17; i++) {
                tmp += parseInt(value.charAt(i)) * IDENTITY_CONSTANTS[i];
            }
            tmp = tmp % 11;
            var lastStr = LAST_STR[tmp];
            bValid = (lastStr == s18);
        }
    }
    return bValid;
}

//组织机构代码校验
function validateCodeAllocationToOrganizations(c18,c9) {
    var bValid = true;
    if (c18.length && c9.length) {
        bValid = /(^[0-9A-Za-z]{8}$)/.test(c18) && /(^[0-9Xx]{1}$)/.test(c9);
        if (bValid && c18.length == 8 && c9.length == 1) {
            var c18Upper = c18.toUpperCase();
            var c9Upper = c9.toUpperCase();
            var Wi = [3, 7, 9, 10, 5, 8, 4, 2];
            var z = 0;
            var zz = 0;
            var tmp = '';
            for(var i = 0; i < c18.length; i++) {
                tmp = c18Upper.charAt(i);
                if (tmp >= 'A' && tmp <= 'Z') {
                    z = (c18Upper.charCodeAt(i) - 55) * Wi[i];
                } else if (tmp >= '0' && tmp <= '9') {
                    z = parseInt(tmp) * Wi[i];
                }
                zz = zz + z;
            }
            var m = 11 - (zz % 11);
            var code9 = '';
            if (m == 11) {
                code9 = '0';
            } else if (m == 10) {
                code9 = 'X';
            } else {
                code9 = '' + m;
            }
            bValid = (code9 == c9Upper);
        }
    }
    return bValid;    
}
