nerd clocks - code

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>nerd clocks</title>
<meta name="Author" content="fitzrovian">
<meta name="Keywords" content="nerd, nerds, clock, clocks,
                               nerd clocks, binary clock,
                               hexadecimal clock, octal clock,
                               esperanto, horlogxo esperanta">
<meta name="Description" content="clocks for nerds">

<script language="javascript">
// -------------------------------------------
// nerd clocks
// written by fitzrovian
// 05-02-03
//
// based in small part on a decimal
// javascript clock by Nicolas -
// http://www.javascript-page.com/clock.html
//
// cut and paste but please include this note
// -------------------------------------------

var typeChars = location.href.substring(location.href.length - 3,
                  location.href.length);

if (typeChars == "bin" || typeChars == "oct" || typeChars == "hex")
  var numBase = typeChars;

if (numBase == null)
  var numBase = "bin";

var boxSize = new Array();
    boxSize["bin"] = 19;
    boxSize["oct"] = 8;
    boxSize["hex"] = 8;

var clockName = new Array();
    clockName["bin"] = "binary";
    clockName["oct"] = "octal";
    clockName["hex"] = "hexadecimal";

var runClock = false;

function dec2bin(x)
{
  if (x < 1) return "";
  return dec2bin((x - (x % 2)) / 2) + x % 2;
}

function bin2dec(binString)
{
  var j = 1;
  var decVal = 0;
  for (var i = binString.length - 1; i >= 0; i--)
  {
    decVal += (binString.charAt(i) == "1" ? 1 : 0) * j;
    j *= 2;
  }
  return decVal;
}

function dec2hex(x)
{
  if (x == 0) return "0";
  var hex = new Array("0", "1", "2", "3", "4", "5",
                      "6", "7", "8", "9", "A",
                      "B", "C", "D", "E", "F");
  var i = 0;
  var hexString = "";
  var binString = dec2bin(x);
  var numExtraBits = (4 - (binString.length % 4)) % 4;
  for (i = 0; i < numExtraBits; i++)
    binString = "0" + binString;
  for (i = 0; i < binString.length; i += 4)
    hexString = hexString + hex[bin2dec(binString.substring(i, i + 4))];
  return hexString;
}

function dec2octProper(x, n)
{
  if (x < 1) return "";
  return dec2octProper((x - (x % 8)) / 8, n * 8) + x % 8;
}

function dec2oct(x)
{
  if (x == 0) return "0";
  return dec2octProper(x, 1);
}

function isBin(binString)
{
  for (var i = 0; i < binString.length; i++)
    if (binString.charAt(i) != '0' && binString.charAt(i) != '1') return false;
  return true;
}

function formatBin(binString, timeType)
{
  var NUM_BITS = new Array();
  NUM_BITS["h"] = 5;
  NUM_BITS["m"] = 6;
  NUM_BITS["s"] = 6;
  var numExtraBits = NUM_BITS[timeType] - binString.length;

  if (!isBin(binString))
    return "Error: string not a binary number.";
  if (timeType != "h" && timeType != "m" && timeType != "s")
    return "Error: timeType not valid.";
  for (var i = 0; i < numExtraBits; i++)
    binString = "0" + binString;
  return binString;
}

function formatHex(hexString)
{
  return (hexString.length == 1 ? "0" : "") + hexString;
}

function formatOct(octString)
{
  return (octString.length == 1 ? "0" : "") + octString;
}

function esperantoNumber(x)
{
  var numeroj = new Array("nul", "unu", "du", "tri", "kvar",
                          "kvin", "ses", "sep", "ok", "naux",
                          "dek");
  var numero = "";
  if (x > 59 || x == 0) return "nul";
  if (x > 9) numero = (x - (x % 10) != 10 ? numeroj[(x - (x % 10)) / 10] : "") + "dek";
  if (x > 0 && (x % 10) != 0) numero += (numero == "" ? "" : " ") + numeroj[x % 10];
  return numero;
}

function updateClock()
{
  if (runClock)
  {
    var date_var = new Date;
    if (numBase == "oct")
      document.nerdClock.nerdTime.value = "" +
        formatOct(dec2oct(date_var.getHours())) + ":" +
        formatOct(dec2oct(date_var.getMinutes())) + ":" +
        formatOct(dec2oct(date_var.getSeconds()));
    else if (numBase == "hex")
      document.nerdClock.nerdTime.value = "" +
        formatHex(dec2hex(date_var.getHours())) + ":" +
        formatHex(dec2hex(date_var.getMinutes())) + ":" +
        formatHex(dec2hex(date_var.getSeconds()));
    else
      document.nerdClock.nerdTime.value = "" +
        formatBin(dec2bin(date_var.getHours()), "h") + ":" +
        formatBin(dec2bin(date_var.getMinutes()), "m") + ":" +
        formatBin(dec2bin(date_var.getSeconds()), "s");
    setTimeout("updateClock()", 1000);
  }
}

function updateGClock()
{
  if (runClock)
  {
    var date_var = new Date;
    var gHours = formatBin(dec2bin(date_var.getHours()), "h");
    var gMinutes = formatBin(dec2bin(date_var.getMinutes()), "m");
    var gSeconds = formatBin(dec2bin(date_var.getSeconds()), "s");
    var i = 0;

    document.gNerdClock.gNerdTimeH0.checked =
      (gHours.charAt(0) == '1');
    document.gNerdClock.gNerdTimeH1.checked =
      (gHours.charAt(1) == '1');
    document.gNerdClock.gNerdTimeH2.checked =
      (gHours.charAt(2) == '1');
    document.gNerdClock.gNerdTimeH3.checked =
      (gHours.charAt(3) == '1');
    document.gNerdClock.gNerdTimeH4.checked =
      (gHours.charAt(4) == '1');

    document.gNerdClock.gNerdTimeM0.checked =
      (gMinutes.charAt(0) == '1');
    document.gNerdClock.gNerdTimeM1.checked =
      (gMinutes.charAt(1) == '1');
    document.gNerdClock.gNerdTimeM2.checked =
      (gMinutes.charAt(2) == '1');
    document.gNerdClock.gNerdTimeM3.checked =
      (gMinutes.charAt(3) == '1');
    document.gNerdClock.gNerdTimeM4.checked =
      (gMinutes.charAt(4) == '1');
    document.gNerdClock.gNerdTimeM5.checked =
      (gMinutes.charAt(5) == '1');

    document.gNerdClock.gNerdTimeS0.checked =
      (gSeconds.charAt(0) == '1');
    document.gNerdClock.gNerdTimeS1.checked =
      (gSeconds.charAt(1) == '1');
    document.gNerdClock.gNerdTimeS2.checked =
      (gSeconds.charAt(2) == '1');
    document.gNerdClock.gNerdTimeS3.checked =
      (gSeconds.charAt(3) == '1');
    document.gNerdClock.gNerdTimeS4.checked =
      (gSeconds.charAt(4) == '1');
    document.gNerdClock.gNerdTimeS5.checked =
      (gSeconds.charAt(5) == '1');

    setTimeout("updateGClock()", 1000);
  }
}

function updateEsperantoClock()
{
  if (runClock)
  {
    var date_var = new Date;
    var horoj = date_var.getHours();
    var minutoj = date_var.getMinutes();
    var sekundoj = date_var.getSeconds();

    document.nerdEsperantoClock.nerdEsperantoTime.value =
      esperantoNumber(horoj) + " horo" +
        ((horoj == 0 || horoj > 1) ? "j" : "") + ", " +
      esperantoNumber(minutoj) + " minuto" +
        ((minutoj == 0 || minutoj > 1) ? "j" : "") + " kaj " +
      esperantoNumber(sekundoj) + " sekundo" +
        ((sekundoj == 0 || sekundoj > 1) ? "j" : "");

    setTimeout("updateEsperantoClock()", 1000);
  }
}

function startClock()
{
  runClock = true;
  updateClock();
  updateGClock();
  updateEsperantoClock();
}

function stopClock()
{
  runClock = false;
}

function sizeClock(x)
{
  document.nerdClock.nerdTime.size = x;
}
</script>
</head>

<body bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#800000"
  alink="#ff00ff" background="?" onLoad="startClock()" onUnload="stopClock()">
<h1>nerd clocks<br /><hr /></h1>

<script language="javascript">
  document.writeln("<h2>" + clockName[numBase] + " clock</h2>");
</script>

<form name="nerdClock">
  <input type="text" name="nerdTime" />
</form>

<script language="javascript">
  sizeClock(boxSize[numBase]);
</script>

<a href="nerdclocks.html?numBase=bin">bin</a> |
<a href="nerdclocks.html?numBase=oct">oct</a> |
<a href="nerdclocks.html?numBase=hex">hex</a>

<br /><br /><hr />

<h2>graphical binary clock</h2>

<form name="gNerdClock">
  <input type="radio" name="gNerdTimeH0" />
  <input type="radio" name="gNerdTimeH1" />
  <input type="radio" name="gNerdTimeH2" />
  <input type="radio" name="gNerdTimeH3" />
  <input type="radio" name="gNerdTimeH4" /> <b>:</b>
  <input type="radio" name="gNerdTimeM0" />
  <input type="radio" name="gNerdTimeM1" />
  <input type="radio" name="gNerdTimeM2" />
  <input type="radio" name="gNerdTimeM3" />
  <input type="radio" name="gNerdTimeM4" />
  <input type="radio" name="gNerdTimeM5" /> <b>:</b>
  <input type="radio" name="gNerdTimeS0" />
  <input type="radio" name="gNerdTimeS1" />
  <input type="radio" name="gNerdTimeS2" />
  <input type="radio" name="gNerdTimeS3" />
  <input type="radio" name="gNerdTimeS4" />
  <input type="radio" name="gNerdTimeS5" />
</form>

<hr />

<h2>horlogxo esperanta</h2>

<form name="nerdEsperantoClock">
  <input type="text" name="nerdEsperantoTime" size="70" />
</form>

<hr />
<a href="http://www.fitzrovian.com/nerdclocks-code.html" target="new">view the code for this page</a>
<hr />
visit <a href="http://www.herdofnerds.net/" target="new">herd of nerds</a>
<hr />
</body>
</html>

visit herd of nerds