//
// System.Web.UI.WebControls.BulletedList.cs
//
// Authors:
//   Ben Maurer (bmaurer@users.sourceforge.net)
//
// (C) 2003 Ben Maurer
//
#if NET_1_2
using System.IO;
using System.Collections;
using System.Globalization;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.ComponentModel.Design;

namespace System.Web.UI.WebControls {
	public class BulletedList : ListControl, IPostBackEventHandler {
		
		[MonoTODO ("we are missing a new style enum, we should be using it")]
		protected override void AddAttributesToRender (HtmlTextWriter writer)
		{
			const string ListStyleType = "list-style-type";
			const string ListStyleImage = "list-style-image";
			
			bool isNumeric = false;
			switch (BulletStyle)
			{
				case BulletStyle.NotSet:
					break;
				
				case BulletStyle.Numbered:
					writer.AddStyleAttribute (ListStyleType, "decimal");
					isNumeric = true;
					break;
				
				case BulletStyle.LowerAlpha:
					writer.AddStyleAttribute (ListStyleType, "lower-alpha");
					isNumeric = true;
					break;
				
				case BulletStyle.UpperAlpha:
					writer.AddStyleAttribute (ListStyleType, "upper-alpha");
					isNumeric = true;
					break;
				
				case BulletStyle.LowerRoman:
					writer.AddStyleAttribute (ListStyleType, "lower-roman");
					isNumeric = true;
					break;
				
				case BulletStyle.UpperRoman:
					writer.AddStyleAttribute (ListStyleType, "lower-roman");
					isNumeric = true;
					break;

				case BulletStyle.Disc:
					writer.AddStyleAttribute (ListStyleType, "disc");
					break;
				
				case BulletStyle.Circle:
					writer.AddStyleAttribute (ListStyleType, "circle");
					break;
				
				case BulletStyle.Square:
					writer.AddStyleAttribute (ListStyleType, "square");
					break;
								
				case BulletStyle.CustomImage:
					writer.AddStyleAttribute (ListStyleImage, "url(" + BulletImageUrl+ ")");
					break;
			}

			if (isNumeric && FirstBulletNumber != 1)
				writer.AddAttribute ("start", FirstBulletNumber.ToString ());
			
			base.AddAttributesToRender (writer);
		}
		
		bool cacheIsEnabled;
		[MonoTODO ("new bool prop on ListItem: Enabled")]
		protected virtual void RenderBulletText (ListItem item, int index, HtmlTextWriter writer)
		{
			switch (DisplayMode) {
				case BulletedListDisplayMode.Text:
					//if (!item.Enabled) {
					//	writer.AddAttribute (HtmlTextWriterAttribute.Disabled, "disabled");
					//	writer.RenderBeginTag (HtmlTextWriterTag.Span);
					//}
					writer.Write (item.Text);
					//if (!item.Enabled)
					//	writer.RenderEndTag ();
					break;

				case BulletedListDisplayMode.HyperLink:
					//if (cacheIsEnabled && item.Enabled) {
					//	writer.AddAttribute (HtmlTextWriterAttribute.Href, item.Value);
					//	if (Target != "")
					//		writer.AddAttribute(HtmlTextWriterAttribute.Target, this.Target);
					//	
					//}
					//else
						writer.AddAttribute (HtmlTextWriterAttribute.Disabled, "disabled");
					
					writer.RenderBeginTag (HtmlTextWriterTag.A);
					writer.Write (item.Text);
					writer.RenderEndTag ();
					break;

				case BulletedListDisplayMode.LinkButton:
					//if (cacheIsEnabled && item.Enabled)
						writer.AddAttribute (HtmlTextWriterAttribute.Href, Page.GetPostBackClientHyperlink (this, (index.ToString (CultureInfo.InvariantCulture))));
					//else
					//	writer.AddAttribute (HtmlTextWriterAttribute.Disabled, "disabled");
					writer.RenderBeginTag (HtmlTextWriterTag.A);
					writer.Write (item.Text);
					writer.RenderEndTag ();
					break;
			}
		}
		
		protected override void RenderContents (HtmlTextWriter writer)
		{
			cacheIsEnabled = this.Enabled;
			int idx = 0;
			foreach (ListItem i in Items) {
				writer.RenderBeginTag (HtmlTextWriterTag.Li);
				this.RenderBulletText (i, idx ++, writer);
				writer.RenderEndTag ();
			}
		}
		
		[MonoTODO ("ListControl has a CausesValidation prop in v1.2, we need to use it")]
		void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
		{
			//if (CausesValidation)
			//	Page.Validate ();
			
			this.OnClick (new BulletedListEventArgs (int.Parse (eventArgument, CultureInfo.InvariantCulture)));
		}
			
		public override bool AutoPostBack { 
			get { return base.AutoPostBack; }
			set { throw new NotSupportedException (String.Format ("This property is not supported in {0}", GetType ())); }
		}
		
		public override int SelectedIndex {
			get { return base.SelectedIndex; }
			set { throw new NotSupportedException (String.Format ("This property is not supported in {0}", GetType ())); }
		}
		
		public override ListItem SelectedItem {
			get { return base.SelectedItem; }
		}
		
		public virtual string BulletImageUrl {
			get {
				object ret = ViewState ["BulletImageUrl"];
				if (ret != null)
					return (string) ret; 
			
				return "";
			}
			set {
				ViewState ["BulletImageUrl"] = value;
			}
		}
		
		public virtual BulletStyle BulletStyle {
			get {
				object ret = ViewState ["BulletStyle"];
				if (ret != null)
					return (BulletStyle) ret; 
			
				return BulletStyle.NotSet;
			}
			set {
				if ((int) value < 0 || (int) value > 9)
					throw new ArgumentOutOfRangeException ("value");

				ViewState ["BulletStyle"] = value;
			}
		}
		
		public override ControlCollection Controls { get { return new EmptyControlCollection (this); } }
		
		public virtual BulletedListDisplayMode DisplayMode {
			get {
				object ret = ViewState ["DisplayMode"];
				if (ret != null)
					return (BulletedListDisplayMode) ret; 
			
				return BulletedListDisplayMode.Text;
			}
			set {
				if ((int) value < 0 || (int) value > 2)
					throw new ArgumentOutOfRangeException ("value");

				ViewState ["DisplayMode"] = value;
			}
		}
		
		public virtual int FirstBulletNumber {
			get {
				object ret = ViewState ["FirstBulletNumber"];
				if (ret != null)
					return (int) ret; 
			
				return 1;
			}
			set {
				ViewState ["FirstBulletNumber"] = value;
			}
		}
		

		protected override HtmlTextWriterTag TagKey {
			get {
				switch (BulletStyle) {			
					case BulletStyle.Numbered:
					case BulletStyle.LowerAlpha:
					case BulletStyle.UpperAlpha:
					case BulletStyle.LowerRoman:
					case BulletStyle.UpperRoman:
						return HtmlTextWriterTag.Ol;
					
					case BulletStyle.NotSet:
					case BulletStyle.Disc:
					case BulletStyle.Circle:
					case BulletStyle.Square:
					case BulletStyle.CustomImage:
					default:
						return HtmlTextWriterTag.Ul;
				}
			}
		}
		
		public virtual string Target {
			get {
				object ret = ViewState ["Target"];
				if (ret != null)
					return (string) ret; 
			
				return "";
			}
			set {
				ViewState ["Target"] = value;
			}
		}
		
		static readonly object ClickEvent = new object ();
		public event EventHandler Click
		{
			add {
				Events.AddHandler (ClickEvent, value);
			}
			remove {
				Events.RemoveHandler (ClickEvent, value);
			}
		}
		
		protected virtual void OnClick (BulletedListEventArgs e)
		{
			if (Events != null) {
				EventHandler eh = (EventHandler) (Events [ClickEvent]);
				if (eh != null)
					eh (this, e);
			}
		}
	}
}
#endif
