function checkIdcard(idcard){
var Errors=new Array(
" Verification by ",
" The id number is not correct !",
" Id number date of birth is out of range or contains illegal characters !",
" Error check of id card number !",
" Illegal id card areas !"
);
var area={11:" Beijing ",12:" tianjin ",13:" hebei ",14:" shanxi ",15:" Inner Mongolia ",21:" liaoning ",22:" Ji Lin ",23:" heilongjiang ",31:" Shanghai ",32:" jiangsu ",33:" zhejiang ",34:" anhui ",35:" fujian ",36:" jiangxi ",37:" shandong ",41:" henan ",42:" hubei ",43:" hunan ",44:" guangdong ",45:" guangxi ",46:" hainan ",50:" chongqing ",51:" sichuan ",52:" guizhou ",53:" yunnan ",54:" Tibet ",61:" shaanxi ",62:" gansu ",63:" qinghai ",64:" ningxia ",65:" xinjiang ",71:" Taiwan ",81:" Hong Kong ",82:" Macau ",91:" foreign "}
var idcard,Y,JYM;
var S,M;
var idcard_array = new Array();
idcard_array = idcard.split("");
//Regional inspection
if(area[parseInt(idcard.substr(0,2))]==null) return Errors[4];
//Identification number and format check
switch(idcard.length){
case 15:
if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
ereg=/^[1-9][0-9]{5}[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}$/;//Test the validity of the date of birth
} else {
ereg=/^[1-9][0-9]{5}[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}$/;//Test the validity of the date of birth
}
if(ereg.test(idcard)) return Errors[0];
else return Errors[2];
break;
case 18:
//18-digit identification number detection
//Check the validity of the date of birth
//Leap (date) (month) (year) : ((01 | | 07 | 3 | 05 08 | | 10 12) (0 | [1-9] [1-2] [0-9] [0, 1]) | 3 | (04 | | | 06 09 11) (0 [1-9] | [1-2] [0-9] 30) | | 02 (0 | [1-9] [1-2] [0-9]))
//Flat (date) (month) (year) : ((01 | | 07 | 3 | 05 08 | | 10 12) (0 [1-9] | [1-2] [0-9] [0, 1]) | 3 | (04 | | | 06 09 11) (0 [1-9] | [1-2] [0-9] 30) | | 02 (0 [1-9] [0-9] | 2 | 1 [0 to 8]))
if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.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]$/;//The validity of leap year birth date regular expression
} 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]$/;//Regular expression for the validity of the average year of birth
}
if(ereg.test(idcard)){//Test the validity of the date of birth
//Calculated check bit
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);//Judgment check bit
if(M == idcard_array[17]) return Errors[0]; //Detects the check bit of the ID
else return Errors[3];
}
else return Errors[2];
break;
default:
return Errors[1];
break;
}
}