go.timers = new (function()
{

var TIMER_STEP = 100;

this.set = (
	function(handler, period, number, now)
	{
		if (!timer) {
			timer = setInterval(timerClk, TIMER_STEP);
		}
		aiTimers++;
		aTimers[aiTimers] = [handler, period, number, period];
		qTimers++;
		if (now) {
			go.methodExec(handler);
		}
		return aiTimers;
	}
);

this.remove = (
	function(id)
	{
		if (!aTimers[id]) {
			return false;
		}
		delete(aTimers[id]);
		qTimers--;		
		if (qTimers < 1) {
			clearInterval(timer);
			timer = false;
		}
		return true;
	}
);

var aTimers  = {};
var aiTimers = 0;
var qTimers  = 0;
var timer;
var _this = this;

function timerClk()
{
	var at  = aTimers;
	var me  = go.methodExec;
	for (var id in at) {
		var t = at[id];
		t[3] -= TIMER_STEP;
		while (t[3] <= 0) {
			_this.diff = -t[3];
			t[3] += t[1];
			me(t[0]);			
			if (t[2]) {
				t[2]--;
				if (t[2] == 0) {
					delete(at[id]);
					qTimers--;
				}
			}
		}
	}
	if (qTimers < 1) {
		clearInterval(timer);
		timer = false;
	}
	return true;
}

})();