// ================================================================================
// Observable class

function Observable()
{
  this._EventTypeObservers = new Object();
}

// observe(eventType, obj, handler)
// handler is a function which when calling notify(eventType)
// will be called with this==obj (if obj is null, this==window)
Observable.prototype.observe = function(eventType, obj, handler)
{
  var Arr = this._EventTypeObservers[eventType];
  if (!Arr) {
    Arr = this._EventTypeObservers[eventType] = new Array();
  }
  // resolve obj once, not in each call to notify()
  if (!obj) {
    obj = window;
  }
  Arr.push([obj, handler]);
  // alert("Observable.observe: with obj="+obj+", handler="+handler+",for event type '" + eventType + "' now having " + Arr.length + " handlers.");
}


Observable.prototype.notify = function(eventType)
{
  var Arr = (this._EventTypeObservers)[eventType];
  if (Arr) {
    // alert("Observable.notify: for event type '" + eventType + "' now having " + Arr.length + " handlers.");
    for (var i = 0; i < Arr.length; ++i) {
      var obj     = Arr[i][0];
      var handler = Arr[i][1];
      //alert("Observable.notify: calling obj="+obj+", handler="+handler);
      handler.apply(obj, arguments);// first argument: eventType, + all additional ones
    }
  }
}

