/*
**	PhonePanel.c
**
**	The phonebook and support routines
**
**	Copyright © 1990-1994 by Olaf `Olsen' Barthel
**		All Rights Reserved
*/

#include "termGlobal.h"

	/* Gadget IDs. */

enum	{	GAD_NAMELIST,		GAD_EDIT,
		GAD_NAME,		GAD_COMMENT,		GAD_PHONENUMBER,	GAD_QUICKMENU,
		GAD_NEWENTRY,		GAD_DIALLIST,		GAD_LOADLIST,		GAD_COPYCONFIG,
		GAD_CLONEENTRY,		GAD_CLEARLIST,		GAD_SORTLIST,		GAD_PASSWORD,
		GAD_REMOVEENTRY,	GAD_USEIT,		GAD_SAVELIST,		GAD_PRINT,
		GAD_TAG,		GAD_UNTAG,		GAD_TAG_ALL,		GAD_TOGGLE_ALL,
		GAD_CANCEL
	};

	/* Editing IDs. */

enum	{	EDIT_SERIAL,		EDIT_MODEM,		EDIT_SCREEN,		EDIT_TERMINAL,
		EDIT_EMULATION,		EDIT_CLIPBOARD,		EDIT_CAPTURE,		EDIT_COMMANDS,
		EDIT_MISC,		EDIT_PATHS,		EDIT_TRANSFER,		EDIT_TRANSLATION,
		EDIT_KEYMACROS,		EDIT_CURSORKEYS,
		EDIT_FASTMACROS,	EDIT_PASSWORD,		EDIT_RATES };

	/* What action is to follow clicking into the listview. */

enum	{	CLICK_NONE,CLICK_SELECT,CLICK_TOGGLE,CLICK_DIAL };

	/* Some hints. */

STATIC LONG LastSelected,LastNumPhoneEntries;

	/* ListViewRender():
	 *
	 *	This callback routine is responsible for rendering
	 *	the single listview entries.
	 */

STATIC ULONG __saveds __asm
ListViewRender(register __a0 struct Hook *Hook,register __a1 struct LVDrawMsg *Msg,register __a2 struct PhoneNode *Node)
{
		/* We only know how to redraw lines. */

	if(Msg -> lvdm_MethodID == LV_DRAW)
	{
		struct RastPort	*RPort	= Msg -> lvdm_RastPort;
		LONG		 Count	= Node -> Entry -> Count + 1,
				 Left	= Msg -> lvdm_Bounds . MinX,
				 Top	= Msg -> lvdm_Bounds . MinY,
				 Width	= Msg -> lvdm_Bounds . MaxX - Msg -> lvdm_Bounds . MinX + 1,
				 Height	= Msg -> lvdm_Bounds . MaxY - Msg -> lvdm_Bounds . MinY + 1,
				 FgPen,BgPen,
				 Template,
				 Len,LabelLen;
		UBYTE		 String[80],Num[8];

			/* Determine the rendering pens. */

		switch(Msg -> lvdm_State)
		{
			case LVR_SELECTEDDISABLED:
			case LVR_NORMALDISABLED:
			case LVR_NORMAL:

				FgPen = Msg -> lvdm_DrawInfo -> dri_Pens[TEXTPEN];
				BgPen = Msg -> lvdm_DrawInfo -> dri_Pens[BACKGROUNDPEN];
				break;

			case LVR_SELECTED:

				FgPen = Msg -> lvdm_DrawInfo -> dri_Pens[FILLTEXTPEN];
				BgPen = Msg -> lvdm_DrawInfo -> dri_Pens[FILLPEN];
				break;
		}

		if(Count > 0)
		{
			if(Msg -> lvdm_DrawInfo -> dri_Pens[HIGHLIGHTTEXTPEN] != BgPen)
				FgPen = Msg -> lvdm_DrawInfo -> dri_Pens[HIGHLIGHTTEXTPEN];
		}

		SetAPen(RPort,BgPen);
		RectFill(RPort,Left,Top,Left + 1,Top + Height - 1);

		Left	+= 2;
		Width	-= 2;

			/* Determine maximum index text length. */

		Template = 3 * ((ULONG)Hook -> h_Data) + TextLength(RPort," - ",3);

			/* Get the vanilla name. */

		strcpy(String,&Node -> VanillaNode . ln_Name[6]);

			/* Set the rendering pens. */

		SetDrMd(RPort,JAM2);
		SetBPen(RPort,BgPen);

			/* Has this entry been selected? */

		if(Count > 0)
		{
			LONG Delta;

				/* Set up the header. */

			SPrintf(Num,"%3ld - ",Count);

				/* Determine header length. */

			Len = TextLength(RPort,Num,6);

				/* Fill the space to precede the header. */

			if((Delta = Template - Len) > 0)
			{
				SetAPen(RPort,BgPen);
				RectFill(RPort,Left,Top,Left + Delta - 1,Top + Height - 1);
			}

				/* Render the header, right-justified. */

			SetAPen(RPort,FgPen);

			Move(RPort,Left + Delta,Top + RPort -> Font -> tf_Baseline);
			Text(RPort,Num,6);
		}
		else
		{
				/* Fill the blank space to precede the vanilla name. */

			SetAPen(RPort,BgPen);
			RectFill(RPort,Left,Top,Left + Template - 1,Top + Height - 1);
			SetAPen(RPort,FgPen);
		}

			/* Adjust width and area left edge. */

		Left	+= Template;
		Width	-= Template;

			/* Determine length of vanilla name. */

		LabelLen = strlen(String);

			/* Try to make it fit. */

		while(LabelLen > 0 && (Len = TextLength(RPort,String,LabelLen)) > Width)
			LabelLen--;

			/* Print the vanilla name if possible. */

		if(LabelLen)
		{
			Move(RPort,Left,Top + RPort -> Font -> tf_Baseline);
			Text(RPort,String,LabelLen);

			Left	+= Len;
			Width	-= Len;
		}

			/* Fill the area to follow the vanilla name. */

		if(Width > 0)
		{
			SetAPen(RPort,BgPen);
			RectFill(RPort,Left,Top,Left + Width - 1,Top + Height - 1);
		}

			/* If the item happens to be disabled, draw the cross-hatch
			 * pattern across it.
			 */

		if(Msg -> lvdm_State == LVR_SELECTEDDISABLED || Msg -> lvdm_State == LVR_NORMALDISABLED)
		{
			SetDrMd(RPort,JAM1);

			SetAPen(RPort,Msg -> lvdm_DrawInfo -> dri_Pens[BLOCKPEN]);

			SetAfPt(RPort,(UWORD *)&Ghosting,1);

			RectFill(RPort,Msg -> lvdm_Bounds . MinX,Msg -> lvdm_Bounds . MinY,Msg -> lvdm_Bounds . MaxX,Msg -> lvdm_Bounds . MaxY);

			SetAfPt(RPort,NULL,0);
		}

		return(LVCB_OK);
	}
	else
		return(LVCB_UNKNOWN);
}

STATIC ULONG __saveds __asm
EditViewRender(register __a0 struct Hook *Hook,register __a1 struct LVDrawMsg *Msg,register __a2 struct Node *Node)
{
		/* We only know how to redraw lines. */

	if(Msg -> lvdm_MethodID == LV_DRAW)
	{
		struct RastPort	*RPort	= Msg -> lvdm_RastPort;
		LONG		 Left	= Msg -> lvdm_Bounds . MinX,
				 Top	= Msg -> lvdm_Bounds . MinY,
				 Width	= Msg -> lvdm_Bounds . MaxX - Msg -> lvdm_Bounds . MinX + 1,
				 Height	= Msg -> lvdm_Bounds . MaxY - Msg -> lvdm_Bounds . MinY + 1,
				 FgPen,BgPen,
				 Template,
				 Len,LabelLen;
		STRPTR		 String = Node -> ln_Name;

			/* Determine the rendering pens. */

		switch(Msg -> lvdm_State)
		{
			case LVR_SELECTEDDISABLED:
			case LVR_NORMALDISABLED:
			case LVR_NORMAL:

				FgPen = Msg -> lvdm_DrawInfo -> dri_Pens[TEXTPEN];
				BgPen = Msg -> lvdm_DrawInfo -> dri_Pens[BACKGROUNDPEN];
				break;

			case LVR_SELECTED:

				FgPen = Msg -> lvdm_DrawInfo -> dri_Pens[FILLTEXTPEN];
				BgPen = Msg -> lvdm_DrawInfo -> dri_Pens[FILLPEN];
				break;
		}

		SetAPen(RPort,BgPen);
		RectFill(RPort,Left,Top,Left + 1,Top + Height - 1);

		Left	+= 2;
		Width	-= 2;

			/* Determine maximum index text length. */

		Template = TextLength(RPort,"*",1);

			/* Set the rendering pens. */

		SetDrMd(RPort,JAM2);
		SetBPen(RPort,BgPen);

			/* Has this entry been selected? */

		if(*String == '*')
		{
				/* Render the header, right-justified. */

			SetAPen(RPort,FgPen);

			Move(RPort,Left,Top + RPort -> Font -> tf_Baseline);
			Text(RPort,"*",1);
		}
		else
		{
				/* Fill the blank space to precede the vanilla name. */

			SetAPen(RPort,BgPen);
			RectFill(RPort,Left,Top,Left + Template - 1,Top + Height - 1);
			SetAPen(RPort,FgPen);
		}

			/* Adjust width and area left edge. */

		Left	+= Template;
		Width	-= Template;

		String++;

			/* Determine length of vanilla name. */

		LabelLen = strlen(String);

			/* Try to make it fit. */

		while(LabelLen > 0 && (Len = TextLength(RPort,String,LabelLen)) > Width)
			LabelLen--;

			/* Print the vanilla name if possible. */

		if(LabelLen)
		{
			Move(RPort,Left,Top + RPort -> Font -> tf_Baseline);
			Text(RPort,String,LabelLen);

			Left	+= Len;
			Width	-= Len;
		}

			/* Fill the area to follow the vanilla name. */

		if(Width > 0)
		{
			SetAPen(RPort,BgPen);
			RectFill(RPort,Left,Top,Left + Width - 1,Top + Height - 1);
		}

			/* If the item happens to be disabled, draw the cross-hatch
			 * pattern across it.
			 */

		if(Msg -> lvdm_State == LVR_SELECTEDDISABLED || Msg -> lvdm_State == LVR_NORMALDISABLED)
		{
			SetDrMd(RPort,JAM1);

			SetAPen(RPort,Msg -> lvdm_DrawInfo -> dri_Pens[BLOCKPEN]);

			SetAfPt(RPort,(UWORD *)&Ghosting,1);

			RectFill(RPort,Msg -> lvdm_Bounds . MinX,Msg -> lvdm_Bounds . MinY,Msg -> lvdm_Bounds . MaxX,Msg -> lvdm_Bounds . MaxY);

			SetAfPt(RPort,NULL,0);
		}

		return(LVCB_OK);
	}
	else
		return(LVCB_UNKNOWN);
}

STATIC VOID __regargs
UpdateEditList(struct Configuration *Config)
{
	ULONG	*Array;
	WORD	 i;

	Array = (ULONG *)Config;

	for(i = 0 ; i < 10 ; i++)
	{
		if(Array[i])
			EditLabels[i][0] = (UBYTE)'*';
		else
			EditLabels[i][0] = ' ';
	}

	if(Config -> TransferConfig)
		EditLabels[10][0] = (UBYTE)'*';
	else
		EditLabels[10][0] = ' ';

	EditLabels[15][0] = (UBYTE)'*';
	EditLabels[16][0] = (UBYTE)'*';

	if(Config -> FileConfig)
	{
		EditLabels[11][0] = (UBYTE)'*';
		EditLabels[12][0] = (UBYTE)'*';
		EditLabels[13][0] = (UBYTE)'*';
		EditLabels[14][0] = (UBYTE)'*';
	}
	else
	{
		EditLabels[11][0] = ' ';
		EditLabels[12][0] = ' ';
		EditLabels[13][0] = ' ';
		EditLabels[14][0] = ' ';
	}
}

STATIC BYTE __regargs
EditConfig(struct Configuration *Config,UWORD Type,struct Window *Window)
{
	STATIC LONG TypeMappings[15][2] =
	{
		EDIT_SERIAL,		PREF_SERIAL,
		EDIT_MODEM,		PREF_MODEM,
		EDIT_SCREEN,		PREF_SCREEN,
		EDIT_TERMINAL,		PREF_TERMINAL,
		EDIT_EMULATION,		PREF_EMULATION,
		EDIT_CLIPBOARD,		PREF_CLIP,
		EDIT_CAPTURE,		PREF_CAPTURE,
		EDIT_COMMANDS,		PREF_COMMAND,
		EDIT_MISC,		PREF_MISC,
		EDIT_PATHS,		PREF_PATH,
		EDIT_TRANSFER,		PREF_TRANSFER,
		EDIT_TRANSLATION,	PREF_FILE,
		EDIT_KEYMACROS,		PREF_FILE,
		EDIT_CURSORKEYS,	PREF_FILE,
		EDIT_FASTMACROS,	PREF_FILE
	};

	struct FileRequester	*FileRequest;
	UBYTE			 DummyBuffer[MAX_FILENAME_LENGTH],
				*DummyChar;
	BYTE			 Changed	= FALSE,
				 Default	= FALSE;
	LONG			 PrefType;
	WORD			 i;
	APTR			 Data;

	for(i = 0 ; i < 15 ; i++)
	{
		if(TypeMappings[i][0] == Type)
		{
			PrefType = TypeMappings[i][1];

			break;
		}
	}

	Data = GetConfigEntry(Config,PrefType);

	if(CreateConfigEntry(Config,PrefType))
	{
		if(!Data)
			ResetConfigEntry(Config,PrefType,FALSE);

		switch(Type)
		{
			case EDIT_SERIAL:

				Changed = SerialPanel(Config,&Default);
				break;

			case EDIT_MODEM:

				Changed = ModemPanel(Config,&Default);
				break;

			case EDIT_SCREEN:

				Changed = ScreenPanel(Config,&Default);
				break;

			case EDIT_TERMINAL:

				Changed = TerminalPanel(Config,&Default);
				break;

			case EDIT_EMULATION:

				Changed = EmulationPanel(Config,&Default);
				break;

			case EDIT_CLIPBOARD:

				Changed = ClipPanel(Config,&Default);
				break;

			case EDIT_CAPTURE:

				Changed = CapturePanel(Config,&Default);
				break;

			case EDIT_COMMANDS:

				Changed = CommandPanel(Config,&Default);
				break;

			case EDIT_MISC:

				Changed = MiscPanel(Config,&Default);
				break;

			case EDIT_PATHS:

				Changed = PathPanel(Config,&Default);
				break;

			case EDIT_TRANSFER:

				Changed = LibPanel(Config,&Default);
				break;

			case EDIT_TRANSLATION:

				SplitFileName(Config -> FileConfig -> TranslationFileName,&DummyChar,DummyBuffer);

				if(FileRequest = GetFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_TRANSLATION_TXT),DummyBuffer,DummyChar,DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SELECT_TXT),TRUE))
				{
					strcpy(Config -> FileConfig -> TranslationFileName,DummyBuffer);

					FreeAslRequest(FileRequest);

					Changed = TRUE;
				}

				break;

			case EDIT_KEYMACROS:

				SplitFileName(Config -> FileConfig -> MacroFileName,&DummyChar,DummyBuffer);

				if(FileRequest = GetFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_KEYBOARD_MACROS_TXT),DummyBuffer,DummyChar,DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SELECT_TXT),TRUE))
				{
					strcpy(Config -> FileConfig -> MacroFileName,DummyBuffer);

					FreeAslRequest(FileRequest);

					Changed = TRUE;
				}

				break;

			case EDIT_CURSORKEYS:

				SplitFileName(Config -> FileConfig -> CursorFileName,&DummyChar,DummyBuffer);

				if(FileRequest = GetFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_CURSOR_KEYS_TXT),DummyBuffer,DummyChar,DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SELECT_TXT),TRUE))
				{
					strcpy(Config -> FileConfig -> CursorFileName,DummyBuffer);

					FreeAslRequest(FileRequest);

					Changed = TRUE;
				}

				break;

			case EDIT_FASTMACROS:

				SplitFileName(Config -> FileConfig -> FastMacroFileName,&DummyChar,DummyBuffer);

				if(FileRequest = GetFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_FAST_MACROS_TXT),DummyBuffer,DummyChar,DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SELECT_TXT),TRUE))
				{
					strcpy(Config -> FileConfig -> FastMacroFileName,DummyBuffer);

					FreeAslRequest(FileRequest);

					Changed = TRUE;
				}

				break;
		}

		if((!Changed && !Data) || Default)
		{
			DeleteConfigEntry(Config,PrefType);

			if(Default)
				Changed = TRUE;
		}
	}
	else
		DisplayBeep(Window -> WScreen);

	return(Changed);
}

STATIC VOID __regargs
SetPanelState(struct LayoutHandle *Handle,struct List *PhoneList,LONG Count,LONG Selected,BOOLEAN Released)
{
	if(NumPhoneEntries)
	{
		LT_SetAttributes(Handle,GAD_SAVELIST,
			GA_Disabled,	FALSE,
		TAG_DONE);

		LT_SetAttributes(Handle,GAD_PRINT,
			GA_Disabled,	FALSE,
		TAG_DONE);

		LT_SetAttributes(Handle,GAD_SORTLIST,
			GA_Disabled,	NumPhoneEntries < 2,
		TAG_DONE);

		LT_SetAttributes(Handle,GAD_PASSWORD,
			GA_Disabled,	FALSE,
		TAG_DONE);

		LT_SetAttributes(Handle,GAD_CLONEENTRY,
			GA_Disabled,	Selected == -1,
		TAG_DONE);

		LT_SetAttributes(Handle,GAD_REMOVEENTRY,
			GA_Disabled,	Selected == -1,
		TAG_DONE);

		LT_SetAttributes(Handle,GAD_COPYCONFIG,
			GA_Disabled,	FALSE,
		TAG_DONE);

		LT_SetAttributes(Handle,GAD_USEIT,
			GA_Disabled,	Selected == -1,
		TAG_DONE);

		if(Selected == -1)
		{
			LT_SetAttributes(Handle,GAD_EDIT,
				GA_Disabled,	TRUE,
			TAG_DONE);

			if(Selected != LastSelected)
			{
				LT_SetAttributes(Handle,GAD_NAMELIST,
					GA_Disabled,	FALSE,
					GTLV_Selected,	~0,
				TAG_DONE);
	
				LT_SetAttributes(Handle,GAD_NAME,
					GTST_String,	"",
					GA_Disabled,	TRUE,
				TAG_DONE);
	
				LT_SetAttributes(Handle,GAD_COMMENT,
					GTST_String,	"",
					GA_Disabled,	TRUE,
				TAG_DONE);
	
				LT_SetAttributes(Handle,GAD_PHONENUMBER,
					GTST_String,	"",
					GA_Disabled,	TRUE,
				TAG_DONE);
	
				LT_SetAttributes(Handle,GAD_QUICKMENU,
					GTCB_Checked,	FALSE,
					GA_Disabled,	TRUE,
				TAG_DONE);
			}

			LT_SetAttributes(Handle,GAD_TAG,
				GA_Disabled,	TRUE,
			TAG_DONE);

			LT_SetAttributes(Handle,GAD_UNTAG,
				GA_Disabled,	TRUE,
			TAG_DONE);

			LT_SetAttributes(Handle,GAD_DIALLIST,
				GA_Disabled,	Online || !Count,
			TAG_DONE);
		}
		else
		{
			LT_SetAttributes(Handle,GAD_NAMELIST,
				GA_Disabled,	FALSE,
				GTLV_Labels,	PhoneList,
			TAG_DONE);

			if(Selected != LastSelected)
			{
				LT_SetAttributes(Handle,GAD_NAME,
					GTST_String,	Phonebook[Selected] -> Header -> Name,
					GA_Disabled,	FALSE,
				TAG_DONE);
	
				LT_SetAttributes(Handle,GAD_COMMENT,
					GTST_String,	Phonebook[Selected] -> Header -> Comment,
					GA_Disabled,	FALSE,
				TAG_DONE);
	
				LT_SetAttributes(Handle,GAD_PHONENUMBER,
					GTST_String,	Phonebook[Selected] -> Header -> Number,
					GA_Disabled,	FALSE,
				TAG_DONE);
	
				LT_SetAttributes(Handle,GAD_QUICKMENU,
					GTCB_Checked,	Phonebook[Selected] -> Header -> QuickMenu,
					GA_Disabled,	FALSE,
				TAG_DONE);

				if(Released)
				{
					LT_SetAttributes(Handle,GAD_EDIT,
						GTLV_Labels,	~0,
					TAG_DONE);

					UpdateEditList(Phonebook[Selected] -> Config);

					LT_SetAttributes(Handle,GAD_EDIT,
						GTLV_Labels,	EditList,
						GA_Disabled,	FALSE,
					TAG_DONE);
				}
			}
			else
			{
				LT_SetAttributes(Handle,GAD_EDIT,
					GA_Disabled,	FALSE,
				TAG_DONE);
			}

			LT_SetAttributes(Handle,GAD_TAG,
				GA_Disabled,	Phonebook[Selected] -> Count != -1,
			TAG_DONE);

			LT_SetAttributes(Handle,GAD_UNTAG,
				GA_Disabled,	Phonebook[Selected] -> Count == -1,
			TAG_DONE);

			LT_SetAttributes(Handle,GAD_DIALLIST,
				GA_Disabled,	Online || !Phonebook[Selected] -> Header -> Number[0],
			TAG_DONE);
		}

		LT_SetAttributes(Handle,GAD_TAG_ALL,
			GA_Disabled,	Count == NumPhoneEntries,
		TAG_DONE);

		LT_SetAttributes(Handle,GAD_TOGGLE_ALL,
			GA_Disabled,	FALSE,
		TAG_DONE);

		LT_SetAttributes(Handle,GAD_CLEARLIST,
			GA_Disabled,	!Count,
		TAG_DONE);
	}
	else
	{
		LONG i;

		for(i = GAD_NAMELIST ; i < GAD_CANCEL ; i++)
		{
			LT_SetAttributes(Handle,i,
				GA_Disabled,	i != GAD_LOADLIST && i != GAD_NEWENTRY,
			TAG_DONE);
		}
	}

	LastSelected = Selected;
}

BYTE
PhonePanel()
{
	struct LayoutHandle	*Handle;
	struct PhoneNode	*TempNode;
	struct List		*PhoneList;
	LONG			 Count;
	BYTE			 DialTheList = FALSE;

	LastSelected = LastNumPhoneEntries = -17;

	if(Phonebook && NumPhoneEntries)
	{
		LONG i;

		if(!(PhoneList = CreatePhoneList()))
		{
			DisplayBeep(Window -> WScreen);

			return(FALSE);
		}

		FreeDialList(TRUE);

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

		Count++;
	}
	else
	{
		PhoneList	= NULL;
		Count		= 0;
	}

	if(Handle = LT_CreateHandleTags(Window -> WScreen,
		LH_LocaleHook,		&LocaleHook,
/*		LH_AutoActivate,	TRUE,*/
	TAG_DONE))
	{
		STATIC struct Hook ListViewHook =
		{
			{NULL},
			(HOOKFUNC)ListViewRender
		};

		STATIC struct Hook EditViewHook =
		{
			{NULL},
			(HOOKFUNC)EditViewRender
		};

		STATIC LONG LabelIDTable[] =
		{
			MSG_PHONEPANEL_LOAD_LIST_GAD,
			MSG_PHONEPANEL_SAVE_LIST_GAD,
			MSG_PHONEPANEL_PRINT_GAD,
			MSG_PHONEPANEL_SORT_LIST_GAD,
			MSG_PHONEPANEL_SET_PASSWORT_GAD,
			MSG_PHONEPANEL_NEW_ENTRY_GAD,
			MSG_PHONEPANEL_CLONE_ENTRY_GAD,
			MSG_PHONEPANEL_REMOVE_ENTRY_GAD,
			MSG_PHONEPANEL_COPY_CONFIG_GAD,
			MSG_PHONEPANEL_USE_ENTRY_GAD,
			MSG_PHONEPANEL_TAG_GAD,
			MSG_PHONEPANEL_UNTAG_GAD,
			MSG_PHONEPANEL_TAG_ALL_GAD,
			MSG_PHONEPANEL_TOGGLE_ALL_GAD,
			MSG_PHONEPANEL_UNTAG_ALL_GAD
		};

		struct IBox	 Bounds;
		struct Window	*PhoneWindow;
		LONG		 i,Max,Size,MaxPen,MaxChars;
		UBYTE		 SmallString[2];

		for(i = MaxChars = 0 ; i < NumElements(LabelIDTable) ; i++)
		{
			if((Max = LT_LabelChars(Handle,LocaleString(LabelIDTable[i]))) > MaxChars)
				MaxChars = Max;
		}

		MaxPen = MAX(Handle -> DrawInfo -> dri_Pens[BLOCKPEN],MAX(Handle -> DrawInfo -> dri_Pens[TEXTPEN],MAX(Handle -> DrawInfo -> dri_Pens[BACKGROUNDPEN],MAX(Handle -> DrawInfo -> dri_Pens[FILLTEXTPEN],MAX(Handle -> DrawInfo -> dri_Pens[FILLPEN],Handle -> DrawInfo -> dri_Pens[HIGHLIGHTTEXTPEN])))));

		SmallString[1] = 0;
		Max = 0;

		for(i = MSG_PHONEPANEL_SERIAL_TXT ; i <= MSG_PHONEPANEL_RATES_TXT ; i++)
			EditLabels[i - MSG_PHONEPANEL_SERIAL_TXT][0] = ' ';

		for(i = '0' ; i <= '9' ; i++)
		{
			SmallString[0] = i;

			if((Size = LT_LabelWidth(Handle,SmallString)) > Max)
				Max = Size;
		}

		ListViewHook . h_Data = (APTR)Max;

		LT_New(Handle,
			LA_Type,	VERTICAL_KIND,
		TAG_DONE);
		{
			LT_New(Handle,
				LA_Type,	VERTICAL_KIND,
/*				LA_LabelID,	MSG_V36_0132,*/
			TAG_DONE);
			{
				LT_New(Handle,
					LA_Type,	HORIZONTAL_KIND,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	LISTVIEW_KIND,
						LA_LabelID,	MSG_GLOBAL_NAME_LIST_GAD,
						LA_ID,		GAD_NAMELIST,
						LA_Chars,	40,
						LA_Lines,	4,
						GTLV_CallBack,	&ListViewHook,
						GTLV_MaxPen,	MaxPen,
						LALV_CursorKey,	TRUE,
						LALV_MaxGrowX,	50,
						LALV_MaxGrowY,	20,

						Kick30 ? LALV_Link : TAG_IGNORE, NIL_LINK,

						PhoneList ? GTLV_Labels : TAG_IGNORE, PhoneList,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	LISTVIEW_KIND,
						LA_LabelID,	MSG_PHONEPANEL_SETTINGS_TXT,
						LA_Lines,	4,
						LA_ID,		GAD_EDIT,
						LA_NoKey,	TRUE,
						GA_Disabled,	TRUE,
						GTLV_Labels,	EditList,
						GTLV_CallBack,	&EditViewHook,
					TAG_DONE);

					LT_EndGroup(Handle);
				}

				LT_New(Handle,
					LA_Type,	HORIZONTAL_KIND,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	VERTICAL_KIND,
					TAG_DONE);
					{
						LT_New(Handle,
							LA_Type,		STRING_KIND,
							LA_LabelID,		MSG_PHONEPANEL_BBS_NAME_GAD,
							LA_ID,			GAD_NAME,
							GTST_MaxChars,		39,
							LA_Chars,		40,
							GA_Disabled,		TRUE,
						TAG_DONE);
	
						LT_New(Handle,
							LA_Type,		STRING_KIND,
							LA_LabelID,		MSG_PHONEPANEL_COMMENT_GAD,
							LA_ID,			GAD_COMMENT,
							GTST_MaxChars,		99,
							GA_Disabled,		TRUE,
						TAG_DONE);
	
						LT_New(Handle,
							LA_Type,		STRING_KIND,
							LA_LabelID,		MSG_PHONEPANEL_PHONE_NUMBER_GAD,
							LA_ID,			GAD_PHONENUMBER,
							GTST_MaxChars,		99,
							LAST_LastGadget,	TRUE,
							GA_Disabled,		TRUE,
						TAG_DONE);
	
						LT_EndGroup(Handle);
					}
	
					LT_New(Handle,
						LA_Type,	VERTICAL_KIND,
					TAG_DONE);
					{
						LT_New(Handle,
							LA_Type,	CHECKBOX_KIND,
							LA_LabelID,	MSG_PHONEPANEL_QUICK_MENU_GAD,
							LA_ID,		GAD_QUICKMENU,
							GA_Disabled,	TRUE,
						TAG_DONE);
	
						LT_EndGroup(Handle);
					}

					LT_EndGroup(Handle);
				}

				LT_EndGroup(Handle);
			}

			LT_New(Handle,
				LA_Type,VERTICAL_KIND,
			TAG_DONE);
			{
				LT_New(Handle,
					LA_Type,	XBAR_KIND,
					LAXB_FullSize,	TRUE,
				TAG_DONE);

				LT_EndGroup(Handle);
			}

			LT_New(Handle,
				LA_Type,	VERTICAL_KIND,
			TAG_DONE);
			{
				LT_New(Handle,
					LA_Type,	HORIZONTAL_KIND,
					LAGR_SameSize,	TRUE,
					LAGR_Spread,	TRUE,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_NEW_ENTRY_GAD,
						LA_ID,		GAD_NEWENTRY,
						LA_Chars,	MaxChars,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_CLONE_ENTRY_GAD,
						LA_ID,		GAD_CLONEENTRY,
						GA_Disabled,	TRUE,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_REMOVE_ENTRY_GAD,
						LA_ID,		GAD_REMOVEENTRY,
						GA_Disabled,	TRUE,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_COPY_CONFIG_GAD,
						LA_ID,		GAD_COPYCONFIG,
						GA_Disabled,	!NumPhoneEntries,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_USE_ENTRY_GAD,
						LA_ID,		GAD_USEIT,
						GA_Disabled,	TRUE,
					TAG_DONE);

					LT_EndGroup(Handle);
				}

				LT_New(Handle,
					LA_Type,	HORIZONTAL_KIND,
					LAGR_SameSize,	TRUE,
					LAGR_Spread,	TRUE,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_TAG_GAD,
						LA_Chars,	MaxChars,
						LA_ID,		GAD_TAG,
						GA_Disabled,	TRUE,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_UNTAG_GAD,
						LA_ID,		GAD_UNTAG,
						GA_Disabled,	!Count,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_TAG_ALL_GAD,
						LA_ID,		GAD_TAG_ALL,
						GA_Disabled,	!NumPhoneEntries,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_TOGGLE_ALL_GAD,
						LA_ID,		GAD_TOGGLE_ALL,
						GA_Disabled,	!NumPhoneEntries,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_UNTAG_ALL_GAD,
						LA_ID,		GAD_CLEARLIST,
						GA_Disabled,	!Count,
					TAG_DONE);

					LT_EndGroup(Handle);
				}

				LT_New(Handle,
					LA_Type,VERTICAL_KIND,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	XBAR_KIND,
					TAG_DONE);

					LT_EndGroup(Handle);
				}

				LT_New(Handle,
					LA_Type,	HORIZONTAL_KIND,
					LAGR_SameSize,	TRUE,
					LAGR_Spread,	TRUE,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_LOAD_LIST_GAD,
						LA_ID,		GAD_LOADLIST,
						LA_Chars,	MaxChars,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_SAVE_LIST_GAD,
						LA_ID,		GAD_SAVELIST,
						GA_Disabled,	!NumPhoneEntries,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_PRINT_GAD,
						LA_ID,		GAD_PRINT,
						GA_Disabled,	!NumPhoneEntries,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_SORT_LIST_GAD,
						LA_ID,		GAD_SORTLIST,
						GA_Disabled,	NumPhoneEntries < 2,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_SET_PASSWORT_GAD,
						LA_ID,		GAD_PASSWORD,
						GA_Disabled,	!NumPhoneEntries,
					TAG_DONE);

					LT_EndGroup(Handle);
				}

				LT_New(Handle,
					LA_Type,VERTICAL_KIND,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	XBAR_KIND,
						LAXB_FullSize,	TRUE,
					TAG_DONE);

					LT_EndGroup(Handle);
				}

				LT_New(Handle,
					LA_Type,	HORIZONTAL_KIND,
					LAGR_SameSize,	TRUE,
					LAGR_Spread,	TRUE,
				TAG_DONE);
				{
					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_PHONEPANEL_DIAL_LIST_GAD,
						LA_ID,		GAD_DIALLIST,
						LABT_ReturnKey,	TRUE,
						LABT_ExtraFat,	TRUE,
						GA_Disabled,	!Count || Online,
					TAG_DONE);

					LT_New(Handle,
						LA_Type,	BUTTON_KIND,
						LA_LabelID,	MSG_GLOBAL_CANCEL_GAD,
						LA_ID,		GAD_CANCEL,
						LABT_EscKey,	TRUE,
					TAG_DONE);

					LT_EndGroup(Handle);
				}

				LT_EndGroup(Handle);
			}

			LT_EndGroup(Handle);
		}

		if(Screen)
		{
			Bounds . Left	= Window -> LeftEdge;
			Bounds . Top	= Window -> TopEdge;
			Bounds . Width	= Window -> Width;
			Bounds . Height	= Window -> Height;
		}

		if(PhoneWindow = LT_Layout(Handle,LocaleString(MSG_PHONEPANEL_PHONEBOOK_TXT),Screen ? &Bounds : NULL,0,0,IDCMP_CLOSEWINDOW,0,
			LAWN_HelpHook,		&GuideHook,
			WA_DepthGadget,		TRUE,
			WA_CloseGadget,		TRUE,
			WA_DragBar,		TRUE,
			WA_RMBTrap,		TRUE,
			WA_Activate,		TRUE,
		TAG_DONE))
		{
			struct IntuiMessage	*Message;
			BOOLEAN			 Done = FALSE,
						 Released;
			ULONG			 MsgClass,
						 MsgQualifier;
			UWORD			 MsgCode;
			struct Gadget		*MsgGadget;

			BYTE			 ClickAction;

			UBYTE			 DummyBuffer[MAX_FILENAME_LENGTH],
						*DummyChar;

			LONG			 Selected = ~0,i;

			struct FileRequester	*FileRequest;

			GuideContext(CONTEXT_PHONEBOOK);

			PushWindow(PhoneWindow);

			SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

			do
			{
				if(Wait(PORTMASK(PhoneWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
				{
					FreeDialList(TRUE);

					break;
				}

				while(Message = (struct IntuiMessage *)GT_GetIMsg(PhoneWindow -> UserPort))
				{
					MsgClass	= Message -> Class;
					MsgQualifier	= Message -> Qualifier;
					MsgCode		= Message -> Code;
					MsgGadget	= (struct Gadget *)Message -> IAddress;

/*					if(MsgQualifier & IEQUALIFIER_REPEAT)*/
/*						Released = FALSE;*/
/*					else*/
						Released = TRUE;

					GT_ReplyIMsg(Message);

					if(MsgClass == IDCMP_RAWKEY)
					{
						LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);

						if(MsgClass == IDCMP_GADGETUP && MsgGadget -> GadgetID == GAD_NAMELIST)
							MsgQualifier &= ~(IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT);
					}
					else
						LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);

					if(MsgClass == IDCMP_CLOSEWINDOW)
					{
						FreeDialList(TRUE);

						Done = TRUE;
					}

					if(LT_GetCode(MsgQualifier,MsgClass,MsgCode,MsgGadget) == ' ' && Selected != -1)
					{
						LT_SetAttributes(Handle,GAD_NAMELIST,
							GTLV_Labels,	~0,
						TAG_DONE);

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

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

							LT_PressButton(Handle,GAD_TAG);
						}
						else
						{
							RemoveDialEntry(Selected);

							Count--;

							LT_PressButton(Handle,GAD_UNTAG);
						}

						SetPanelState(Handle,PhoneList,Count,Selected,TRUE);
					}

					if(MsgClass == IDCMP_GADGETUP)
					{
						switch(MsgGadget -> GadgetID)
						{
							case GAD_TOGGLE_ALL:
							{
								LONG LocalCount = 0;

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	~0,
								TAG_DONE);

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

										SPrintf(Phonebook[i] -> Node -> LocalName,"%3ld - %s",LocalCount,Phonebook[i] -> Header -> Name);
									}
									else
										RemoveDialEntry(i);
								}

								Count = LocalCount;

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	PhoneList,
								TAG_DONE);

								SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

								break;
							}

							case GAD_TAG_ALL:

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	~0,
								TAG_DONE);

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

										SPrintf(Phonebook[i] -> Node -> LocalName,"%3ld - %s",Count,Phonebook[i] -> Header -> Name);
									}
								}

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	PhoneList,
								TAG_DONE);

								SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

								break;

							case GAD_TAG:

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	~0,
								TAG_DONE);

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

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

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	PhoneList,
								TAG_DONE);

								SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

								break;

							case GAD_UNTAG:

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	~0,
								TAG_DONE);

								RemoveDialEntry(Selected);

								Count--;

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	PhoneList,
								TAG_DONE);

								SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

								break;

							case GAD_NAMELIST:

								Selected = MsgCode;

								if(Phonebook[Selected] -> Header -> Number[0] && Phonebook[Selected] -> Header -> Name[0])
								{
									if(MsgQualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
										ClickAction = CLICK_TOGGLE;
									else
										ClickAction = CLICK_SELECT;
								}
								else
									ClickAction = CLICK_SELECT;

								if(ClickAction == CLICK_TOGGLE)
								{
									LT_SetAttributes(Handle,GAD_NAMELIST,
										GTLV_Labels,	~0,
									TAG_DONE);

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

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

										Count--;
									}

									LT_SetAttributes(Handle,GAD_NAMELIST,
										GTLV_Labels,	PhoneList,
									TAG_DONE);
								}

								SetPanelState(Handle,PhoneList,Count,Selected,Released);

								break;

							case GAD_CLEARLIST:

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	~0,
								TAG_DONE);

								Count = 0;

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

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

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	PhoneList,
								TAG_DONE);

								SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

								break;

							case GAD_PRINT:

								LT_LockWindow(PhoneWindow);

								PrintPanel(PhoneWindow,PhoneList,Count);

								LT_UnlockWindow(PhoneWindow);

								LT_ShowWindow(Handle,TRUE);

								break;

							case GAD_USEIT:

								if(Selected != ~0)
								{
									SaveConfig(Config,PrivateConfig);

									SaveConfig(Phonebook[Selected] -> Config,Config);

									strcpy(Password,Phonebook[Selected] -> Header -> Password);
									strcpy(UserName,Phonebook[Selected] -> Header -> UserName);

									ConfigSetup();

									Done = TRUE;

									ConfigChanged = FALSE;
								}

								break;

							case GAD_NEWENTRY:

								LT_SetAttributes(Handle,GAD_NAMELIST,
									GTLV_Labels,	~0,
								TAG_DONE);

								if(PhoneList)
								{
									DeletePhoneList(PhoneList);

									PhoneList = NULL;
								}

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

										LT_SetAttributes(Handle,GAD_NAMELIST,
											GTLV_Labels,		PhoneList,
											GTLV_Selected,		Selected,
											GTLV_Top,		Selected,
											GTLV_MakeVisible,	Selected,
										TAG_DONE);

										SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

										LT_Activate(Handle,GAD_NAME);

										RebuildMenu = PhonebookChanged = TRUE;
									}
									else
										goto ClearList;
								}
								else
									goto ClearList;

								break;

							case GAD_CLONEENTRY:

								if(Selected != ~0)
								{
									LT_SetAttributes(Handle,GAD_NAMELIST,
										GTLV_Labels,	~0,
									TAG_DONE);

									if(PhoneList)
									{
										DeletePhoneList(PhoneList);

										PhoneList = NULL;
									}

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

											Selected = NumPhoneEntries - 1;

											CopyMem(Phonebook[Tmp] -> Header,Phonebook[Selected] -> Header,sizeof(struct PhoneHeader));

											Phonebook[Selected] -> Header -> QuickMenu = FALSE;

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

											LT_SetAttributes(Handle,GAD_NAMELIST,
												GTLV_Labels,		PhoneList,
												GTLV_Selected,		Selected,
												GTLV_Top,		Selected,
												GTLV_MakeVisible,	Selected,
											TAG_DONE);

											SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

												/* Allocate space for the config data. */

											for(i = PREF_SERIAL ; i <= PREF_EMULATION ; i++)
											{
												if(GetConfigEntry(Phonebook[Tmp] -> Config,i))
													CreateConfigEntry(Phonebook[Selected] -> Config,i);
											}

												/* Copy the data. */

											SaveConfig(Phonebook[Tmp] -> Config,Phonebook[Selected] -> Config);

											RebuildMenu = PhonebookChanged = TRUE;
										}
										else
											goto ClearList;
									}
									else
										goto ClearList;
								}

								break;

							case GAD_REMOVEENTRY:

								if(Selected != ~0)
								{
									if(Phonebook[Selected] == ChosenEntry)
										MyEasyRequest(PhoneWindow,LocaleString(MSG_PHONEPANEL_PHONE_ENTRY_IN_USE_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT));
									else
									{
										RebuildMenu = PhonebookChanged = TRUE;

										LT_SetAttributes(Handle,GAD_NAMELIST,
											GTLV_Labels,~0,
										TAG_DONE);

										if(PhoneList)
										{
											DeletePhoneList(PhoneList);

											PhoneList = NULL;
										}

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

											Count--;
										}

										RemPhoneEntry(Selected);

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

												LT_SetAttributes(Handle,GAD_NAMELIST,
													GTLV_Labels,	PhoneList,
													GTLV_Selected,	Selected,
												TAG_DONE);
											}
											else
												goto ClearList;

											SetPanelState(Handle,PhoneList,Count,Selected,TRUE);
										}
										else
										{
ClearList:										LT_SetAttributes(Handle,GAD_NAMELIST,
												GTLV_Labels,	&EmptyList,
												GTLV_Selected,	~0,
											TAG_DONE);

											Selected = ~0;

											Count = 0;

											SetPanelState(Handle,PhoneList,Count,Selected,TRUE);
										}
									}
								}

								break;

							case GAD_NAME:

								if(Selected != ~0)
								{
									strcpy(Phonebook[Selected] -> Header -> Name,(STRPTR)LT_GetAttributes(Handle,GAD_NAME,TAG_DONE));

									LT_SetAttributes(Handle,GAD_NAMELIST,
										GTLV_Labels,~0,
									TAG_DONE);

									if(PhoneList)
										DeletePhoneList(PhoneList);

									if(PhoneList = CreatePhoneList())
									{
										LT_SetAttributes(Handle,GAD_NAMELIST,
											GTLV_Labels,		PhoneList,
											GTLV_Selected,		Selected,
											GTLV_Top,		Selected,
											GTLV_MakeVisible,	Selected,
										TAG_DONE);
									}

									if(!Phonebook[Selected] -> Header -> Name[0])
									{
										LT_SetAttributes(Handle,GAD_NAMELIST,
											GTLV_Labels,	~0,
										TAG_DONE);

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

											Count--;
										}

										LT_SetAttributes(Handle,GAD_NAMELIST,
											GTLV_Labels,		PhoneList,
											GTLV_Selected,		Selected,
											GTLV_Top,		Selected,
											GTLV_MakeVisible,	Selected,
										TAG_DONE);
									}

									SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

									RebuildMenu = PhonebookChanged = TRUE;

									if(MsgCode == '\r')
										LT_Activate(Handle,GAD_COMMENT);
								}

								break;

							case GAD_COMMENT:

								if(Selected != ~0)
								{
									strcpy(Phonebook[Selected] -> Header -> Comment,(STRPTR)LT_GetAttributes(Handle,GAD_COMMENT,TAG_DONE));

									PhonebookChanged = TRUE;

									if(MsgCode == '\r')
										LT_Activate(Handle,GAD_PHONENUMBER);
								}

								break;

							case GAD_QUICKMENU:

								if(Selected != ~0)
								{
									if(Phonebook[Selected] -> Header -> QuickMenu != MsgCode)
									{
										Phonebook[Selected] -> Header -> QuickMenu = MsgCode;

										RebuildMenu = PhonebookChanged = TRUE;
									}
								}

								break;

							case GAD_PHONENUMBER:

								if(Selected != ~0)
								{
									strcpy(Phonebook[Selected] -> Header -> Number,(STRPTR)LT_GetAttributes(Handle,GAD_PHONENUMBER,TAG_DONE));

									PhonebookChanged = TRUE;

									if(!Phonebook[Selected] -> Header -> Number[0])
									{
										LT_SetAttributes(Handle,GAD_NAMELIST,
											GTLV_Labels,	~0,
										TAG_DONE);

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

											Count--;
										}

										LT_SetAttributes(Handle,GAD_NAMELIST,
											GTLV_Labels,		PhoneList,
										TAG_DONE);
									}

									SetPanelState(Handle,PhoneList,Count,Selected,TRUE);
								}

								break;

							case GAD_LOADLIST:

								LT_LockWindow(PhoneWindow);

								if(ChosenEntry)
									MyEasyRequest(PhoneWindow,LocaleString(MSG_PHONEPANEL_PHONE_ENTRY_IN_USE_LOAD_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT));
								else
								{
									SplitFileName(LastPhone,&DummyChar,DummyBuffer);

									if(FileRequest = GetFile(PhoneWindow,LocaleString(MSG_PHONEPANEL_LOAD_PHONEBOOK_TXT),DummyBuffer,DummyChar,DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT),TRUE))
									{
										LT_SetAttributes(Handle,GAD_NAMELIST,
											GTLV_Labels,	~0,
											GTLV_Selected,	~0,
										TAG_DONE);

										if(PhoneList)
											DeletePhoneList(PhoneList);

										if(!LoadPhonebook(DummyBuffer))
											ShowError(PhoneWindow,ERR_LOAD_ERROR,IoErr(),DummyBuffer);
										else
										{
											strcpy(LastPhone,DummyBuffer);

											PhonebookChanged = FALSE;

											RebuildMenu = TRUE;
										}

										if(PhoneList = CreatePhoneList())
										{
											LT_SetAttributes(Handle,GAD_NAMELIST,
												GTLV_Labels,	PhoneList,
												GA_Disabled,	FALSE,
											TAG_DONE);

											FreeDialList(TRUE);
										}
										else
										{
											LT_SetAttributes(Handle,GAD_NAMELIST,
												GTLV_Labels,	&EmptyList,
												GA_Disabled,	TRUE,
											TAG_DONE);
										}

										Selected = ~0;

										Count = 0;

										SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

										FreeAslRequest(FileRequest);
									}
								}

								LT_UnlockWindow(PhoneWindow);

								break;

							case GAD_SORTLIST:

								if(NumPhoneEntries > 1)
								{
									RebuildMenu = PhonebookChanged = TRUE;

									LT_LockWindow(PhoneWindow);

									LT_SetAttributes(Handle,GAD_NAMELIST,
										GTLV_Labels,	~0,
										GTLV_Selected,	~0,
									TAG_DONE);

									Selected = ~0;

									SetPanelState(Handle,PhoneList,Count,Selected,TRUE);

									if(PhoneList)
										DeletePhoneList(PhoneList);

									SortPhoneEntries();

									if(PhoneList = CreatePhoneList())
									{
										LT_SetAttributes(Handle,GAD_NAMELIST,
											GTLV_Labels,	PhoneList,
											GTLV_Selected,	~0,
										TAG_DONE);
									}
									else
										Count = 0;

									LT_UnlockWindow(PhoneWindow);
								}

								break;

							case GAD_SAVELIST:

								if(NumPhoneEntries)
								{
									SplitFileName(LastPhone,&DummyChar,DummyBuffer);

									LT_LockWindow(PhoneWindow);

									if(FileRequest = GetFile(PhoneWindow,LocaleString(MSG_PHONEPANEL_SAVE_PHONEBOOK_TXT),DummyBuffer,DummyChar,DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT),TRUE))
									{
										if(!SavePhonebook(DummyBuffer))
											ShowError(PhoneWindow,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
										else
										{
											strcpy(LastPhone,DummyBuffer);

											PhonebookChanged = FALSE;
										}

										FreeAslRequest(FileRequest);
									}

									LT_UnlockWindow(PhoneWindow);
								}

								break;

							case GAD_COPYCONFIG:

								LT_LockWindow(PhoneWindow);

								if(Selected == ~0)
									PhonebookChanged |= CopyPanel(NULL,Count > 0);
								else
								{
									PhonebookChanged |= CopyPanel(Phonebook[Selected] -> Config,Count > 0);

									LT_SetAttributes(Handle,GAD_EDIT,
										GTLV_Labels,	~0,
									TAG_DONE);

									UpdateEditList(Phonebook[Selected] -> Config);

									LT_SetAttributes(Handle,GAD_EDIT,
										GTLV_Labels,	EditList,
									TAG_DONE);
								}

								LT_UnlockWindow(PhoneWindow);

								LT_ShowWindow(Handle,TRUE);

								break;

							case GAD_PASSWORD:

								LT_LockWindow(PhoneWindow);

								{
									UBYTE SomeBuffer[30];

									memset(SomeBuffer,0,21);

									PhonePasswordUsed = FALSE;

									if(GetString(FALSE,TRUE,21,LocaleString(MSG_PHONEPANEL_PLEASE_ENTER_PASSWORD_TXT),SomeBuffer))
									{
										SomeBuffer[20] = 0;

										PhonebookChanged = TRUE;

										if(SomeBuffer[0])
										{
											UBYTE OtherBuffer[30];

											memset(OtherBuffer,0,21);

											if(GetString(FALSE,TRUE,21,LocaleString(MSG_PHONEPANEL_PLEASE_REPEAT_PASSWORD_TXT),OtherBuffer))
											{
												OtherBuffer[20] = 0;

												if(!memcmp(OtherBuffer,SomeBuffer,20))
												{
													Encrypt(OtherBuffer,20,PhonePassword,OtherBuffer,strlen(OtherBuffer));

													PhonePasswordUsed = TRUE;
												}
												else
													MyEasyRequest(PhoneWindow,LocaleString(MSG_PHONEPANEL_ERROR_ENTERING_PASSWORD_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT));
											}
											else
												MyEasyRequest(PhoneWindow,LocaleString(MSG_PHONEPANEL_ERROR_ENTERING_PASSWORD_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT));
										}
									}
								}

								LT_ShowWindow(Handle,TRUE);

								LT_UnlockWindow(PhoneWindow);
								break;

							case GAD_EDIT:

								if(Selected != ~0)
								{
									LT_LockWindow(PhoneWindow);

									switch(MsgCode)
									{
										case EDIT_RATES:

											if(Phonebook[Selected] == ChosenEntry)
												MyEasyRequest(PhoneWindow,LocaleString(MSG_PHONEPANEL_PHONE_ENTRY_IN_USE_EDIT_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
											else
											{
												LT_SetAttributes(Handle,GAD_NAMELIST,
													GTLV_Labels,	~0,
												TAG_DONE);

												PhonebookChanged |= RatePanel(PhoneList,Phonebook[Selected]);

												LT_SetAttributes(Handle,GAD_NAMELIST,
													GTLV_Labels,	PhoneList,
												TAG_DONE);
											}

											break;

										case EDIT_PASSWORD:

											PhonebookChanged |= PasswordUserPanel(Phonebook[Selected]);
											break;

										default:

											PhonebookChanged |= EditConfig(Phonebook[Selected] -> Config,MsgCode,PhoneWindow);
											break;
									}

									LT_SetAttributes(Handle,GAD_EDIT,
										GTLV_Labels,	~0,
									TAG_DONE);

									UpdateEditList(Phonebook[Selected] -> Config);

									LT_SetAttributes(Handle,GAD_EDIT,
										GTLV_Labels,	EditList,
									TAG_DONE);

									LT_UnlockWindow(PhoneWindow);

									LT_ShowWindow(Handle,TRUE);
								}

								break;

							case GAD_DIALLIST:

								if(!Count && Selected != ~0)
								{
									LT_SetAttributes(Handle,GAD_NAMELIST,
										GTLV_Labels,	~0,
									TAG_DONE);

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

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

									LT_SetAttributes(Handle,GAD_NAMELIST,
										GTLV_Labels,	PhoneList,
									TAG_DONE);
								}

								if(Count > 0)
								{
									DialTheList	= TRUE;
									Done		= TRUE;
								}

								break;

							case GAD_CANCEL:

								FreeDialList(TRUE);

								Done = TRUE;

								break;
						}
					}

					if(MsgClass == IDCMP_IDCMPUPDATE && MsgGadget -> GadgetID == GAD_NAMELIST)
					{
						if(!(MsgQualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) && !Online)
						{
							Selected = MsgCode;

							LT_SetAttributes(Handle,GAD_NAMELIST,
								GTLV_Labels,	~0,
							TAG_DONE);

							Count = 1;

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

									Phonebook[i] -> Count = -1;
								}
								else
								{
									SPrintf(Phonebook[i] -> Node -> LocalName,"  1 - %s",Phonebook[i] -> Header -> Name);

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

							DialTheList	= TRUE;
							Done		= TRUE;

							LT_PressButton(Handle,GAD_DIALLIST);
						}
					}
				}
			}
			while(!Done);

			PopWindow();
		}

		LT_DeleteHandle(Handle);
	}

	if(PhonebookChanged)
		RebuildMenu = TRUE;

	FreeDialList(TRUE);

	if(PhoneList)
	{
		if(Count > 0)
		{
			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;
			}

			if(!DialList)
				DialTheList = FALSE;
		}

		DeletePhoneList(PhoneList);
	}

	return(DialTheList);
}
