/*
**	$Id: PhonePanel.c,v 1.12 92/08/15 20:13:04 olsen Sta Locker: olsen $
**	$Revision: 1.12 $
**	$Date: 92/08/15 20:13:04 $
**
**	The phonebook and support routines
**
**	Copyright © 1990-1992 by Olaf `Olsen' Barthel & MXM
**		All Rights Reserved
*/

#include "termGlobal.h"

enum	{	GAD_NAMELIST,GAD_NAME,GAD_PHONENUMBER,
		GAD_NEWENTRY,GAD_DIALLIST,GAD_LOADLIST,
		GAD_CLONEENTRY,GAD_CLEARLIST,GAD_SORTLIST,
		GAD_REMOVEENTRY,GAD_PLAYNUMBER,GAD_SAVELIST,
		GAD_COPYCONFIG,GAD_USEIT,GAD_PASSWORD,GAD_EDIT };

enum	{	EDIT_SERIAL,EDIT_MODEM,EDIT_TRANSFER,EDIT_SCREEN,EDIT_TERMINAL,
		EDIT_COMMANDS,EDIT_UNITS,EDIT_MISC,EDIT_PATHS,EDIT_KEYMACROS,
		EDIT_FASTMACROS,EDIT_PASSWORD,EDIT_COPY };

STATIC struct List	EditList;
STATIC struct Node	EditNode[13];

STATIC UBYTE *EditName[13] =
{
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL
};

STATIC struct Gadget *
CreateAllGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList,APTR VisualInfo,UWORD TopEdge)
{
	struct Gadget		*Gadget;
	struct NewGadget	 NewGadget;
	UWORD			 Counter = 0;

	LocalizeString(EditName,MSG_PHONEPANEL_SERIAL_TXT,MSG_PHONEPANEL_PASSWORD_USER_TXT);

	memset(&NewGadget,0,sizeof(struct NewGadget));

	SZ_SizeSetup(Screen,&UserFont,TRUE);

	if(Gadget = CreateContext(GadgetList))
	{
		WORD i,Max,Len,ButtonWidth,MaxWidth,LeftEdge;

		NewList(&EditList);

		for(i = 0 ; i < 12 ; i++)
		{
			EditNode[i] . ln_Name = EditName[i];

			AddTail(&EditList,&EditNode[i]);
		}

		SZ_ResetMaxWidth();

		for(i = MSG_PHONEPANEL_PLAY_NUMBER_GAD ; i <= MSG_PHONEPANEL_SET_PASSWORT_GAD ; i++)
			SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(i),0,NULL);

		ButtonWidth = SZ_ResetMaxWidth();

		MaxWidth = 3 * ButtonWidth + 2 * INTERWIDTH;

		Max = SZ_TextWidth(LocaleString(MSG_PHONEPANEL_PHONE_NUMBER_GAD));

		if((Len = SZ_TextWidth(LocaleString(MSG_PHONEPANEL_BBS_NAME_GAD))) > Max)
			Max = Len;

		if((Len = SZ_TextWidth(LocaleString(MSG_GLOBAL_NAME_LIST_GAD))) > Max)
			Max = Len;

		SZ_AddLeftOffset(Max + INTERWIDTH);

		LeftEdge = SZ_GetLeftEdge();

		if(SZ_Width(LISTVIEW_KIND,NULL,35,NULL) > MaxWidth)
			MaxWidth = SZ_Width(LISTVIEW_KIND,NULL,35,NULL);

		SZ_SetWidth(MaxWidth);

		NewGadget . ng_TextAttr		= &UserFont;
		NewGadget . ng_VisualInfo	= VisualInfo;
		NewGadget . ng_Flags		= PLACETEXT_LEFT;
		NewGadget . ng_GadgetText	= LocaleString(MSG_GLOBAL_NAME_LIST_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(LISTVIEW_KIND,Gadget,&NewGadget,
			SZ_Adjust,		TRUE,
			SZ_AutoWidth,		TRUE,
			SZ_Lines,		10,

			GT_Underscore,		'_',
		TAG_DONE);

		SZ_SetTopEdge(SZ_GetTopEdge() - 2 * InterHeight);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_BBS_NAME_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,

			GTST_MaxChars,	29,
			GTST_EditHook,	&CommandHook,
			GA_Disabled,	TRUE,
			GA_Immediate,	TRUE,
			GT_Underscore,		'_',
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_PHONE_NUMBER_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,

			GTST_MaxChars,	49,
			GTST_EditHook,	&CommandHook,
			GA_Disabled,	TRUE,
			GA_Immediate,	TRUE,
			GT_Underscore,		'_',
		TAG_DONE);


		SZ_SetWidth(ButtonWidth);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_NEW_ENTRY_GAD);
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_Flags		= PLACETEXT_IN;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_AlignBottom,	TRUE,
			SZ_GroupCount,	3,
			SZ_UseLeft,	LeftEdge,

			GT_Underscore,	'_',
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_DIAL_LIST_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,

			GT_Underscore,	'_',
			GA_Disabled,	TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_LOAD_LIST_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,

			GT_Underscore,	'_',
			GA_Disabled,	(Online && ChosenEntry),
		TAG_DONE);


		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_CLONE_ENTRY_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_AlignBottom,	TRUE,
			SZ_GroupCount,	3,
			SZ_UseLeft,	LeftEdge,

			GT_Underscore,	'_',
			GA_Disabled,	TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_CLEAR_LIST_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,

			GT_Underscore,	'_',
			GA_Disabled,	TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_SORT_LIST_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,

			GT_Underscore,	'_',
			GA_Disabled,	TRUE,
		TAG_DONE);


		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_REMOVE_ENTRY_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_AlignBottom,	TRUE,
			SZ_GroupCount,	3,
			SZ_UseLeft,	LeftEdge,

			GT_Underscore,	'_',
			GA_Disabled,	TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_PLAY_NUMBER_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,

			GT_Underscore,	'_',
			GA_Disabled,	TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_SAVE_LIST_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,

			GT_Underscore,	'_',
			GA_Disabled,	TRUE,
		TAG_DONE);


		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_COPY_CONFIG_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_AlignBottom,	TRUE,
			SZ_GroupCount,	3,
			SZ_UseLeft,	LeftEdge,

			GT_Underscore,	'_',
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_USE_ENTRY_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,

			GT_Underscore,	'_',
			GA_Disabled,	TRUE,
		TAG_DONE);

		NewGadget . ng_GadgetText	= LocaleString(MSG_PHONEPANEL_SET_PASSWORT_GAD);
		NewGadget . ng_GadgetID		= Counter;

		GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_AutoWidth,	TRUE,
			SZ_GroupNext,	TRUE,

			GT_Underscore,	'_',
			GA_Disabled,	TRUE,
		TAG_DONE);


		NewGadget . ng_GadgetText	= "";
		NewGadget . ng_GadgetID		= Counter;
		NewGadget . ng_Flags		= 0;

		GadgetArray[Counter++] = Gadget = CreateGadget(LISTVIEW_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_NewColumn,	TRUE,
			SZ_FullHeight,	TRUE,

/*			GA_Disabled,	TRUE,*/
			GTLV_Labels,	&EditList,
		TAG_DONE);
	}

	return(Gadget);
}

BYTE
PhonePanel()
{
	STATIC WORD	 OffsetX = -1,OffsetY = -1;

	struct Window	*PanelWindow;
	struct Gadget	*GadgetList = NULL;
	struct Gadget	*GadgetArray[GAD_EDIT + 1];

	ULONG		 Sec1,Mic1,Sec2,Mic2;
	LONG		 HitItem = -1;

	if(CreateAllGadgets(&GadgetArray[0],&GadgetList,VisualInfo,Screen -> WBorTop + Screen -> Font -> ta_YSize + 1))
	{
		if(PanelWindow = OpenWindowTags(NULL,
			WA_Left,	(Screen -> Width	- SZ_GetWindowWidth())	/ 2,
			WA_Top,		(Screen -> Height	- SZ_GetWindowHeight())	/ 2,
			WA_Width,	SZ_GetWindowWidth(),
			WA_Height,	SZ_GetWindowHeight(),

			WA_Activate,	TRUE,
			WA_DragBar,	TRUE,
			WA_DepthGadget,	TRUE,
			WA_RMBTrap,	TRUE,
			WA_DepthGadget,	TRUE,
			WA_CloseGadget,	TRUE,
			WA_CustomScreen,Screen,

			WA_IDCMP,	IDCMP_GADGETDOWN | IDCMP_ACTIVEWINDOW | IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY | STRINGIDCMP | BUTTONIDCMP | LISTVIEWIDCMP,

			WA_Title,	LocaleString(MSG_PHONEPANEL_PHONEBOOK_TXT),
		TAG_DONE))
		{
			struct IntuiMessage	*Massage;
			ULONG			 Class,Code;
			struct Gadget		*Gadget;
			BYTE			 Terminated = FALSE;

			UBYTE			 DummyBuffer[256],*DummyChar;

			LONG			 Selected = ~0,
						 Count = -1,i;
			struct List		*PhoneList = NULL;
			struct PhoneNode	*TempNode;

			struct FileRequest	*FileRequest;

			PushWindow(PanelWindow);

			AddGList(PanelWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
			RefreshGList(GadgetList,PanelWindow,NULL,(UWORD)-1);
			GT_RefreshWindow(PanelWindow,NULL);

			if(Phonebook && NumPhoneEntries)
			{
				if(PhoneList = CreatePhoneList())
				{
					GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
						GTLV_Labels,PhoneList,
					TAG_DONE);

					if(PhoneList -> lh_Head -> ln_Succ)
					{
						GT_SetGadgetAttrs(GadgetArray[GAD_SAVELIST],PanelWindow,NULL,
							GA_Disabled,	FALSE,
						TAG_DONE);

						GT_SetGadgetAttrs(GadgetArray[GAD_PASSWORD],PanelWindow,NULL,
							GA_Disabled,	FALSE,
						TAG_DONE);

						if(PhoneList -> lh_Head -> ln_Succ -> ln_Succ)
						{
							GT_SetGadgetAttrs(GadgetArray[GAD_SORTLIST],PanelWindow,NULL,
								GA_Disabled,	FALSE,
							TAG_DONE);
						}
					}
				}
			}

			ActiveGadget = NULL;

			FreeDialList();

			for(i = 0 ; i < NumPhoneEntries ; i++)
			{
				if(Phonebook[i] -> Count > Count)
					Count = Phonebook[i] -> Count;
			}

			Count++;

			if(Count)
			{
				if(!Online)
				{
					GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
						GA_Disabled,	FALSE,
					TAG_DONE);
				}

				GT_SetGadgetAttrs(GadgetArray[GAD_CLEARLIST],PanelWindow,NULL,
					GA_Disabled,	FALSE,
				TAG_DONE);
			}

			while(!Terminated)
			{
				WaitPort(PanelWindow -> UserPort);

				while(!Terminated && (Massage = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort)))
				{
					Class	= Massage -> Class;
					Code	= Massage -> Code;
					Gadget	= (struct Gadget *)Massage -> IAddress;

					GT_ReplyIMsg(Massage);

					if(Class == IDCMP_VANILLAKEY)
					{
						switch(Code)
						{
							case ' ':	if(Selected != -1)
									{
										HitItem = -1;

										GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
											GTLV_Labels,	~0,
										TAG_DONE);

										if(Phonebook[Selected] -> Count == -1)
										{
											if(!Count)
											{
												if(!Online)
												{
													GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
														GA_Disabled,	FALSE,
													TAG_DONE);
												}

												GT_SetGadgetAttrs(GadgetArray[GAD_CLEARLIST],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);
											}

											Phonebook[Selected] -> Count = Count++;

											SPrintf(Phonebook[Selected] -> Node -> LocalName,"%3ld - %s",Count,Phonebook[Selected] -> Name);
										}
										else
										{
											RemoveDialEntry(Selected);

											if(!(--Count))
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_CLEARLIST],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);
											}
										}

										GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
											GTLV_Labels,	PhoneList,
										TAG_DONE);
									}

									break;

							default:        KeySelect(GadgetArray,GAD_PASSWORD,Code,PanelWindow,&Gadget,&Class,&Code);
									break;
						}
                                        }

					if(Class == IDCMP_GADGETDOWN)
					{
						if((Gadget -> GadgetType & GTYP_GTYPEMASK) == GTYP_STRGADGET)
							ActiveGadget = Gadget;
					}

					if(Class == IDCMP_ACTIVEWINDOW && ActiveGadget)
						ActivateGadget(ActiveGadget,PanelWindow,NULL);

					if(Class == IDCMP_CLOSEWINDOW)
					{
						FreeDialList();

						Terminated = TRUE;
					}

					if(Class == IDCMP_GADGETUP)
					{
						switch(Gadget -> GadgetID)
						{
							case GAD_NAMELIST:

									if(HitItem != Code)
									{
										HitItem = Code;

										CurrentTime(&Sec1,&Mic1);

										GT_SetGadgetAttrs(GadgetArray[GAD_NAME],PanelWindow,NULL,
											GTST_String,	Phonebook[Code] -> Name,
											GA_Disabled,	FALSE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL,
											GTST_String,	Phonebook[Code] -> Number,
											GA_Disabled,	FALSE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_PLAYNUMBER],PanelWindow,NULL,
											GA_Disabled,	FALSE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_USEIT],PanelWindow,NULL,
											GA_Disabled,	FALSE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_REMOVEENTRY],PanelWindow,NULL,
											GA_Disabled,	(Phonebook[Code] == ChosenEntry && Online),
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_CLONEENTRY],PanelWindow,NULL,
											GA_Disabled,	FALSE,
										TAG_DONE);

/*										GT_SetGadgetAttrs(GadgetArray[GAD_EDIT],PanelWindow,NULL,
											GA_Disabled,	FALSE,
										TAG_DONE);*/

										Selected = Code;
									}
									else
									{
										CurrentTime(&Sec2,&Mic2);

										if(DoubleClick(Sec1,Mic1,Sec2,Mic2))
										{
											HitItem = -1;

											GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
												GTLV_Labels,	~0,
											TAG_DONE);

											if(Phonebook[Selected] -> Count == -1)
											{
												if(!Count)
												{
													if(!Online)
													{
														GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
															GA_Disabled,	FALSE,
														TAG_DONE);
													}

													GT_SetGadgetAttrs(GadgetArray[GAD_CLEARLIST],PanelWindow,NULL,
														GA_Disabled,	FALSE,
													TAG_DONE);
												}

												Phonebook[Selected] -> Count = Count++;

												SPrintf(Phonebook[Selected] -> Node -> LocalName,"%3ld - %s",Count,Phonebook[Selected] -> Name);
											}
											else
											{
												RemoveDialEntry(Selected);

												if(!(--Count))
												{
													GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
														GA_Disabled,	TRUE,
													TAG_DONE);

													GT_SetGadgetAttrs(GadgetArray[GAD_CLEARLIST],PanelWindow,NULL,
														GA_Disabled,	TRUE,
													TAG_DONE);
												}
											}

											GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
												GTLV_Labels,	PhoneList,
											TAG_DONE);
										}

										Sec1 = Sec2;
										Mic1 = Mic2;
									}

									break;

							case GAD_CLEARLIST:

									GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
										GTLV_Labels,	~0,
									TAG_DONE);

									Count = 0;

									for(i = 0 ; i < NumPhoneEntries ; i++)
									{
										SPrintf(Phonebook[i] -> Node -> LocalName,"      %s",Phonebook[i] -> Name);

										Phonebook[i] -> Count = -1;
									}

									GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
										GTLV_Labels,	PhoneList,
									TAG_DONE);

									GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
										GA_Disabled,	TRUE,
									TAG_DONE);

									GT_SetGadgetAttrs(GadgetArray[GAD_CLEARLIST],PanelWindow,NULL,
										GA_Disabled,	TRUE,
									TAG_DONE);

									break;

							case GAD_PLAYNUMBER:

									if(Selected != ~0)
									{
										UBYTE *String = Phonebook[Selected] -> Number;

										ExtractString(String,DummyBuffer,FALSE);

										BlockWindow(PanelWindow);

										if(!ToneDial(DummyBuffer))
											MyEasyRequest(NULL,LocaleString(MSG_GLOBAL_TERM_HAS_A_PROBLEM_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),LocaleString(MSG_GLOBAL_FAILED_TO_ALLOCATE_RESOURCES_FOR_PLAYING_TXT));

										ReleaseWindow(PanelWindow);
									}

									break;

							case GAD_USEIT:

									if(Selected != ~0)
									{
										CopyMem(&Config,&PrivateConfig,sizeof(struct Configuration));

										CopyMem(&Phonebook[Selected] -> Config,&Config,sizeof(struct Configuration));

										ConfigSetup();

										Terminated = TRUE;
									}

									break;

							case GAD_NEWENTRY:

									GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
										GTLV_Labels,	~0,
									TAG_DONE);

									if(PhoneList)
									{
										DeletePhoneList(PhoneList);

										PhoneList = NULL;
									}

									if(NewPhoneEntry())
									{
										if(PhoneList = CreatePhoneList())
										{
											Selected = NumPhoneEntries - 1;

											GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
												GTLV_Labels,	PhoneList,
												GTLV_Selected,	Selected,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_NAME],PanelWindow,NULL,
												GTST_String,	Phonebook[Selected] -> Name,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL,
												GTST_String,	Phonebook[Selected] -> Number,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_PLAYNUMBER],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_USEIT],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_REMOVEENTRY],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_CLONEENTRY],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

/*											GT_SetGadgetAttrs(GadgetArray[GAD_EDIT],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);*/

											if(NumPhoneEntries == 1)
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_SAVELIST],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_PASSWORD],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);
											}

											if(NumPhoneEntries == 2)
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_SORTLIST],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);
											}

											ActivateGadget(GadgetArray[GAD_NAME],PanelWindow,NULL);

											ActiveGadget = GadgetArray[GAD_NAME];
										}
										else
											goto ClearList;
									}
									else
										goto ClearList;

									break;

							case GAD_CLONEENTRY:

									if(Selected != ~0)
									{
										GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
											GTLV_Labels,	~0,
										TAG_DONE);

										if(PhoneList)
										{
											DeletePhoneList(PhoneList);

											PhoneList = NULL;
										}

										if(NewPhoneEntry())
										{
											if(PhoneList = CreatePhoneList())
											{
												LONG Tmp = Selected;

												Selected = NumPhoneEntries - 1;

												CopyMem(Phonebook[Tmp] -> Name,Phonebook[Selected] -> Name,sizeof(struct PhoneEntry) - (sizeof(struct PhoneNode) + sizeof(LONG)));

												SPrintf(Phonebook[Selected] -> Node -> LocalName,"      %s",Phonebook[Selected] -> Name);

												GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
													GTLV_Labels,	PhoneList,
													GTLV_Selected,	Selected,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_NAME],PanelWindow,NULL,
													GTST_String,	Phonebook[Selected] -> Name,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL,
													GTST_String,	Phonebook[Selected] -> Number,
												TAG_DONE);
											}
											else
												goto ClearList;
										}
										else
											goto ClearList;
									}

									break;

							case GAD_REMOVEENTRY:

									if(Selected != ~0)
									{
										if(Phonebook[Selected] == ChosenEntry)
											MyEasyRequest(Window,LocaleString(MSG_PHONEPANEL_PHONE_ENTRY_IN_USE_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT));
										else
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
												GTLV_Labels,~0,
											TAG_DONE);

											if(PhoneList)
											{
												DeletePhoneList(PhoneList);

												PhoneList = NULL;
											}

											if(Phonebook[Selected] -> Count != -1)
											{
												RemoveDialEntry(Selected);

												if(!(--Count))
												{
													GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
														GA_Disabled,	TRUE,
													TAG_DONE);

													GT_SetGadgetAttrs(GadgetArray[GAD_CLEARLIST],PanelWindow,NULL,
														GA_Disabled,	TRUE,
													TAG_DONE);
												}
											}

											RemPhoneEntry(Selected);

											if(NumPhoneEntries > 0)
											{
												if(PhoneList = CreatePhoneList())
												{
													if(Selected == NumPhoneEntries)
														Selected--;

													GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
														GTLV_Labels,	PhoneList,
														GTLV_Selected,	Selected,
													TAG_DONE);

													GT_SetGadgetAttrs(GadgetArray[GAD_NAME],PanelWindow,NULL,
														GTST_String,	Phonebook[Selected] -> Name,
													TAG_DONE);

													GT_SetGadgetAttrs(GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL,
														GTST_String,	Phonebook[Selected] -> Number,
													TAG_DONE);
												}
												else
													goto ClearList;

												if(NumPhoneEntries == 1)
												{
													GT_SetGadgetAttrs(GadgetArray[GAD_SORTLIST],PanelWindow,NULL,
														GA_Disabled,	TRUE,
													TAG_DONE);
												}
											}
											else
											{
ClearList:											GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
													GTLV_Labels,	&EmptyList,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_NAME],PanelWindow,NULL,
													GTST_String,	"",
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL,
													GTST_String,	"",
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_PLAYNUMBER],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_USEIT],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_REMOVEENTRY],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_CLONEENTRY],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_SAVELIST],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_PASSWORD],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_SORTLIST],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

/*												GT_SetGadgetAttrs(GadgetArray[GAD_EDIT],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);*/

												ActiveGadget = NULL;

												Selected	= ~0;
												HitItem		= -1;
											}
										}
									}

									break;

							case GAD_NAME:

									if(Selected != ~0)
									{
										strcpy(Phonebook[Selected] -> Name,GT_STRING(GadgetArray[GAD_NAME]));

										GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
											GTLV_Labels,~0,
										TAG_DONE);

										if(PhoneList)
											DeletePhoneList(PhoneList);

										if(PhoneList = CreatePhoneList())
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
												GTLV_Labels,	PhoneList,
												GTLV_Selected,	Selected,
											TAG_DONE);
										}
									}

									break;

							case GAD_PHONENUMBER:

									if(Selected != ~0)
										strcpy(Phonebook[Selected] -> Number,GT_STRING(GadgetArray[GAD_PHONENUMBER]));

									break;

							case GAD_LOADLIST:

									BlockWindow(PanelWindow);

									if(ChosenEntry)
										MyEasyRequest(Window,LocaleString(MSG_PHONEPANEL_PHONE_ENTRY_IN_USE_LOAD_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT));
									else
									{
										strcpy(DummyBuffer,LastPhone);

										DummyChar = PathPart(DummyBuffer);

										*DummyChar = 0;

										if(FileRequest = GetFile(LocaleString(MSG_PHONEPANEL_LOAD_PHONEBOOK_TXT),DummyBuffer,FilePart(LastPhone),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT)))
										{
											if(PhoneList)
												DeletePhoneList(PhoneList);

											PhoneList = NULL;

											if(!LoadPhonebook(DummyBuffer))
												MyEasyRequest(Window,LocaleString(MSG_PHONEPANEL_COULD_NOT_LOAD_PHONEBOOK_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
											else
												strcpy(LastPhone,DummyBuffer);

											if(PhoneList = CreatePhoneList())
											{
												GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
													GTLV_Labels,	PhoneList,
												TAG_DONE);

												FreeDialList();
											}

											Count = 0;

											GT_SetGadgetAttrs(GadgetArray[GAD_NAME],PanelWindow,NULL,
												GTST_String,	"",
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL,
												GTST_String,	"",
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_PLAYNUMBER],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_USEIT],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_REMOVEENTRY],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_CLONEENTRY],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_CLEARLIST],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

/*											GT_SetGadgetAttrs(GadgetArray[GAD_EDIT],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);*/

											ActiveGadget = NULL;

											if(PhoneList)
											{
												if(!PhoneList -> lh_Head -> ln_Succ)
												{
													GT_SetGadgetAttrs(GadgetArray[GAD_SAVELIST],PanelWindow,NULL,
														GA_Disabled,	TRUE,
													TAG_DONE);

													GT_SetGadgetAttrs(GadgetArray[GAD_PASSWORD],PanelWindow,NULL,
														GA_Disabled,	TRUE,
													TAG_DONE);

													GT_SetGadgetAttrs(GadgetArray[GAD_SORTLIST],PanelWindow,NULL,
														GA_Disabled,	TRUE,
													TAG_DONE);
												}
												else
												{
													GT_SetGadgetAttrs(GadgetArray[GAD_SAVELIST],PanelWindow,NULL,
														GA_Disabled,	FALSE,
													TAG_DONE);

													GT_SetGadgetAttrs(GadgetArray[GAD_PASSWORD],PanelWindow,NULL,
														GA_Disabled,	FALSE,
													TAG_DONE);

													if(PhoneList -> lh_Head -> ln_Succ -> ln_Succ)
													{
														GT_SetGadgetAttrs(GadgetArray[GAD_SORTLIST],PanelWindow,NULL,
															GA_Disabled,	FALSE,
														TAG_DONE);
													}
													else
													{
														GT_SetGadgetAttrs(GadgetArray[GAD_SORTLIST],PanelWindow,NULL,
															GA_Disabled,	TRUE,
														TAG_DONE);
													}
												}
											}

											Selected	= ~0;
											HitItem		= -1;

											FreeAslRequest(FileRequest);
										}
									}

									ReleaseWindow(PanelWindow);

									break;

							case GAD_SORTLIST:

									if(NumPhoneEntries > 1)
									{
										BlockWindow(PanelWindow);

										GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
											GTLV_Labels,	~0,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_NAME],PanelWindow,NULL,
											GTST_String,	"",
											GA_Disabled,	TRUE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL,
											GTST_String,	"",
											GA_Disabled,	TRUE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_PLAYNUMBER],PanelWindow,NULL,
											GA_Disabled,	TRUE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_USEIT],PanelWindow,NULL,
											GA_Disabled,	TRUE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_REMOVEENTRY],PanelWindow,NULL,
											GA_Disabled,	TRUE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_CLONEENTRY],PanelWindow,NULL,
											GA_Disabled,	TRUE,
										TAG_DONE);
/*
										GT_SetGadgetAttrs(GadgetArray[GAD_EDIT],PanelWindow,NULL,
											GA_Disabled,	TRUE,
										TAG_DONE);*/

										ActiveGadget = NULL;

										if(PhoneList)
											DeletePhoneList(PhoneList);

										SortPhoneEntries();

										if(PhoneList = CreatePhoneList())
										{
											GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
												GTLV_Labels,	PhoneList,
												GTLV_Selected,	~0,
											TAG_DONE);
										}

										Selected	= ~0;
										HitItem		= -1;

										ReleaseWindow(PanelWindow);
									}

									break;

							case GAD_SAVELIST:

									if(NumPhoneEntries)
									{
										strcpy(DummyBuffer,LastPhone);

										DummyChar = PathPart(DummyBuffer);

										*DummyChar = 0;

										BlockWindow(PanelWindow);

										if(FileRequest = GetFile(LocaleString(MSG_PHONEPANEL_SAVE_PHONEBOOK_TXT),DummyBuffer,FilePart(LastPhone),DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT)))
										{
											if(!SavePhonebook(DummyBuffer))
												MyEasyRequest(Window,LocaleString(MSG_PHONEPANEL_COULD_NOT_CREATE_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
											else
												strcpy(LastPhone,DummyBuffer);

											FreeAslRequest(FileRequest);
										}

										ReleaseWindow(PanelWindow);
									}

									break;

							case GAD_COPYCONFIG:

									BlockWindow(PanelWindow);

									if(Selected == ~0)
										CopyPanel(NULL);
									else
										CopyPanel(&Phonebook[Selected] -> Config);

									ReleaseWindow(PanelWindow);
									break;

							case GAD_PASSWORD:

									BlockWindow(PanelWindow);

									{
										struct Gadget *OldActiveGadget = ActiveGadget;

										memset(SharedBuffer,0,20);

										PhonePasswordUsed = FALSE;

										if(xpr_gets(LocaleString(MSG_PHONEPANEL_PLEASE_ENTER_PASSWORD_TXT),SharedBuffer))
										{
											if(SharedBuffer[0])
											{
												SharedBuffer[20] = 0;

												Encrypt(SharedBuffer,20,PhonePassword,SharedBuffer,strlen(SharedBuffer),TRUE);

												PhonePasswordUsed = TRUE;
											}
										}

										ActiveGadget = OldActiveGadget;
									}

									ReleaseWindow(PanelWindow);
									break;

							case GAD_EDIT:

									if(Selected != ~0)
									{
										BlockWindow(PanelWindow);

										switch(Code)
										{
											case EDIT_SERIAL:	SerialPanel(&Phonebook[Selected] -> Config);
														break;

											case EDIT_MODEM:	ModemPanel(&Phonebook[Selected] -> Config);
														break;

											case EDIT_TRANSFER:	strcpy(DummyBuffer,LastXprLibrary);

														if(SelectProtocol(Phonebook[Selected] -> Config . Protocol,PanelWindow))
															strcpy(Phonebook[Selected] -> Config . Protocol,LastXprLibrary);

														strcpy(LastXprLibrary,DummyBuffer);
														break;

											case EDIT_SCREEN:	ScreenPanel(&Phonebook[Selected] -> Config);
														break;

											case EDIT_TERMINAL:	TerminalPanel(&Phonebook[Selected] -> Config);
														break;

											case EDIT_COMMANDS:	CommandPanel(&Phonebook[Selected] -> Config);
														break;

											case EDIT_MISC:		MiscPanel(&Phonebook[Selected] -> Config);
														break;

											case EDIT_PATHS:	PathPanel(&Phonebook[Selected] -> Config);
														break;

											case EDIT_UNITS:	if(Phonebook[Selected] == ChosenEntry)
															MyEasyRequest(Window,LocaleString(MSG_PHONEPANEL_PHONE_ENTRY_IN_USE_EDIT_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
														else
														{
															GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
																GTLV_Labels,	~0,
															TAG_DONE);

															RatePanel(PhoneList,Phonebook[Selected]);

															GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
																GTLV_Labels,	PhoneList,
																GTLV_Selected,	Selected,
															TAG_DONE);
														}

														break;

											case EDIT_KEYMACROS:	strcpy(DummyBuffer,Phonebook[Selected] -> Config . MacroFile);

														DummyChar = PathPart(DummyBuffer);

														*DummyChar = 0;

														if(FileRequest = GetFile(LocaleString(MSG_PHONEPANEL_SELECT_KEYBOARD_MACROS_TXT),DummyBuffer,FilePart(Phonebook[Selected] -> Config . MacroFile),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SELECT_TXT)))
														{
															strcpy(Phonebook[Selected] -> Config . MacroFile,DummyBuffer);

															FreeAslRequest(FileRequest);
														}

														break;

											case EDIT_FASTMACROS:	strcpy(DummyBuffer,Phonebook[Selected] -> Config . FastMacroFile);

														DummyChar = PathPart(DummyBuffer);

														*DummyChar = 0;

														if(FileRequest = GetFile(LocaleString(MSG_PHONEPANEL_SELECT_FAST_MACROS_TXT),DummyBuffer,FilePart(Phonebook[Selected] -> Config . FastMacroFile),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SELECT_TXT)))
														{
															strcpy(Phonebook[Selected] -> Config . FastMacroFile,DummyBuffer);

															FreeAslRequest(FileRequest);
														}

														break;

											case EDIT_PASSWORD:	PasswordUserPanel(Phonebook[Selected]);

														break;
										}

										ActiveGadget = GadgetArray[GAD_NAME];

										ReleaseWindow(PanelWindow);
									}
									else
									{
										if(Code == EDIT_COPY)
										{
											BlockWindow(PanelWindow);

											CopyPanel(NULL);

											if(!GT_DISABLED(GadgetArray[GAD_NAME]))
												ActiveGadget = GadgetArray[GAD_NAME];
											else
												ActiveGadget = NULL;

											ReleaseWindow(PanelWindow);
										}
									}

									break;

							case GAD_DIALLIST:

									if(Count)
									{
										FreeDialList();

										TempNode = (struct PhoneNode *)PhoneList -> lh_Head;

										while(TempNode -> VanillaNode . ln_Succ)
										{
											if(TempNode -> Entry -> Count != -1)
												SortToList(TempNode);

											TempNode = (struct PhoneNode *)TempNode -> VanillaNode . ln_Succ;
										}

										Terminated = TRUE;
									}

									break;

							default:	break;
						}
					}
				}
			}

			DeleteTone();

			if(PhoneList)
				DeletePhoneList(PhoneList);

			RemoveGList(PanelWindow,GadgetList,(UWORD)-1);

			PopWindow();

			OffsetX = PanelWindow -> LeftEdge;
			OffsetY = PanelWindow -> TopEdge;

			CloseWindow(PanelWindow);
		}
	}

	FreeGadgets(GadgetList);

	if(DialList)
		return(TRUE);
	else
		return(FALSE);
}
