var TaskManager = new Object ();

/*

*/

TaskManager.initialize = function ()
{
	if (isSet (this.timeout_id))
		clearTimeout (this.timeout_id);
		
	this.timeout_id = null;
	
	// Cleanning array
	if (isSet (this.awaiting))
	{
		var len = this.awaiting.length;
		for (var i=0; i < len; i++)
			this.awaiting.pop();
	}
	else // Creating new array
		this.awaiting = new Array();
	
	return true;
};

TaskManager.task_exists = function (_args)
{
	for (var i=0; i < this.awaiting.length; i++)
	{
		var args = this.awaiting[i];
		
		if (_args.length != args.length)
			continue;
			
		var equal=true;
		for (var j=0; j < args.length; j++)
		{
			if (args[j] !== _args[j])
			{
				equal=false;
				break;
			}
		}
		
		if (equal)
			return true;
	}
	return false;
};

// gets many arguments via `arguments` variable (first argument is the functionName the others are it's args)
TaskManager.add_task = function (_functionName)
{
	if (! this.task_exists (arguments))
		var length = this.awaiting.push (arguments);
		
	this.start ();
	return length; // the place of me
};

TaskManager.hadStarted = function ()
{
	if (isSet (this.timeout_id))
		return true;

	return false;
};

TaskManager.start = function ()
{
	if (! this.hadStarted ())
		this.workInBackground ();
};

TaskManager.workInBackground = function ()
{
	if (this.awaiting.length == 0)
		return this.initialize();

	if (! FormHandler.inUse ())
	{
		var task = this.awaiting[0];
		
		var function_name = task[0]; // first argument is the functionName
		var function_arguments = "";
		
		for (var i=1; i < task.length; i++)
		{
			if (! function_arguments == "")
				function_arguments += ", ";
			
			if (typeof (task[i]) == "string")
				function_arguments += "'" + task[i] + "'";
			else
				function_arguments += "task["+i+"]";
		}
		
		eval (function_name+"(" + function_arguments + ");");
		this.awaiting.shift();
	}
	
	this.timeout_id = setTimeout ("TaskManager.workInBackground()", 100);
};

TaskManager.initialize ();
