// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
using System;
using System.Collections;

namespace HtmlAgilityPack
{
	internal class NameValuePairList
	{
		internal readonly string Text;
		private ArrayList _allPairs;
		private Hashtable _pairsWithName;

		internal NameValuePairList():
			this(null)
		{
		}

		internal NameValuePairList(string text)
		{
			Text = text;
			_allPairs = new ArrayList();
			_pairsWithName = new Hashtable();

			Parse(text);
		}

		internal string GetNameValuePairValue(string name)
		{
			if (name==null)
				throw new ArgumentNullException();
			ArrayList al = GetNameValuePairs(name);
			if (al==null)
				return null;

			// return first item
			NameValuePair nvp = al[0] as NameValuePair;
			return nvp.Value;
		}

		internal ArrayList GetNameValuePairs(string name)
		{
			if (name==null)
				return _allPairs;
			return _pairsWithName[name] as ArrayList;
		}

		private void Parse(string text)
		{
			_allPairs.Clear();
			_pairsWithName.Clear();
			if (text==null)
				return;

			string[] p = text.Split(';');
			if (p==null)
				return;
			foreach(string pv in p)
			{
				if (pv.Length==0)
					continue;
				string[] onep = pv.Split(new char[]{'='}, 2);
				if (onep==null)
					continue;
				NameValuePair nvp = new NameValuePair(onep[0].Trim().ToLower());
				if (onep.Length<2)
					nvp.Value = "";
				else
					nvp.Value = onep[1];

				_allPairs.Add(nvp);

				// index by name
				ArrayList al = _pairsWithName[nvp.Name] as ArrayList;
				if (al==null)
				{
					al = new ArrayList();
					_pairsWithName[nvp.Name] = al;
				}
				al.Add(nvp);
			}
		}

		internal static string GetNameValuePairsValue(string text, string name)
		{
			NameValuePairList l = new NameValuePairList(text);
			return l.GetNameValuePairValue(name);
		}
	}
}
