Click here to Skip to main content
15,886,806 members
Articles / Multimedia / GDI+

A flexible charting library for .NET

Rate me:
Please Sign up or sign in to vote.
4.70/5 (1,112 votes)
6 Jun 200730 min read 8.9M   180.2K   2.1K  
Looking for a way to draw 2D line graphs with C#? Here's yet another charting class library with a high degree of configurability, that is also easy to use.
//============================================================================
//ZedGraphWebData Class
//Copyright (C) 2005  Darren Martz
//
//This library is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public
//License as published by the Free Software Foundation; either
//version 2.1 of the License, or (at your option) any later version.
//
//This library is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public
//License along with this library; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//=============================================================================

using System;
using System.Web.UI;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;

//
// The following are PROXY classes to the real parts of ZedGraph. This was done
// because of the generic nature of ZedGraph support WebForms, WinForms, and 
// Console applications. The specific requirements for building the webcontrol are
// unique enough to conflict the generic requirements of ZedGraph, so we have
// proxy classes.
//

namespace ZedGraph
{
	#region ZedGraphWebCurveItem
	/// <summary>
	/// Base class for curve items in the web control
	/// <seealso cref="CurveItem"/>
	/// </summary>
	/// <author>Darren Martz</author>
	[DefaultProperty("Label")]
	public abstract class ZedGraphWebCurveItem : GenericItem
	{
		/// <summary>
		/// Identifies curve item by the labels value
		/// </summary>
		/// <returns>A string containing "CurveItem: label", where 'label' is the
		/// <see cref="CurveItem.Label"/> property of the <see cref="CurveItem"/>
		/// </returns>
		public override string ToString()
		{
			return "CurveItem: " + Label;
		}
		
		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebCurveItem() : base()
		{
			Register('0',typeof(ZedGraphWebPointPairCollection));
		}

		/// <summary>
		/// Constructor that accepts a default label value
		/// </summary>
		/// <param name="label">Curve item label</param>
		public ZedGraphWebCurveItem(string label) : base()
		{
			Label = label;
		}

		#region Web specific Methods
		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebCurveItem"/> to the specified
		/// <see cref="CurveItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="CurveItem"/> object</param>
		public void CopyTo( CurveItem item )
		{
			item.Label = this.Label;
			item.Color = this.Color;
			item.IsLegendLabelVisible = this.IsLegendLabelVisible;
			item.IsY2Axis = this.IsY2Axis;
			item.IsVisible = this.IsVisible;
		}

		/// <summary>
		/// Creates a new CurveItem using the PointPairList and add it the the given pane.
		/// </summary>
		/// <param name="pane">the GraphPane object to which to add the new curve</param>
		/// <param name="points">a PointPairList collection defining the points for this curve</param>
		/// <returns>the newly created CurveItem added to the given GraphPane</returns>
		/// <remarks>This method must be overriden by childs</remarks>
		public abstract CurveItem CreateInPane( GraphPane pane, PointPairList points );
		#endregion

		#region Web Specific Properties

		/// <summary>
		/// The object reference that points to a data source from which to bind curve data.
		/// </summary>
		[Bindable(true),Category("Data"),NotifyParentProperty(true)]
		[Description("Overrides the main DataSource. This data source contains the data for this curve.")]
		public object DataSource
		{
			get 
			{ 
				object x = ViewState["DataSource"]; 
				return (null == x) ? null : (object)x;
			}
			set { ViewState["DataSource"] = value; }
		}

		/// <summary>
		/// The <see cref="String"/> name of the data member that contains the data to be
		/// bound to this <see cref="ZedGraph.CurveItem"/>.
		/// </summary>
		[Category("Data"),NotifyParentProperty(true),
		Description("Optional binding member name for populating this curve item with values")]
		public string DataMember
		{
			get 
			{ 
				object x = ViewState["DataMember"]; 
				return (null == x) ? String.Empty : (string)x;
			}
			set { ViewState["DataMember"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="CurveItem.Label"/>.
		/// </summary>
		/// <remarks> A text string that represents the <see cref="ZedGraph.Legend"/>
		/// entry for the the <see cref="CurveItem"/> object.
		/// </remarks>
		/// <seealso cref="CurveItem.Label"/>
		[Category("Curve Details")]
		[NotifyParentProperty(true)]
		[Description("A text string that represents the Legend entry for this CurveItem object")]
		public string Label
		{
			get 
			{ 
				object x = ViewState["Label"]; 
				return (null == x) ? String.Empty : (string)x;
			}
			set { ViewState["Label"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="CurveItem.Color"/>.
		/// </summary>
		/// <remarks> The <see cref="LineItem.Line"/>/<see cref="LineItem.Symbol"/>/<see cref="BarItem.Bar"/> 
		/// color (FillColor for the Bar).  This is a common access to
		/// <see cref="ZedGraph.Line.Color"/>, <see cref="ZedGraph.Border.Color"/>, and
		/// <see cref="ZedGraph.Fill.Color"/> properties for this curve
		/// </remarks>
		/// <seealso cref="CurveItem.Color"/>
		[Category("Curve Details"),NotifyParentProperty(true),
		Description("The Line/Symbol/Bar color (FillColor for the Bar). "+
			"This is a common access to Color, Color, and Color properties for this curve.")]
		public Color Color
		{
			get 
			{ 
				object x = ViewState["Color"]; 
				return (null == x) ? Color.Empty : (Color)x;
			}
			set { ViewState["Color"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="CurveItem.IsVisible"/>.
		/// </summary>
		/// <remarks> Determines whether the <see cref="CurveItem"/> is visible on the graph.
		/// Note that this value turns the curve display on or off, but it does not
		/// affect the display of the legend entry.  To hide the legend entry, you
		/// have to set <see cref="IsLegendLabelVisible"/> to false.
		/// </remarks>
		/// <seealso cref="CurveItem.IsVisible"/>
		/// <seealso cref="CurveItem.IsLegendLabelVisible"/>
		[Category("Curve Details"),NotifyParentProperty(true),
		Description("Determines whether this CurveItem is visible on the graph. "+
			"Note that this value turns the curve display on or off, but it does not "+
			"affect the display of the legend entry. To hide the legend entry, you have "+
			"to set IsLegendLabelVisible to false.")]
		public bool IsVisible
		{
			get 
			{ 
				object x = ViewState["IsVisible"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["IsVisible"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="CurveItem.IsLegendLabelVisible"/>.
		/// </summary>
		/// <remarks> Determines whether the label for this <see cref="CurveItem"/> is visible in the legend.
		/// Note that this value turns the legend entry display on or off, but it does not
		/// affect the display of the curve on the graph.  To hide the curve, you
		/// have to set <see cref="IsVisible"/> to false.
		/// </remarks>
		/// <seealso cref="CurveItem.IsVisible"/>
		/// <seealso cref="CurveItem.IsLegendLabelVisible"/>
		[Category("Curve Details"),NotifyParentProperty(true),
		Description("Determines whether the label for this CurveItem is visible in "+
			"the legend. Note that this value turns the legend entry display on or off, "+
			"but it does not affect the display of the curve on the graph. To hide the "+
			"curve, you have to set IsVisible to false. ")]		
		public bool IsLegendLabelVisible
		{
			get 
			{ 
				object x = ViewState["IsLegendLabelVisible"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["IsLegendLabelVisible"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="CurveItem.IsY2Axis"/>.
		/// </summary>
		/// <remarks> Determines which Y axis this <see cref="CurveItem"/>
		/// is assigned to.  The
		/// <see cref="ZedGraph.YAxis"/> is on the left side of the graph and the
		/// <see cref="ZedGraph.Y2Axis"/> is on the right side.  Assignment to an axis
		/// determines the scale that is used to draw the curve on the graph.
		/// </remarks>
		/// <seealso cref="CurveItem.IsY2Axis"/>
		[Category("Curve Details"),NotifyParentProperty(true),
		Description("Determines which Y axis this CurveItem is assigned to. The "+
			"YAxis is on the left side of the graph and the Y2Axis is on the right "+
			"side. Assignment to an axis determines the scale that is used to draw the "+
			"curve on the graph.")]
		public bool IsY2Axis
		{
			get 
			{ 
				object x = ViewState["IsY2Axis"]; 
				return (null == x) ? false : (bool)x;
			}
			set { ViewState["IsY2Axis"] = value; }
		}

		/// <summary>
		/// Proxy property that gets the value of the <see cref="CurveItem.Points"/>.
		/// </summary>
		[
		Category("Data"),		
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebPointPairCollection Points
		{			
			get {  return (ZedGraphWebPointPairCollection)GetValue('0');} 
		}
							
		#endregion
	}
	#endregion

	#region ZedGraphWebBorder

	/// <summary>
	/// Web control state management class for a <see cref="Border"/> object.
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebBorder : GenericItem
	{
		/// <summary>
		/// Override ToString function
		/// </summary>
		/// <returns>Always returns "Border"</returns>
		public override string ToString()
		{
			string text;
			if( !this.IsVisible )
				text = "none";
			else
				text = Color.Name;
			return text;
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebBorder"/> to the specified
		/// <see cref="ZedGraph.Border"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.Border"/> object</param>
		public void CopyTo( Border item )
		{
			item.Color = this.Color;
			item.IsVisible = this.IsVisible;
			item.PenWidth = this.PenWidth;
			item.InflateFactor = this.InflateFactor;
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Border.Color"/>.
		/// </summary>
		/// <remarks> Determines the <see cref="System.Drawing.Color"/> of the <see cref="Pen"/> used to
		/// draw this Border.
		/// </remarks>
		[NotifyParentProperty(true)]
		public Color Color
		{
			get 
			{ 
				object x = ViewState["Color"]; 
				return (null == x) ? Border.Default.Color : (Color)x;
			}
			set { ViewState["Color"] = value; }
		} 

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Border.IsVisible"/>.
		/// </summary>
		/// <remarks> Determines whether or not the Border will be drawn.  true to draw the Border,
		/// false otherwise.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsVisible
		{
			get 
			{ 
				object x = ViewState["IsVisible"]; 
				return (null == x) ? Border.Default.IsVisible : (bool) x;
			}
			set { ViewState["IsVisible"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Border.PenWidth"/>.
		/// </summary>
		/// <remarks> Gets or sets the width, in points (1/72 inch), of the <see cref="Pen"/>
		/// used to draw this Border.
		/// </remarks>
		[NotifyParentProperty(true)]
		public float PenWidth
		{
			get 
			{ 
				object x = ViewState["PenWidth"]; 
				return (null == x) ? Border.Default.PenWidth : (float)x;
			}
			set { ViewState["PenWidth"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Border.InflateFactor"/>.
		/// </summary>
		/// <remarks> Gets or sets the amount of inflation to be done on the rectangle
		/// before rendering.
		/// </remarks>
		[NotifyParentProperty(true)]
		public float InflateFactor
		{
			get 
			{ 
				object x = ViewState["InflateFactor"]; 
				return (null == x) ? Border.Default.InflateFactor : (float)x;
			}
			set { ViewState["InflateFactor"] = value; }
		}
	}

	/// <summary>
	/// Todo: idem ZedGraphWebFill2
	/// </summary>
	public class ZedGraphWebBorder2 : ZedGraphWebBorder
	{
		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebBorder2() : base()
		{
			this.IsVisible = true;
		}
	}
	#endregion

	#region ZedGraphWebFill
	/// <summary>
	/// Web control state management class for a <see cref="Fill"/> object.
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebFill : GenericItem
	{
		/// <summary>
		/// Override ToString() function
		/// </summary>
		/// <returns>Always returns "Fill"</returns>
		public override string ToString()
		{
			string text = this.Type.ToString();
			if( this.Type != ZedGraph.FillType.None )
				text += " (" + this.Color.Name + ")";
			return text;
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebFill"/> to the specified
		/// <see cref="ZedGraph.Fill"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.Fill"/> object</param>
		public void CopyTo( Fill item )
		{
			item.Color = System.Drawing.Color.FromArgb( (int)Math.Floor(this.ColorOpacity*2.55+.5), this.Color );
			item.IsVisible = this.IsVisible;
			item.RangeMax = this.RangeMax;
			item.RangeMin = this.RangeMin;
			item.Type = this.Type;
			item.AlignH = this.AlignH;
			item.AlignV = this.AlignV;
			item.IsScaled = this.IsScaled;
			item.Brush = this.Brush;
		}
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Fill.Color"/>.
		/// </summary>
		/// <remarks> The fill color.  This property is used as a single color to make a solid fill
		/// (<see cref="Type"/> is <see cref="FillType.Solid"/>), or it can be used in 
		/// combination with <see cref="System.Drawing.Color.White"/> to make a
		/// <see cref="LinearGradientBrush"/>
		/// when <see cref="Type"/> is <see cref="FillType.Brush"/> and <see cref="Brush"/>
		/// is null.
		/// </remarks>
		[NotifyParentProperty(true)]
		public Color Color
		{
			get 
			{ 
				object x = ViewState["Color"]; 
				return (null == x) ? Color.Empty : (Color)x;
			}
			set { ViewState["Color"] = value; }
		} 

		/// <summary>
		/// Opacity of <see cref="Color"/>, range from 0 to 100.
		/// 100 is opaque, 0 is invisible.
		/// </summary>
		/// <remarks>
		/// To be replaced by a best color designer which enables the selection of a transparency level.
		/// </remarks>
		[NotifyParentProperty(true)]
		[Description("Color Opacity between 0 and 100. 100 is opaque. 0 is invisible.")]
		public float ColorOpacity
		{
			get 
			{ 
				object x = ViewState["ColorOpacity"];
				return (null == x) ? 100 : (float)x;
			}
			set { ViewState["ColorOpacity"] = Math.Max(0,Math.Min(100,(float)value)); }
		} 

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Fill.IsVisible"/>.
		/// </summary>
		/// <remarks> This property determines the type of color fill. 
		/// Returns true if the <see cref="Type"/> property is either
		/// <see cref="FillType.Solid"/> or
		/// <see cref="FillType.Brush"/>.  If set to true, this property
		/// will automatically set the <see cref="Type"/> to
		/// <see cref="FillType.Brush"/>.  If set to false, this property
		/// will automatically set the <see cref="Type"/> to
		/// <see cref="FillType.None"/>.  In order to get a regular
		/// solid-color fill, you have to manually set <see cref="Type"/>
		/// to <see cref="FillType.Solid"/>.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsVisible
		{
			get 
			{ 
				object x = ViewState["IsVisible"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["IsVisible"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Fill.RangeMax"/>.
		/// </summary>
		/// <remarks> The maximum user-scale value for the gradient-by-value determination.  This defines
		/// the user-scale value for the end of the gradient.
		/// </remarks>
		/// <seealso cref="FillType.GradientByX"/>
		/// <seealso cref="FillType.GradientByY"/>
		/// <seealso cref="FillType.GradientByZ"/>
		/// <seealso cref="ZedGraph.Fill.IsGradientValueType"/>
		/// <value>A double value, in user scale unit</value>
		[NotifyParentProperty(true)]
		public double RangeMax
		{
			get 
			{ 
				object x = ViewState["RangeMax"]; 
				return (null == x) ? 0 : (double)x;
			}
			set { ViewState["RangeMax"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Fill.RangeMin"/>.
		/// </summary>
		/// <remarks> The minimum user-scale value for the gradient-by-value determination.  This defines
		/// the user-scale value for the start of the gradient.
		/// </remarks>
		/// <seealso cref="FillType.GradientByX"/>
		/// <seealso cref="FillType.GradientByY"/>
		/// <seealso cref="FillType.GradientByZ"/>
		/// <seealso cref="ZedGraph.Fill.IsGradientValueType"/>
		/// <value>A double value, in user scale unit</value>
		[NotifyParentProperty(true)]
		public double RangeMin
		{
			get 
			{ 
				object x = ViewState["RangeMin"]; 
				return (null == x) ? 0 : (double)x;
			}
			set { ViewState["RangeMin"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Fill.Type"/>.
		/// </summary>
		/// <remarks> Determines the type of fill, which can be either solid
		/// color (<see cref="ZedGraph.FillType.Solid"/>) or a custom brush
		/// (<see cref="ZedGraph.FillType.Brush"/>).  See <see cref="Type"/> for
		/// more information.
		/// </remarks>
		/// <seealso cref="ZedGraph.Fill.Color"/>
		[NotifyParentProperty(true)]
		public FillType Type
		{
			get 
			{ 
				object x = ViewState["Type"]; 
				return (null == x) ? FillType.Solid : (FillType)x;
			}
			set { ViewState["Type"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Fill.AlignH"/>.
		/// </summary>
		/// <remarks> Determines how the brush will be aligned with the filled object
		/// in the horizontal direction.  This value is a <see cref="ZedGraph.AlignH"/> enumeration.
		/// This field only applies if <see cref="IsScaled"/> is false.
		/// </remarks>
		/// <seealso cref="AlignV"/>
		[NotifyParentProperty(true)]
		public AlignH AlignH
		{
			get 
			{ 
				object x = ViewState["AlignH"]; 
				return (null == x) ? Fill.Default.AlignH : (AlignH)x;
			}
			set { ViewState["AlignH"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Fill.AlignV"/>.
		/// </summary>
		/// <remarks> Determines how the brush will be aligned with the filled object
		/// in the vertical direction.  This value is a <see cref="ZedGraph.AlignV"/> enumeration.
		/// This field only applies if <see cref="IsScaled"/> is false.
		/// </remarks>
		/// <seealso cref="AlignH"/>
		[NotifyParentProperty(true)]
		public AlignV AlignV
		{
			get 
			{ 
				object x = ViewState["AlignV"]; 
				return (null == x) ? Fill.Default.AlignV : (AlignV)x;
			}
			set { ViewState["AlignV"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Fill.IsScaled"/>.
		/// </summary>
		/// <remarks> Determines if the brush will be scaled to the bounding box
		/// of the filled object.  If this value is false, then the brush will only be aligned
		/// with the filled object based on the <see cref="AlignH"/> and <see cref="AlignV"/>
		/// properties.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsScaled
		{
			get 
			{ 
				object x = ViewState["IsScaled"]; 
				return (null == x) ? Fill.Default.IsScaled : (bool)x;
			}
			set { ViewState["IsScaled"] = value; }
		}
		
		/// <summary>
		/// The <see cref="Brush"/> object associated with this <see cref="Fill"/> object.
		/// Not accessible via webcontrol properties.
		/// </summary>
		[Browsable(false)]
		public Brush Brush = null;			
	}


	/// <summary>
	/// TODO: change the vsassist system so different default constructors or initializers can be called,
	/// or to be able to know if a the object is already initialized or not (new).
	/// </summary>
	public class ZedGraphWebFill2 : ZedGraphWebFill
	{
		/// <summary>
		/// Default Constructor
		/// </summary>
		public ZedGraphWebFill2()
		{
			this.Color = Color.White;
		}
	}

	#endregion

	#region ZedGraphWebSymbol
	/// <summary>
	/// Web control state management class for a <see cref="Symbol"/> object
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebSymbol : GenericItem
	{
		/// <summary>
		/// Override ToString() function
		/// </summary>
		/// <returns>Always returns "Symbol"</returns>
		public override string ToString()
		{
			return "Symbol";
		}

		/// <summary>
		/// Default Constructor
		/// </summary>
		public ZedGraphWebSymbol() : base()
		{
			Register('b',typeof(ZedGraphWebBorder));
			Register('f',typeof(ZedGraphWebFill));

			this.Fill.Color = ZedGraph.Symbol.Default.FillColor;
			this.Fill.Brush = ZedGraph.Symbol.Default.FillBrush;
			this.Fill.Type  = ZedGraph.Symbol.Default.FillType;

			this.Border.IsVisible = ZedGraph.Symbol.Default.IsBorderVisible;
			this.Border.Color = ZedGraph.Symbol.Default.BorderColor;
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebSymbol"/> to the specified
		/// <see cref="Symbol"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="Symbol"/> object</param>
		public void CopyTo( Symbol item )
		{
			item.IsVisible = this.IsVisible;
			item.Size = this.Size;
			item.Type = this.SymbolType;
			this.Border.CopyTo(item.Border);
			this.Fill.CopyTo(item.Fill);
		}

		#region Properties
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Symbol.IsVisible"/>.
		/// </summary>
		/// <remarks> Gets or sets a property that shows or hides the <see cref="Symbol"/>.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsVisible
		{
			get 
			{ 
				object x = ViewState["IsVisible"]; 
				return (null == x) ? Symbol.Default.IsVisible : (bool)x;
			}
			set { ViewState["IsVisible"] = value; }
		} 
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Symbol.Size"/>.
		/// </summary>
		/// <remarks> Gets or sets the size of the <see cref="Symbol"/> in points (1/72nd inch).
		/// </remarks>
		[NotifyParentProperty(true)]
		public float Size
		{
			get 
			{ 
				object x = ViewState["Size"]; 
				return (null == x) ? Symbol.Default.Size : (float)x;
			}
			set { ViewState["Size"] = value; }
		} 
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="Symbol.Type"/>.
		/// </summary>
		/// <remarks> Gets or sets the type (shape) of the <see cref="Symbol"/> using
		/// a <see cref="SymbolType"/> enumeration.
		/// </remarks>
		[NotifyParentProperty(true)]
		public SymbolType SymbolType
		{
			get 
			{ 
				object x = ViewState["SymbolType"]; 
				return (null == x) ? Symbol.Default.Type : (SymbolType)x;
			}
			set { ViewState["SymbolType"] = value; }
		} 
		#endregion	
	
		#region Border
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebBorder"/> object for
		/// this <see cref="Symbol"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Border"/>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebBorder Border
		{
			get { return (ZedGraphWebBorder)base.GetValue('b'); }
		}
		#endregion

		#region Fill
		
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebFill"/> object for
		/// this <see cref="Symbol"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Fill"/>
		[
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFill Fill
		{
			get { return (ZedGraphWebFill)base.GetValue('f'); }
		}
		
		#endregion		
	}
	#endregion

	#region ZedGraphWebBarItem
	/// <summary>
	/// Web control state management class for a <see cref="BarItem"/> class
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebBarItem : ZedGraphWebCurveItem
	{
		/// <summary>
		/// Identifies <see cref="BarItem"/> by the labels value
		/// </summary>
		/// <returns>A string containing "BarItem: label", where 'label' is the
		/// <see cref="CurveItem.Label"/> property of the <see cref="CurveItem"/>
		/// </returns>
		public override string ToString()
		{
			return "BarItem: " + Label;
		}	

		/// <summary>
		/// Default Constructor
		/// </summary>
		public ZedGraphWebBarItem() : base()
		{
			Register('b',typeof(ZedGraphWebBorder));
			Register('f',typeof(ZedGraphWebFill));

			this.Border.PenWidth = ZedGraph.Bar.Default.BorderWidth;
			this.Border.Color = ZedGraph.Bar.Default.BorderColor;
			this.Fill.Color = ZedGraph.Bar.Default.FillColor;
			this.Fill.Type = ZedGraph.Bar.Default.FillType;
			this.Fill.Brush = ZedGraph.Bar.Default.FillBrush;
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebBarItem"/> to the specified
		/// <see cref="ZedGraph.BarItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.BarItem"/> object</param>
		public void CopyTo( BarItem item )
		{
			base.CopyTo( item );
			this.Border.CopyTo( item.Bar.Border );
			this.Fill.CopyTo( item.Bar.Fill );
		}

		/// <summary>
		/// Creates a new CurveItem using the PointPairList and add it the the given pane.
		/// </summary>
		/// <param name="pane">the GraphPane object to which to add the new curve</param>
		/// <param name="points">a PointPairList collection defining the points for this curve</param>
		/// <returns>the newly created CurveItem added to the given GraphPane</returns>
		/// <remarks>This method must be overriden by childs</remarks>
		public override CurveItem CreateInPane( GraphPane pane, PointPairList points )
		{
			BarItem x = pane.AddBar(this.Label,points,this.Color);
			this.CopyTo(x);
			return x;
		}

		#region Border
		
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebBorder"/> object for
		/// this <see cref="BarItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Border"/>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebBorder Border
		{
			get { return (ZedGraphWebBorder)base.GetValue('b'); }
		}
		
		#endregion

		#region Fill
		
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebFill"/> object for
		/// this <see cref="BarItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Fill"/>
		[
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFill Fill
		{
			get { return (ZedGraphWebFill)base.GetValue('f'); }
		}
		
		#endregion		
	}
	
	#endregion

	#region ZedGraphWebErrorBarItem
	/// <summary>
	/// Web control state management class for a <see cref="ErrorBarItem"/> class
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebErrorBarItem : ZedGraphWebCurveItem
	{
		/// <summary>
		/// Identifies <see cref="ErrorBarItem"/> by the labels value
		/// </summary>
		/// <returns>A string containing "ErrorBarItem: label", where 'label' is the
		/// <see cref="CurveItem.Label"/> property of the <see cref="CurveItem"/>
		/// </returns>
		public override string ToString()
		{
			return "ErrorBarItem: " + Label;
		}	

		/// <summary>
		/// Default Constructor
		/// </summary>
		public ZedGraphWebErrorBarItem() : base()
		{
			Register('s',typeof(ZedGraphWebSymbol));
			
			this.Symbol.SymbolType = ZedGraph.ErrorBar.Default.Type;
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebErrorBarItem"/> to the specified
		/// <see cref="ZedGraph.ErrorBarItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.ErrorBarItem"/> object</param>
		public void CopyTo( ErrorBarItem item )
		{
			base.CopyTo(item);
			this.Symbol.CopyTo(item.ErrorBar.Symbol);
			//item.BarBase = this.BarBase;
			item.ErrorBar.PenWidth = this.PenWidth;
		}

		/// <summary>
		/// Creates a new CurveItem using the PointPairList and add it the the given pane.
		/// </summary>
		/// <param name="pane">the GraphPane object to which to add the new curve</param>
		/// <param name="points">a PointPairList collection defining the points for this curve</param>
		/// <returns>the newly created CurveItem added to the given GraphPane</returns>
		/// <remarks>This method must be overriden by childs</remarks>
		public override CurveItem CreateInPane( GraphPane pane, PointPairList points )
		{
			ErrorBarItem x = pane.AddErrorBar(this.Label,points,this.Color);
			this.CopyTo(x);
			return x;
		}

		#region Symbol
		
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebSymbol"/> object for
		/// this <see cref="ErrorBarItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Symbol"/>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebSymbol Symbol
		{
			get { return (ZedGraphWebSymbol)base.GetValue('s'); }
		}
		
		#endregion

		#region Properties
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.ErrorBar.PenWidth"/>.
		/// </summary>
		/// <remarks> The pen width to be used for drawing error bars
		/// Units are points.  This property only controls the pen width for the
		/// vertical line.  The pen width for the symbol outline is
		/// controlled separately by the <see cref="Symbol"/> property.
		/// </remarks>
		[NotifyParentProperty(true)]
		public float PenWidth
		{
			get 
			{ 
				object x = ViewState["PenWidth"]; 
				return (null == x) ? ErrorBar.Default.PenWidth : (float)x;
			}
			set { ViewState["PenWidth"] = value; }
		}
		#endregion
	}

	#endregion

	#region ZedGraphWebHiLowBar
	/// <summary>
	/// Web control state management class for a <see cref="HiLowBarItem"/> class
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebHiLowBarItem : ZedGraphWebCurveItem
	{
		/// <summary>
		/// Identifies <see cref="HiLowBarItem"/> by the labels value
		/// </summary>
		/// <returns>A string containing "HiLowBarItem: label", where 'label' is the
		/// <see cref="CurveItem.Label"/> property of the <see cref="CurveItem"/>
		/// </returns>
		public override string ToString()
		{
			return "HiLowBarItem: " + Label;
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebHiLowBarItem() : base()
		{
			Register('b',typeof(ZedGraphWebBorder));
			Register('f',typeof(ZedGraphWebFill));
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebHiLowBarItem"/> to the specified
		/// <see cref="ZedGraph.HiLowBarItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.HiLowBarItem"/> object</param>
		public void CopyTo( HiLowBarItem item )
		{
			base.CopyTo(item);
		}

		/// <summary>
		/// Creates a new CurveItem using the PointPairList and add it the the given pane.
		/// </summary>
		/// <param name="pane">the GraphPane object to which to add the new curve</param>
		/// <param name="points">a PointPairList collection defining the points for this curve</param>
		/// <returns>the newly created CurveItem added to the given GraphPane</returns>
		/// <remarks>This method must be overriden by childs</remarks>
		public override CurveItem CreateInPane( GraphPane pane, PointPairList points )
		{
			HiLowBarItem x = pane.AddHiLowBar(this.Label,points,this.Color);
			this.CopyTo(x);
			return x;
		}


		#region Properties
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.HiLowBar.IsMaximumWidth"/>.
		/// </summary>
		/// <remarks> Determines whether the bar width will be based on
		/// the <see cref="Size"/> value, or it will be based on available
		/// space similar to <see cref="BarItem"/> objects.
		/// </remarks>
		/// <value>If true, then the value
		/// of <see cref="Size"/> is ignored.  If this value is true, then
		/// <see cref="GraphPane.MinClusterGap"/> will be used to determine the total space between each bar.
		/// </value>
		[NotifyParentProperty(true)]
		public bool IsMaximumWidth
		{
			get 
			{ 
				object x = ViewState["IsMaximumWidth"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["IsMaximumWidth"] = value; }
		} 
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="HiLowBar.Size"/>.
		/// </summary>
		/// <remarks>The size of the bars can be set by this value, which
		/// is then scaled according to the scaleFactor (see
		/// <see cref="PaneBase.CalcScaleFactor"/>).  Alternatively,
		/// if <see cref="IsMaximumWidth"/> is true, the bar width will
		/// be set according to the maximum available cluster width less
		/// the cluster gap (see <see cref="GraphPane.GetClusterWidth"/>
		/// and <see cref="GraphPane.MinClusterGap"/>).  That is, if
		/// <see cref="IsMaximumWidth"/> is true, then the value of
		/// <see cref="Size"/> will be ignored.
		/// </remarks>
		/// <value>Size in points (1/72 inch)</value>
		[NotifyParentProperty(true)]
		public float Size
		{
			get 
			{ 
				object x = ViewState["Size"]; 
				return (null == x) ? ZedGraph.HiLowBar.Default.Size : (float)x;
			}
			set { ViewState["Size"] = value; }
		} 		
		#endregion

		#region Border

		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebBorder"/> object for
		/// this <see cref="HiLowBarItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Border"/>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebBorder Border
		{
			get { return (ZedGraphWebBorder)base.GetValue('b'); }
		}
		#endregion

		#region Fill

		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebFill"/> object for
		/// this <see cref="HiLowBarItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Fill"/>
		[
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFill Fill
		{
			get { return (ZedGraphWebFill)base.GetValue('f'); }
		}
		#endregion		

		
	}	

	#endregion
	
	#region ZedGraphWebLineItem
	/// <summary>
	/// Web control state management class for a <see cref="LineItem"/> class
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebLineItem : ZedGraphWebCurveItem
	{
		/// <summary>
		/// Identifies <see cref="LineItem"/> by the labels value
		/// </summary>
		/// <returns>A string containing "LineItem: label", where 'label' is the
		/// <see cref="CurveItem.Label"/> property of the <see cref="CurveItem"/>
		/// </returns>
		public override string ToString()
		{
			return "LineItem: " + Label;
		}
	
		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebLineItem() : base()
		{
			Register('s',typeof(ZedGraphWebSymbol));
			Register('f',typeof(ZedGraphWebFill));

			this.Fill.Color = Line.Default.FillColor;
			this.Fill.Brush = Line.Default.FillBrush;
			this.Fill.Type  = Line.Default.FillType;
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebLineItem"/> to the specified
		/// <see cref="ZedGraph.LineItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.LineItem"/> object</param>
		public void CopyTo( LineItem item )
		{
			base.CopyTo(item);
			this.Symbol.CopyTo(item.Symbol);
			this.Fill.CopyTo(item.Line.Fill);
			item.Line.IsSmooth = this.IsSmooth;
			item.Line.Width = this.Width;
			item.Line.SmoothTension = this.Width;
			item.Line.Style = this.Style;
			item.Line.StepType = this.StepType;
		}

		/// <summary>
		/// Creates a new CurveItem using the PointPairList and add it the the given pane.
		/// </summary>
		/// <param name="pane">the GraphPane object to which to add the new curve</param>
		/// <param name="points">a PointPairList collection defining the points for this curve</param>
		/// <returns>the newly created CurveItem added to the given GraphPane</returns>
		/// <remarks>This method must be overriden by childs</remarks>
		public override CurveItem CreateInPane( GraphPane pane, PointPairList points )
		{
			LineItem x = pane.AddCurve(this.Label,points,this.Color);
			this.CopyTo(x);
			return x;
		}

		#region Properties
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Line.IsSmooth"/>.
		/// </summary>
		/// <remarks> Gets or sets a property that determines if this <see cref="Line"/>
		/// will be drawn smooth.  The "smoothness" is controlled by
		/// the <see cref="SmoothTension"/> property.
		/// </remarks>
		/// <seealso cref="ZedGraph.Line.IsSmooth"/>
		[NotifyParentProperty(true)]
		public bool IsSmooth
		{
			get 
			{ 
				object x = ViewState["IsSmooth"]; 
				return (null == x) ? Line.Default.IsSmooth : (bool)x;
			}
			set { ViewState["IsSmooth"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Line.Width"/>.
		/// </summary>
		/// <remarks> The pen width used to draw the <see cref="Line"/>, in points (1/72 inch)
		/// </remarks>
		/// <seealso cref="ZedGraph.Line.Width"/>
		[NotifyParentProperty(true)]
		public float Width
		{
			get 
			{ 
				object x = ViewState["Width"]; 
				return (null == x) ? Line.Default.Width : (float)x;
			}
			set { ViewState["Width"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Line.SmoothTension"/>.
		/// </summary>
		/// <remarks> Gets or sets a property that determines the smoothing tension
		/// for this <see cref="Line"/>.  This property is only used if
		/// <see cref="IsSmooth"/> is true.  A tension value 0.0 will just
		/// draw ordinary line segments like an unsmoothed line.  A tension
		/// value of 1.0 will be smooth.  Values greater than 1.0 will generally
		/// give odd results.
		/// </remarks>
		/// <value>A floating point value indicating the level of smoothing.
		/// 0.0F for no smoothing, 1.0F for lots of smoothing, >1.0 for odd
		/// smoothing.</value>
		/// <seealso cref="ZedGraph.Line.IsSmooth"/>
		[NotifyParentProperty(true)]
		public float SmoothTension
		{
			get 
			{ 
				object x = ViewState["SmoothTension"]; 
				return (null == x) ? Line.Default.SmoothTension : (float)x;
			}
			set { ViewState["SmoothTension"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Line.Style"/>.
		/// </summary>
		/// <remarks> The style of the <see cref="Line"/>, defined as a <see cref="DashStyle"/> enum.
		/// This allows the line to be solid, dashed, or dotted.
		/// </remarks>
		/// <seealso cref="ZedGraph.Line.Style"/>
		[NotifyParentProperty(true)]
		public DashStyle Style
		{
			get 
			{ 
				object x = ViewState["DashStyle"]; 
				return (null == x) ? Line.Default.Style : (DashStyle)x;
			}
			set { ViewState["DashStyle"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Line.StepType"/>.
		/// </summary>
		/// <remarks> Determines if the <see cref="LineItem"/> will be drawn by directly connecting the
		/// points from the <see cref="CurveItem.Points"/> data collection,
		/// or if the curve will be a "stair-step" in which the points are
		/// connected by a series of horizontal and vertical lines that
		/// represent discrete, constant values.  Note that the values can
		/// be forward oriented <c>ForwardStep</c> (<see cref="ZedGraph.StepType"/>) or
		/// rearward oriented <c>RearwardStep</c>.
		/// That is, the points are defined at the beginning or end
		/// of the constant value for which they apply, respectively.
		/// The <see cref="StepType"/> property is ignored for lines
		/// that have <see cref="IsSmooth"/> set to true.
		/// </remarks>
		/// <seealso cref="ZedGraph.Line.StepType"/>
		[NotifyParentProperty(true)]
		public StepType StepType
		{
			get 
			{ 
				object x = ViewState["StepType"]; 
				return (null == x) ? Line.Default.StepType : (StepType)x;
			}
			set { ViewState["StepType"] = value; }
		}
		#endregion

		#region Symbol
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebSymbol"/> object for
		/// this <see cref="LineItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Symbol"/>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebSymbol Symbol
		{
			get { return (ZedGraphWebSymbol)GetValue('s'); }
		}
		#endregion

		#region Fill
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebFill"/> object for
		/// this <see cref="LineItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Fill"/>
		[
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFill Fill
		{
			get { return (ZedGraphWebFill)GetValue('f'); }
		}
		#endregion		
	}
	#endregion

	#region ZedGraphWebPieItem
	/// <summary>
	/// Web control state management class for a <see cref="PieItem"/> class
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebPieItem : ZedGraphWebCurveItem
	{
		/// <summary>
		/// Identifies <see cref="PieItem"/> by the labels value
		/// </summary>
		/// <returns>A string containing "PieItem: label", where 'label' is the
		/// <see cref="CurveItem.Label"/> property of the <see cref="CurveItem"/>
		/// </returns>
		public override string ToString()
		{
			return "PieItem: " + Label;
		}

		/// <summary>
		/// Default Constructor
		/// </summary>
		public ZedGraphWebPieItem() : base()
		{
			Register('b',typeof(ZedGraphWebBorder));			
			Register('t',typeof(ZedGraphWebTextItem));

			this.Border.IsVisible = ZedGraph.PieItem.Default.IsBorderVisible;
			this.Border.PenWidth = ZedGraph.PieItem.Default.BorderWidth;
			this.Border.Color = ZedGraph.PieItem.Default.BorderColor;
			this.LabelDetail.FontSpec.Size = ZedGraph.PieItem.Default.FontSize;
		}	

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebPieItem"/> to the specified
		/// <see cref="ZedGraph.PieItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.PieItem"/> object</param>
		public void CopyTo( PieItem item )
		{
			base.CopyTo(item);
			this.Border.CopyTo(item.Border);
			this.LabelDetail.CopyTo(item.LabelDetail);
			item.Value = this.Value;
			item.Displacement = this.Displacement;
			item.LabelType = this.LabelType;
			item.PercentDecimalDigits = this.PercentDecimalDigits;
			item.ValueDecimalDigits = this.ValueDecimalDigits;			
		}

		/// <summary>
		/// Creates a new CurveItem using the PointPairList and add it the the given pane.
		/// </summary>
		/// <param name="pane">the GraphPane object to which to add the new curve</param>
		/// <param name="points">a PointPairList collection defining the points for this curve</param>
		/// <returns>the newly created CurveItem added to the given GraphPane</returns>
		/// <remarks>This method must be overriden by childs</remarks>
		public override CurveItem CreateInPane( GraphPane pane, PointPairList points )
		{
			PieItem x = pane.AddPieSlice(this.Value, this.Color, this.Displacement, this.Label);
			this.CopyTo(x);
			return x;
		}


		#region Properties
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.PieItem.Value"/>.
		/// </summary>
		/// <remarks> Gets or sets the value of this <see cref="PieItem"/>.  
		/// Minimum value is 0. 
		/// </remarks>
		[NotifyParentProperty(true)]
		public double Value
		{
			get 
			{ 
				object x = ViewState["Value"]; 
				return (null == x) ? 0 : (double)x;
			}
			set { ViewState["Value"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.PieItem.Displacement"/>.
		/// </summary>
		/// <remarks> Gets or sets the a value which determines the amount, if any, of this <see cref="PieItem"/>  
		/// displacement.
		/// </remarks>
		[NotifyParentProperty(true)]
		public	double Displacement
		{
			get 
			{ 
				object x = ViewState["Displacement"]; 
				return (null == x) ? PieItem.Default.Displacement : (double)x;
			}
			set { ViewState["Displacement"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.PieItem.LabelType"/>.
		/// </summary>
		/// <remarks> Gets or sets the <see cref="PieLabelType"/> to be used in displaying 
		/// <see cref="PieItem"/> labels.
		/// </remarks>
		[NotifyParentProperty(true)]
		public	PieLabelType LabelType
		{
			get 
			{ 
				object x = ViewState["LabelType"]; 
				return (null == x) ? PieItem.Default.LabelType : (PieLabelType)x;
			}
			set { ViewState["LabelType"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.PieItem.ValueDecimalDigits"/>.
		/// </summary>
		/// <remarks> Gets or sets the number of decimal digits to be displayed in a <see cref="PieItem"/> 
		/// value label.
		/// </remarks>
		[NotifyParentProperty(true)]
		public int ValueDecimalDigits
		{
			get 
			{ 
				object x = ViewState["ValueDecimalDigits"]; 
				return (null == x) ? PieItem.Default.ValueDecimalDigits : (int)x;
			}
			set { ViewState["ValueDecimalDigits"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.PieItem.PercentDecimalDigits"/>.
		/// </summary>
		/// <remarks> Gets or sets the number of decimal digits to be displayed in a <see cref="PieItem"/> 
		/// percent label.
		/// </remarks>
		[NotifyParentProperty(true)]
		public int PercentDecimalDigits
		{
			get 
			{ 
				object x = ViewState["PercentDecimalDigits"]; 
				return (null == x) ? PieItem.Default.PercentDecimalDigits : (int)x;
			}
			set { ViewState["PercentDecimalDigits"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.PieItem.LabelDetail"/>.
		/// </summary>
		/// <remarks> Gets or sets the <see cref="TextItem"/> to be used
		/// for displaying this <see cref="PieItem"/>'s label.
		/// </remarks>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebTextItem LabelDetail
		{
			get { return (ZedGraphWebTextItem)base.GetValue('t'); }
		}

		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebBorder"/> object for
		/// this <see cref="PieItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Border"/>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebBorder Border
		{
			get { return (ZedGraphWebBorder)base.GetValue('b'); }
		}
		#endregion		
	}
	#endregion

	#region ZedGraphWebGraphItem
	
	/// <summary>
	/// Baseclass for graph items in the web control
	/// <seealso cref="ZedGraph.GraphItem"/>
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebGraphItem : GenericItem
	{
		/// <summary>
		/// Override the ToString() method.
		/// </summary>
		/// <returns>Always returns the string "GraphItem".</returns>
		public override string ToString()
		{
			return "GraphItem";
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebGraphItem() : base()
		{
			Register('l',typeof(ZedGraphWebLocation));
		}
	
		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebGraphItem"/> to the specified
		/// <see cref="ZedGraph.GraphItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.GraphItem"/> object</param>
		public void CopyTo(GraphItem item)
		{
			item.ZOrder = this.ZOrder;
			item.IsVisible = this.IsVisible;
			this.Location.CopyTo(item.Location);
		}

		#region Properties

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.GraphItem.IsVisible"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public bool IsVisible
		{
			get 
			{ 
				object x = ViewState["IsVisible"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["IsVisible"] = value; }
		} 
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.GraphItem.Location"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebLocation Location
		{
			get { return (ZedGraphWebLocation)base.GetValue('l'); }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.GraphItem.ZOrder"/>
		/// </summary>
		public ZOrder ZOrder
		{
			get 
			{ 
				object x = ViewState["ZOrder"]; 
				return (null == x) ? ZOrder.A_InFront : (ZOrder)x;
			}
			set { ViewState["ZOrder"] = value; }
		} 
		#endregion
	}
	#endregion

	#region ZedGraphWebCurveCollection
	/// <summary>
	/// Manages a collection of <see cref="ZedGraphWebCurveItem"/> objects that are 
	/// state management aware.
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebCurveCollection : GenericCollection
	{	
		/// <summary>
		/// Override the ToString() method.
		/// </summary>
		/// <returns>Always returns String.Empty</returns>
		public override string ToString(){return String.Empty;}		

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebCurveCollection() : base()
		{
			Schema = new GenericCollectionItemSchema[5];
			Schema[0].code = 'b';
			Schema[0].type = typeof(ZedGraphWebBarItem);
			Schema[1].code = 'l';
			Schema[1].type = typeof(ZedGraphWebLineItem);
			Schema[2].code = 'e';
			Schema[2].type = typeof(ZedGraphWebErrorBarItem);
			Schema[3].code = 'h';
			Schema[3].type = typeof(ZedGraphWebHiLowBarItem);
			Schema[4].code = 'p';
			Schema[4].type = typeof(ZedGraphWebPieItem);
		}

		/// <summary>
		/// Add a <see cref="ZedGraphWebCurveItem"/> to this collection.
		/// </summary>
		/// <param name="item">The <see cref="ZedGraphWebCurveItem"/> to be added.</param>
		/// <seealso cref="ZedGraph.CurveItem"/>
		public void Add(ZedGraphWebCurveItem item)
		{
			if ( null != item )
				ListAdd( item );
			else
				throw new ArgumentException("parameter cannot be null","item");
		}	

		/// <summary>
		/// Indexer to access the specified <see cref="ZedGraphWebCurveItem"/> object by
		/// its ordinal position in the list.
		/// </summary>
		/// <param name="index">The ordinal position (zero-based) of the
		/// <see cref="ZedGraphWebCurveItem"/> object to be accessed.</param>
		/// <value>A <see cref="ZedGraphWebCurveItem"/> object reference.</value>
		/// <seealso cref="ZedGraph.CurveItem"/>
		[NotifyParentProperty(true)]
		public ZedGraphWebCurveItem this [int index]
		{
			get { return (ZedGraphWebCurveItem)ListGet(index); }
			set { ListInsert(index, value); }
		}			
	}

	#endregion

	#region ZedGraphWebGraphItemCollection
	/// <summary>
	/// Manages a collection of <see cref="ZedGraphWebGraphItem"/> objects that are 
	/// state management aware.
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebGraphItemCollection : GenericCollection
	{	
		/// <summary>
		/// Override the ToString() method.
		/// </summary>
		/// <returns>Always returns String.Empty</returns>
		public override string ToString(){return String.Empty;}		

		/// <summary>
		/// Default Constructor
		/// </summary>
		public ZedGraphWebGraphItemCollection() : base()
		{
			Schema = new GenericCollectionItemSchema[5];
			Schema[0].code = 't';
			Schema[0].type = typeof(ZedGraphWebTextItem);			
			Schema[1].code = 'a';
			Schema[1].type = typeof(ZedGraphWebArrowItem);			
			Schema[2].code = 'i';
			Schema[2].type = typeof(ZedGraphWebImageItem);			
			Schema[3].code = 'b';
			Schema[3].type = typeof(ZedGraphWebBoxItem);			
			Schema[4].code = 'e';
			Schema[4].type = typeof(ZedGraphWebEllipseItem);			
		}

		/// <summary>
		/// Add a <see cref="ZedGraphWebGraphItem"/> to this collection.
		/// </summary>
		/// <param name="item">The <see cref="ZedGraphWebGraphItem"/> to be added.</param>
		/// <seealso cref="ZedGraph.GraphItem"/>
		public void Add(ZedGraphWebGraphItem item)
		{
			if ( null != item )
				ListAdd( item );
			else
				throw new ArgumentException("parameter cannot be null","item");
		}	

		/// <summary>
		/// Indexer to access the specified <see cref="ZedGraphWebGraphItem"/> object by
		/// its ordinal position in the list.
		/// </summary>
		/// <param name="index">The ordinal position (zero-based) of the
		/// <see cref="ZedGraphWebGraphItem"/> object to be accessed.</param>
		/// <value>A <see cref="ZedGraphWebGraphItem"/> object reference.</value>
		/// <seealso cref="ZedGraph.GraphItem"/>
		[NotifyParentProperty(true)]
		public ZedGraphWebGraphItem this [int index]
		{
			get 
			{
				return (ZedGraphWebGraphItem)ListGet(index);
			}
			set
			{
				ListInsert(index,value);
			}
		}			
	}

	#endregion

	#region ZedGraphWebStringCollection
	/// <summary>
	/// Manages a collection of <see cref="ZedGraphWebGraphItem"/> objects that are 
	/// state management aware.
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebStringCollection : GenericCollection
	{	
		/// <summary>
		/// Override the ToString() method.
		/// </summary>
		/// <returns>Always returns String.Empty</returns>
		public override string ToString(){return String.Empty;}		

		/// <summary>
		/// Default Constructor
		/// </summary>
		public ZedGraphWebStringCollection() : base()
		{
			Schema = new GenericCollectionItemSchema[1];
			Schema[0].code = 's';
			Schema[0].type = typeof(ZedGraphWebString);						
		}		

		/// <summary>
		/// Add a <see cref="ZedGraphWebString"/> to the collection.
		/// </summary>
		/// <param name="item">The <see cref="ZedGraphWebString"/> object to be added</param>
		public void Add(ZedGraphWebString item)
		{
			if ( null != item )
				ListAdd( item );
		}

		/// <summary>
		/// Indexer to access the specified <see cref="string"/> object by
		/// its ordinal position in the list.
		/// </summary>
		/// <param name="index">The ordinal position (zero-based) of the
		/// <see cref="System.String"/> object to be accessed.</param>
		/// <value>A <see cref="string"/> object reference.</value>
		/// <seealso cref="System.String"/>
		[NotifyParentProperty(true)]
		public ZedGraphWebString this [int index]
		{
			get 
			{
				return (ZedGraphWebString)ListGet(index);
			}
			set
			{
				ListInsert(index,value);
			}
		}			
	}

	#endregion

	#region ZedGraphWebPointPairCollection
	/// <summary>
	/// Manages a collection of <see cref="ZedGraphWebPointPair"/> objects that are 
	/// state management aware.
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebPointPairCollection : GenericCollection
	{	
		/// <summary>
		/// Override the ToString() method.
		/// </summary>
		/// <returns>Always returns String.Empty</returns>
		public override string ToString(){return String.Empty;}		

		/// <summary>
		/// Default Constructor
		/// </summary>
		public ZedGraphWebPointPairCollection() : base()
		{
			Schema = new GenericCollectionItemSchema[1];
			Schema[0].code = 'p';
			Schema[0].type = typeof(ZedGraphWebPointPair);			
		}

		/// <summary>
		/// Add a <see cref="ZedGraphWebPointPair"/> to this collection.
		/// </summary>
		/// <param name="item">The <see cref="ZedGraphWebPointPair"/> to be added.</param>
		/// <seealso cref="ZedGraph.PointPair"/>
		public void Add(ZedGraphWebPointPair item)
		{
			if ( null != item )
				ListAdd( item );
			else
				throw new ArgumentException("parameter cannot be null","item");
		}	

		/// <summary>
		/// Indexer to access the specified <see cref="ZedGraphWebPointPair"/> object by
		/// its ordinal position in the list.
		/// </summary>
		/// <param name="index">The ordinal position (zero-based) of the
		/// <see cref="ZedGraphWebPointPair"/> object to be accessed.</param>
		/// <value>A <see cref="ZedGraphWebPointPair"/> object reference.</value>
		/// <seealso cref="ZedGraph.PointPair"/>
		[NotifyParentProperty(true)]
		public ZedGraphWebPointPair this [int index]
		{
			get 
			{
				return (ZedGraphWebPointPair)ListGet(index);
			}
			set
			{
				ListInsert(index,value);
			}
		}			
	}

	#endregion

	#region ZedGraphWebPointPair
	/// <summary>
	/// A Web PointPair class
	/// </summary>
	/// <author>Darren Martz</author>
	[DefaultProperty("Value")]
	public class ZedGraphWebPointPair : GenericItem
	{
		/// <summary>
		/// Identifies PointPair instance
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{						
			return string.Format( "PointPair({0},{1})", X, Y );
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebPointPair() : base()
		{				
		}		
		
		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebPointPair"/> to the specified
		/// <see cref="PointPair"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="PointPair"/> object</param>
		public void CopyTo( PointPair item )
		{
			item.X = this.X;
			item.Y = this.Y;			
			item.Z = this.Z;			
		}
		
		#region Properties

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="PointPair.X"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public double X
		{
			get 
			{ 
				object x = ViewState["X"]; 
				return (null == x) ? 0 : (double)x;
			}
			set { ViewState["X"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="PointPair.Y"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public double Y
		{
			get 
			{ 
				object y = ViewState["Y"]; 
				return (null == y) ? 0 : (double)y;
			}
			set { ViewState["Y"] = value; }
		}
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="PointPair.Z"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public double Z
		{
			get 
			{ 
				object z = ViewState["Z"]; 
				return (null == z) ? 0 : (double)z;
			}
			set { ViewState["Z"] = value; }
		}
		
		#endregion
	}
	#endregion

	#region ZedGraphWebString
	/// <summary>
	/// A Web String class
	/// </summary>
	/// <author>Darren Martz</author>
	[DefaultProperty("Value")]
	public class ZedGraphWebString : GenericItem
	{
		/// <summary>
		/// Identifies fontspec instance
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{						
			return this.Value;
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebString() : base()
		{				
		}		
		
		#region Properties

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="SizeF.Height"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public string Value
		{
			get 
			{ 
				object x = ViewState["Value"]; 
				return (null == x) ? string.Empty : (string)x;
			}
			set { ViewState["Value"] = value; }
		}		
		
		#endregion
	}
	#endregion

	#region ZedGraphWebXAxis
	/// <summary>
	/// Web control state management class for a <see cref="ZedGraph.XAxis"/> object
	/// </summary>
	/// <author>Darren Martz</author>	
	public class ZedGraphWebXAxis : ZedGraphWebAxis
	{
		/// <summary>
		/// Identifies <see cref="XAxis"/> by the <see cref="Axis.Title"/> value
		/// </summary>
		/// <returns>A string containing "XAxis: title", where 'title' is the
		/// <see cref="Axis.Title"/> property of the <see cref="XAxis"/>
		/// </returns>
		public override string ToString()
		{
			if (Title == string.Empty) return string.Empty;
			return "XAxis: " + Title;
		}

		/// <summary>
		/// Default constructor.
		/// </summary>
		public ZedGraphWebXAxis() : base()
		{
		}
	}
	#endregion

	#region ZedGraphWebYAxis
	/// <summary>
	/// Web control state management class for a <see cref="ZedGraph.YAxis"/> object
	/// </summary>
	/// <author>Darren Martz</author>	
	public class ZedGraphWebYAxis : ZedGraphWebAxis
	{
		/// <summary>
		/// Identifies <see cref="YAxis"/> by the <see cref="Axis.Title"/> value
		/// </summary>
		/// <returns>A string containing "YAxis: title", where 'title' is the
		/// <see cref="Axis.Title"/> property of the <see cref="YAxis"/>
		/// </returns>
		public override string ToString()
		{
			if (Title == string.Empty) return string.Empty;
			return "YAxis: " + Title;
		}

		/// <summary>
		/// Default constructor.
		/// </summary>
		public ZedGraphWebYAxis() : base()
		{
			this.ScaleFontSpec.Angle = 90.0F;
			this.TitleFontSpec.Angle = -180F;
		}
	}
	#endregion

	#region ZedGraphWebY2Axis
	/// <summary>
	/// Web control state management class for a <see cref="ZedGraph.Y2Axis"/> object
	/// </summary>
	/// <author>Darren Martz</author>	
	public class ZedGraphWebY2Axis : ZedGraphWebAxis
	{
		/// <summary>
		/// Identifies <see cref="Y2Axis"/> by the <see cref="Axis.Title"/> value
		/// </summary>
		/// <returns>A string containing "Y2Axis: title", where 'title' is the
		/// <see cref="Axis.Title"/> property of the <see cref="Y2Axis"/>
		/// </returns>
		public override string ToString()
		{
			if (Title == string.Empty) return string.Empty;
			return "Y2Axis: " + Title;
		}

		/// <summary>
		/// Default constructor.
		/// </summary>
		public ZedGraphWebY2Axis() : base()
		{
			this.ScaleFontSpec.Angle = -90.0F;
		}
	}
	#endregion

	#region ZedGraphWebGrid

	/// <summary>
	/// Proxy class to manage all properties associated with a grid
	/// </summary>
	public class ZedGraphWebGrid : GenericItem
	{
		/// <summary>
		/// Returns a string description of the class
		/// </summary>
		public override string ToString()
		{
			return "ZedGraphWebGrid";
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebGrid() : base()
		{
			this.StepUnit = DateUnit.Day;
		}

		/// <summary>
		/// Set the default properties associated with the major grid.
		/// </summary>
		public void SetDefaultsForMajorGrid()
		{
			
		}

		/// <summary>
		/// Set the default properties associated with the minor grid.
		/// </summary>
		public void SetDefaultsForMinorGrid()
		{
			this.GridColor = ZedGraph.Axis.Default.MinorGridColor;
			this.TicSize = ZedGraph.Axis.Default.MinorTicSize;
			this.IsTicsOutside = ZedGraph.Axis.Default.IsMinorTic;
			this.IsTicsInside = ZedGraph.Axis.Default.IsMinorInsideTic;
			this.IsTicsOpposite = ZedGraph.Axis.Default.IsMinorOppositeTic;
			this.TicPenWidth = ZedGraph.Axis.Default.TicPenWidth;
			this.IsGridVisible = ZedGraph.Axis.Default.IsShowMinorGrid;
			this.GridDashOn = ZedGraph.Axis.Default.MinorGridDashOn;
			this.GridDashOff = ZedGraph.Axis.Default.MinorGridDashOff;
			this.GridPenWidth = ZedGraph.Axis.Default.MinorGridPenWidth;
		}

		#region properties
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.Color"/>.
		/// </summary>
		/// <remarks> This affects only the grid lines, since the <see cref="Axis.TitleFontSpec"/> and
		/// <see cref="Axis.ScaleFontSpec"/> both have their own color specification.
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		public Color GridColor
		{
			get 
			{ 
				object x = ViewState["GridColor"]; 
				return (null == x) ? ZedGraph.Axis.Default.GridColor : (Color)x;
			}
			set { ViewState["GridColor"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.StepAuto"/>.
		/// </summary>
		/// <remarks> Determines whether or not the scale major step size value <see cref="ZedGraph.Axis.Step"/>
		/// is set automatically.
		/// </remarks>
		[Category("Behaviour")]
		[NotifyParentProperty(true)]
		public bool StepAuto
		{
			get 
			{ 
				object x = ViewState["StepAuto"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["StepAuto"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.StepAuto"/>.
		/// </summary>
		/// <remarks> Determines whether or not the scale major step size value <see cref="ZedGraph.Axis.Step"/>
		/// is set automatically.
		/// </remarks>
		[Category("Behaviour")]
		[NotifyParentProperty(true)]
		public double Step
		{
			get 
			{ 
				object x = ViewState["Step"]; 
				return (null == x) ? 1.0 : (double)x;
			}
			set 
			{ 
				ViewState["Step"] = value; 
				ViewState["StepAuto"] = false;
			}
		}
		
		/// <summary>
		/// Proxy property to handle the units for the <see cref="Axis.Step" /> or <see cref="Axis.MinorStep" />
		/// properties.
		/// </summary>
		[Category("Behaviour")]
		[NotifyParentProperty(true)]
		[Description("Defines in which unit the Step property is. Applies to AxisType.Date only.")]
		public DateUnit StepUnit
		{
			get { return (DateUnit)ViewState["DateUnit"]; }
			set { ViewState["DateUnit"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.TicSize"/>.
		/// </summary>
		/// <remarks> The length of the <see cref="ZedGraph.Axis"/> major tic marks, expressed in points
		/// (1/72nd inch).
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		public float TicSize
		{
			get 
			{ 
				object x = ViewState["TicSize"]; 
				return (null == x) ? ZedGraph.Axis.Default.TicSize : (float)x;
			}
			set { ViewState["TicSize"] = value; }
		}


		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsTic"/>.
		/// </summary>
		/// <remarks> Determines whether or not the <see cref="ZedGraph.Axis"/> major tics (where the
		/// scale labels are located) will be displayed.
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		[Description("Show tics outside")]
		public bool IsTicsOutside
		{
			get 
			{ 
				object x = ViewState["IsTicsOutside"]; 
				return (null == x) ? ZedGraph.Axis.Default.IsTic : (bool)x;
			}
			set { ViewState["IsTicsOutside"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsInsideTic"/>.
		/// </summary>
		/// <remarks> This value determines whether or not the major inside tic marks
		/// are shown.  These are the tic marks on the inside of the <see cref="ZedGraph.Axis"/> border.
		/// The major tic spacing is controlled by <see cref="ZedGraph.Axis.Step"/>.
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		[Description("Show tics inside")]
		public bool IsTicsInside
		{
			get 
			{ 
				object x = ViewState["IsTicsInside"]; 
				return (null == x) ? ZedGraph.Axis.Default.IsInsideTic : (bool)x;
			}
			set { ViewState["IsTicsInside"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsOppositeTic"/>.
		/// </summary>
		/// <remarks> This value determines whether or not the major opposite tic marks
		/// are shown.  These are the tic marks on the inside of the <see cref="ZedGraph.Axis"/> border on
		/// the opposite side from the axis.
		/// The major tic spacing is controlled by <see cref="ZedGraph.Axis.Step"/>.
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		public bool IsTicsOpposite
		{
			get 
			{ 
				object x = ViewState["IsTicsOpposite"]; 
				return (null == x) ? ZedGraph.Axis.Default.IsOppositeTic : (bool)x;
			}
			set { ViewState["IsTicsOpposite"] = value; }
		}
		

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.TicPenWidth"/>.
		/// </summary>
		/// <remarks> This property determines the pen width to be used when drawing the tic marks for
		/// this <see cref="ZedGraph.Axis"/>.  The pen width is expressed in points (1/72nd inch).
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		public float TicPenWidth
		{
			get 
			{ 
				object x = ViewState["TicPenWidth"]; 
				return (null == x) ? ZedGraph.Axis.Default.TicPenWidth : (float)x;
			}
			set { ViewState["TicPenWidth"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsShowGrid"/>.
		/// </summary>
		/// <remarks> This property determines if the major <see cref="Axis"/> gridlines
		/// (at each labeled value) will be visible.
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		public bool IsGridVisible
		{
			get 
			{ 
				object x = ViewState["IsShowGrid"]; 
				return (null == x) ? ZedGraph.Axis.Default.IsShowGrid : (bool)x;
			}
			set { ViewState["IsShowGrid"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.GridDashOn"/>.
		/// </summary>
		/// <remarks> This is the distance,
		/// in points (1/72 inch), of the dash segments that make up the dashed grid lines.
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		public float GridDashOn
		{
			get 
			{ 
				object x = ViewState["GridDashOn"]; 
				return (null == x) ? ZedGraph.Axis.Default.GridDashOn : (float)x;
			}
			set { ViewState["GridDashOn"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.GridDashOff"/>.
		/// </summary>
		/// <remarks> This is the distance,
		/// in points (1/72 inch), of the spaces between the dash segments that make up
		/// the dashed grid lines.
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		public float GridDashOff
		{
			get 
			{ 
				object x = ViewState["GridDashOff"]; 
				return (null == x) ? ZedGraph.Axis.Default.GridDashOff : (float)x;
			}
			set { ViewState["GridDashOff"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.GridPenWidth"/>.
		/// </summary>
		/// <remarks> The pen width used for drawing the grid lines, expressed in points (1/72nd inch).
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		public float GridPenWidth
		{
			get 
			{ 
				object x = ViewState["GridPenWidth"]; 
				return (null == x) ? ZedGraph.Axis.Default.GridPenWidth : (float)x;
			}
			set { ViewState["GridPenWidth"] = value; }
		}
		#endregion

	}	
	
	#endregion


	#region ZedGraphWebAxis
	/// <summary>
	/// Web control state management class for a <see cref="ZedGraph.Axis"/> object
	/// </summary>
	/// <author>Darren Martz</author>	
	public class ZedGraphWebAxis : GenericItem
	{
		/// <summary>
		/// Identifies <see cref="Axis"/> by the <see cref="Axis.Title"/> value
		/// </summary>
		/// <returns>A string containing "Axis: title", where 'title' is the
		/// <see cref="Axis.Title"/> property of the <see cref="Axis"/>
		/// </returns>
		public override string ToString()
		{
			if (Title == string.Empty) return string.Empty;
			return "Axis: " + Title;
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebAxis() : base()
		{
			Register('z',typeof(ZedGraphWebFontSpec));
			Register('Z',typeof(ZedGraphWebFontSpec));
			Register('y',typeof(ZedGraphWebGrid));
			Register('Y',typeof(ZedGraphWebGrid));

			this.MajorGrid.SetDefaultsForMajorGrid();
			this.MinorGrid.SetDefaultsForMinorGrid();

			this.ScaleFontSpec.Family = ZedGraph.Axis.Default.ScaleFontFamily;
			this.ScaleFontSpec.Size = ZedGraph.Axis.Default.ScaleFontSize;
			this.ScaleFontSpec.IsBold = ZedGraph.Axis.Default.ScaleFontBold;
			this.ScaleFontSpec.FontColor = ZedGraph.Axis.Default.ScaleFontColor;
			this.ScaleFontSpec.IsItalic = ZedGraph.Axis.Default.ScaleFontItalic;
			this.ScaleFontSpec.IsUnderline = ZedGraph.Axis.Default.ScaleFontUnderline;
			this.ScaleFontSpec.Fill.Color = ZedGraph.Axis.Default.ScaleFillColor;
			this.ScaleFontSpec.Fill.Type = ZedGraph.Axis.Default.ScaleFillType;

			this.TitleFontSpec.Family = ZedGraph.Axis.Default.TitleFontFamily;
			this.TitleFontSpec.Size = ZedGraph.Axis.Default.TitleFontSize;
			this.TitleFontSpec.IsBold = ZedGraph.Axis.Default.TitleFontBold;
			this.TitleFontSpec.FontColor = ZedGraph.Axis.Default.TitleFontColor;
			this.TitleFontSpec.IsItalic = ZedGraph.Axis.Default.TitleFontItalic;
			this.TitleFontSpec.IsUnderline = ZedGraph.Axis.Default.TitleFontUnderline;
			this.TitleFontSpec.Fill.Color = ZedGraph.Axis.Default.TitleFillColor;
			this.TitleFontSpec.Fill.Type = ZedGraph.Axis.Default.TitleFillType;
		}	
	
		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebAxis"/> to the specified
		/// <see cref="ZedGraph.Axis"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.Axis"/> object</param>
		public void CopyTo(Axis item)
		{				
			this.ScaleFontSpec.CopyTo( item.ScaleFontSpec );
			this.TitleFontSpec.CopyTo( item.TitleFontSpec );

			item.IsVisible = this.IsVisible;
			item.IsReverse = this.IsReverse;
			item.Type = this.Type;
			item.Color = this.AxisColor;
			item.Title = this.Title;
			item.IsShowTitle = this.IsShowTitle;
			item.IsOmitMag = this.IsOmitMag;
			item.IsUseTenPower = this.IsUseTenPower;
			item.IsPreventLabelOverlap = this.IsPreventLabelOverlap;
			item.ScaleFormat = this.ScaleFormat;
			item.ScaleAlign = this.ScaleAlign;
			item.ScaleMag = this.ScaleMag;
			item.Min = this.Min;
			item.Max = this.Max;
			item.MinGrace = this.MinGrace;
			item.MaxGrace = this.MaxGrace;
			item.MinAuto = this.MinAuto;
			item.MaxAuto = this.MaxAuto;
			//item.NumDecAuto = this.NumDecAuto;
			//item.NumDec = this.NumDec;
			item.ScaleMagAuto = this.ScaleMagAuto;
			item.ScaleFormatAuto = this.ScaleFormatAuto;

			item.Cross = this.Cross;
			item.CrossAuto = this.CrossAuto;
			item.IsZeroLine = this.IsZeroLine;
			item.MinSpace = this.MinSpace;
			item.IsTicsBetweenLabels = this.IsTicsBetweenLabels;
			
			item.IsShowGrid = this.MajorGrid.IsGridVisible;
			item.GridColor = this.MajorGrid.GridColor;
			item.TicSize = this.MajorGrid.TicSize;
			item.IsTic = this.MajorGrid.IsTicsOutside;
			item.IsInsideTic = this.MajorGrid.IsTicsInside;
			item.IsOppositeTic = this.MajorGrid.IsTicsOpposite;
			item.TicPenWidth = this.MajorGrid.TicPenWidth;
			item.GridDashOn = this.MajorGrid.GridDashOn;
			item.GridDashOff = this.MajorGrid.GridDashOff;
			item.GridPenWidth = this.MajorGrid.GridPenWidth;
			item.MajorUnit = this.MajorGrid.StepUnit;
			item.Step = this.MajorGrid.Step;
			item.StepAuto = this.MajorGrid.StepAuto;
			
			item.IsShowMinorGrid = this.MinorGrid.IsGridVisible;
			item.MinorGridColor = this.MinorGrid.GridColor;
			item.MinorTicSize = this.MinorGrid.TicSize;
			item.IsMinorTic = this.MinorGrid.IsTicsOutside;
			item.IsMinorInsideTic = this.MinorGrid.IsTicsInside;
			item.IsMinorOppositeTic = this.MinorGrid.IsTicsOpposite;
			item.MinorGridDashOn = this.MinorGrid.GridDashOn;
			item.MinorGridDashOff = this.MinorGrid.GridDashOff;
			item.MinorGridPenWidth = this.MinorGrid.GridPenWidth;
			item.MinorUnit = this.MinorGrid.StepUnit;
			item.MinorStep = this.MinorGrid.Step;
			item.MinorStepAuto = this.MinorGrid.StepAuto;
		}

		#region Properties	

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.Color"/>.
		/// </summary>
		/// <remarks> This affects only the grid lines, since the <see cref="Axis.TitleFontSpec"/> and
		/// <see cref="Axis.ScaleFontSpec"/> both have their own color specification.
		/// </remarks>
		[Category("Appearance")]
		[NotifyParentProperty(true)]
		public Color AxisColor
		{
			get 
			{ 
				object x = ViewState["AxisColor"]; 
				return (null == x) ? ZedGraph.Axis.Default.Color : (Color)x;
			}
			set { ViewState["AxisColor"] = value; }
		}
		

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.Min"/>.
		/// </summary>
		[NotifyParentProperty(true)]
		public double Min
		{
			get 
			{ 
				object x = ViewState["Min"]; 
				return (null == x) ? 0.0 : (double)x;
			}
			set 
			{ 
				ViewState["Min"] = value; 
				ViewState["MinAuto"] = false; 
			}
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.Max"/>.
		/// </summary>
		[NotifyParentProperty(true)]
		public double Max
		{
			get 
			{ 
				object x = ViewState["Max"]; 
				return (null == x) ? 0.0 : (double)x;
			}
			set 
			{ 
				ViewState["Max"] = value; 
				ViewState["MaxAuto"] = false; 
			}
		}

		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.Title"/>.
		/// </summary>
		/// <remarks> The title normally shows the basis and dimensions of
		/// the scale range, such as "Time (Years)".  The title is only shown if the
		/// <see cref="Axis.IsShowTitle"/> property is set to true.  If the Title text is empty,
		/// then no title is shown, and no space is "reserved" for the title on the graph.
		/// </remarks>
		[NotifyParentProperty(true)]
		public string Title
		{
			get 
			{ 
				object x = ViewState["Title"]; 
				return (null == x) ? String.Empty : (string)x;
			}
			set { ViewState["Title"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.Cross"/>.
		/// </summary>
		/// <remarks>This property allows the axis to be shifted away from its default location.
		/// For example, for a graph with an X range from -100 to +100, the Y Axis can be located
		/// at the X=0 value rather than the left edge of the axisRect.  This value can be set
		/// automatically based on the state of <see cref="CrossAuto"/>.  If
		/// this value is set manually, then <see cref="CrossAuto"/> will
		/// also be set to false.  The "other" axis is the axis the handles the second dimension
		/// for the graph.  For the XAxis, the "other" axis is the YAxis.  For the YAxis or
		/// Y2Axis, the "other" axis is the XAxis.
		/// </remarks>
		/// <value> The value is defined in user scale units </value>
		[NotifyParentProperty(true)]
		public double Cross
		{
			get 
			{ 
				object x = ViewState["Cross"]; 
				return (null == x) ? 0 : (double)x;
			}
			set { ViewState["Cross"] = value; ViewState["CrossAuto"] = false; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.MinAuto"/>.
		/// </summary>
		/// <remarks> Determines whether or not the minimum scale value <see cref="ZedGraph.Axis.Min"/>
		/// is set automatically.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool MinAuto
		{
			get 
			{ 
				object x = ViewState["MinAuto"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["MinAuto"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.MaxAuto"/>.
		/// </summary>
		/// <remarks> Determines whether or not the maximum scale value <see cref="ZedGraph.Axis.Max"/>
		/// is set automatically.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool MaxAuto
		{
			get 
			{ 
				object x = ViewState["MaxAuto"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["MaxAuto"] = value; }
		}


		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.CrossAuto"/>.
		/// </summary>
		/// <remarks> Determines whether or not the axis intersection point <see cref="ZedGraph.Axis.Cross"/>
		/// is set automatically.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool CrossAuto
		{
			get 
			{ 
				object x = ViewState["CrossAuto"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["CrossAuto"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.MinGrace"/>.
		/// </summary>
		/// <remarks> This is the "grace" value applied to the minimum data range.
		/// This value is expressed as a fraction of the total data range.  For example, assume the data
		/// range is from 4.0 to 16.0, leaving a range of 12.0.  If MinGrace is set to
		/// 0.1, then 10% of the range, or 1.2 will be subtracted from the minimum data value.
		/// The scale will then be ranged to cover at least 2.8 to 16.0.
		/// </remarks>
		[NotifyParentProperty(true)]
		[Description("Fraction of data range to substract to Min. For example 0.1 means 10% of (Max-Min).")]
		public double MinGrace
		{
			get 
			{ 
				object x = ViewState["MinGrace"];
				return (null == x) ? ZedGraph.Scale.Default.MinGrace : (double)x;
			}
			set { ViewState["MinGrace"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.MaxGrace"/>.
		/// </summary>
		/// <remarks> This is the "grace" value applied to the maximum data range.
		/// This value is expressed as a fraction of the total data range.  For example, assume the data
		/// range is from 4.0 to 16.0, leaving a range of 12.0.  If MaxGrace is set to
		/// 0.1, then 10% of the range, or 1.2 will be added to the maximum data value.
		/// The scale will then be ranged to cover at least 4.0 to 17.2.
		/// </remarks>
		[NotifyParentProperty(true)]
		[Description("Fraction of data range to add to Max. For example 0.1 means 10% of (Max-Min).")]
		public double MaxGrace
		{
			get 
			{ 
				object x = ViewState["MaxGrace"]; 
				return (null == x) ? ZedGraph.Scale.Default.MaxGrace : (double)x;
			}
			set { ViewState["MaxGrace"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.MinSpace"/>.
		/// </summary>
		/// <remarks> This is the minimum axis space allocation.
		/// This term, expressed in points (1/72 inch) and scaled according to <see cref="PaneBase.CalcScaleFactor"/>
		/// for the <see cref="ZedGraph.GraphPane"/>, determines the minimum amount of space
		/// an axis must have between the <see cref="ZedGraph.GraphPane.AxisRect"/> and the
		/// <see cref="PaneBase.PaneRect"/>.  This minimum space
		/// applies whether <see cref="ZedGraph.Axis.IsVisible"/> is true or false.
		/// </remarks>
		[NotifyParentProperty(true)]
		[Description("Minimum amount of space in points between this axis and the pane border. Applies even if IsVisible is false.")]
		public float MinSpace
		{
			get 
			{ 
				object x = ViewState["MinSpace"]; 
				return (null == x) ? ZedGraph.Axis.Default.MinSpace : (float)x;
			}
			set { ViewState["MinSpace"] = value; }
		}



		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsTicsBetweenLabels"/>.
		/// </summary>
		/// <remarks> This property determines whether or not the major tics will be drawn
		/// inbetween the labels, rather than right at the labels.  Note that this setting is only
		/// applicable if <see cref="ZedGraph.Axis.Type"/> = <see cref="AxisType.Text"/>.
		/// </remarks>
		[NotifyParentProperty(true)]
		[Description("If true, draws major tics inbetween labels rather than right at the labels. Only for AxisType.Text.")]
		public bool IsTicsBetweenLabels
		{
			get 
			{ 
				object x = ViewState["IsTicsBetweenLabels"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["IsTicsBetweenLabels"] = value; }
		}


		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsZeroLine"/>.
		/// </summary>
		/// <remarks> This boolean value determines if a line will be drawn at the
		/// zero value for the axis.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsZeroLine
		{
			get 
			{ 
				object x = ViewState["IsZeroLine"]; 
				return (null == x) ? false : (bool)x;
			}
			set { ViewState["IsZeroLine"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsVisible"/>.
		/// </summary>
		/// <remarks> Determines whether or not the <see cref="ZedGraph.Axis"/> is shown.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsVisible
		{
			get 
			{ 
				object x = ViewState["IsVisible"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["IsVisible"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsReverse"/>.
		/// </summary>
		/// <remarks> Determines if the scale values are reversed for this <see cref="ZedGraph.Axis"/>.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsReverse
		{
			get 
			{ 
				object x = ViewState["IsReverse"]; 
				return (null == x) ? ZedGraph.Scale.Default.IsReverse : (bool)x;
			}
			set { ViewState["IsReverse"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.Type"/>.
		/// </summary>
		/// <remarks> Determines the <see cref="AxisType"/> for this <see cref="ZedGraph.Axis"/>.
		/// The type can be either <see cref="AxisType.Linear"/>,
		/// <see cref="AxisType.Log"/>, <see cref="AxisType.Date"/>,
		/// or <see cref="AxisType.Text"/>.
		/// </remarks>
		[NotifyParentProperty(true)]
		public AxisType Type
		{
			get 
			{ 
				object x = ViewState["Type"]; 
				return (null == x) ? ZedGraph.Axis.Default.Type : (AxisType)x;
			}
			set { ViewState["Type"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsOmitMag"/>.
		/// </summary>
		/// <remarks> This property controls whether or not the magnitude factor (power of 10) for
		/// this scale will be included in the label.
		/// For large scale values, a "magnitude" value (power of 10) is automatically
		/// used for scaling the graph.  This magnitude value is automatically appended
		/// to the end of the Axis <see cref="ZedGraph.Axis.Title"/> (e.g., "(10^4)") to indicate
		/// that a magnitude is in use.  This property controls whether or not the
		/// magnitude is included in the title.  Note that it only affects the axis
		/// title; a magnitude value may still be used even if it is not shown in the title.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsOmitMag
		{
			get 
			{ 
				object x = ViewState["IsOmitMag"]; 
				return (null == x) ? false : (bool)x;
			}
			set { ViewState["IsOmitMag"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsShowTitle"/>.
		/// </summary>
		/// <remarks> Determines whether or not the <see cref="ZedGraph.Axis"/>
		/// <see cref="ZedGraph.Axis.Title"/> will be displayed.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsShowTitle
		{
			get 
			{ 
				object x = ViewState["IsShowTitle"]; 
				return (null == x) ? ZedGraph.Axis.Default.IsShowTitle : (bool)x;
			}
			set { ViewState["IsShowTitle"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsUseTenPower"/>.
		/// </summary>
		/// <remarks> Determines if powers-of-ten notation will be used for the numeric value labels.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsUseTenPower
		{
			get 
			{ 
				object x = ViewState["IsUseTenPower"]; 
				return (null == x) ? false : (bool)x;
			}
			set { ViewState["IsUseTenPower"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.IsPreventLabelOverlap"/>.
		/// </summary>
		/// <remarks> This <see cref="bool"/> value determines if ZedGraph will check to
		/// see if the <see cref="ZedGraph.Axis"/> scale labels are close enough to overlap.  If so,
		/// ZedGraph will adjust the step size to prevent overlap.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsPreventLabelOverlap
		{
			get 
			{ 
				object x = ViewState["IsPreventLabelOverlap"]; 
				return (null == x) ? false : (bool)x;
			}
			set { ViewState["IsPreventLabelOverlap"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.ScaleFormatAuto"/>.
		/// </summary>
		/// <remarks> Determines whether or not the scale label format <see cref="ZedGraph.Axis.ScaleFormat"/>
		/// is determined automatically based on the range of data values.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool ScaleFormatAuto
		{
			get 
			{ 
				object x = ViewState["ScaleFormatAuto"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["ScaleFormatAuto"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.ScaleFormat"/>.
		/// </summary>
		/// <remarks> The format of the <see cref="ZedGraph.Axis"/> tic labels.
		/// This property is only used if the <see cref="Type"/> is set to <see cref="AxisType.Date"/>.
		/// This property may be set automatically by ZedGraph, depending on the state of
		/// <see cref="ZedGraph.Axis.ScaleFormatAuto"/>.
		/// </remarks>
		[Description("Date format for labels. Only for AxisType.Date.")]
		[NotifyParentProperty(true)]
		public string ScaleFormat
		{
			get 
			{ 
				object x = ViewState["ScaleFormat"]; 
				return (null == x) ? ZedGraph.Scale.Default.ScaleFormat : (string)x;
			}
			set { ViewState["ScaleFormat"] = value; ViewState["ScaleFormatAuto"] = false; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.ScaleAlign"/>.
		/// </summary>
		/// <remarks> Controls the alignment of the <see cref="ZedGraph.Axis"/> tic labels.
		/// </remarks>
		[NotifyParentProperty(true)]
		[Description("Controls the aligment of the tic labels")]
		public AlignP ScaleAlign
		{
			get 
			{ 
				object x = ViewState["ScaleAlign"]; 
				return (null == x) ? ZedGraph.Axis.Default.ScaleAlign : (AlignP)x;
			}
			set { ViewState["ScaleAlign"] = value; }
		}
/*
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.NumDecAuto"/>.
		/// </summary>
		/// <remarks> Determines whether or not the number of decimal places for value
		/// labels <see cref="ZedGraph.Axis.NumDec"/> is determined automatically based
		/// on the magnitudes of the scale values.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool NumDecAuto
		{
			get 
			{ 
				object x = ViewState["NumDecAuto"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["NumDecAuto"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.NumDec"/>.
		/// </summary>
		/// <remarks> The number of decimal places displayed for axis value labels.
		/// This value can be determined automatically depending on the state of
		/// <see cref="ZedGraph.Axis.NumDecAuto"/>.  If this value is set manually by the user,
		/// then <see cref="ZedGraph.Axis.NumDecAuto"/> will also be set to false.
		/// </remarks>
		[NotifyParentProperty(true)]
		public int NumDec
		{
			get 
			{ 
				object x = ViewState["NumDec"]; 
				return (null == x) ? 0 : (int)x;
			}
			set { ViewState["NumDec"] = value; ViewState["NumDecAuto"] = false; }
		}
*/
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.ScaleMag"/>.
		/// </summary>
		/// <remarks> The magnitude multiplier for scale values.
		/// This is used to limit
		/// the size of the displayed value labels.  For example, if the value
		/// is really 2000000, then the graph will display 2000 with a 10^3
		/// magnitude multiplier.  This value can be determined automatically
		/// depending on the state of <see cref="ZedGraph.Axis.ScaleMagAuto"/>.
		/// If this value is set manually by the user,
		/// then <see cref="ZedGraph.Axis.ScaleMagAuto"/> will also be set to false.
		/// </remarks>
		[NotifyParentProperty(true)]
		public int ScaleMag
		{
			get 
			{ 
				object x = ViewState["ScaleMag"]; 
				return (null == x) ? 0 : (int)x;
			}
			set { ViewState["ScaleMag"] = value; ViewState["ScaleMagAuto"] = false; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.ScaleMagAuto"/>.
		/// </summary>
		/// <remarks> Determines whether the <see cref="ZedGraph.Axis.ScaleMag"/> value will be set
		/// automatically based on the data, or manually by the user.
		/// If the user manually sets the <see cref="ZedGraph.Axis.ScaleMag"/> value, then this
		/// flag will be set to false.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool ScaleMagAuto
		{
			get 
			{ 
				object x = ViewState["ScaleMagAuto"]; 
				return (null == x) ? true : (bool)x;
			}
			set { ViewState["ScaleMagAuto"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.ScaleFontSpec"/>.
		/// </summary>
		/// <remarks> Gets a reference to the <see cref="ZedGraph.FontSpec"/> class used to render
		/// the scale values.
		/// </remarks>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFontSpec ScaleFontSpec
		{
			get { return (ZedGraphWebFontSpec)base.GetValue('z'); }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Axis.TitleFontSpec"/>.
		/// </summary>
		/// <remarks> Gets a reference to the <see cref="ZedGraph.FontSpec"/> class used to render
		/// the <see cref="ZedGraph.Axis.Title"/>
		/// </remarks>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFontSpec TitleFontSpec
		{
			get { return (ZedGraphWebFontSpec)base.GetValue('Z'); }
		}

		/// <summary>
		/// Proxy property to get or set the values for the <see cref="GraphPane" /> major grid.
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebGrid MinorGrid
		{
			get { return (ZedGraphWebGrid)base.GetValue('y'); }
		}

		/// <summary>
		/// Proxy property to get or set the values for the <see cref="GraphPane" /> minor grid.
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebGrid MajorGrid
		{
			get { return (ZedGraphWebGrid)base.GetValue('Y'); }
		}

		#endregion		
	}
	#endregion

	#region ZedGraphWebLegend
	/// <summary>
	/// Web control state management class for a <see cref="ZedGraph.Legend"/> object
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebLegend : GenericItem
	{
		/// <summary>
		/// Identifies legend instance
		/// </summary>
		/// <returns>Always returns the string "Legend".</returns>
		public override string ToString()
		{
			return "Legend";
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebLegend() : base()
		{
			Register('r',typeof(ZedGraphWebRect));
			Register('F',typeof(ZedGraphWebFontSpec));
			Register('b',typeof(ZedGraphWebBorder));
			Register('f',typeof(ZedGraphWebFill));
			Register('l',typeof(ZedGraphWebLocation));

			this.Border.Color = Legend.Default.BorderColor;
			this.Border.PenWidth = Legend.Default.BorderWidth;
			this.Border.IsVisible = Legend.Default.IsBorderVisible;
			this.Fill.Brush = Legend.Default.FillBrush;
			this.Fill.Color = Legend.Default.FillColor;
			this.Fill.Type = Legend.Default.FillType;
			this.FontSpec.IsBold = Legend.Default.FontBold;
			this.FontSpec.FontColor = Legend.Default.FontColor;
			this.FontSpec.Family = Legend.Default.FontFamily;
			this.FontSpec.Fill.Brush = Legend.Default.FontFillBrush;
			this.FontSpec.Fill.Color = Legend.Default.FontFillColor;
			this.FontSpec.IsItalic = Legend.Default.FontItalic;
			this.FontSpec.Size = Legend.Default.FontSize;					
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebLegend"/> to the specified
		/// <see cref="ZedGraph.Legend"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.Legend"/> object</param>
		public void CopyTo( Legend item )
		{
			item.IsVisible = this.IsVisible;
			item.Position = this.Position;
			item.IsHStack = this.IsHStack;
			this.Rect.CopyTo(item.Rect);
			this.FontSpec.CopyTo(item.FontSpec);
			this.Border.CopyTo(item.Border);
			this.Fill.CopyTo(item.Fill);
			this.Location.CopyTo(item.Location);
		}
		
		#region Properties

		/// <summary>
		/// Proxy property that gets the value of <see cref="ZedGraph.Legend.Location"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebLocation Location
		{
			get { return (ZedGraphWebLocation)base.GetValue('l'); }
		}

		/// <summary>
		/// Proxy property that gets the value of <see cref="ZedGraph.Legend.FontSpec"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFontSpec FontSpec
		{
			get { return (ZedGraphWebFontSpec)base.GetValue('F'); }
		}

		/// <summary>
		/// Proxy property that gets the value of <see cref="ZedGraph.Legend.Fill"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFill Fill
		{
			get { return (ZedGraphWebFill)base.GetValue('f'); }
		}

		/// <summary>
		/// Proxy property that gets the value of <see cref="ZedGraph.Legend.Border"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebBorder Border
		{
			get { return (ZedGraphWebBorder)base.GetValue('b'); }
		}

		/// <summary>
		/// Proxy property that gets the value of <see cref="ZedGraph.Legend.Rect"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebRect Rect
		{
			get { return (ZedGraphWebRect)base.GetValue('r'); }
		}
	
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Legend.IsVisible"/>.
		/// </summary>
		/// <remarks> This property shows or hides the <see cref="Legend"/> entirely.
		/// </remarks>
		/// <value> true to show the <see cref="Legend"/>, false to hide it </value>
		[NotifyParentProperty(true)]
		public bool IsVisible
		{
			get 
			{ 
				object x = ViewState["IsVisible"]; 
				return (null == x) ? Legend.Default.IsVisible : (bool)x;
			}
			set { ViewState["IsVisible"] = value; }
		}
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Legend.IsHStack"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public bool IsHStack
		{
			get 
			{ 
				object x = ViewState["IsHStack"]; 
				return (null == x) ? Legend.Default.IsHStack : (bool)x;
			}
			set { ViewState["IsHStack"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Legend.Position"/>.
		/// </summary>
		/// <remarks> Sets or gets the location of the <see cref="Legend"/> on the
		/// <see cref="GraphPane"/> using the <see cref="LegendPos"/> enum type
		/// </remarks>
		[NotifyParentProperty(true)]
		public LegendPos Position
		{
			get 
			{ 
				object x = ViewState["Position"]; 
				return (null == x) ? Legend.Default.Position : (LegendPos)x;
			}
			set { ViewState["Position"] = value; }
		}

		#endregion		
	}
	#endregion

	#region ZedGraphWebFontSpec
	/// <summary>
	/// Web control state management class for a <see cref="ZedGraph.FontSpec"/> object
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebFontSpec : GenericItem
	{
		/// <summary>
		/// Identifies fontspec instance
		/// </summary>
		/// <returns>Always returns the string "FontSpec".</returns>
		public override string ToString()
		{
			string color = this.FontColor.Name + " " + this.Size + "pts";
			string fill;
			if( !this.Fill.IsVisible || this.Fill.Type == FillType.None )
				fill = "none";
			else
				fill = this.Fill.Color.Name;
			string border;
			if( !this.Border.IsVisible )
				border = "none";
			else
				border = this.Border.Color.Name;

			return color + " " + fill + " " + border;
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebFontSpec() : base()
		{
			Register('b',typeof(ZedGraphWebBorder));
			Register('f',typeof(ZedGraphWebFill));	
		
			this.Fill.Color = ZedGraph.FontSpec.Default.FillColor;
			this.Fill.Brush = ZedGraph.FontSpec.Default.FillBrush;
			this.Fill.Type  = ZedGraph.FontSpec.Default.FillType;
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebFontSpec"/> to the specified
		/// <see cref="ZedGraph.FontSpec"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.FontSpec"/> object</param>
		public void CopyTo( FontSpec item )
		{
			this.Border.CopyTo(item.Border);
			this.Fill.CopyTo(item.Fill);
			item.Angle = this.Angle;
			item.Size = this.Size;
			item.Family = this.Family;
			item.FontColor = this.FontColor;
			item.StringAlignment = this.StringAlignment;
			item.IsBold = this.IsBold;
			item.IsItalic = this.IsItalic;
			item.IsUnderline = this.IsUnderline;
		}
		
		#region Properties

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.FontSpec.Angle"/>.
		/// </summary>
		/// <remarks> The angle at which this <see cref="FontSpec"/> object is drawn.
		/// </remarks>
		/// <value>The angle of the font, measured in anti-clockwise degrees from
		/// horizontal.  Negative values are permitted.</value>
		[NotifyParentProperty(true)]
		public float Angle
		{
			get 
			{ 
				object x = ViewState["Angle"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Angle"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.FontSpec.Size"/>.
		/// </summary>
		/// <remarks> The size of the font for this <see cref="FontSpec"/> object.
		/// </remarks>
		/// <value>The size of the font, measured in points (1/72 inch).</value>
		[NotifyParentProperty(true)]
		public float Size
		{
			get 
			{ 
				object x = ViewState["Size"]; 
				return (null == x) ? 10 : (float)x;
			}
			set { ViewState["Size"] = value; }
		}
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.FontSpec.Family"/>.
		/// </summary>
		/// <remarks> The font family name for this <see cref="FontSpec"/>.
		/// </remarks>
		/// <value>A text string with the font family name, e.g., "Arial"</value>
		[NotifyParentProperty(true)]
		public string Family
		{
			get 
			{ 
				object x = ViewState["Family"]; 
				return (null == x) ? string.Empty : (string)x;
			}
			set { ViewState["Family"] = value; }
		}		

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.FontSpec.FontColor"/>.
		/// </summary>
		/// <remarks> The color of the font characters for this <see cref="FontSpec"/>.
		/// Note that the border and background
		/// colors are set using the <see cref="ZedGraph.Border.Color"/> and
		/// <see cref="ZedGraph.Fill.Color"/> properties, respectively.
		/// </remarks>
		/// <value>A system <see cref="System.Drawing.Color"/> reference.</value>
		[NotifyParentProperty(true)]
		public Color FontColor
		{
			get 
			{ 
				object x = ViewState["FontColor"]; 
				return (null == x) ? Color.Empty : (Color)x;
			}
			set { ViewState["FontColor"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.FontSpec.StringAlignment"/>.
		/// </summary>
		/// <remarks> Determines the alignment with which this
		/// <see cref="FontSpec"/> object is drawn.  This alignment really only
		/// affects multi-line strings.
		/// </remarks>
		/// <value>A <see cref="StringAlignment"/> enumeration.</value>
		[NotifyParentProperty(true)]
		public StringAlignment StringAlignment
		{
			get 
			{ 
				object x = ViewState["StringAlignment"]; 
				return (null == x) ? FontSpec.Default.StringAlignment : (StringAlignment)x;
			}
			set { ViewState["StringAlignment"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.FontSpec.IsBold"/>.
		/// </summary>
		/// <remarks> Determines whether this <see cref="FontSpec"/> is
		/// drawn with bold typeface.
		/// </remarks>
		/// <value>A boolean value, true for bold, false for normal</value>
		[NotifyParentProperty(true)]
		public bool IsBold
		{
			get 
			{ 
				object x = ViewState["IsBold"]; 
				return (null == x) ? false : (bool)x;
			}
			set { ViewState["IsBold"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.FontSpec.IsItalic"/>.
		/// </summary>
		/// <remarks> Determines whether this <see cref="FontSpec"/> is
		/// drawn with an italic typeface.
		/// </remarks>
		/// <value>A boolean value, true for italic, false for normal</value>
		[NotifyParentProperty(true)]
		public bool IsItalic
		{
			get 
			{ 
				object x = ViewState["IsItalic"]; 
				return (null == x) ? false : (bool)x;
			}
			set { ViewState["IsItalic"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.FontSpec.IsUnderline"/>.
		/// </summary>
		/// <remarks> Determines whether this <see cref="FontSpec"/> is
		/// drawn with an underline typeface.
		/// </remarks>
		/// <value>A boolean value, true for underline, false for normal</value>
		[NotifyParentProperty(true)]
		public bool IsUnderline
		{
			get 
			{ 
				object x = ViewState["IsUnderline"]; 
				return (null == x) ? false : (bool)x;
			}
			set { ViewState["IsUnderline"] = value; }
		}

		#endregion

		#region Border
		
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebBorder"/> object for
		/// this <see cref="FontSpec"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Border"/>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebBorder Border
		{
			get { return (ZedGraphWebBorder)GetValue('b'); }
		}
		
		#endregion

		#region Fill

		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebFill"/> object for
		/// this <see cref="FontSpec"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Fill"/>
		[
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFill Fill
		{
			get { return (ZedGraphWebFill)GetValue('f'); }
		}
		
		#endregion		
	}
	#endregion

	#region ZedGraphWebRect (X,Y,Width,Height)
	/// <summary>
	/// Rectangle class for a <see cref="ZedGraph.FontSpec"/> object
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebRect : GenericItem
	{
		/// <summary>
		/// Identifies fontspec instance
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{		
			return string.Format("Rect({0},{1},{2},{3})", X,Y,Height,Width);
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebRect() : base()
		{				
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebRect"/> to the specified
		/// <see cref="RectangleF"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="RectangleF"/> object</param>
		public void CopyTo( RectangleF item )
		{
			item.X = this.X;
			item.Y = this.Y;
			item.Width = this.Width;
			item.Height = this.Height;
		}
		
	#region Properties

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="RectangleF.Height"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Height
		{
			get 
			{ 
				object x = ViewState["Height"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Height"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="RectangleF.Width"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Width
		{
			get 
			{ 
				object x = ViewState["Width"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Width"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="RectangleF.Y"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Y
		{
			get 
			{ 
				object x = ViewState["Y"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Y"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="RectangleF.X"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float X
		{
			get 
			{ 
				object x = ViewState["X"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["X"] = value; }
		}
		#endregion
	}
	#endregion

	#region ZedGraphWebRect2 (Left, Top, Right, Bottom)
	/// <summary>
	/// Rectangle class for margins
	/// </summary>
	/// <author>Benjamin Mayrargue</author>
	public class ZedGraphWebRect2 : GenericItem
	{
		/// <summary>
		/// Override ToString
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{		
			return string.Format("Rect({0},{1},{2},{3})", Left, Top, Right, Bottom);
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebRect2() : base()
		{				
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebRect2"/> to the specified
		/// <see cref="RectangleF"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="RectangleF"/> object</param>
		public void CopyTo( RectangleF item )
		{
			item.X = this.Left;
			item.Y = this.Top;
			item.Width = this.Right - this.Left;
			item.Height = this.Bottom - this.Top;
		}
		
	#region Properties

		/// <summary>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Left
		{
			get 
			{ 
				object x = ViewState["Left"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Left"] = value; }
		}

		/// <summary>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Top
		{
			get 
			{ 
				object x = ViewState["Top"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Top"] = value; }
		}

		/// <summary>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Right
		{
			get 
			{ 
				object x = ViewState["Right"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Right"] = value; }
		}

		/// <summary>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Bottom
		{
			get 
			{ 
				object x = ViewState["Bottom"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Bottom"] = value; }
		}
		#endregion
	}
	#endregion

	#region ZedGraphWebSize
	/// <summary>
	/// Size class for a <see cref="ZedGraph.FontSpec"/> object
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebSize : GenericItem
	{
		/// <summary>
		/// Identifies fontspec instance
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{				
			if ( Height==0 && Width==0 ) return string.Empty;			
			return string.Format("Size({0},{1})",
				Height,Width);
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebSize() : base()
		{				
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebSize"/> to the specified
		/// <see cref="SizeF"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="SizeF"/> object</param>
		public void CopyTo( SizeF item )
		{
			item.Width = this.Width;
			item.Height = this.Height;
		}
		
		#region Properties

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="SizeF.Height"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Height
		{
			get 
			{ 
				object x = ViewState["Height"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Height"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="SizeF.Width"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Width
		{
			get 
			{ 
				object x = ViewState["Width"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Width"] = value; }
		}
		
		#endregion
	}
	#endregion

	#region ZedGraphWebPoint
	/// <summary>
	/// Point class for a <see cref="ZedGraph.FontSpec"/> object
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebPoint : GenericItem
	{
		/// <summary>
		/// Identifies fontspec instance
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{			
			if ( X==0 && Y==0 ) return string.Empty;
			return string.Format("Point({0},{1})",
				X,Y);
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebPoint() : base()
		{
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebPoint"/> to the specified
		/// <see cref="PointF"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="PointF"/> object</param>
		public void CopyTo( PointF item )
		{
			item.X = this.X;
			item.Y = this.Y;			
		}
		
		#region Properties

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="PointF.X"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float X
		{
			get 
			{ 
				object x = ViewState["X"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["X"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="PointF.Y"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Y
		{
			get 
			{ 
				object x = ViewState["Y"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Y"] = value; }
		}
		
		#endregion
	}
	#endregion

	#region ZedGraphWebTextItem
	/// <summary>
	/// Baseclass for graph items in the web control
	/// <seealso cref="ZedGraph.GraphItem"/>
	/// </summary>
	/// <author>Darren Martz</author>
	/// <remarks>
	/// A TextItem uses only:
	///		FontSpec
	///		Location
	///			.CoordinateFrame (<see cref="CoordType"/>)
	///			.X (between 0 and 1 for fraction CoordTypes) 0=left, 1=right
	///			.Y (between 0 and 1 for fraction CoordTypes) 0=top, 1=bottom
	///			.AlignH
	///			.AlignV
	///			.layoutArea
	/// </remarks>
	public class ZedGraphWebTextItem : ZedGraphWebGraphItem
	{
		/// <summary>
		/// Identifies curve item by the labels value
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{
			return "TextItem: " + this.Text;
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebTextItem() : base()
		{
			Register('a',typeof(ZedGraphWebSize));
			Register('f',typeof(ZedGraphWebFontSpec));

			this.FontSpec.Family = ZedGraph.TextItem.Default.FontFamily;
			this.FontSpec.Size = ZedGraph.TextItem.Default.FontSize;
			this.FontSpec.FontColor = ZedGraph.TextItem.Default.FontColor;
			this.FontSpec.IsBold = ZedGraph.TextItem.Default.FontBold;
			this.FontSpec.IsUnderline = ZedGraph.TextItem.Default.FontUnderline;
			this.FontSpec.IsItalic = ZedGraph.TextItem.Default.FontItalic;			
		}
	
		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebTextItem"/> to the specified
		/// <see cref="ZedGraph.TextItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.TextItem"/> object</param>
		public void CopyTo( TextItem item )
		{
			base.CopyTo(item);
			this.LayoutArea.CopyTo(item.LayoutArea); //Width, height
			item.Text = this.Text;
			this.FontSpec.CopyTo(item.FontSpec);
		}
		
		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.TextItem.Text"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public string Text
		{
			get 
			{ 
				object x = ViewState["Text"]; 
				return (null == x) ? string.Empty : (string)x;
			}
			set { ViewState["Text"] = value; }
		} 

		/// <summary>
		/// Proxy property that gets the value of <see cref="ZedGraph.TextItem.LayoutArea"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebSize LayoutArea
		{
			get { return (ZedGraphWebSize)GetValue('a'); }			
		} 

		/// <summary>
		/// Proxy property that gets the value of <see cref="ZedGraph.TextItem.FontSpec"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFontSpec FontSpec
		{
			get { return (ZedGraphWebFontSpec)GetValue('f'); }			
		} 
	}
	#endregion

	#region ZedGraphWebArrowItem
	/// <summary>
	/// Baseclass for graph items in the web control
	/// <seealso cref="ZedGraph.GraphItem"/>
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebArrowItem : ZedGraphWebGraphItem
	{
		/// <summary>
		/// Identifies curve item by the labels value
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{
			return "ArrowItem";
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebArrowItem() : base()
		{
		}	
		
		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebArrowItem"/> to the specified
		/// <see cref="ZedGraph.ArrowItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.ArrowItem"/> object</param>
		public void CopyTo( ArrowItem item )
		{
			base.CopyTo(item);
			item.Size = this.Size;
			item.PenWidth = this.PenWidth;
			item.Color = this.Color;
			item.IsArrowHead = this.IsArrowHead;
		}

		#region Properties

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.ArrowItem.Size"/>.
		/// </summary>
		/// <remarks> The size of the arrowhead, expressed in points (1/72nd inch).
		/// </remarks>
		[NotifyParentProperty(true)]
		public float Size
		{
			get 
			{ 
				object x = ViewState["Size"]; 
				return (null == x) ? ArrowItem.Default.Size : (float)x;
			}
			set { ViewState["Size"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.ArrowItem.PenWidth"/>.
		/// </summary>
		/// <remarks> The width of the pen, expressed in points (1/72nd inch), used to draw the
		/// arrow line segment.
		/// </remarks>
		[NotifyParentProperty(true)]
		public float PenWidth
		{
			get 
			{ 
				object x = ViewState["PenWidth"]; 
				return (null == x) ? ArrowItem.Default.PenWidth : (float)x;
			}
			set { ViewState["PenWidth"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.ArrowItem.Color"/>.
		/// </summary>
		/// <remarks> The <see cref="System.Drawing.Color"/> value used to draw the <see cref="ZedGraph.ArrowItem"/>.
		/// </remarks>
		[NotifyParentProperty(true)]
		public Color Color
		{
			get 
			{ 
				object x = ViewState["Color"]; 
				return (null == x) ? ArrowItem.Default.Color : (Color)x;
			}
			set { ViewState["Color"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.ArrowItem.IsArrowHead"/>.
		/// </summary>
		/// <remarks> Determines whether or not an arrowhead will be draw.  If false, only a line segment
		/// will be drawn.
		/// </remarks>
		[NotifyParentProperty(true)]
		public bool IsArrowHead
		{
			get 
			{ 
				object x = ViewState["IsArrowHead"]; 
				return (null == x) ? ArrowItem.Default.IsArrowHead : (bool)x;
			}
			set { ViewState["IsArrowHead"] = value; }
		}

		#endregion
	}
	#endregion

	#region ZedGraphWebImageItem
	/// <summary>
	/// Baseclass for graph items in the web control
	/// <seealso cref="ZedGraph.GraphItem"/>
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebImageItem : ZedGraphWebGraphItem
	{
		/// <summary>
		/// Identifies curve item by the labels value
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{
			return "ImageItem";
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebImageItem() : base()
		{
		}
		
		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebImageItem"/> to the specified
		/// <see cref="ZedGraph.ImageItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.ImageItem"/> object</param>
		public void CopyTo( ImageItem item )
		{
			base.CopyTo(item);
			item.IsScaled = this.IsScaled;					

			item.Image = null;
			try
			{
				if ( (this.ImageUrl != null) && (this.ImageUrl != string.Empty) )
				{
					string path = System.AppDomain.CurrentDomain.BaseDirectory;
					path = System.IO.Path.Combine(path,this.ImageUrl);						
					item.Image = Image.FromFile(path);
				}
			}
			catch(Exception)
			{
				//TODO: deal with failure?
			}			
		}

		#region Properties

		/// <summary>
		/// The <see cref="String"/> url reference from which to get the <see cref="Image"/>
		/// data for this <see cref="ZedGraph.ImageItem"/>.
		/// </summary>
		[NotifyParentProperty(true)]
		public string ImageUrl
		{
			get 
			{ 
				object x = ViewState["ImageUrl"]; 
				return (null == x) ? string.Empty : (string)x;
			}
			set { ViewState["ImageUrl"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.ImageItem.IsScaled"/>.
		/// </summary>
		/// <remarks>
		/// Determines if the image will be scaled to the output rectangle (see <see cref="Location"/>).
		/// </remarks>
		/// <value>true to scale the image, false to draw the image unscaled, but clipped
		/// to the destination rectangle</value>
		[NotifyParentProperty(true)]
		public bool IsScaled
		{
			get 
			{ 
				object x = ViewState["IsScaled"]; 
				return (null == x) ? false : (bool)x;
			}
			set { ViewState["IsScaled"] = value; }
		}

		#endregion
	}
	#endregion

	#region ZedGraphWebBoxItem
	/// <summary>
	/// Baseclass for graph items in the web control
	/// <seealso cref="ZedGraph.GraphItem"/>
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebBoxItem : ZedGraphWebGraphItem
	{
		/// <summary>
		/// Identifies curve item by the labels value
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{
			return "BoxItem";
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebBoxItem() : base()
		{
			Register('b',typeof(ZedGraphWebBorder));
			Register('f',typeof(ZedGraphWebFill));

			this.Border.Color = ZedGraph.BoxItem.Default.BorderColor;
			this.Fill.Color = ZedGraph.BoxItem.Default.FillColor;
		}			
	
		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebBoxItem"/> to the specified
		/// <see cref="ZedGraph.BoxItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.BoxItem"/> object</param>
		public void CopyTo( BoxItem item )
		{
			base.CopyTo(item);
			this.Border.CopyTo(item.Border);
			this.Fill.CopyTo(item.Fill);
		}

		#region Border
		
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebBorder"/> object for
		/// this <see cref="BarItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Border"/>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebBorder Border
		{
			get { return (ZedGraphWebBorder)base.GetValue('b'); }
		}
		
		#endregion

		#region Fill
		
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebFill"/> object for
		/// this <see cref="BarItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Fill"/>
		[
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFill Fill
		{
			get { return (ZedGraphWebFill)base.GetValue('f'); }
		}
		
		#endregion		
	}
	#endregion

	#region ZedGraphWebEllipseItem
	/// <summary>
	/// Baseclass for graph items in the web control
	/// <seealso cref="ZedGraph.GraphItem"/>
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebEllipseItem : ZedGraphWebGraphItem
	{
		/// <summary>
		/// Identifies curve item by the labels value
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{
			return "EllipseItem";
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebEllipseItem() : base()
		{
			Register('b',typeof(ZedGraphWebBorder));
			Register('f',typeof(ZedGraphWebFill));
		}
		
		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebEllipseItem"/> to the specified
		/// <see cref="ZedGraph.EllipseItem"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.EllipseItem"/> object</param>
		public void CopyTo( EllipseItem item )
		{
			base.CopyTo(item);
			this.Border.CopyTo(item.Border);
			this.Fill.CopyTo(item.Fill);
		}

		#region Border
		
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebBorder"/> object for
		/// this <see cref="BarItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Border"/>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebBorder Border
		{
			get { return (ZedGraphWebBorder)base.GetValue('b'); }
		}
		
		#endregion

		#region Fill
		
		/// <summary>
		/// Proxy property that gets or sets the <see cref="ZedGraphWebFill"/> object for
		/// this <see cref="BarItem"/>.
		/// </summary>
		/// <seealso cref="ZedGraph.Fill"/>
		[
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebFill Fill
		{
			get { return (ZedGraphWebFill)base.GetValue('f'); }
		}
		
		#endregion		
	}
	#endregion

	#region ZedGraphWebLocation
	/// <summary>
	/// Location class for a <see cref="ZedGraph.FontSpec"/> object
	/// </summary>
	/// <author>Darren Martz</author>
	public class ZedGraphWebLocation : GenericItem
	{
		/// <summary>
		/// Identifies location instance
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{						
			return "Location";
		}

		/// <summary>
		/// Default constructor
		/// </summary>
		public ZedGraphWebLocation() : base()
		{	
			Register('r',typeof(ZedGraphWebRect));
			Register('t',typeof(ZedGraphWebPoint));
			Register('b',typeof(ZedGraphWebPoint));
		}

		/// <summary>
		/// Copy the properties of this <see cref="ZedGraphWebLocation"/> to the specified
		/// <see cref="ZedGraph.Location"/> object.
		/// </summary>
		/// <param name="item">The destination <see cref="ZedGraph.Location"/> object</param>
		public void CopyTo( Location item )
		{
			item.X = this.X;
			item.Y = this.Y;
			item.Width = this.Width;
			item.Height = this.Height;
			item.AlignH = this.AlignH;
			item.AlignV = this.AlignV;
			item.CoordinateFrame = this.CoordinateFrame;
			this.Rect.CopyTo(item.Rect);
			this.TopLeft.CopyTo(item.TopLeft);
			this.BottomRight.CopyTo(item.BottomRight);
		}

		#region Properties

		/// <summary>
		/// Proxy property that gets the value of <see cref="ZedGraph.Location.Rect"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebRect Rect
		{
			get { return (ZedGraphWebRect)GetValue('r'); }
		}

		/// <summary>
		/// Proxy property that gets the value of <see cref="ZedGraph.Location.TopLeft"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebPoint TopLeft
		{
			get { return (ZedGraphWebPoint)GetValue('t'); }
		}

		/// <summary>
		/// Proxy property that gets the value of <see cref="ZedGraph.Location.BottomRight"/>
		/// </summary>
		[	
		Category("Appearance"),
		DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
		NotifyParentProperty(true),
		PersistenceMode(PersistenceMode.InnerProperty)
		]
		public ZedGraphWebPoint BottomRight
		{
			get { return (ZedGraphWebPoint)GetValue('b'); }
		}		

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Location.Height"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Height
		{
			get 
			{ 
				object x = ViewState["Height"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Height"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Location.Width"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Width
		{
			get 
			{ 
				object x = ViewState["Width"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Width"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Location.Y"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float Y
		{
			get 
			{ 
				object x = ViewState["Y"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["Y"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Location.X"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public float X
		{
			get 
			{ 
				object x = ViewState["X"]; 
				return (null == x) ? 0 : (float)x;
			}
			set { ViewState["X"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Location.AlignH"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public AlignH AlignH
		{
			get 
			{ 
				object x = ViewState["AlignH"]; 
				return (null == x) ? AlignH.Left : (AlignH)x;
			}
			set { ViewState["AlignH"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Location.AlignV"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public AlignV AlignV
		{
			get 
			{ 
				object x = ViewState["AlignV"]; 
				return (null == x) ? AlignV.Center : (AlignV)x;
			}
			set { ViewState["AlignV"] = value; }
		}

		/// <summary>
		/// Proxy property that gets or sets the value of <see cref="ZedGraph.Location.CoordinateFrame"/>
		/// </summary>
		[NotifyParentProperty(true)]
		public CoordType CoordinateFrame
		{
			get 
			{ 
				object x = ViewState["CoordinateFrame"]; 
				return (null == x) ? CoordType.AxisFraction : (CoordType)x;
			}
			set { ViewState["CoordinateFrame"] = value; }
		}

		#endregion
	}
	#endregion
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Engineer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions