if (!window.ecoideas){ var ecoideas = {}; }
(function (pkg){

pkg.CustomEvent     = CustomEvent;
pkg.EventDispatcher = EventDispatcher;

function CustomEvent(type, detail) {
	this.type          = "";
	this.target        = null;
	this.currentTarget = null;
	this.detail        = null;
	this._prevented    = false;
	this.init(type, detail);
}
CustomEvent.prototype.init = function (type, detail) {
	this.type   = type   || "";
	this.detail = detail || null;
}
CustomEvent.prototype.dispose = function () {
	this.type          = "";
	this.target        = null;
	this.currentTarget = null;
	this.detail        = null;
	this._prevented    = false;
}
CustomEvent.prototype.preventDefault = function (type, target) {
	this._prevented = true;
}

function EventDispatcher() {
	this.init();
}
EventDispatcher.prototype.init = function () {
}
EventDispatcher.prototype.dispose = function () {
	this._listeners = null;
}
EventDispatcher.prototype.hasEventListener = function (type, listener) {
	if (!this._listeners || !this._listeners[type]) {
		return false;
	}
	if (!listener) {
		return true;
	}
	var listeners = this._listeners[type];
	for (var i = 0, n = listeners.length; i < n; i++) {
		if (listeners[i] === listener) {
			return true;
		}
	}
	return false;
}
EventDispatcher.prototype.addEventListener = function (type, listener) {
	if (!this._listeners) {
		this._listeners = {};
	}
	if (!this._listeners[type]) {
		this._listeners[type] = [];
	}
	this._listeners[type].push(listener);
}
EventDispatcher.prototype.removeEventListener = function (type, listener) {
	var ret = [];

	if (!this._listeners) {
		return ret;
	}

	if (!type) {
		for (var name in this._listeners) {
			if (!$.isArray(this._listeners[name])) {
				continue;
			}
			var results = arguments.callee.apply(this, [name]);
			if (results.length) {
				ret = ret.concat(results);
			}
		}
		return ret;
	}

	if (!this._listeners[type]) {
		return ret;
	}

	if (!listener) {
		ret.push(this._listeners[type]);
		this._listeners[type] = null;
		return ret;
	}

	var listeners = this._listeners[type];
	for (var i = 0, n = listeners.length; i < n; i++) {
		if (listeners[i] === listener) {
			return listeners.splice(i, 1);
		}
	}
}
EventDispatcher.prototype.dispatchEvent = function (event) {
	if (!this._listeners || !this._listeners[event.type]) {
		return false;
	}

	if (!event.target) {
		event.target = this;
	}
	event.currentTarget = this;

	var listeners = this._listeners[event.type];
	for (var i = 0, n = listeners.length; i < n; i++) {
		listeners[i].apply(this, [event]);
		if (event._prevented) {
			return false;
		}
	}

	event._prevented = false;
	event.currentTarget = null;
	event.dispose();

	return true;
}

})(ecoideas);