function observer() {

    this.observers = {};

}	// Function

observer.prototype = {

    attachObserver: function( _observer_, _event_, _once_ ) {

        if( !(_observer_ instanceof Object) && !(_observer_ instanceof Function) ) {
            return; }

		if( typeof(_once_) == "undefined" ) {
			_once_ = false; }

        if( !this.observers[_event_] ) {
            this.observers[_event_] = []; }

        this.observers[_event_].push({ "observer": _observer_, "once": _once_ });

    },	// Function

    detachObserver: function( _observer_, _event_ ) {

        if( typeof(this.observers[_event_]) == "undefined" ) {
			return; }

		for(var i = 0, e = this.observers[_event_].length; i < e; i++) {

			if( this.observers[_event_][i]["observer"] == _observer_ ) {
				this.observers[_event_].splice(i); }

        }	// for

    },	// Function

    detachAll: function() {

    	this.observers = [];

    },	// Function

    detachEvent: function( _event_ ) {

    	if( typeof(this.observers[_event_]) == "undefined" ) {
			return; }

		this.observers[_event_] = [];

    },	// Function

    notifyObservers: function( _event_ ) {

		if( typeof(this.observers[_event_]) == "undefined" ) {
			return; }

		for(var i = 0, e = this.observers[_event_].length; i < e; i++) {

			if( typeof(this.observers[_event_][i]) == "undefined" ) {
				continue; }

			if( this.observers[_event_][i]["observer"] instanceof Function ) {

                this.observers[_event_][i]["observer"](_event_, arguments[1]);

            } else if(this.observers[_event_][i]["observer"].notifyObserver instanceof Function) {

                this.observers[_event_][i]["observer"].notifyObserver(_event_, arguments[1]);

            }	// if

			if( this.observers[_event_][i]["once"] == true ) {
				this.observers[_event_].splice(i); }

        }	// for

    }	// Function

};	// Class