var ALP_STR = "ABCDEFGHJKLMNPQRSTUVXYWZIO";
var NUM_STR = "0123456789";
var SEX_STR = "12";
var MAX_COUNT = 999;

// ------------------------------------------------------------
// 去字串前後空白
function trim(str) {
	while (str.indexOf(" ")==0) {
		str = str.substring(1, str.length);
	}
	while ((str.length>0) && (str.indexOf(" ")==(str.length-1))) {
		str = str.substring(0, str.length-1);
	}
	return str;
}

// ------------------------------------------------------------
// 補前置零
function getZero(iLen, val) {
	var val = val + "";
	var rtn = "";
	for(var i=0; i<iLen; i++) {
		rtn += "0"; 
	}
	rtn += val;
	rtn = rtn.substring(val.length, rtn.length);
	return rtn;
}

// ------------------------------------------------------------
// 身份證字號產生器
// 產生 iCount 個亂數值的身份證字號
function MakePID(form) {
	var iCount = form.COUNT.value
	var sList = "";
	var SelectALP = "";
	var SelectSEX = "";

	// 檢查個數
	var iCount = form.COUNT.value;
	iCount = Math.max(Math.min(iCount, MAX_COUNT), 0);

	// 字母組
	for(var k=0;k<form.ALP.length;k++) {
		SelectALP += form.ALP[k].selected?form.ALP[k].value:"";
	}
	SelectALP = SelectALP.length==0?ALP_STR:SelectALP;

	// 性別組
	for(var k=0;k<form.SEX.length;k++) {
		SelectSEX += form.SEX[k].selected?form.SEX[k].value:"";
	}
	SelectSEX = SelectSEX.length==0?SEX_STR:SelectSEX;

	// 產生 iCount 組字號
	for (var k=0; k<iCount; k++) {
		var j = 0;
		var iChkSum = 0;
		var sNewPID = "";

		// 第1碼 (英文字母)
		j = SelectALP.substr(Math.round(Math.random()*(SelectALP.length-1)), 1);
		sNewPID += j;
		j = ALP_STR.indexOf(sNewPID) + 10;
		iChkSum = (j-j%10)/10 + (j%10*9); /* X1 + X2*9 */

		// 第2碼 (性別)
		j = SelectSEX.substr(Math.round(Math.random()*(SelectSEX.length-1)), 1);
		sNewPID += j;
		iChkSum += j*8; /* X3*8 */

		// 第3~9碼
		for (var i=0; i<7; i++) {
			c = Math.round(Math.random()*9);
			sNewPID += c;
			iChkSum += c * (7-i);
		}

		// 第10碼 (檢查碼)
		sNewPID += ((10 - iChkSum % 10) % 10);

		sList += sNewPID + "\n";
	}
	form.list.value = sList;
	return false;
}

// ------------------------------------------------------------
//身份證字號檢查器 - 累加檢查碼
function getPID_SUM(sPID) {
	var iChkNum = 0;

	// 第 1 碼
	iChkNum = ALP_STR.indexOf(sPID.substr(0,1)) + 10;
	iChkNum = Math.floor(iChkNum/10) + (iChkNum%10*9);

	// 第 2 - 9 碼
	for(var i=1; i<sPID.length-1; i++) {
		iChkNum += sPID.substr(i,1) * (9-i);
	}

	// 第 10 碼
	iChkNum += sPID.substr(9,1)*1;

	return iChkNum;
}

// ------------------------------------------------------------
// 身份證字號檢查器 - 檢查合法字元
function chkPID_CHAR(sPID) {
	var sMsg = "";
	//sPID = trim(sPID.toUpperCase());
	var iPIDLen = String(sPID).length;

	var sChk = ALP_STR + NUM_STR;
	for(i=0;i<iPIDLen;i++) {
		if (sChk.indexOf(sPID.substr(i,1)) < 0) {
			//sMsg = "這個身份證字號含有不正確的字元！";
			sMsg = "身份證字號格式錯誤";
			break;
		}
	}

	if (sMsg.length == 0) {
		if (ALP_STR.indexOf(sPID.substr(0,1)) < 0) {
			//sMsg = "身份證字號第 1 碼應為英文字母(A~Z)。";
			sMsg = "身份證字號格式錯誤";
		} else if ((sPID.substr(1,1) != "1") && (sPID.substr(1,1) != "2")) {
			//sMsg = "身份證字號第 2 碼應為數字(1~2)。";
			sMsg = "身份證字號格式錯誤";
		} else {
			for(var i=2; i<iPIDLen; i++) {
				if (NUM_STR.indexOf(sPID.substr(i, 1)) < 0) {
					//sMsg = "第 " + (i+1) + " 碼應為數字(0~9)。";
					sMsg = "身份證字號格式錯誤";
					break;
				}
			}
		}
	}

	if (sMsg.length != 0) {
		//alert(sMsg);
		return false;
	} else {
		return true;
	}
}

// ------------------------------------------------------------
// 身份證字號檢查器
function CheckPID(sPID) {
	var sMsg = "正確";
	
	if (sPID == '') {
		sMsg = "請輸入身份證字號";
		return false;
	} else if (sPID.length != 10) {
		//sMsg = "長度應為 10 ！";
		sMsg = "身份證字號格式錯誤";
		return false;
	} else {
		sPID = trim(sPID.toUpperCase());
		if (!chkPID_CHAR(sPID)) return;

		var iChkNum = getPID_SUM(sPID);

		if (iChkNum % 10 != 0) {
			var iLastNum = sPID.substr(9, 1) * 1;
			for (i=0; i<10; i++) {
				var xRightAlpNum = iChkNum - iLastNum + i;
				if ((xRightAlpNum % 10) ==0) {
					//sMsg = "最後一個數應為：" + i;
					sMsg = "身份證字號格式錯誤";
					return false;
					break;
				}
			}
		}
	}
	if(sMsg!='正確'){
		//alert(sMsg);
		return false;
	}
	
	return  true;
}

// ------------------------------------------------------------
// 身份證字號產生器２
// 依設定字元的範圍，產生相對 iCount 個身份證字號
function MakePID2(form) {
	// 檢查前置字元與後置字元
	var sBefore = form.sBefore.value;
	var sAfter = form.sAfter.value;
	if (sBefore.length < 2){
		alert("請設定前置字元至少 2 碼。");
		return false;
	} else if ((sBefore + sAfter).length > 9) {
		alert("前置字元與後置字元總長度，不得超過 9 個");
		return false;
	}

	var iLen = 10 - sBefore.length - sAfter.length;
	var sPID = sBefore + getZero(iLen, sAfter);
	if (!chkPID_CHAR(sPID)) return;

	// 檢查個數
	var iCount = form.COUNT.value;
	iCount = Math.max(Math.min(iCount, MAX_COUNT), 0);

	// 產生相對的身份證字號
	var sList = "";
	var iPoint = 0;
	var bBreak = false;
	var iValidCount = 0;
	for(var k=0; k<iCount; k++) {
		var sNewPID = "";

		while (!bBreak) {
			sNewPID = sBefore;

			// 第3~10碼
			sNewPID += getZero(iLen, iPoint++) + sAfter;

			if (getPID_SUM(sNewPID) % 10 == 0) {
				/* 十位數相同的數, 只有會有一組: 僅適用在沒有 後置字元 時
				iPoint = (Math.floor((iPoint-1) / 10) + 1) * 10;
				*/
				iValidCount++;
				break;
			}

			bBreak = (String(iPoint).length > iLen);
		}

		if (bBreak) break;
		sList += sNewPID + "\n";
	}
	form.list.value = sList;
	form.COUNT.value = iValidCount;
	return false;
}

<!--
/* 原來的 CheckPID() 2002/05/06
// ------------------------------------------------------------
// 身份證字號檢查器
function CheckPID(sPID) {
	var bChk = true;
	var sMsg = "正確";
	sPID = trim(sPID.toUpperCase());
	var iPIDLen = String(sPID).length;

	var iChkNum=0;

	if (iPIDLen!=10) {
		sMsg = "這個身份證字號長度不合法！";
		bChk = false;
	} else {
		var sChk = ALP_STR + NUM_STR;
		for(i=0;i<iPIDLen;i++) {
			if (sChk.indexOf(sPID.substr(i,1))==-1) {
				sMsg = "這個身份證字號含有不正確的字元！";
				bChk = false;
				break;
			}
		}
	}

	if (bChk) {
		iChkNum = ALP_STR.indexOf(sPID.substr(0,1));
		if (iChkNum==-1) {
			sMsg = "身份證字號第一個字應為英文字母！";
			bChk = false;
		} else {
			iChkNum += 10;
			if ((sPID.indexOf("1")!=1) && (sPID.indexOf("2")!=1)) {
				sMsg = "身份證字號第二個字應為 1 或 2！";
				bChk = false;
			}
		}
	}

	if (bChk) {
 		iChkNum = Math.floor(iChkNum/10) + (iChkNum%10*9);
		for(var i=1; i<iPIDLen-1; i++) {
			iChkNum += sPID.substr(i,1) * (9-i);
		}

		var iLastNum = sPID.substr(9,1)*1;
		iChkNum += iLastNum;

		if ((iChkNum % 10) !=0) {
			sMsg = "這個身份證字號不合法！";
			bChk = false;
			for (i=0;i<10;i++) {
				var xRightAlpNum = iChkNum - iLastNum + i;
				if ((xRightAlpNum % 10) ==0) {
					sMsg += "最後一個數應為：" + i;
				}
			}
		}
	}

	alert(sMsg);
}
*/
-->
