var EventService = Namespace.declare("tla.EAM.layer1.OnceServices",
    class EventService extends Thing {

        constructor() {
            super();
            this.registry = {};
        }

        addEventListener(eventName, eventTarget, handlerFunction) {

            if (this.registry[eventName] == null)
                this.registry[eventName] = new MyEvent().init(eventName);

            var event = this.registry[eventName];
            event.addHandler(handlerFunction);
            event.target = eventTarget;
        }

        getEvent(eventName) {
            return this.registry[eventName];
        }


        fire(eventName, eventSource, item) {
            var event = this.getEvent(eventName);
            if (event)
                event.fire(eventSource,item);
        }


    }
);

var MyEvent = Namespace.declare("tla.EAM.layer1.OnceServices",
    class Event {
        constructor() {
            this.name = "";
            this.handlers = [];
        }

        init(name) {
            this.name = name;
            return this;
        }

        addHandler(handlerFunction) {
            this.handlers.push(handlerFunction);
        }


        fire(eventSource, item) {
            this.source = eventSource;

            if (eventSource.duringFire == true)
                return;
            try {
                eventSource.duringFire = true;
                for (var i in this.handlers) {
                    console.log("fire ",this.name," from ",eventSource.id,"to",this.target.id," item: ",item);
                    this.handlers[i](this, item);
                }
            }
            catch (error) {
                console.error("Error during fire: ",error);
                eventSource.duringFire = false;
            }
            eventSource.duringFire = false;
        }

    }
);

var EventSupport = Namespace.declare("tla.EAM.layer1.OnceServices",
    class EventSupport extends Interface {
        get eventSupport() {
            if (!this._private.eventSupport) {
                this._private.eventSupport = new EventService();
                //this._eventSupport = this._private.eventSupport;
            }
            return this._private.eventSupport;
        }
    }
);
