Calculator: NRIC Generator

FIN and NRIC generator

by Joey Albert Abano

HTML

<div>
  <select id='prefix'>
    <option>S</option>
    <option>T</option>
    <option>F</option>
    <option>G</option>
  </select>
  <input id='age' value="30" size="2">
  <button id='generate'>Generate</button>
</div>
<pre id="display">
</pre>

CSS

body {
  background:#222;
  color:#fff;
  
}

body, input {
  font-size:14px;
}

input { 
  width:100px; 
}

h1 {
  font-size:18px;
}

h2 {
  font-size:16px;
}

JavaScript

var prefix_el = document.getElementById('prefix');
var age_el = document.getElementById('age');
var generate_el = document.getElementById('generate');
var display_el = document.getElementById('display');

function pad(num, size) {
  var s = "0000000" + num;
  return s.substr(s.length - size);
}


// first = S,T,F,G age=10-100
function generate(first, age) {
  age = parseInt(age, 10);
  if (first != 'S' && first != 'T' && first != 'F' && first != 'G') return;
  if (!(age >= -1 && age <= 9)) age = -1;

  // The IC Generator Algorithm
  var chars = pad(Math.floor(Math.random() * 9999999), 7).split('');
  if (age != -1) chars[0] = age;

  var output = first + chars.join('');

  chars[0] *= 2;
  chars[1] *= 7;
  chars[2] *= 6;
  chars[3] *= 5;
  chars[4] *= 4;
  chars[5] *= 3;
  chars[6] *= 2;

  var sum = 0;
  var offset = (first == "T" || first == "G") ? 4 : 0;
  var st = ["J", "Z", "I", "H", "G", "F", "E", "D", "C", "B", "A"];
  var fg = ["X", "W", "U", "T", "R", "Q", "P", "N", "M", "L", "K"];
  for (i = 0; i <= 6; i++) {
    sum += chars[i];
  }
  temp = (offset + sum) % 11;

  var theAlpha = "";
  if (first == "S" || first == "T") {
    theAlpha = st[temp];
  } else if (first == "F" || first == "G") {
    theAlpha = fg[temp];
  } else theAlpha = "?";

  return output + theAlpha;
}

generate_el.addEventListener('click', function() { 
  display_el.innerHTML = generate(prefix_el.options[prefix_el.selectedIndex].value, parseInt(age_el.value));
});