身份證驗證

function checkID(idStr){
	var debug = true;
  // 依照字母的編號排列,存入陣列備用。
  var letters = new Array('A', 'B', 'C', 'D',
      'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M',
      'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
      'X', 'Y', 'W', 'Z', 'I', 'O');
  // 儲存各個乘數
  var multiply = new Array(1, 9, 8, 7, 6, 5,
                           4, 3, 2, 1);
  var nums = new Array(2);
  var firstChar;
  var firstNum;
  var lastNum;
  var total = 0;
  // 撰寫「正規表達式」。第一個字為英文字母,
  // 第二個字為1或2,後面跟著8個數字,不分大小寫。
  var regExpID=/^[a-z](1|2)\d{8}$/i;
  // 使用「正規表達式」檢驗格式
  var result = idStr.match(regExpID);
  if(debug) console.log(result);
  if (result == null) {
    // 基本格式錯誤
    if(debug) console.log('基本格式錯誤');
   return false;
  } else {
        // 取出第一個字元和最後一個數字。
        firstChar = idStr.charAt(0).toUpperCase();
        lastNum = idStr.charAt(9);
  }
  // 找出第一個字母對應的數字,並轉換成兩位數數字。
  for (var i=0; i<26; i++) {
        if (firstChar == letters[i]) {
          firstNum = i + 10;
          nums[0] = Math.floor(firstNum / 10);
          nums[1] = firstNum - (nums[0] * 10);
          break;
        }
  }
  // 執行加總計算
  for(var i=0; i<multiply.length; i++){
    if (i<2) {
      total += nums[i] * multiply[i];
    } else {
      total += parseInt(idStr.charAt(i-1)) *
               multiply[i];
    }
  }
  // 和最後一個數字比對
  if ((10 - (total % 10))!= lastNum) {
  	if(debug) console.log('和最後一個數字比對');
    return false;
  }
  return true;
}

function f2h(val){
	var value = val || "";
	var result = "";
  if (value) {
    for (i = 0; i < value.length; i++) {
      if (value.charCodeAt(i) == 12288) {
      	//console.log(value.charCodeAt(i));
        result += " ";
      } else {
      	//console.log(i + ': ' + value.charCodeAt(i));
        if (value.charCodeAt(i) > 65280 && value.charCodeAt(i) < 65375) {
          result += String.fromCharCode(value.charCodeAt(i) - 65248);
        } else {
          result += String.fromCharCode(value.charCodeAt(i));
        }
        //console.log(i + ': ' + result);
      }
    }
  } 

  return result;
}