/*
 * Main event handler and support for adding triggers from other scripts.
 */
bind(K_BIND_EVENT, "event");

lastUser = null;
lastDate = new Date();
userWidth = -1;
triggers = new Array();
localecho = loaddb("localecho", false);
alwaysts = loaddb("timestamp", false);
commands = new Object();

function register(command, func, description)
{
	var fname = "" + func.name;
	bind(command, fname);
	commands[command] = description;
}

register("help", help, "Displays help on commands.");
function help()
{
	for(c in commands)
	{
		print("\03302," + c + "\033-- " + commands[c]);
	}
}

register("echo", setlocalecho, "Toggles local echo.  Optional argument is on or off.");

function setlocalecho(command, echo)
{
	if(echo)
	{
		localecho = (echo.toLowerCase == "on");
	}
	else
	{
		localecho = !localecho;
	}
	print("Local echo set to: " + localecho);
	storedb("localecho", localecho);
}
register("timestamp", settimestamp, "Toggles timestamp display.");

function settimestamp(command)
{
	alwaysts = !alwaysts;
	print("Timestamp display set to: " + alwaysts);
	storedb("timestamp", alwaysts);
}
Number.prototype.toStringWithWidth = function(width)
{
	var str = this.toString();
	if(width > str.length)
	{
		str = repeatChar("0", width - str.lenth) + str;
	}
	return str;
}
Date.prototype.mwtimestamp = function()
{
	return "[" + (new Number(this.getHours())).toStringWithWidth(2) + ":" + (new Number(this.getMinutes())).toStringWithWidth(2) + "]";
}

/**
 * Add a trigger.  When user sends a message containing text, func is called.
 * Passing "*" as user matches any user.  
 */
function addTrigger(user, text, func)
{
	var trigger = new Object();
	trigger.user = user;
	trigger.text = text.toLowerCase();
	trigger.action = func;
	triggers.push(trigger);
	return trigger;
}
function removeTrigger(trigger)
{
	for(var i=0 ; i<triggers.length ; i++)
	{
		if(trigger == triggers[i])
		{
			triggers.splice(i,1);
		}
	}
}
function checkTriggers(user, text)
{
	var lowertext = text.toLowerCase();
	for(var i=0 ; i<triggers.length ; i++)
	{
		var trigger = triggers[i];
		//Only if the trigger applies to this user
		if(trigger.user == "*" || trigger.user == user)
		{
			if(lowertext.search(trigger.text) >= 0)
			{
				text = trigger.action(user, text);
				lowertext = text.toLowerCase();
			}
		}
	}
	return text;
}

/**
 * Event handler.
 */
function event(type, user, text, clippedText)
{
	if(userWidth < 0)
	{
		calculateUserWidth();
	}
	//Make the left column wider for people like wim with silly usernames.
	if(user.length > userWidth)
	{
		userWidth = user.length;
	}
	//Don't process normal events.
	if(type == "text")
	{
		var now = new Date();
		//Timestamp messages more than 2 minutes apart
		if(!alwaysts && now.getMinutes() - lastDate.getMinutes() > 2)
		{
			beep(2);
			timestamp();
		}
		lastDate = now;
		//Add some padding to the username string to make them all the
		//same length.
		var paddedUser = user;
		if(lastUser == user)
		{
			paddedUser = repeatChar(" ", userWidth);
		}
		else
		{
			paddedUser = repeatChar(" ", userWidth - user.length) + user;
		}
		lastUser = user;
		if(alwaysts)
		{
			paddedUser = now.mwtimestamp() + paddedUser;
		}
		//Detect raws
		if(!isUser(user,clippedText))
		{
			var prefix = "[" + colourUser(user, user) +"]:";
			if(alwaysts)
			{
				prefix = now.mwtimestamp() + prefix;
			}
			wrap(user, prefix, clippedText);
		}
		else if(localecho || user != whoami)
		{
			clippedText = checkTriggers(user, clippedText);
			if(isGlobal())
			{
				wrap(user, colourUser(user,paddedUser) + "[" + clippedText.split(":")[0] + "]", stripUser(user, clippedText));
			}
			else
			{
				wrap(user, colourUser(user,paddedUser), stripUser(user, clippedText));
			}
		}
		return false;
	}
	return true;
}

