// Argument handling class
if (typeof(_fileVersions) == 'undefined')
	eval('var _fileVersions = new Array()');
_fileVersions.push('Arguments 6.6.0.0');

function Arguments(separator)
{
    if (!separator)
    {
        separator = "|";
    }

	this.args = new Array();
	this.separator = separator;
}

Arguments.prototype.Clear = function()
{
	this.args = new Array();
}

Arguments.prototype.AddFunction = function(argValue)
{
	this.Add("Function", argValue);
}

Arguments.prototype.AddCallbackFunction = function(argValue)
{
	if (typeof(argValue) == "function")
	{
		var functionNameRegExp = new RegExp("function (\\w+)", "gi");

		functionNameRegExp.exec(argValue);
		argValue = RegExp.$1;
	}

	this.Add("CallbackFunction", argValue);
}

Arguments.prototype.Add = function(argKey, argValue)
{
    var keyValuePair = 
        {  
            key: argKey,
            value : argValue
        };

    if (argKey == null || argKey.search(/=/) >= 0)
    {
        alert("Invalid key: " + (argKey == null ? "null" : argKey));
        return;
    }

    if (this.Get(argKey) != null)
    {
        alert("Key already exists: " + argKey);
        return;
    }
        
    this.args.push(keyValuePair);
}

Arguments.prototype.GetCallbackFunction = function()
{
	return this.Get("CallbackFunction");
}

Arguments.prototype.Get = function(argKey)
{
    var argValue = null;

    var item = this.GetItem(argKey);

    if (item != null)
    {
        argValue = item.value;
    }

    return argValue;
}

Arguments.prototype.GetItem = function(argKey)
{
    var item = null;

    for (var index = 0; index < this.args.length; index++)
    {
        if (this.args[index].key.toLowerCase() == argKey.toLowerCase())
        {
            item = this.args[index];
            break;
        }
    }

    return item;
}

Arguments.prototype.Set = function(argKey, argValue)
{
    var item = this.GetItem(argKey);

    if (item != null)
    {
        item.value = argValue;
    }
    else
    {
        this.Add(argKey, argValue);
    }
}

Arguments.prototype.ToString = function()
{
    var keyValuePairs = new Array();
    
    for(var index = 0; index < this.args.length; index++)
    {
        keyValuePairs.push(this.args[index].key + "=" + this.args[index].value);
    }    
    
    return keyValuePairs.join(this.separator);
}

function ParseArguments(args, splitChar, separator)
{
	// Sanity check
	if (typeof(args) != "string")
	{
		alert("ParseArguments: only string is allowed. Caller passed: " + args);
		return null;
	}

    if (!splitChar)
    {
        splitChar = "|";
    }    

    if (!separator)
    {
        separator = "|";
    }    

    var arguments = new Arguments(separator);
    var nameValuePairs = args.split(splitChar);
    
    for(var index = 0; index < nameValuePairs.length; index++)
    {
        var nameValuePair = nameValuePairs[index].split("=");
        var key = nameValuePair[0];
        var value = nameValuePair[1];
    
        arguments.Add(key, value);
    }

    return arguments;
}

function ExecuteArgumentsCallbackFunction(arguments)
{
	var args = ParseArguments(arguments);        
	var callbackFunction = args.GetCallbackFunction();
	var callbackExecuted = false;

	if (callbackFunction != null && callbackFunction != "")
	{
		eval(callbackFunction + "(args)");
		callbackExecuted = true;
	}
	
	return callbackExecuted;
}
