var NameValueList = (function()
{
	function add()
	{
		if (this[arguments[0]])
			return (false);
		this[this.length] = {name:arguments[0], value:arguments[1]};
		this[arguments[0]] = arguments[1];
		return (true);
	}

	function clear()
	{
		for (var i = 0; i < this.length; ++i)
			delete (this[this[i].name]);
		this.length = 0;
	}

	function clone()
	{
		var other = ctor(this.delimiters.line, this.delimiters.equal);

		for (var i = 0; i < this.length; ++i)
		{
			other[i] = this[i];
			other[this[i].name] = this[i].value;
		}
		return (other);
	}

	function remove(name)
	{
		var idx = parseInt(name, 10);

		if (isNaN(idx))
			for (idx = 0; idx < this.length; ++idx)
				if (this[idx].name == name)
					break;
		if (-1 < idx && idx < this.length)
		{
			name = this[idx].name;
			for (++idx; idx < this.length; ++idx)
				this[idx - 1] = this[idx];
			--this.length;
			delete (this[name]);
		}
	}

	function set()
	{
		if (!this.add(arguments[0], arguments[1]))
		{
			this[arguments[0]] = arguments[1];
			for (var i = 0; i < this.length; ++i)
			{
				if (this[i].name == arguments[0])
				{
					this[i].value = arguments[1];
					break;
				}
			}
		}
	}

	function toString()
	{
		var value = "";
		var line = arguments[0] ? arguments[0].toString() : this.delimiters.line;
		var equal = arguments[1] ? arguments[1].toString() : this.delimiters.equal;
		var last = this.length - 1;

		if (-1 < last)
		{
			for (var i = 0; i < last; ++i)
				value += this[i].name + equal + this[i].value + line;
			value += this[last].name + equal + this[last].value;
		}
		return (value);
	}

	function ctor()
	{
		var items = [];
		var line = arguments[0] ? arguments[0].toString() : ",";
		var equal = arguments[1] ? arguments[1].toString() : "=";

		items.delimiters = {line:line, equal:equal};
		items.add = add;
		items.clear = clear;
		items.clone = clone;
		items.remove = remove;
		items.set = set;
		items.toString = toString;
		return (items);
	}

	ctor.parse = function(value)
	{
		var items = ctor(arguments[1], arguments[2]);
		var list = value.split(new RegExp(items.delimiters.line.replace(/([\\\^\$\*\+\?\,\.\:\=\-\|\[\]\(\)\{\}])/g, "\\$1")));

		for (var i = 0; i < list.length; ++i)
		{
			items[i] = list[i].split(items.delimiters.equal);
			items[i] = {name:items[i][0], value:items[i][1]};
			items[items[i].name] = items[i].value;
		}
		return (items);
	}

	return (ctor);
})();
