var PhotoClans; if (!PhotoClans) PhotoClans = {};
if (!PhotoClans.Events) PhotoClans.Events = {};

if (!PhotoClans.Events.definedEvents) PhotoClans.Events.definedEvents = {};

PhotoClans.Events.EventListener = function(callback, callbackData) {
	this.callback = callback;
	this.callbackData = callbackData;
	this.invoke = function(evType, staticEvData, evData) {
		return this.callback(evType, staticEvData, this.callbackData, evData);
	}
}

PhotoClans.Events.Event = function(evType, staticData, stopable) {
	this.evType = evType;
	this.stopable = stopable;
	this.staticData = staticData;
	this.listeners = [];
}
PhotoClans.Events.Event.prototype.fire = function(evData) {
	bContinue = true;
	for(var i = 0; (!this.stopable || bContinue) && (i < this.listeners.length); i++ ) {
		var listener = this.listeners[i];
		bContinue &= listener.invoke(this.evType, this.staticData, evData);
	}
}
PhotoClans.Events.Event.prototype.listen = function(listener, listenerData) {
	this.listeners.push(new PhotoClans.Events.EventListener(listener, listenerData));
}
PhotoClans.Events.Event.prototype.remove = function(listener) {
	for(var i=0; i< this.listeners.length; i++) {
		if (this.listeners[i] === listener) {
			this.listeners.splice(i,1);
			break;
		}
	}
}


PhotoClans.Events.defineEvent = function(evType, staticData, stopable) {
	PhotoClans.Events.definedEvents[evType] = new PhotoClans.Events.Event(evType,staticData,stopable);
	return PhotoClans.Events.definedEvents[evType];
}

PhotoClans.Events.fireEvent = function(evType, evData) {
	var eventDef = PhotoClans.Events.definedEvents[evType];
	if (eventDef) eventDef.fire(evData);
}
PhotoClans.Events.listen = function(evType, callback, callbackData) {
	var eventDef = PhotoClans.Events.definedEvents[evType];
	if (eventDef) eventDef.listen(callback, callbackData);
}
PhotoClans.Events.removeListener = function(evType, listener) {
	var eventDef = PhotoClans.Events.definedEvents[evType];
	if (eventDef) eventDef.remove(listener);
}

