context: using System;
  using Server;
  using Server.Gumps;
  using Server.Network;
  
  namespace Server.ACC.PG
  {
  	[Flags]
  	public enum	Conditions
  	{
  		None      = 0x00000000,
  		Adding    = 0x00000001,
  		Category  = 0x00000002,
  	}
  
  	public class PGAddEditGump : Gump
  	{
  		private Conditions m_Conditions;
  		private int        m_CurCat;
  		private int        m_CurLoc;
  		private PGCategory m_Cat;
  		private PGLocation m_Loc;
  		private PublicGate m_Gate;
  
  		private bool GetFlag( Conditions flag ) { return( (m_Conditions & flag) != 0 ); }
  
  		public PGAddEditGump( Conditions conditions, int curC, int curL, PublicGate gate ) : base( 0, 0 )
  		{
  			if( !PGSystem.Running )
  				return;
  
  			m_Conditions = conditions;
  			m_CurCat     = curC;
  			m_CurLoc     = curL;
  			m_Gate       = gate;
  
  			if( !GetFlag( Conditions.Category ) || (GetFlag( Conditions.Category ) && !GetFlag( Conditions.Adding )) )
  				m_Cat = PGSystem.CategoryList[curC];
  			if( m_Cat != null && (!GetFlag( Conditions.Category ) && !GetFlag( Conditions.Adding )) )
  				m_Loc = m_Cat.Locations[curL];
  
  
  			string Name = "";
  			if( !GetFlag( Conditions.Adding ) )
  			{
  				if( GetFlag( Conditions.Category ) )
  					Name = m_Cat.Name;
  				else
  					Name = m_Loc.Name;
  			}
  
  			Point3D Loc = new Point3D( 0, 0, 0 );
  			Map Map = Map.Trammel;
  			bool Gen, Staff, Reds, Charge, Young;
  			int Hue, Cost;
  			Gen = Staff = Reds = Charge = Young = false;
  			Hue = Cost = 0;
  
  			if( GetFlag( Conditions.Category ) && !GetFlag( Conditions.Adding ) )
  			{
  				Gen    = m_Cat.GetFlag( EntryFlag.Generate );
  				Staff  = m_Cat.GetFlag( EntryFlag.StaffOnly );
  				Reds   = m_Cat.GetFlag( EntryFlag.Reds );
  				Charge = m_Cat.GetFlag( EntryFlag.Charge );
  				Young  = m_Cat.GetFlag( EntryFlag.Young );
  				Cost   = m_Cat.Cost;
  			}
  
  			if( !GetFlag( Conditions.Category ) && !GetFlag( Conditions.Adding ) )
  			{
  				Loc    = m_Loc.Location;
  				Map    = m_Loc.Map;
  				Gen    = m_Loc.GetFlag( EntryFlag.Generate );
  				Staff  = m_Loc.GetFlag( EntryFlag.StaffOnly );
  				Reds   = m_Loc.GetFlag( EntryFlag.Reds );
  				Charge = m_Loc.GetFlag( EntryFlag.Charge );
  				Young  = m_Loc.GetFlag( EntryFlag.Young );
  				Hue    = m_Loc.Hue;
  				Cost   = m_Loc.Cost;
  			}
  
  			Closable   = true;
  			Disposable = true;
  			Dragable   = true;
  			Resizable  = false;
  
  			AddPage(0);
  
  			AddBackground( 530, 100, 230, 410, 2600 );
  			AddLabel( 602, 120, 0, string.Format("{0} {1}", (GetFlag(Conditions.Adding) ? "Add" : "Edit"), (GetFlag(Conditions.Category) ? "Category" : "Location")) );
  
  			AddLabel( 625, 145, 0, "Name :" );
  			AddImage( 555, 170, 2446 );
  			AddTextEntry( 565, 170, 160, 20, 0, 2, Name );
  
  			AddLabel( 715, 235, 0, ": C" );
  			AddImage( 650, 235, 2443 );
  			AddTextEntry( 655, 235, 55, 20, 0, 15, Cost.ToString() );
  
  			if( !GetFlag(Conditions.Category) )
  			{
  
  				AddLabel( 560, 210, 0, "X :" );
  				AddImage( 580, 210, 2443 );
  				AddTextEntry( 585, 210, 55, 20, 0, 3, Loc.X.ToString() );
  
  				AddLabel( 560, 235, 0, "Y :" );
  				AddImage( 580, 235, 2443 );
  				AddTextEntry( 585, 235, 55, 20, 0, 4, Loc.Y.ToString() );
  
  				AddLabel( 560, 260, 0, "Z :" );
  				AddImage( 580, 260, 2443 );
  				AddTextEntry( 585, 260, 55, 20, 0, 5, Loc.Z.ToString() );
  
  				AddLabel( 715, 210, 0, ": H" );
  				AddImage( 650, 210, 2443 );
  				AddTextEntry( 655, 210, 55, 20, 0, 14, Hue.ToString() );
  
  				AddLabel( 585, 315, 0, "Trammel" );
  				AddRadio( 555, 315, 208, 209, (Map == Map.Trammel ? true : false), 6 );
  
  				AddLabel( 585, 340, 0, "Felucca" );
  				AddRadio( 555, 340, 208, 209, (Map == Map.Felucca ? true : false), 7 );
  
  				AddLabel( 685, 315, 0, "Malas" );
  				AddRadio( 655, 315, 208, 209, (Map == Map.Malas ? true : false), 8 );
  
  				AddLabel( 685, 345, 0, "Ilshenar" );
  				AddRadio( 655, 340, 208, 209, (Map == Map.Ilshenar ? true : false), 9 );
  
  				AddLabel( 585, 365, 0, "Tokuno" );
  				AddRadio( 555, 370, 208, 209, (Map == Map.Tokuno ? true : false), 10 );
  			}
  
  
  			AddLabel( 585, 395, 0, "Generate?" );
  			AddCheck( 555, 395, 210, 211, Gen, 11 );
  
  			AddLabel( 665, 395, 0, "Young?" );
  			AddCheck( 715, 395, 210, 211, Young, 16 );
  
  			AddLabel( 585, 420, 0, "Reds?" );
  			AddCheck( 555, 420, 210, 211, Reds, 13 );
  
  			AddLabel( 658, 420, 0, "Charge?" );
  			AddCheck( 715, 420, 210, 211, Charge, 17 );
  
  			AddLabel( 585, 445, 0, "Staff Only?" );
  			AddCheck( 555, 445, 210, 211, Staff, 12 );
  
  			AddButton( 700, 450, 1417, 1417, 1, GumpButtonType.Reply, 0 );
  			AddLabel( 728, 481, 69, "Apply" );
  		}
  
  		private EntryFlag Flags;
  		private void SetFlag( EntryFlag flag, bool value )
  		{
  			if( value )
  				Flags |= flag;
  			else Flags &= ~flag;
  		}
  
  		public override void OnResponse( NetState state, RelayInfo info )
  		{
  			if( state.Mobile.AccessLevel < PGSystem.PGAccessLevel )
  				return;
  
  			Mobile from = state.Mobile;
  			int BID = info.ButtonID;
  			if( BID == 0 )
  				return;
  
  			SetFlag( EntryFlag.Generate, info.IsSwitched( 11 ) );
  			SetFlag( EntryFlag.StaffOnly, info.IsSwitched( 12 ) );
  			SetFlag( EntryFlag.Reds, info.IsSwitched( 13 ) );
  			SetFlag( EntryFlag.Young, info.IsSwitched( 16 ) );
  			SetFlag( EntryFlag.Charge, info.IsSwitched( 17 ) );
  
  			Map Map = null;
  			for( int i = 0; i < info.Switches.Length; i++ )
  			{
  				int m = info.Switches[i];
  				switch( m )
  				{
  					case 6:  Map = Map.Trammel;  break;
  					case 7:  Map = Map.Felucca;  break;
  					case 8:  Map = Map.Malas;    break;
  					case 9:  Map = Map.Ilshenar; break;
  					case 10: Map = Map.Tokuno;   break;
  				}
  			}
  
  
  			TextRelay NR = info.GetTextEntry( 2 );
  			TextRelay XR = info.GetTextEntry( 3 );
  			TextRelay YR = info.GetTextEntry( 4 );
  			TextRelay ZR = info.GetTextEntry( 5 );
  			TextRelay HR = info.GetTextEntry( 14 );
  			TextRelay CR = info.GetTextEntry( 15 );
  			string NS = (NR == null ? null : NR.Text.Trim());
  			string XS = (XR == null ? null : XR.Text.Trim());
  			string YS = (YR == null ? null : YR.Text.Trim());
  			string ZS = (ZR == null ? null : ZR.Text.Trim());
  			string HS = (HR == null ? null : HR.Text.Trim());
  			string CS = (CR == null ? null : CR.Text.Trim());
  
  			if( BID == 1 )
  			{
  				if( GetFlag( Conditions.Category ) )
  				{
  					if( GetFlag( Conditions.Adding ) )
  					{
  						if( NS == null || NS.Length == 0 || CS == null || CS.Length == 0 )
  						{
  							from.SendMessage( "Please enter a name and cost for this Category." );
  							from.CloseGump( typeof( PGAddEditGump ) );
  							from.SendGump( new PGAddEditGump( m_Conditions, m_CurCat, m_CurLoc, m_Gate ) );
  							return;
  						}
  
  						int c = 0;
  						try
  						{
  							c = Int32.Parse( CS );
  							PGSystem.CategoryList.Add( new PGCategory( NS, Flags, c ) );
  							from.SendMessage( "Added Category." );
  						}
  						catch
  						{
  							from.SendMessage( "Bad cost value, defaulting to 0." );
  							PGSystem.CategoryList.Add( new PGCategory( NS, Flags ) );
  						}
  					}
  
  					else
  					{
  						if( NS == null || NS.Length == 0 )
  						{
  							from.SendMessage( "Removed the Category." );
  							PGSystem.CategoryList.RemoveAt( m_CurCat );
  							m_CurCat = 0;
  						}
  
  						else
  						{
  							from.SendMessage( "Changed the Category." );
  							PGSystem.CategoryList[m_CurCat].Name = NS;
  							PGSystem.CategoryList[m_CurCat].Flags = Flags;
  							if( CS == null || CS.Length == 0 )
  								PGSystem.CategoryList[m_CurCat].Cost = 0;
  							else
  							{
  								int c = 0;
  
  								try
  								{
  									c = Int32.Parse( CS );
  									PGSystem.CategoryList[m_CurCat].Cost = c;
  								}
  								catch
  								{
  									PGSystem.CategoryList[m_CurCat].Cost = 0;
  								}
  							}
  						}
  					}
  				}
  
  				else
  				{
  					if( NS == null || NS.Length == 0 ||
  
gt: 						XS == null || XS.Length == 0 ||