if (rio.EventDelegator) { rio.EventDelegator.disable(); }

rio.EventDelegator = {
	observers: [],

	processEvent: function(eventName, e) {
		var body = Element.body();
		var rioComponent;
		var target = e.target;
		while (target && target != body) {
			rioComponent = target.rioComponent;
			if (rioComponent) {
				if (Object.isFunction(rioComponent[eventName])) {
					rioComponent[eventName](Event.extend(e));
				}
			}
			target = target.parentNode;
		}
	},

	enable: function() {
		this.observers = [
			{
				eventName: "click",
				element: Element.body(),
				observer: this.processEvent.bind(this, "click")
			},
			{
				eventName: "dblclick",
				element: Element.body(),
				observer: this.processEvent.bind(this, "dblClick")
			},
			{
				eventName: "keyup",
				element: document,
				observer: this.processEvent.bind(this, "keyUp")
			}
		];

		this.observers.each(function(o) {
			Event.observe(o.element, o.eventName, o.observer);
		});
	},
	
	disable: function() {
		this.observers.each(function(o) {
			try {
				Event.stopObserving(o.element, o.eventName, o.observer);
			} catch(e) {
				// Don't let one failure ruin the party
			}
		});
		
		this.observers.clear();
	}
	
	
};