// --------------------------------------------------------------
// WACTimerHandler

function WACTimerHandler(aName, aTimeout) {
  this.name    = aName;
  this.timeout = aTimeout;
}


function WACTimerHandlerDoIt() {
  alert("abstract function WACTimerHandler.doIt() called");
}

function WACTimerHandlerToString() {
  return this.name + "[" + this.timeout + "]: abstract";
}

WACTimerHandler.prototype.doIt     = WACTimerHandlerDoIt;
WACTimerHandler.prototype.toString = WACTimerHandlerToString;



// --------------------------------------------------------------
// WACTimerEvalHandler

function WACTimerEvalHandler(aName, aTimeout, anObject, aFunction) {
  this.name    = aName;
  this.timeout = aTimeout;
  this.obj     = anObject;
  this.func    = aFunction;
}


function WACTimerEvalHandlerDoIt() {
  this.obj.eval(this.func);
}

function WACTimerEvalHandlerToString() {
  return this.name + "[" + this.timeout + "]:" + typeof this.obj + " " + this.func;
}

WACTimerEvalHandler.prototype.doIt     = WACTimerEvalHandlerDoIt;
WACTimerEvalHandler.prototype.toString = WACTimerEvalHandlerToString;



// --------------------------------------------------------------
// WACTimer

function WACTimer(aName, anInterval) {
  this.name              = aName;
  this.interval          = anInterval;
  this.count             = 0;
  this.handlers          = new Object();
}

function WACTimerGo() {
  this.doIt();
}

function WACTimerRegisterHandler(handler) {
  this.handlers[handler.name] = handler;
}


function WACTimerUnregisterHandler(handler) {
  if (handler) {
    if (handler.name)
      this.handlers[handler.name] = null;
    else
      this.handlers[handler] = null;
  }
}


function WACTimerDoIt() {
  for (handlerName in this.handlers) {
    var handler = this.handlers[handlerName];
    if (handler && !(this.count % Math.round(handler.timeout / this.interval)))
      handler.doIt();
  }
  this.count++;
  window.setTimeout(this.name + ".doIt()", this.interval);
}


function WACTimerToString() {
  var str = this.name + "[" + this.interval + "|" + this.count + "]<br/>\n";
  var ii;
  for (ii in this.handlers)
    str += this.handlers[ii].toString() + "<br/>\n";
  return str;
}

WACTimer.prototype.registerHandler   = WACTimerRegisterHandler;
WACTimer.prototype.unregisterHandler = WACTimerUnregisterHandler;
WACTimer.prototype.go                = WACTimerGo;
WACTimer.prototype.doIt              = WACTimerDoIt;
WACTimer.prototype.toString          = WACTimerToString;

