// ActionDispatcher.js
// ActionDispatcher Object Module, A Centralized Action Registration and Dispatching Module
// By Tony Sung, Team and Concepts Limited, July 2003 (for PEM 2.0)

//////////////////////////////////////////////////////////////////////////////
// CLASS ActionDispatcher
//	ActionDispatcher()				: constructor
//	attachListener(aid, listener)	: attach action listener to action specified by aid
//	detachListener(aid, listenr)	: detach action listener from action specified by aid
//	fire(a)							: fire action a to registered listeners

function ActionDispatcher() {

	var register = new Array();
	
	this.attachListener = function(a, listener) {
		var newaction = true;
		for (var i=0; i<register.length; i++) {
			if (register[i].aid == a.aid) {
				register[i].listeners.push(listener);
				newaction = false;
			}
		}
		if (newaction) {
			var regentry = new Object();
			regentry.aid = a.aid;
			regentry.listeners = new Array(listener);
			register.push(regentry);
		}
	}
	
	this.detachListener = function(aid, listener) {
		for (var i=0; i<register.length; i++) {
			if (register[i].aid == aid) {
				for (var j=0; j<register[i].listeners.length; j++) {
					if (register[i].listeners[j] == listener) {
						register[i].splice(j, 1);
						return true;
					}
				}
			}
		}
		return false;
	}

	this.fire = function(a) {
		for (var i=0; i<register.length; i++) {
			if (register[i].aid == a.aid) {
				for (var j=0; j<register[i].listeners.length; j++) {
					register[i].listeners[j](a);
				}
			}
		}
	}

}

function EventDetailChangedAction(source, eid) {
	this.aid = 11001; this.source = source; this.eid = eid;
}

function EventViewingStatusChangedAction(source, eid) {
	this.aid = 11002; this.source = source; this.eid = eid;
}

function EventNewAction(source) {
	this.aid = 11003; this.source = source;
}

function EventViewAction(source, etype, eid, regid) {
	this.aid = 11004; this.source = source; this.etype = etype; this.eid = eid; this.regid = regid;
}

function EventShowHideAction(source, eoid, show) {
	this.aid = 11005; this.source = source; this.eoid = eoid, this.show = show;
}

function EventRemovedAction(source) {
	this.aid = 11006; this.source = source;
}

function EventEnrolledAction(source) {
	this.aid = 11007; this.source = source;
}

function EventSearchAction(source) {
	this.aid = 11008; this.source = source;
}

function PersonalEventDetailChangedAction(source, eid) {
	this.aid = 11009; this.source = source; this.eid = eid;
}

function EventImportedAction(source) {
	this.aid = 11010; this.source = source;
}

function EventImportAction(source) {
	this.aid = 11011; this.source = source;
}

function CalendarPreferenceChangedAction(source) {
	this.aid = 12001; this.source = source;
}

function CalendarPreferenceLoadedAction(source) {
	this.aid = 12002; this.source = source;
}

function MonthlyCalWeekSelectedAction(source, date) {
	this.aid = 13001; this.source = source; this.date = date;
}

function MonthlyCalMonthChangedAction(source, date) {
	this.aid = 13002; this.source = source; this.date = date;
}

function InfoBoxToggleAction(source) {
	this.aid = 14001; this.source = source;
}

function CalBoxLoadedAction(source) {
	this.aid = 15001; this.source = source;
}

function EmailTemplateLoadedAction(source) {
  this.aid = 16001; this.source = source;
}

function EmailTemplateSavedAction(source) {
  this.aid = 16002; this.source = source;
}
