//-------------------------------------------
// nerd clocks
// written by Thom Curtis
//
// based on code from fitzrovian
// http://www.fitzrovian.com/nerdclocks.html
// who in turn based his 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 runClock = false;

function lessten(number) {
	if (number < 10) {
		number = '0' + number;
	}
	return number;
}

function lesshex(number) {
	if (hex2dec(number) < 16) {
		number = '0' + number;
	}
	return number;
}

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 hex2dec(number) {
	return parseInt(number,16);
}

function plural(number) {
	var plural = 's';
	if (number == 1) {
		plural = '';
	}
	return plural;
}

function updateclocks()
{
	if (runClock)
	{
		//variables for all clocks
		var date = new Date;
		var totaltime = 0;
		var timenow = date.getSeconds() + 60*date.getMinutes() + 3600*date.getHours();
		
		//binary clock specific
		var bininterval = 43200;
		var level = new Array(17);
		var bintime = new String;

		//do the binary tree and  get each digit
		for (i = 0; i < 17; i++) {
			if ((timenow >= totaltime) && (timenow < (totaltime + bininterval))) {
				level[i] = 0;
			} else {
				level[i] = 1;
				totaltime += bininterval;
			}
			bininterval /= 2;
		}

		//for the first three places, use the names
		var levelname = new Array(3);
		if (!level[0]) {
			levelname[0] = "off ";
		} else {
			levelname[0] = "on ";
		}
                if (!level[1]) {
			levelname[1] = "early ";
		} else {
			levelname[1] = "late ";
		}
		if (!level[2]) {
			levelname[2] = "sub ";
		} else {
			levelname[2] = "super ";
		}

		//put them all together into one big number and display it
		for (i = 0; i < 17; i++) {
			if (i < 3) {
				bintime += levelname[i];
			} else {
				bintime += level[i];
			}
		}
		var newbintime = document.createTextNode(bintime);
		var oldbintime = document.getElementById('bintime').firstChild;
		document.getElementById('bintime').replaceChild(newbintime, oldbintime);

		//Do the graphical clock
		for (i = 0; i < 17; i++) {
			if (level[i]) {
				document.getElementById('level' + i).style.backgroundColor = 'black';
			}
			else {
				document.getElementById('level' + i).style.backgroundColor = '#eee';
			}
		}
		
		//French Revolutionary Time
		var propofday = (timenow / 86400) + '';
		var frhour = propofday.substr(2,1);
		var frmin = propofday.substr(3,2);
		var frsec = propofday.substr(5,2);
		var newfrtime = document.createTextNode(frhour + ":" + frmin + ":" + frsec);
		var oldfrtime = document.getElementById('frtime').firstChild;
		document.getElementById('frtime').replaceChild(newfrtime, oldfrtime);

		//28 Hour Clock
		var dayofweek = date.getDay() - 1;
		if (dayofweek == -1) {
			dayofweek = 6;
		}
		var dayhr = (24 * dayofweek) + date.getHours() + '';
		dayday = Math.floor(dayhr / 28);
		var dayname = ["Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
		dayhr = dayhr % 28;
		var newdaytime = document.createTextNode(dayname[dayday] + ' ' + lessten(dayhr) + ':' + lessten(date.getMinutes()) + ':' + lessten(date.getSeconds()));
		var olddaytime = document.getElementById('daytime').firstChild;
		document.getElementById('daytime').replaceChild(newdaytime, olddaytime);

		//Hexadecimal clock
		var hexsecs = Math.round((timenow / 86400) * 1048576);
		var hexhours = Math.floor(hexsecs / 65536);
		var hexmins = Math.floor((hexsecs - (hexhours * 65536)) / 256);
		hexsecs = hexsecs - ((hexmins * 256) + (hexhours * 65536));
		var newhextime = document.createTextNode(dec2hex(hexhours) + ':' + lesshex(dec2hex(hexmins)) + ':' + lesshex(dec2hex(hexsecs)));
		var oldhextime = document.getElementById('hextime').firstChild;
		document.getElementById('hextime').replaceChild(newhextime, oldhextime);

		//Make the colour clock work
		var hexstring = dec2hex(hexhours) + lesshex(dec2hex(hexmins)) + lesshex(dec2hex(hexsecs));
		for (i = 0; i < 5; i++) {
			document.getElementById('hex' + i).style.backgroundColor = '#' + hexstring.substr(i,1) + hexstring.substr(i,1) + hexstring.substr(i,1);
		}

		//Angular clock
		var angtime = ((timenow / 86400) * 1296000);
		var angdegs = Math.floor(angtime / 3600);
		var angmins = Math.floor((angtime - (3600 * angdegs)) / 60);
		var angsecs = Math.floor(angtime - ((60 * angmins) + (3600 * angdegs)));
		var angstring = angdegs + '\u00B0 ' + angmins + '\u0027 ' + angsecs + '\u0027\u0027';
		var newangtime = document.createTextNode(angstring);
		var oldangtime = document.getElementById('angtime').firstChild;
		document.getElementById('angtime').replaceChild(newangtime, oldangtime);

		//Chrons
		var chrontime = (1000 * (timenow / 86400));
		var newchrontime = document.createTextNode(chrontime.toFixed(2) + 'c');
		var oldchrontime = document.getElementById('chrontime').firstChild;
		document.getElementById('chrontime').replaceChild(newchrontime, oldchrontime);

		//Swatchbeats
		var gmttimenow = date.getUTCSeconds() + (60 * date.getUTCMinutes()) + (60 * 60 * (date.getUTCHours() + 1));
		var beats = Math.floor(gmttimenow / 86.4) % 1000;
		var beatsstring = beats.toFixed(0);
		if (beatsstring.length == 1) {
			beatsstring = '00' + beatsstring;
		}
		if (beatsstring.length == 2) {
			beatsstrint = '0' + beatsstring;
		}
		var newbeats = document.createTextNode('@' + beatsstring);
		var oldbeats = document.getElementById('swatchbeatstime').firstChild;
		document.getElementById('swatchbeatstime').replaceChild(newbeats, oldbeats);

		//New Earth Time
		var utctimenow = date.getUTCSeconds() + (60 * date.getUTCMinutes()) + (60 * 60 * date.getUTCHours());
		nettime = 1296000 * (utctimenow / 86400);
		var netangdegs = Math.floor(nettime / 3600);
		var netangmins = Math.floor((nettime - 3600 * netangdegs) / 60);
		var netangsecs = Math.floor(nettime - ((60 * netangmins) + (3600 * netangdegs)));
		var netangstring = netangdegs + '\u00B0 ' + netangmins + '\u0027 ' + netangsecs + '\u0027\u0027';
		var newnettime = document.createTextNode(netangstring);
		var oldnettime = document.getElementById('newearthtime').firstChild;
		document.getElementById('newearthtime').replaceChild(newnettime, oldnettime);

		//update the clocks once a second
		setTimeout("updateclocks()", 1000);
	}
}

function startClock()
{
	runClock = true;
	updateclocks();
}