function alertx(text) {
	if (alertxx) {
	    alertxx = confirm(text);
	}
}

function initTable() {
	currentTime = new Date();
	var yourOffset = (-currentTime.getTimezoneOffset());
	for (var line = 0;;line++) {
	    var goffsetTD = document.getElementById(line + '_go');
	    if (goffsetTD == null) {
	        break;
	    }
	    
	    goffset = goffsetTD.innerHTML;
	    op = goffset.indexOf(' ');
        goffset = goffset.substring(0,op) * 60;
        var lineOffset = goffset - yourOffset;
        lineOffset /= 60;
        
        if (lineOffset > 0) {
            lineOffset = '+' + lineOffset;
        }
        lineOffset += ' hrs';
        if (line == 0) {
		    var soffsetTD = document.getElementById(line + '_so');
		    var soffset = soffsetTD.innerHTML;
	        if (soffset == lineOffset) {
				break;
	        }
		}
        var yoTD = document.createElement('TD');
        yoTD.className = 'r';
        yoTD.appendChild(document.createTextNode(lineOffset));
        goffsetTD.parentNode.insertBefore(yoTD,goffsetTD);
	}
	if (soffset != lineOffset) {
		var gmtTH = document.getElementById('gmt_offset');
		var clientTH = document.createElement('th');
		clientTH.appendChild(document.createTextNode('Your offset'));
		gmtTH.parentNode.insertBefore(clientTH,gmtTH);
	} else {
	    var soffsetTH = document.getElementById('server_offset');
	    if (soffsetTH != null) {
	        soffsetTH.innerHTML = 'Your offset';
	    }
	}


	initClocks();
}

function initClocks() {
	var prevHrs = -1;
	currentTime = new Date();
	compareDate1 = currentTime.getTime();
	tickStarted = true;
	for (;;count++) {
	    if (document.getElementById(count + '_m') == null) {
	        break;
	    } else {
   	        var offsetGMT = document.getElementById(count + '_go').innerHTML;
	        op = offsetGMT.indexOf(' ');
	        offsetGMT = offsetGMT.substring(0,op);

	        var offset = document.getElementById(count + '_so').innerHTML;
	        var op = offset.indexOf(' ');
	        offset = offset.substring(0,op);
			var hours = (currentTime.getUTCHours() + parseInt(offsetGMT) + 24) % 24;
	        var sel = document.getElementById(count + '_s');
	        if (sel != null) {
	            sel.innerHTML = pad2(currentTime.getUTCSeconds());
	        }
			var offsetGMTMin = (offsetGMT - Math.floor(offsetGMT)) * 60;
			var mins = (currentTime.getUTCMinutes() + offsetGMTMin);
			if (mins > 60) {
			    hours++;
			    mins -= 60;
			}
	        var hrs = document.getElementById(count + '_h');
			hrs.innerHTML = pad2(hours);
	        document.getElementById(count + '_m').innerHTML = pad2(mins);
			var tr = document.getElementById('r_' +count);
//			alert(prevHrs + ' ' + hours);
            if (prevHrs > hours) {
				moveMidnightMarker(count);
				prevHrs = hours;
			}
	        if (tr.className.indexOf('midnightline') != -1) { // set midnight line marker for JS
            	prevE = count;
	        } else {
	            prevHrs = hours;
	        }
	        if (offsetGMT * 60 == -currentTime.getTimezoneOffset()) {
	            tr.className = tr.className + ' youarehere';
				tr.setAttribute('title',youarehere);

	        }
	        if (tr.className.indexOf('serverishere') != -1) { // add title attribute
				if (tr.className.indexOf('youarehere') != -1) {
				    serverishere = botharehere;
				}
				tr.setAttribute('title',serverishere);
	        }
	    }
	}
//	alertx('clock init!');
//	alertx(prevE);

	if (document.getElementById('0_s') != null) {
	    // time to next full second
	    tickFunction = tick;
	    tickInterval = 1000;
	    window.setTimeout(tickFunction, tickInterval - currentTime.getMilliseconds() - 1);
	} else {
	    // time to next full minute
	    tickFunction = tick_min_all;
	    tickInterval = 60000;
	    var toNextMin = tickInterval - currentTime.getMilliseconds() - (currentTime.getSeconds() * 1000) - 1;
		window.setTimeout(tickFunction,toNextMin);
	}
}

function tick() {
	tickStarted = true;
	for (var c = 0; c < count; c++) {
	    el = document.getElementById(c + '_s');
		sec = el.innerHTML;
		sec++;
		if (sec >= 60) {
		    tick_min(c);
		    sec = 0;
		}
		el.innerHTML = pad2(sec);
	}
	if (sec == 0) {
	    checkTime();
	}
	if (interval == null) {
		interval = window.setInterval(tickFunction,tickInterval);
	}
}

function tick_min_all() {
    tickStarted = true;
	for (var c = 0; c < count; c++) {
		tick_min(c);
	}
	checkTime();
	if (interval == null) {
		//interval = window.setInterval(tick_min_all,1000);
		interval = window.setInterval(tickFunction,tickInterval);
	}
}

function checkTime() {
	var compareDate2 = (new Date()).getTime();
	var deltaTime = (compareDate2 - compareDate1 - 1000);
	//alertx(compareDate1 + "\n" + compareDate2 + "\n" + (compareDate2 - compareDate1 - 1000) + "\n" + tickInterval);
	if (deltaTime > tickInterval || deltaTime < -5000) {
	    window.clearInterval(interval);
	    interval = null;
		currentTime.setTime(compareDate2);
	    initClocks();
	}
	compareDate1 = compareDate2;
}

function tick_min(d) {
	var elm = document.getElementById(d + '_m');
	if (elm != null) {
	    var min = elm.innerHTML;
	    min++;
	    if (min >= 60) {
	        tick_hr(d);
	        min = 0;
	    }
	    elm.innerHTML = pad2(min);
	}
}


/**
 *  moves the hour counter forward
 **/
function tick_hr(e) {
	var elh = document.getElementById(e + '_h');
	if (elh != null) { // 'hours' element exists
	    var hrs = elh.innerHTML;
	    hrs++;
	    if (hrs >= 24) { // midnight rollover
	        hrs = 0;
	        moveMidnightMarker(e);
	    }
	    // update value
	    elh.innerHTML = pad2(hrs);
	}
}

function moveMidnightMarker(e) {
    if (tickStarted) { // move the midnight marker ( pure cosmetics )
		// the marker is in a previous location
		var elpr = document.getElementById('r_'+prevE);
		if (elpr != null) {
			var elprs = elpr.className;
			elprs = elprs.replace(' midnightline', '');
			//alertx(elprs);
			elpr.className = elprs;
			prevE = e;
			tickStarted = false;
		}
        if (e > 0) { // the marker has somewhere to move to
//            alert(e);
	        var elp2 = document.getElementById('r_' + e);
	        if (elp2 != null && elp2.className.indexOf('midnightline') == -1) {
        		elp2.className = elp2.className + ' midnightline';
			}
		}
	}
}

/**
 * Pad a number to two decimal digits
 **/
function pad2(tx) {
	if (tx < 10) {
	    tx = '0' + tx;
	}
	return tx;
}

/** cross-browser event registering/unregistering functions
 *	Originally from http://www.quirksmode.org/
 **/
function addEventSimple(obj,evt,fn) {
	return addEventSimpleEx(obj,evt,fn, false);
}

function addEventSimpleEx(obj,evt,fn,dir) {
	if ( obj.attachEvent) {
		obj.attachEvent('on'+evt,fn);
	} else if (obj.addEventListener) {
		obj.addEventListener(evt, fn, dir);
	}
}

function removeEventSimple(obj,evt,fn) {
	return removeEventSimpleEx(obj,evt,fn, false);
}

function removeEventSimpleEx(obj,evt,fn, dir) {
	if (obj.removeEventListener)
		obj.removeEventListener(evt,fn,dir);
	else if (obj.detachEvent)
		obj.detachEvent('on'+evt,fn);
}

var count = 0;
var currentTime;
var el;
var sec;
var prevE = -1;
var tickStarted = true;
var interval = null;
var youarehere = 'You are in this time zone.';
var serverishere = 'The server is in this time zone.';
var botharehere = 'You and the server are both in this time zone.';
var tickFunction;
var tickInterval;
var compareDate1;
var alertxx = true;
addEventSimple(window,'load',initTable);

