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

#include "termGlobal.h"

	/* Gadget IDs. */

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

	/* 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 };

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

STATIC STRPTR		EditName[18];
STATIC struct Hook	ListViewHook;

	/* 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;
		}

		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)
		{
			SetAPen(RPort,Msg -> lvdm_DrawInfo -> dri_Pens[BLOCKPEN]);

			SetAfPt(RPort,(UWORD *)&Crosshatch,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 struct Gadget *
CreateAllGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList)
{
	struct Gadget		*Gadget;
	struct NewGadget	 NewGadget;
	UWORD			 Counter = 0;
	WORD			 Lines = EDIT_RATES + 1;

	LocalizeString(EditName,MSG_PHONEPANEL_SERIAL_TXT,MSG_PHONEPANEL_RATES_TXT);

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

	SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);

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

		NewList(&EditList);

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

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

		SZ_ResetMaxWidth();

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

		ButtonWidth = SZ_ResetMaxWidth();

		MaxWidth = 4 * ButtonWidth + 3 * 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_PHONEPANEL_COMMENT_GAD))) > Max)
			Max = Len;

		SZ_AddLeftOffset(Max + INTERWIDTH);

		LeftEdge = SZ_GetLeftEdge();

		ListWidth = SZ_Width(LISTVIEW_KIND,NULL,35,NULL);

		Width = 0;

		for(i = 0 ; i < 17 ; i++)
		{
			if((Len = strlen(EditName[i])) > Width)
				Width = Len;
		}

		EditWidth = SZ_Width(LISTVIEW_KIND,NULL,Width,NULL);

		if(MaxWidth > ListWidth + InterWidth + EditWidth)
		{
			LONG Remainder = ListWidth + InterWidth + EditWidth;

			Width = (MaxWidth - Remainder) / 2;

			ListWidth += Width;
			EditWidth += MaxWidth - (Remainder + Width);
		}

		FOREVER
		{
			NewGadget . ng_Flags		= PLACETEXT_ABOVE|NG_HIGHLABEL;
			NewGadget . ng_GadgetText	= LocaleString(MSG_GLOBAL_NAME_LIST_GAD);
			NewGadget . ng_GadgetID		= Counter;

			ListViewHook . h_Entry	= (LONG (*)())ListViewRender;
			ListViewHook . h_Data	= (APTR)SZ_GetNumericLen("1");

			GadgetArray[Counter++] = Gadget = CreateGadget(LISTVIEW_KIND,Gadget,&NewGadget,
				SZ_Adjust,		TRUE,
				SZ_UseWidth,		ListWidth,
				SZ_Lines,		Lines,
				SZ_InterHeight,		1,

				GTLV_CallBack,		&ListViewHook,
			TAG_DONE);

			if(SZ_GetWindowHeight() + 5 * InterHeight + 3 * (SZ_Height(BUTTON_KIND,0,0) + SZ_Height(STRING_KIND,0,0)) > Window -> Height - (Window -> BorderTop + Window -> BorderBottom) && Lines > 5)
			{
				if(*GadgetList)
				{
					FreeGadgets(*GadgetList);

					*GadgetList = NULL;
				}

				SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);

				Counter = 0;

				Lines--;

				if(!(Gadget = CreateContext(GadgetList)))
					return(NULL);

				SZ_AddLeftOffset(Max + INTERWIDTH);
			}
			else
				break;
		}

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

		GadgetArray[Counter++] = Gadget = CreateGadget(LISTVIEW_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_NewColumn,	TRUE,
			SZ_UseWidth,	EditWidth,
			SZ_Lines,	Lines,
			!Kick30 ? TAG_IGNORE : GA_Disabled,	TRUE,
			GTLV_Labels,	&EditList,
			SZ_InterHeight,	1,
		TAG_DONE);

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

		GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
			SZ_Adjust,	TRUE,
			SZ_FullWidth,	TRUE,
			SZ_UseLeft,	LeftEdge,
			SZ_AlignBottom,	TRUE,

			GTST_MaxChars,	39,
			GA_Disabled,	TRUE,
		TAG_DONE);

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

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

			GTST_MaxChars,	99,
			GA_Disabled,	TRUE,
		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,	99,
			GA_Disabled,	TRUE,
		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,	4,
			SZ_UseLeft,	LeftEdge,
		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,

			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,

			GA_Disabled,	(Online && ChosenEntry),
		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_GroupNext,	TRUE,

			GA_Disabled,	TRUE,
		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,	4,
			SZ_UseLeft,	LeftEdge,

			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,

			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,

			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,

			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,	4,
			SZ_UseLeft,	LeftEdge,

			GA_Disabled,	TRUE,
		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,

			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,

			GA_Disabled,	TRUE,
		TAG_DONE);

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

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

			GA_Disabled,	TRUE,
		TAG_DONE);
	}

	return(Gadget);
}

STATIC BYTE
EditConfig(struct Configuration *Config,UWORD Type,struct Window *PanelWindow)
{
	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_FILE,
		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:

				strcpy(DummyBuffer,LastXprLibrary);

				if(SelectProtocol(Config -> FileConfig -> ProtocolFileName,PanelWindow))
				{
					strcpy(Config -> FileConfig -> ProtocolFileName,LastXprLibrary);

					Changed = TRUE;
				}

				strcpy(LastXprLibrary,DummyBuffer);

				break;

			case EDIT_TRANSLATION:

				strcpy(DummyBuffer,Config -> FileConfig -> TranslationFileName);

				DummyChar = PathPart(DummyBuffer);

				*DummyChar = 0;

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

					FreeAslRequest(FileRequest);

					Changed = TRUE;
				}

				break;

			case EDIT_KEYMACROS:

				strcpy(DummyBuffer,Config -> FileConfig -> MacroFileName);

				DummyChar = PathPart(DummyBuffer);

				*DummyChar = 0;

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

					FreeAslRequest(FileRequest);

					Changed = TRUE;
				}

				break;

			case EDIT_CURSORKEYS:

				strcpy(DummyBuffer,Config -> FileConfig -> CursorFileName);

				DummyChar = PathPart(DummyBuffer);

				*DummyChar = 0;

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

					FreeAslRequest(FileRequest);

					Changed = TRUE;
				}

				break;

			case EDIT_FASTMACROS:

				strcpy(DummyBuffer,Config -> FileConfig -> FastMacroFileName);

				DummyChar = PathPart(DummyBuffer);

				*DummyChar = 0;

				if(FileRequest = GetFile(LocaleString(MSG_PHONEPANEL_SELECT_FAST_MACROS_TXT),DummyBuffer,FilePart(Config -> FileConfig -> FastMacroFileName),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);
}

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

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

	ULONG			 Sec1,Mic1,Sec2,Mic2;
	LONG			 HitItem = -1,Count = -1;
	BYTE			 DialTheList = FALSE;
	struct PhoneNode	*TempNode;
	struct List		*PhoneList = NULL;

	if(CreateAllGadgets(GadgetArray,&GadgetList))
	{
		if(PanelWindow = OpenWindowTags(NULL,
			WA_Left,	GetScreenLeft(Window) + (GetScreenWidth(Window) - SZ_GetWindowWidth()) / 2,
			WA_Top,		GetScreenTop(Window) + (GetScreenHeight(Window) - 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,Window -> WScreen,

			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			 IClass,Code,Qualifier;
			struct Gadget		*Gadget;
			BYTE			 Terminated = FALSE,
						 ClickAction;

			UBYTE			 DummyBuffer[MAX_FILENAME_LENGTH],
						*DummyChar;

			LONG			 Selected = ~0,i;

			struct FileRequester	*FileRequest;

			GuideContext(CONTEXT_PHONEBOOK);

			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_PRINT],PanelWindow,NULL,
							GA_Disabled,	FALSE,
						TAG_DONE);

						GT_SetGadgetAttrs(GadgetArray[GAD_COPYCONFIG],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(TRUE);

			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);
			}

			ClrSignal(SIG_BREAK);

			while(!Terminated)
			{
				if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
				{
					FreeDialList(TRUE);

					break;
				}

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

					GT_ReplyIMsg(Massage);

					if(IClass == IDCMP_VANILLAKEY)
					{
						if(Code == ' ')
						{
							if(Selected != -1)
							{
								HitItem = -1;

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

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

									if(!Online && Phonebook[Selected] -> Header -> Number[0] && Phonebook[Selected] -> Header -> Name[0])
									{
										GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
											GA_Disabled,	FALSE,
										TAG_DONE);
									}

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

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

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

								GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
									GTLV_Labels,	PhoneList,
								TAG_DONE);
							}
						}
						else
						{
							KeySelect(GadgetArray,GAD_PRINT,Code,PanelWindow,&Gadget,&IClass,&Code);

							if(IClass == IDCMP_GADGETUP)
								Qualifier = NULL;
						}
					}

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

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

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

						Terminated = TRUE;
					}

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

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

									CurrentTime(&Sec1,&Mic1);

									if(Phonebook[Code] -> Header -> Number[0] && Phonebook[Code] -> Header -> Name[0])
									{
										if(Qualifier & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT))
											ClickAction = CLICK_TOGGLE;
										else
											ClickAction = CLICK_SELECT;
									}
									else
										ClickAction = CLICK_SELECT;
								}
								else
								{
									if(Phonebook[Code] -> Header -> Number[0] && Phonebook[Code] -> Header -> Name[0])
									{
										if(Qualifier & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT))
										{
											CurrentTime(&Sec1,&Mic1);

											ClickAction = CLICK_TOGGLE;
										}
										else
										{
											CurrentTime(&Sec2,&Mic2);

											if(DoubleClick(Sec1,Mic1,Sec2,Mic2))
												ClickAction = CLICK_DIAL;
											else
												ClickAction = CLICK_NONE;

											Sec1 = Sec2;
											Mic1 = Mic2;
										}
									}
									else
									{
										CurrentTime(&Sec1,&Mic1);

										ClickAction = CLICK_NONE;
									}
								}

								if(ClickAction == CLICK_SELECT || ClickAction == CLICK_TOGGLE)
								{
									GT_SetGadgetAttrs(GadgetArray[GAD_NAME],PanelWindow,NULL,
										GTST_String,	Phonebook[Code] -> Header -> Name,
										GA_Disabled,	FALSE,
									TAG_DONE);

									GT_SetGadgetAttrs(GadgetArray[GAD_COMMENT],PanelWindow,NULL,
										GTST_String,	Phonebook[Code] -> Header -> Comment,
										GA_Disabled,	FALSE,
									TAG_DONE);

									GT_SetGadgetAttrs(GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL,
										GTST_String,	Phonebook[Code] -> Header -> Number,
										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_DIALLIST],PanelWindow,NULL,
										GA_Disabled,	Online || !(Count || Phonebook[Code] -> Header -> Number[0] && Phonebook[Code] -> Header -> Name[0]),
									TAG_DONE);

									if(Kick30)
									{
										GT_SetGadgetAttrs(GadgetArray[GAD_EDIT],PanelWindow,NULL,
											GA_Disabled,	FALSE,
										TAG_DONE);
									}

									Selected = Code;
								}

								if(ClickAction == CLICK_DIAL)
								{
									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] -> Header -> Name);

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

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

									DialTheList	= TRUE;
									Terminated	= TRUE;
								}

								if(ClickAction == CLICK_TOGGLE || ClickAction == CLICK_DIAL)
								{
									HitItem = -1;

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

									if(Phonebook[Selected] -> Count == -1)
									{
										if(!Count)
										{
											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] -> Header -> Name);
									}
									else
									{
										RemoveDialEntry(Selected);

										if(!(--Count))
										{
											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;

							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] -> Header -> Name);

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

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

								if(Selected == ~0)
								{
									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_PRINT:

								BlockWindow(PanelWindow);

								PrintPanel(PanelWindow,PhoneList,Count);

								ReleaseWindow(PanelWindow);

								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();

									Terminated = TRUE;

									ConfigChanged = FALSE;
								}

								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,
											GTLV_Top,		Selected,
											GTLV_MakeVisible,	Selected,
										TAG_DONE);

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

										GT_SetGadgetAttrs(GadgetArray[GAD_COMMENT],PanelWindow,NULL,
											GTST_String,	Phonebook[Selected] -> Header -> Comment,
											GA_Disabled,	FALSE,
										TAG_DONE);

										GT_SetGadgetAttrs(GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL,
											GTST_String,	Phonebook[Selected] -> Header -> Number,
											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);

										if(Kick30)
										{
											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_PRINT],PanelWindow,NULL,
												GA_Disabled,	FALSE,
											TAG_DONE);

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

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

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

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

										ActiveGadget = GadgetArray[GAD_NAME];

										PhonebookChanged = TRUE;
									}
									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,i;

											Selected = NumPhoneEntries - 1;

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

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

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

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

											GT_SetGadgetAttrs(GadgetArray[GAD_COMMENT],PanelWindow,NULL,
												GTST_String,	Phonebook[Selected] -> Header -> Comment,
											TAG_DONE);

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

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

												/* 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);

											PhonebookChanged = TRUE;
										}
										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
									{
										PhonebookChanged = TRUE;

										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_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] -> Header -> Name,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_COMMENT],PanelWindow,NULL,
													GTST_String,	Phonebook[Selected] -> Header -> Comment,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL,
													GTST_String,	Phonebook[Selected] -> Header -> 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_COMMENT],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_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_PRINT],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											GT_SetGadgetAttrs(GadgetArray[GAD_COPYCONFIG],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_DIALLIST],PanelWindow,NULL,
												GA_Disabled,	TRUE,
											TAG_DONE);

											if(Kick30)
											{
												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] -> Header -> Name,SZ_GetString(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,
											GTLV_Top,		Selected,
											GTLV_MakeVisible,	Selected,
										TAG_DONE);
									}

									if(!Phonebook[Selected] -> Header -> Name[0])
									{
										GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
											GTLV_Labels,	~0,
										TAG_DONE);

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

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

										GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
											GTLV_Labels,		PhoneList,
											GTLV_Selected,		Selected,
											GTLV_Top,		Selected,
											GTLV_MakeVisible,	Selected,
										TAG_DONE);
									}
									else
									{
										GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
											GA_Disabled,	Online || !Phonebook[Selected] -> Header -> Number[0] || !Phonebook[Selected] -> Header -> Name[0],
										TAG_DONE);
									}

									PhonebookChanged = TRUE;
								}

								ActivateGadget(ActiveGadget = GadgetArray[GAD_COMMENT],PanelWindow,NULL);

								break;

							case GAD_COMMENT:

								if(Selected != ~0)
								{
									strcpy(Phonebook[Selected] -> Header -> Comment,SZ_GetString(GadgetArray[GAD_COMMENT]));

									PhonebookChanged = TRUE;
								}

								ActivateGadget(ActiveGadget = GadgetArray[GAD_PHONENUMBER],PanelWindow,NULL);

								break;

							case GAD_PHONENUMBER:

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

									PhonebookChanged = TRUE;

									if(!Phonebook[Selected] -> Header -> Number[0])
									{
										GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
											GTLV_Labels,	~0,
										TAG_DONE);

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

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

										GT_SetGadgetAttrs(GadgetArray[GAD_NAMELIST],PanelWindow,NULL,
											GTLV_Labels,		PhoneList,
											GTLV_Selected,		Selected,
											GTLV_Top,		Selected,
											GTLV_MakeVisible,	Selected,
										TAG_DONE);
									}
									else
									{
										GT_SetGadgetAttrs(GadgetArray[GAD_DIALLIST],PanelWindow,NULL,
											GA_Disabled,	Online || !Phonebook[Selected] -> Header -> Number[0] || !Phonebook[Selected] -> Header -> Name[0],
										TAG_DONE);
									}
								}

								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),TRUE))
									{
										if(PhoneList)
											DeletePhoneList(PhoneList);

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

											PhonebookChanged = FALSE;
										}

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

											FreeDialList(TRUE);
										}

										Count = 0;

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

										GT_SetGadgetAttrs(GadgetArray[GAD_COMMENT],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_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);

										if(Kick30)
										{
											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_PRINT],PanelWindow,NULL,
													GA_Disabled,	TRUE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_COPYCONFIG],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_PRINT],PanelWindow,NULL,
													GA_Disabled,	FALSE,
												TAG_DONE);

												GT_SetGadgetAttrs(GadgetArray[GAD_COPYCONFIG],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)
								{
									PhonebookChanged = TRUE;

									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_COMMENT],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_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);

									if(Kick30)
									{
										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),TRUE))
									{
										if(!SavePhonebook(DummyBuffer))
											MyEasyRequest(Window,LocaleString(MSG_PHONEPANEL_COULD_NOT_CREATE_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
										else
										{
											strcpy(LastPhone,DummyBuffer);

											PhonebookChanged = FALSE;
										}

										FreeAslRequest(FileRequest);
									}

									ReleaseWindow(PanelWindow);
								}

								break;

							case GAD_COPYCONFIG:

								BlockWindow(PanelWindow);

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

								ReleaseWindow(PanelWindow);
								break;

							case GAD_PASSWORD:

								BlockWindow(PanelWindow);

								{
									struct Gadget *OldActiveGadget = ActiveGadget;
									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(Window,LocaleString(MSG_PHONEPANEL_ERROR_ENTERING_PASSWORD_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT));
											}
											else
												MyEasyRequest(Window,LocaleString(MSG_PHONEPANEL_ERROR_ENTERING_PASSWORD_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT));
										}
									}

									ActiveGadget = OldActiveGadget;
								}

								ReleaseWindow(PanelWindow);
								break;

							case GAD_EDIT:

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

									switch(Code)
									{
										case EDIT_RATES:

											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);

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

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

											break;

										case EDIT_PASSWORD:

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

										default:

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

									ActiveGadget = GadgetArray[GAD_NAME];

									ReleaseWindow(PanelWindow);
								}

								break;

							case GAD_DIALLIST:

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

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

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

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

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

								break;
						}
					}
				}
			}

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

			PopWindow();

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

			CloseWindow(PanelWindow);
		}
	}

	FreeGadgets(GadgetList);

	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);
}
