var NI = (typeof(NI) == "undefined") ? new Object() : NI;

NI.EventsManager = {

	toString : function() {
		return "EventsManager";
	},

	ThrowError : function(message) {
		var error = new Error();
		error.name = this.toString();
		error.message = message;
		throw error;
	},

	AttachEventHandler : function(element, event, handler) {
		var errorMessages = new Array();
		if (!element) errorMessages.push("'element' is null");
		if (!event) errorMessages.push("'event' is null");
		if (typeof(handler) != "function") errorMessages.push("'handler' is not a function");
		if (errorMessages.length) {
			this.ThrowError("AttachEventHandler(element, event, handler) : " + errorMessages.join(", "));
		}

		if (!element.eventsHandlers) element.eventsHandlers = new Object();
		if (!element.eventsHandlers[event]) {
			element.eventsHandlers[event] = new Array();

			if (element["on"+event]) {
				var oldHandler = element["on"+event];
				element["on"+event] = null;
				this.AttachEventHandler(element, event, oldHandler);
			}

			element["on"+event] = function(event) {
				event = event ? event : window.event;
				var handlers = this.eventsHandlers[event.type];
				if (handlers) {		
					var result = true;
					var tmp = null
					for (var i=0; i<handlers.length; i++) {
						tmp = handlers[i].call(this, event);
						result = result && tmp;
					}
					return result;
				}
			}
		}	
		element.eventsHandlers[event].push(handler);
		return handler;
	},

	DetachEventHandler : function(element, event, handler) {
		var errorMessages = new Array();
		if (!element) errorMessages.push("'element' is null");
		if (!event) errorMessages.push("'event' is null");
		if (!handler) errorMessages.push("'handler' is null");
		if (errorMessages.length) {
			this.ThrowError("DetachEventHandler(element, event, handler) : " + errorMessages.join(", "));
		}

		var eventsHandlers = element.eventsHandlers;
		if (eventsHandlers && eventsHandlers[event]) {
			var handlers = eventsHandlers[event];
			for (var i=0; i<handlers.length; i++) {
				if (handlers[i] == handler) {					
					handlers.splice(i, 1);
					return true;
				}
			}
		}
		return false;
	},

	DetachAllEventHandlers : function(element, event) {
		var errorMessages = new Array();
		if (!element) errorMessages.push("'element' is null");
		if (!event) errorMessages.push("'event' is null");
		if (errorMessages.length) {
			this.ThrowError("DetachAllEventHandlers(element, event) : " + errorMessages.join(", "));
		}

		var eventsHandlers = element.eventsHandlers;
		if (eventsHandlers) {
			eventsHandlers[event] = null;			
		}
		element["on"+handler] = null;
	},

	GetEventHandlers : function(element, event) {
		var errorMessages = new Array();
		if (!element) errorMessages.push("'element' is null");
		if (!event) errorMessages.push("'event' is null");
		if (errorMessages.length) {
			this.ThrowError("GetEventHandlers(element, event) : " + errorMessages.join(", "));
			throw this.error;
		}

		var eventsHandlers = element.eventsHandlers;
		return (eventsHandlers)	? eventsHandlers[event] : element["on"+event];
	}
}