/**************************************************************************\
BUILD 4
Copyright (c) Enigma Interactive 2005

Filename:		messenger.js
Description:	Coordinates all the ajax requests and responses for the framework.

History
ver	date		who			comment
-----------------------------------------------------------------------------
1	15/12/05	AJL			Created
\**************************************************************************/

var MESSENGER = { };
MESSENGER.MessageController = function() {
	this.inherit(OO.Listener);
	this.inherit(OO.Timer);
}
MESSENGER.MessageController.prototype = {
	initSelf: function() {
		this.all = OO.create(OO.Broadcaster);
		this.senders = { };
		this.handlers = { };
		this.broadcasters = { };
		this.sendQueue = [];
		
		this.MSG = this.sendMessage;
		this.REQ = this.sendRequest;
		this.counter = 0;
		
		this.requestAlertFn = U.FN(this, this.sendMessage, 'pleaseWait', 'off');
		
		EVENT.attachEvents(document, 'click', this.bodyClick, this);
	},

	registerSender: function(label, handler) {
		if (this.senders[label]) return;
		this.senders[label] = AJAX.create(this, handler);
		this.handlers[label] = handler;
	},
	
	registerListener: function(o, types) {
		var b, type, broadcaster = this.all;

		types = types.split(',');
		while (type = types.pop()) {
			var b = this.broadcasters[type] = this.broadcasters[type] || OO.create(OO.Broadcaster);
			b.addListener(o);
		}
	},
	
	removeListener: function(label, handler) {
		if (this.senders[label]) this.senders[label].removeListener(handler);
	},
	
	chainRequest: function(chain, noWait, waitMess) {
		for (var i=0,c;(c=chain[i]);i++) {
			c[0] = this.senders[c[0]].handler;
			c[2] = c[2] || 0;
		}
		this.sendRequest('chain', 'chain', chain, noWait, waitMess);
	},
	
	queueRequest: function(label, message, params) {
		this.sendQueue.push([label,message,params]);
	},
	
	queueSend: function(noWait, waitParams) {
		if (this.sendQueue.length) this.chainRequest(this.sendQueue, noWait, waitParams);
		this.sendQueue = [ ];	
	},
	
	sendRequest: function(label, message, params, noWait, waitMess, errorMess) {
		var sender = this.senders[label];
		if (!sender) { return false; }
		
		if (!noWait) $CM('pleaseWait', 'on', waitMess);
		
		params = params || { };
		sender.send(message, params, 0, (noWait) ? null : this.requestAlertFn, errorMess);
	},
	
	asyncRequest: function(label, message, params) {
		var handler = this.handlers[label];
		
		if (!handler) return;
		AJAX.asyncRequest(handler, message, params);
	},
	
	delayedRequest: function(delay, label, message, params, noWait, waitMess) {
		var sender = this.senders[label];
		if (!sender) { return false; }
	
		this.counter++;
		this.setTimeout('delay'+this.counter, delay, this.sendRequest, label, message, params, noWait, waitMess);
	},

	noop: function() {
	
	},
	
	sendMessage: function(type, message, params) {
		if (this.broadcasters[type]) this.broadcasters[type].sendMessage(message, params);
		
		this.all.sendMessage(message, params);
	},
	
	delayedMessage: function(delay, type, message, params) {
		this.counter++;
		this.setTimeout('delay'+this.counter, delay, this.sendMessage, type, message, params);
	},
	
	listenToMessage: function(mess, p1, p2, p3) {
		switch (mess) {
			case 'ajaxResponse'	:	this.sendMessage(p1, p2, p3); break;
		}
	},
	
	bodyClick: function(e) {
		var args = e.target.clickMsg;
		if (!args) return;
		
		this.sendMessage.apply(this, args);
	},
	
	disposeSelf: function() {
	}
}