var Shoutbox = new Class(
	{
		Implements:[Options, Events, Chain],
		options:
			{
				message_container:null,
				message_limit:60,
				message_startwith:60,
				shoutbox_hash:null,
				canwrite:false,
				message_template:"<div class=\"message\"></div>"
			},
		initialize:function(options)
		{
			this.setOptions(options);
			this.messages = [];
			this.message_count = 0;
			this.last_update = -1;
			Beacon.handler.add(this.handles);
			this.setup();
		},
		//Sets up Shoutbox.
		setup:function()
		{
			if (this.options.shoutbox_hash == null) {
				roar_queue.alert("Could not setup shoutbox.", "Parameters not properly defined.");
				return null;
			}
			new Request(
				{
					url:SITE_ROOT + "plugs/shoutbox/",
					method:"post",
					"data":
						{
							"mode":"setup",
							"hash":this.options.shoutbox_hash,
							"startwith":this.options.message_startwith
						},
					onRequest:function()
					{
						this.setup_onRequest();
					}.bind(this),
					onComplete:function(result)
					{
						this.setup_onComplete(result);
					}.bind(this)
				}).send();
		},
		//Handles default "setup" responses.
		setup_onRequest:function()
		{
			this.fireEvent("onSetupRequest");
		},
		setup_onComplete:function(result)
		{
			var data = JSON.decode(result);
			if (data.error != undefined && data.error == "0") {
				//Acquire messages.
				this.append_messages(data.messages);
				//Setup shoutbox handles for Beacon.
				Beacon.handler.add([["shoutbox_addmessage(" + this.options.shoutbox_hash + ")", function(e)
				{
					this.append_messages(e);
				}.bind(this)]]);
				Beacon.handler.add([["presence_add(sb-" + this.options.shoutbox_hash + ")", function(e)
				{
					if (e[0].user != null) {
						this.append_messages([
							{
								id:"*",
								formatted:e[0].user.Username + " has joined the chat."
							}]);
					}
				}.bind(this)]]);
				Beacon.handler.add([["presence_remove(sb-" + this.options.shoutbox_hash + ")", function(e)
				{
					if (e[0].user != null) {
						this.append_messages([
							{
								id:"*",
								formatted:e[0].user.Username + " has left the chat."
							}]);
					}
				}.bind(this)]]);
				Beacon.addchannel(BEACON_PREFIX + "sb-" + this.options.shoutbox_hash);
				presence_add(new Array("sb-" + this.options.shoutbox_hash));
				if (SESSIONID != "")
					Beacon.addchannel(BEACON_PREFIX + "sb-" + this.options.shoutbox_hash + ":" + SESSIONID);
				Beacon.reconnect();
				//Allow shouts.
				this.options.canwrite = data.canwrite;
				if (this.options.canwrite == true) {
					$("shoutbox-inputs-message-center").getElement("div").set("html", "Enter your shout message here...");
					$("shoutbox-inputs-message-center").getElement("input").erase("disabled");
				} else {
					$("shoutbox-inputs-message-center").getElement("div").set("html", "You cannot participate. Permitted members only.");
				}
			} else {
				roar_queue.alert("Could not connect to shoutbox!", (data.error != undefined) ? data.error : "Unknown error.");
				this.append_messages([
					{
						id:"*",
						formatted:"Could not connect to shoutbox: " + data.error
					}]);
			}
			//Additional listeners.
			this.fireEvent("onSetupComplete", result);
		},
		//Posts message to Shoutbox
		post_message:function(message)
		{
			if (message == undefined || this.options.shoutbox_hash == null) {
				roar_queue.alert("Could not submit message.", "Parameters not properly defined.");
				return null;
			}
			if (this.options.canwrite != true) {
				roar_queue.alert("Could not submit message.", "Only permitted members can participate.");
				return null;
			}
			new Request(
				{
					url:SITE_ROOT + "plugs/shoutbox/",
					method:"post",
					"data":
						{
							"mode":"post",
							"hash":this.options.shoutbox_hash,
							"message":message
						},
					onRequest:function()
					{
						this.post_message_onRequest();
					}.bind(this),
					onComplete:function(result)
					{
						this.post_message_onComplete(result);
					}.bind(this)
				}).send();
		},
		//Handles default "post_message" responses.
		post_message_onRequest:function()
		{
			this.fireEvent("onPostRequest");
		},
		post_message_onComplete:function(result)
		{
			this.fireEvent("onPostComplete", result);
		},
		//Appends messages to shoutbox.
		append_messages:function(messages_array)
		{
			if (this.options.message_container == undefined) {
				roar_queue.alert("Could not add message.", "Message container not properly defined.");
				return null;
			}
			if (this.message_count == 0)
				this.options.message_container.empty();
			messages_array.each(function(e, i)
				{
					var message = new Element("div",
						{
							"id":"shoutbox" + this.options.shoutbox_hash + "-message" + e.id,
							"html":this.options.message_template
						}).inject(this.options.message_container, "top");
					message.getElement(".message").set("html", e.formatted);
					this.message_count++;
				}, this);
		}
	});
