/*
** Amster - Preferences
** Copyright © 1999-2000 by Gürer Özen & Jacob Laursen
**
** Maintained by Jacob Laursen <laursen@myself.com>
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#include "include/config.h"

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

#include "include/mui.h"
#include <MUI/NListview_mcc.h>
#include <MUI/textinput_mcc.h>
#include <libraries/asl.h>

#include <proto/dos.h>

#include "include/download.h"
#include "include/gui.h"
#include "include/search.h"
#include "include/panel.h"
#include "include/prefs.h"
#include "include/share.h"
#include "amster_Cat.h"
#include "include/protos.h"

struct prefsdata myprefs;
struct prefsdata *prf = &myprefs;

int prf_eventflags[] = { 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1 };

struct MUI_CustomClass *QueueClass;

MUIF QueueDispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg);
ULONG prf_new(struct IClass *cl, Object *obj, struct opSet *msg);
void prf_set(struct prfdata *data);
void prf_use(struct prfdata *data);
void snd_play(char *fname);
void prf_entry(struct prfdata *data);


MUIF prf_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
{
	switch(msg->MethodID) {
		case OM_NEW:
			return(prf_new(cl, obj, (APTR)msg));
		case PRF_UPDATE:
			if (gui_onlinestate == ONLINE) nap_sendbuf(NAPC_EMAILCHANGE, prf->email);
			else MUI_Request(gui->app, gui->swin, 0L, (char *)MSG_ERROR_TITLE, (char *)MSG_OK_GAD, (char *)MSG_ERROR_UPDATEEMAIL);
			return NULL;
		case PRF_OPEN:
			prf_set(INST_DATA(cl, obj));
			set(obj, MUIA_Window_Open, TRUE);
			return NULL;
		case PRF_USE:
			prf_use(INST_DATA(cl, obj));
			set(obj, MUIA_Window_Open, FALSE);
			return NULL;
		case PRF_LASTSAVED:
			{
			u_long tmp;
			prf_setup(0, NULL);
			if (prf_load("ENVARC:"AMSTER_PREFS)) {
				DoMethod(gui->searchpanel, SEARCH_SET);
				GetAttr(MUIA_Window_Open, obj, &tmp);
				if (tmp==TRUE) prf_set(INST_DATA(cl,obj));
			}
			return NULL;
			}
		case PRF_SAVE:
			prf_use(INST_DATA(cl, obj));
			set(obj, MUIA_Window_Open, FALSE);
			prf_save("ENVARC:"AMSTER_PREFS);
			return NULL;
		case PRF_SAVEALL:
			{
			u_long tmp;
			GetAttr(MUIA_Window_Open, obj, &tmp);
			if (tmp==TRUE) {
				prf_use(INST_DATA(cl,obj));
			}
			else prf_save("ENV:"AMSTER_PREFS);
			prf_save("ENVARC:"AMSTER_PREFS);
			return NULL;
			}
		case PRF_CANCEL:
			set(obj, MUIA_Window_Open, FALSE);
			return NULL;
		case PRF_TESTSND:
			{
			u_long tmp;
            struct prfdata *data = INST_DATA(cl,obj);
			GetAttr(MUIA_String_Contents, data->EventSoundString, &tmp);
			if (((char *)tmp)[0] != '\0') snd_play((char *)tmp);
			return NULL;
			}
		case PRF_ENTRY:
			prf_entry(INST_DATA(cl,obj));
			return NULL;
		case PRF_VALIDDELAY:
			{
			u_long tmp;
            struct prfdata *data = INST_DATA(cl,obj);
			GetAttr(MUIA_String_Integer, data->ST_QueueDelay, &tmp);
			if ((int)tmp < 1) set(data->ST_QueueDelay, MUIA_String_Integer, prf->QueueDelay);
			return NULL;
			}
	}
	return DoSuperMethodA(cl, obj, msg);
}


/*
** This is the Queue custom class, a sub class of Slider.mui. Overrides the
** MUIM_Numeric_Stringify method to implement custom display in slider gadget.
*/

MUIF QueueDispatcher(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
{
	if (msg->MethodID==MUIM_Numeric_Stringify)
	{
		struct QueueData *data = INST_DATA(cl,obj);
		struct MUIP_Numeric_Stringify *m = (APTR)msg;

		if (m->value<26)
		{
			sprintf(data->buf,"%3ld", m->value);
		}
		else
		{
			strcpy(data->buf, MSG_PRF_QUEUE_UNLIMITED);
		}
		return((ULONG)data->buf);
	}
	return(DoSuperMethodA(cl,obj,msg));
}


ULONG prf_new(struct IClass *cl, Object *obj, struct opSet *msg)
{
	static char *pages[] = {
		(char *)_MSG_PRF_USER_TAB,
		(char *)_MSG_PRF_OPTIONS_TAB,
		(char *)_MSG_PRF_EVENTS_TAB,
		(char *)_MSG_PRF_ADVANCED_TAB,
		NULL
	};
	static char *events[] = {
		(char *)_MSG_PRF_EVT_START,
		(char *)_MSG_PRF_EVT_EXIT,
		(char *)_MSG_PRF_EVT_CONN,
		(char *)_MSG_PRF_EVT_DISC,
		(char *)_MSG_PRF_EVT_DOWNLOAD_START,
		(char *)_MSG_PRF_EVT_DLFIN,
		(char *)_MSG_PRF_EVT_DOWNLOAD_ERROR,
		(char *)_MSG_PRF_EVT_DOWNLOAD_ABORT,
		(char *)_MSG_PRF_EVT_UPLOAD_START,
		(char *)_MSG_PRF_EVT_ULFIN,
		(char *)_MSG_PRF_EVT_UPLOAD_ERROR,
		(char *)_MSG_PRF_EVT_UPLOAD_ABORT,
		(char *)_MSG_PRF_EVT_INCOMINGMSG,
		(char *)_MSG_PRF_EVT_LIBRARY_DOUBLECLICK,
		(char *)_MSG_PRF_EVT_DOWNLOAD_DOUBLECLICK,
		(char *)_MSG_PRF_EVT_PLAY,
		NULL
	};
	static char *lamps[] = {
		(char *)_MSG_PRF_LAMPLAMP,
		(char *)_MSG_PRF_LAMPTWF,
		NULL
	};
	static char *ServerListOpts[] = {
		(char *)_MSG_PRF_SERVERLIST_FORGET,
		(char *)_MSG_PRF_SERVERLIST_SAVE,
		(char *)_MSG_PRF_SERVERLIST_CACHE,
		NULL
	};
	static char *AutoCleanupOpts[] = {
		(char *)_MSG_PRF_AUTOCLEANUP_NONE,
		(char *)_MSG_PRF_AUTOCLEANUP_DOWNLOADS,
		(char *)_MSG_PRF_AUTOCLEANUP_UPLOADS,
		(char *)_MSG_PRF_AUTOCLEANUP_BOTH,
		NULL
	};

	struct prfdata *data;
	Object *UserString, *PasswordString, *EMailString, *EMailButton, *TG_BypassReg;
	Object *DownloadPathString, *LinkSpeedCycle;
	Object *ClearListToggle, *AutoConnectToggle, *AskFileToggle, *AutoSaveToggle, *AutoAddToggle;
	Object *LampCycle, *CY_ServerList, *CY_AutoCleanup, *ST_NameLength;
	Object *EventList, *EventScriptString, *EventSoundString, *EventTestButton;
	Object *MetaServerString, *ST_MetaPort, *ServerString, *ST_LeafPort, *PortString, *FirewallToggle;
	Object *DownloadQueueSlider, *UploadQueueSlider, *DownloadPriSlider, *UploadPriSlider;
	Object *ST_QueueRetries, *ST_QueueDelay;
	Object *SaveButton, *UseButton, *CancelButton;

	QueueClass = MUI_CreateCustomClass(NULL, MUIC_Slider, NULL, sizeof(struct QueueData), QueueDispatcher);

	if (pages[0] == (char *)_MSG_PRF_USER_TAB)
		localize_array(pages);
	if (events[0] == (char *)_MSG_PRF_EVT_START)
		localize_array(events);
	if (lamps[0] == (char *)_MSG_PRF_LAMPLAMP)
		localize_array(lamps);
	if (ServerListOpts[0] == (char *)_MSG_PRF_SERVERLIST_FORGET)
		localize_array(ServerListOpts);
	if (AutoCleanupOpts[0] == (char *)_MSG_PRF_AUTOCLEANUP_NONE)
		localize_array(AutoCleanupOpts);

	if (obj = (Object *)DoSuperNew(cl, obj,
		MUIA_HelpNode, "config",
		MUIA_Window_Title, MSG_PRF_TITLE,
		MUIA_Window_ID, MAKE_ID('S','E','T','T'),
		WindowContents, VGroup,
			Child, RegisterGroup(pages),
			Child, VGroup,
				Child, ColGroup(2), GroupFrameT(MSG_PRF_ACCOUNT_FRAME),
					MUIA_HelpNode, "conf-user",
					Child, Label2(MSG_PRF_USERNAME),
					Child, HGroup,
					Child, UserString = TextinputObject,
						StringFrame,
                        MUIA_Textinput_Multiline, FALSE,
						MUIA_String_Reject, ":%$ ",
						MUIA_String_AdvanceOnCR, TRUE,
						MUIA_CycleChain, 1,
						MUIA_ShortHelp, MSG_PRF_USERNAME_HELP,
					End,
						Child, Label2(MSG_PRF_BYPASS_REGISTRATION),
						Child, TG_BypassReg = ImageObject,
							ButtonFrame,
							MUIA_HorizWeight, 10,
							MUIA_Background, MUII_ButtonBack,
							MUIA_InputMode, MUIV_InputMode_Toggle,
							MUIA_ShowSelState, FALSE,
							MUIA_Image_Spec, "6:15",
							MUIA_Selected, FALSE,
							MUIA_ShortHelp, MSG_PRF_BYPASS_REGISTRATION_HELP,
						End,
						End,
					Child, Label2(MSG_PRF_PASSWORD),
					Child, PasswordString = StringObject,
						StringFrame,
						MUIA_String_Reject, " ",
						MUIA_String_AdvanceOnCR, TRUE,
						MUIA_String_Secret, TRUE,
						MUIA_CycleChain, 1,
						MUIA_ShortHelp, MSG_PRF_PASSWORD_HELP,
					End,
					Child, Label2(MSG_PRF_EMAIL),
					Child, HGroup,
						Child, EMailString = TextinputObject,
							StringFrame,
                            MUIA_Textinput_Multiline, FALSE,
							MUIA_HorizWeight, 150,
							MUIA_String_AdvanceOnCR, TRUE,
							MUIA_CycleChain, 1,
							MUIA_ShortHelp, MSG_PRF_EMAIL_HELP,
						End,
						Child, EMailButton = SimpleButton(MSG_PRF_UPDATE_GAD),
							MUIA_ShortHelp, MSG_PRF_UPDATE_HELP,
					End,
					Child, Label2(MSG_PRF_CONNECTION),
					Child, LinkSpeedCycle = CycleObject,
						MUIA_Cycle_Active, prf->link,
						MUIA_Cycle_Entries, nap_linktype,
						MUIA_ShortHelp, MSG_PRF_CONNECTION_HELP,
					End,
				End,
				Child, ColGroup(2),
					Child, Label2(MSG_PRF_DLPATH),
					Child, HGroup,
						Child, DownloadPathString = PopaslObject,
							MUIA_Popstring_String, TextinputObject,
								StringFrame,
                                MUIA_Textinput_Multiline, FALSE,
								MUIA_String_MaxLen, 256,
								MUIA_CycleChain, 1,
								MUIA_ShortHelp, MSG_PRF_DLPATH_HELP,
							End,
							MUIA_Popstring_Button, PopButton(MUII_PopFile),
							MUIA_Popasl_Type, ASL_FileRequest,
							ASLFR_TitleText, MSG_PRF_DLPATH_REQ,
							ASLFR_DrawersOnly, TRUE,
						End,
						Child, Label2(MSG_PRF_NAMELENGTH),
						Child, ST_NameLength = TextinputObject,
							StringFrame,
                            MUIA_Textinput_Multiline, FALSE,
							MUIA_HorizWeight, 25,
							MUIA_String_Integer, prf->NameLength,
							MUIA_String_Accept, "0123456789",
							MUIA_String_MaxLen, 4,
							MUIA_CycleChain, 1,
							MUIA_ShortHelp, MSG_PRF_NAMELENGTH_HELP,
						End,
					End,
				End,
			End,
			Child, VGroup,
				MUIA_HelpNode, "conf-opts",
				Child, VGroup, GroupFrameT(MSG_PRF_MISC_FRAME),
					Child, maketoggle(MSG_PRF_AUTOCONNECT,  &AutoConnectToggle),
					Child, maketoggle(MSG_PRF_CLEARLIST,    &ClearListToggle  ),
					Child, maketoggle(MSG_PRF_ALWAYSASK,    &AskFileToggle    ),
					Child, maketoggle(MSG_PRF_ADDTOLIBRARY, &AutoAddToggle    ),
					Child, maketoggle(MSG_PRF_AUTOSAVELIB,  &AutoSaveToggle   ),
				End,
				Child, ColGroup(2),
					Child, Label2(MSG_PRF_AUTOCLEANUP_TMP),
					Child, CY_AutoCleanup = CycleObject,
						MUIA_Cycle_Active, prf->AutoCleanup,
						MUIA_Cycle_Entries, AutoCleanupOpts,
						MUIA_ShortHelp, MSG_PRF_AUTOCLEANUP_HELP,
					End,
					Child, Label2(MSG_PRF_SERVERLIST),
					Child, CY_ServerList = CycleObject,
						MUIA_Cycle_Active, prf->ServerList,
						MUIA_Cycle_Entries, ServerListOpts,
						MUIA_ShortHelp, MSG_PRF_SERVERLIST_HELP,
					End,
					Child, Label2(MSG_PRF_LAMPCLASS),
					Child, LampCycle = CycleObject,
						MUIA_Cycle_Active, prf->lamps,
						MUIA_Cycle_Entries, lamps,
						MUIA_ShortHelp, MSG_PRF_LAMPCLASS_HELP,
					End,
				End,
			End,
			Child, VGroup,
				MUIA_HelpNode, "conf-events",
				Child, NListviewObject,
					MUIA_NListview_NList, EventList = NListObject,
						InputListFrame,
						MUIA_NList_SourceArray, events,
					End,
				End,
				Child, ColGroup(2),
					Child, Label2(MSG_PRF_COMMAND),
					Child, EventScriptString = PopaslObject,
						MUIA_Popstring_String, TextinputObject,
							StringFrame,
                            MUIA_Textinput_Multiline, FALSE,
							MUIA_String_MaxLen, 256,
							MUIA_CycleChain, 1,
							MUIA_ShortHelp, MSG_PRF_COMMAND_HELP,
						End,
						MUIA_Popstring_Button, PopButton(MUII_PopFile),
						MUIA_Popasl_Type, ASL_FileRequest,
						ASLFR_TitleText, MSG_PRF_SCRIPT_REQ,
					End,
					Child, Label2(MSG_PRF_SOUND),
					Child, HGroup,
						Child, EventSoundString = PopaslObject,
							MUIA_HorizWeight, 300,
							MUIA_Popstring_String, TextinputObject,
								StringFrame,
                                MUIA_Textinput_Multiline, FALSE,
								MUIA_String_MaxLen, 256,
								MUIA_CycleChain, 1,
							End,
							MUIA_Popstring_Button, PopButton(MUII_PopFile),
							MUIA_Popasl_Type, ASL_FileRequest,
							ASLFR_TitleText, MSG_PRF_SOUND_REQ,
						End,
						Child, EventTestButton = SimpleButton(MSG_PRF_SOUNDTEST_GAD),
					End,
				End,
			End,
			Child, VGroup,
				Child, VGroup, GroupFrameT(MSG_PRF_NETWORK_FRAME),
					Child, ColGroup(2),
						MUIA_HelpNode, "conf-adv",
						Child, Label2(MSG_PRF_MAINSERVER),
						Child, HGroup,
							Child, MetaServerString = TextinputObject,
								StringFrame,
                                MUIA_Textinput_Multiline, FALSE,
								MUIA_String_AdvanceOnCR, TRUE,
								MUIA_CycleChain, 1,
                                MUIA_String_Accept, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-",
								MUIA_ShortHelp, MSG_PRF_MAINSERVER_HELP,
							End,
							Child, Label2(MSG_PRF_SERVER_PORT),
							Child, ST_MetaPort = TextinputObject,
								StringFrame,
                                MUIA_Textinput_Multiline, FALSE,
								MUIA_HorizWeight, 45,
								MUIA_String_Integer, prf->MetaPort,
								MUIA_String_Accept, "0123456789",
								MUIA_String_MaxLen, 6,
								MUIA_CycleChain, 1,
							End,
						End,
						Child, Label2(MSG_PRF_MP3SERVER),
						Child, HGroup,
							Child, ServerString = TextinputObject,
								StringFrame,
                                MUIA_Textinput_Multiline, FALSE,
								MUIA_String_AdvanceOnCR, TRUE,
								MUIA_CycleChain, 1,
                                MUIA_String_Accept, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-",
								MUIA_ShortHelp, MSG_PRF_MP3SERVER_HELP,
							End,
							Child, Label2(MSG_PRF_SERVER_PORT),
							Child, ST_LeafPort = TextinputObject,
								StringFrame,
                                MUIA_Textinput_Multiline, FALSE,
								MUIA_HorizWeight, 45,
								MUIA_String_Accept, "0123456789",
								MUIA_String_MaxLen, 6,
								MUIA_CycleChain, 1,
							End,
						End,
						Child, Label2(MSG_PRF_LISTENPORT),
						Child, HGroup,
							Child, PortString = TextinputObject,
								StringFrame,
                                MUIA_Textinput_Multiline, FALSE,
								MUIA_HorizWeight, 90,
								MUIA_String_Integer, prf->port,
								MUIA_String_Accept, "0123456789",
								MUIA_String_MaxLen, 6,
								MUIA_CycleChain, 1,
								MUIA_ShortHelp, MSG_PRF_LISTENPORT_HELP,
							End,
							Child, Label2(MSG_PRF_BEHINDFW),
							Child, FirewallToggle = ImageObject,
								ButtonFrame,
								MUIA_HorizWeight, 10,
								MUIA_Background, MUII_ButtonBack,
								MUIA_InputMode, MUIV_InputMode_Toggle,
								MUIA_ShowSelState, FALSE,
								MUIA_Image_Spec, "6:15",
								MUIA_Selected, FALSE,
								MUIA_ShortHelp, MSG_PRF_BEHINDFW_HELP,
							End,
						End,
					End,
				End,
				Child, VGroup, GroupFrameT(MSG_PRF_TRANSFER_FRAME),
					Child, ColGroup(4),
						Child, Label2(MSG_PRF_DLQUEUE),
						Child, DownloadQueueSlider = NewObject(QueueClass->mcc_Class, 0,
							MUIA_Slider_Min, 1,
							MUIA_Slider_Max, 26,
							MUIA_Numeric_Value, 26,
							MUIA_CycleChain, 1,
							MUIA_ShortHelp, MSG_PRF_DLQUEUE_HELP,
							TAG_DONE),
						Child, Label2(MSG_PRF_TASKPRI),
						Child, DownloadPriSlider = NumericbuttonObject,
							MUIA_Numeric_Min, -128,
							MUIA_Numeric_Max, 0,
							MUIA_ShortHelp, MSG_PRF_TASKPRI_HELP,
						End,
						Child, Label2(MSG_PRF_ULQUEUE),
						Child, UploadQueueSlider = NewObject(QueueClass->mcc_Class, 0,
							MUIA_Slider_Min, 0,
							MUIA_Slider_Max, 26,
							MUIA_Numeric_Value, 5,
							MUIA_CycleChain, 1,
							MUIA_ShortHelp, MSG_PRF_ULQUEUE_HELP,
							TAG_DONE),
						Child, Label2(MSG_PRF_TASKPRI),
						Child, UploadPriSlider = NumericbuttonObject,
							MUIA_Numeric_Min, -128,
							MUIA_Numeric_Max, 0,
							MUIA_ShortHelp, MSG_PRF_TASKPRI_HELP,
						End,
					End,
					Child, HGroup,
						Child, Label2(MSG_PRF_RETRIES),
						Child, ST_QueueRetries = TextinputObject,
							StringFrame,
                            MUIA_Textinput_Multiline, FALSE,
							MUIA_String_Integer, prf->QueueRetries,
							MUIA_String_Accept, "0123456789",
							MUIA_String_MaxLen, 6,
							MUIA_CycleChain, 1,
							MUIA_ShortHelp, MSG_PRF_RETRIES_HELP,
						End,
						Child, Label2(MSG_PRF_RETRYDELAY),
						Child, ST_QueueDelay = TextinputObject,
							StringFrame,
                            MUIA_Textinput_Multiline, FALSE,
							MUIA_String_Integer, prf->QueueDelay,
							MUIA_String_Accept, "0123456789",
							MUIA_String_MaxLen, 6,
							MUIA_CycleChain, 1,
							MUIA_ShortHelp, MSG_PRF_RETRYDELAY_HELP,
						End,
					End,
				End,
			End,
			End,
			Child, HGroup,
				Child, SaveButton   = SimpleButton(MSG_PRF_SAVE_GAD  ),
				Child, UseButton    = SimpleButton(MSG_PRF_USE_GAD   ),
				Child, CancelButton = SimpleButton(MSG_PRF_CANCEL_GAD),
			End,

		End,
		TAG_MORE, msg->ops_AttrList))
	{
		data = INST_DATA(cl,obj);

		data->UserString          = UserString;
		data->PasswordString      = PasswordString;
		data->EMailString         = EMailString;
		data->TG_BypassReg        = TG_BypassReg;
		data->DownloadPathString  = DownloadPathString;
		data->LinkSpeedCycle      = LinkSpeedCycle;

		data->ClearListToggle     = ClearListToggle;
		data->AutoConnectToggle   = AutoConnectToggle;
		data->AskFileToggle       = AskFileToggle;
		data->AutoSaveToggle      = AutoSaveToggle;
		data->AutoAddToggle       = AutoAddToggle;
		data->LampCycle           = LampCycle;
		data->CY_ServerList       = CY_ServerList;
		data->CY_AutoCleanup      = CY_AutoCleanup;
		data->ST_NameLength       = ST_NameLength;

		data->EventList           = EventList;
		data->EventScriptString   = EventScriptString;
		data->EventSoundString    = EventSoundString;

		data->MetaServerString    = MetaServerString;
		data->ServerString        = ServerString;
		data->ST_MetaPort         = ST_MetaPort;
		data->ST_LeafPort         = ST_LeafPort;
		data->PortString          = PortString;
		data->FirewallToggle      = FirewallToggle;
		data->DownloadQueueSlider = DownloadQueueSlider;
		data->DownloadPriSlider   = DownloadPriSlider;
		data->UploadQueueSlider   = UploadQueueSlider;
		data->UploadPriSlider     = UploadPriSlider;
		data->ST_QueueRetries     = ST_QueueRetries;
		data->ST_QueueDelay       = ST_QueueDelay;

		data->lastitem = -1;

		DoMethod(EMailButton,     MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, PRF_UPDATE);
		DoMethod(EventList,       MUIM_Notify, MUIA_NList_EntryClick, MUIV_EveryTime, obj, 1, PRF_ENTRY);
		DoMethod(EventTestButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, PRF_TESTSND);
		DoMethod(FirewallToggle,  MUIM_Notify, MUIA_Selected, MUIV_EveryTime, data->PortString, 3, MUIM_Set, MUIA_Disabled, MUIV_TriggerValue);

		DoMethod(ST_QueueDelay,   MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime, obj, 1, PRF_VALIDDELAY);

		DoMethod(SaveButton,     MUIM_Notify, MUIA_Pressed, FALSE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_SAVE  );
		DoMethod(UseButton,      MUIM_Notify, MUIA_Pressed, FALSE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_USE   );
		DoMethod(CancelButton,   MUIM_Notify, MUIA_Pressed, FALSE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_CANCEL);

		DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_CANCEL);

		return((ULONG)obj);
	}
	return(0);
}


void prf_set(struct prfdata *data)
{
	set(data->UserString,         MUIA_String_Contents, prf->user);
	set(data->PasswordString,     MUIA_String_Contents, prf->pass);
	set(data->EMailString,        MUIA_String_Contents, prf->email);
	set(data->TG_BypassReg,       MUIA_Selected,        prf->BypassRegistration);
	set(data->DownloadPathString, MUIA_String_Contents, prf->dlpath);
	set(data->LinkSpeedCycle,     MUIA_Cycle_Active,    prf->link);

	set(data->ClearListToggle,   MUIA_Selected,       prf->clrlist);
	set(data->AutoConnectToggle, MUIA_Selected,       prf->autocon);
	set(data->AskFileToggle,     MUIA_Selected,       prf->askfile);
	set(data->AutoAddToggle,     MUIA_Selected,       prf->autoadd);
	set(data->AutoSaveToggle,    MUIA_Selected,       prf->autosave);
	set(data->LampCycle,         MUIA_Cycle_Active,   prf->lamps);
	set(data->CY_ServerList,     MUIA_Cycle_Active,   prf->ServerList);
	set(data->CY_AutoCleanup,    MUIA_Cycle_Active,   prf->AutoCleanup);
	set(data->ST_NameLength,     MUIA_String_Integer, prf->NameLength);

	set(data->MetaServerString, MUIA_String_Contents, prf->MetaServer);
	set(data->ST_MetaPort,      MUIA_String_Integer,  prf->MetaPort);
	set(data->ServerString,     MUIA_String_Contents, prf->LeafServer);
	set(data->ST_LeafPort,      MUIA_String_Integer,  prf->LeafPort);
	set(data->PortString, MUIA_String_Integer, prf->port);
	if (prf->port)
		set(data->FirewallToggle, MUIA_Selected, FALSE);
	else {
		set(data->FirewallToggle, MUIA_Selected, TRUE);
		set(data->PortString, MUIA_String_Integer, PRF_DEFAULT_PORT);
	}
	set(data->DownloadQueueSlider, MUIA_Numeric_Value,  prf->DownloadQueueLimit);
	set(data->DownloadPriSlider,   MUIA_Numeric_Value,  prf->DownloadTaskPri   );
	set(data->UploadQueueSlider,   MUIA_Numeric_Value,  prf->UploadQueueLimit  );
	set(data->UploadPriSlider,     MUIA_Numeric_Value,  prf->UploadTaskPri     );
	set(data->ST_QueueRetries,     MUIA_String_Integer, prf->QueueRetries      );
	set(data->ST_QueueDelay,       MUIA_String_Integer, prf->QueueDelay        );
}


void prf_use(struct prfdata *data)
{
	u_long tmp, tmp2;

	/* Advanced */

	GetAttr(MUIA_String_Contents, data->MetaServerString, &tmp);
	if (((char*)tmp)[0]==0) prf->MetaServer=NULL; else prf->MetaServer=strdup((char*)tmp);
	GetAttr(MUIA_String_Integer, data->ST_MetaPort, &tmp);
	if ((int)tmp < 65536) prf->MetaPort = (int)tmp;
	else prf->MetaPort = 65535;

	GetAttr(MUIA_String_Contents, data->ServerString, &tmp);
	if (((char*)tmp)[0]==0) prf->LeafServer=NULL; else prf->LeafServer=strdup((char*)tmp);
	GetAttr(MUIA_String_Integer, data->ST_LeafPort, &tmp);
	if ((int)tmp < 65536) prf->LeafPort = (int)tmp;
	else prf->LeafPort = 65535;

	GetAttr(MUIA_Selected, data->FirewallToggle, &tmp);
	if (!tmp) {
		GetAttr(MUIA_String_Integer, data->PortString, &tmp);
		if ((int)tmp < 65536) prf->port = (int)tmp;
		else prf->port = 65535;
	}
	else prf->port = 0;

	GetAttr(MUIA_Numeric_Value, data->DownloadQueueSlider, &tmp);
	if (tmp > prf->DownloadQueueLimit) {
		/* Limit was raised, so we check the queue right away */
		prf->DownloadQueueLimit = tmp;
		DoMethod(gui->dwin, DL_CHECKQUEUE);
	}
	else prf->DownloadQueueLimit = tmp;

	GetAttr(MUIA_Numeric_Value, data->DownloadPriSlider, &tmp);
	prf->DownloadTaskPri = tmp;

	GetAttr(MUIA_Numeric_Value, data->UploadQueueSlider, &tmp);
	prf->UploadQueueLimit = tmp;

	GetAttr(MUIA_Numeric_Value, data->UploadPriSlider, &tmp);
	prf->UploadTaskPri = tmp;

	GetAttr(MUIA_String_Integer, data->ST_QueueRetries, &tmp);
	prf->QueueRetries = (int)tmp;

	GetAttr(MUIA_String_Integer, data->ST_QueueDelay, &tmp);
	if ((int)tmp > 0) {
		prf->QueueDelay = (int)tmp;
		DoMethod(gui->dwin, DL_SETDELAY, prf->QueueDelay);
	}

	/* User */

	GetAttr(MUIA_String_Contents, data->UserString, &tmp);
	if (((char*)tmp)[0]==0) prf->user=NULL; else prf->user=strdup((char*)tmp);

	GetAttr(MUIA_String_Contents, data->PasswordString, &tmp);
	if (((char*)tmp)[0]==0) prf->pass=NULL; else prf->pass=strdup((char*)tmp);

	GetAttr(MUIA_String_Contents, data->EMailString, &tmp);
	if (((char*)tmp)[0]==0) prf->email=NULL; else prf->email=strdup((char*)tmp);

	GetAttr(MUIA_Selected, data->TG_BypassReg, &tmp);
	prf->BypassRegistration = tmp;

	GetAttr(MUIA_String_Contents, data->DownloadPathString, &tmp);
	if (((char *)tmp)[0] == 0) prf->dlpath=NULL;
	else {
		prf->dlpath=strdup((char*)tmp);
		DoMethod(gui->shwin, SHARE_SETDIR, prf->dlpath);
	}

	/* Options */

	GetAttr(MUIA_Cycle_Active, data->LinkSpeedCycle, &tmp);
	prf->link = tmp;

	GetAttr(MUIA_Selected, data->ClearListToggle, &tmp);
	prf->clrlist = tmp;

	GetAttr(MUIA_Selected, data->AutoConnectToggle, &tmp);
	prf->autocon = tmp;

	GetAttr(MUIA_Selected, data->AskFileToggle, &tmp);
	prf->askfile = tmp;

	GetAttr(MUIA_Selected, data->AutoAddToggle, &tmp);
	prf->autoadd = tmp;

	GetAttr(MUIA_Selected, data->AutoSaveToggle, &tmp);
	prf->autosave = tmp;

	GetAttr(MUIA_Cycle_Active, data->LampCycle, &tmp);
	prf->lamps = tmp;

	GetAttr(MUIA_Cycle_Active, data->CY_AutoCleanup, &tmp);
	prf->AutoCleanup = tmp;

	GetAttr(MUIA_Cycle_Active, data->CY_ServerList, &tmp);
	prf->ServerList = tmp;

	GetAttr(MUIA_String_Integer, data->ST_NameLength, &tmp);
	if ((int)tmp > 7 && (int)tmp < 108) prf->NameLength = (int)tmp;

	/* Events */

	GetAttr(MUIA_NList_Active, data->EventList, &tmp);
	if (tmp != MUIV_NList_Active_Off) {
		if (prf_eventflags[tmp]&1) {
			GetAttr(MUIA_String_Contents, data->EventScriptString, &tmp2);
			if (((char*)tmp2)[0]==0) prf->scripts[tmp]=NULL;
			else prf->scripts[tmp]=strdup((char*)tmp2);
		}
		if (prf_eventflags[tmp]&2) {
			GetAttr(MUIA_String_Contents, data->EventSoundString, &tmp2);
			if (((char*)tmp2)[0]==0) prf->sounds[tmp]=NULL;
			else prf->sounds[tmp]=strdup((char*)tmp2);
		}
	}

	prf_save("ENV:"AMSTER_PREFS);
}


void prf_setup(int argc, char *argv[])
{
	memset(prf,0,sizeof(struct prefsdata));

	/* defaults */
	prf->MetaServer = "server.napster.com";
	prf->MetaPort = 8875;
	prf->napvers = "Amster "AMSTER_VERSION;
	prf->port = PRF_DEFAULT_PORT;
	prf->email = "anon@napster.com";
	prf->BypassRegistration = FALSE;
	prf->dlpath = "SYS:";
	prf->link = 0;
	prf->NameLength = 107;
	prf->DownloadQueueLimit = 26;
	prf->UploadQueueLimit = 2;
	prf->UploadTaskPri = -1;
	prf->QueueRetries = 180;
	prf->QueueDelay = 20;
	prf->regflag = 1;	/*  >:)  */
	prf->noiconpanel = 1;
}


BOOL prf_load(char *fname)
{
	FILE *f;
	char tmp[100], *s, *c;
	int i;
	u_long t;

	f=fopen(fname,"r");
	if(f==0) return FALSE;

	while (fgets(tmp, sizeof(tmp), f)) {
		s = strtok(tmp," ");
		if (!s) {
			continue;
		}
		else if (strcmp(s, "<search>")==0) {
			while(fgets(tmp, sizeof(tmp), f)) {
				s = &tmp[0];
				c = nap_token(&s);
				if (!c) continue;
				else if(strcmp(c,"</search>")==0) break;
				else if(strcmp(c,"max")==0) {
					t = nap_ltoken(&s);
					if(t>2 && t<1000) prf->max = t;
				}
				else if(strcmp(c,"advopts")==0) {
					prf->speedqual   = nap_ltoken(&s);
					prf->speedval    = nap_ltoken(&s);
					prf->bitratequal = nap_ltoken(&s);
					prf->bitrateval  = nap_ltoken(&s);
					prf->freqqual    = nap_ltoken(&s);
					prf->freqval     = nap_ltoken(&s);
				}
			}
		} else if(strcmp(s,"iconpanel")==0) {
			prf->noiconpanel = 0;
		} else if(strcmp(s,"metaserver")==0) {
			if(s=strtok(NULL,"\n")) prf->MetaServer=strdup(s);
		} else if(strcmp(s,"leafserver")==0) {
			if(s=strtok(NULL,"\n")) prf->LeafServer=strdup(s);
		} else if(strcmp(s,"metaport")==0) {
			if(s=strtok(NULL,"\n")) prf->MetaPort = atoi(s);
		} else if(strcmp(s,"leafport")==0) {
			if(s=strtok(NULL,"\n")) prf->LeafPort = atoi(s);
		} else if(strcmp(s,"listport")==0) {
			if(s=strtok(NULL,"\n")) prf->port = atoi(s);
		} else if(strcmp(s,"downloadqueue")==0) {
			if(s=strtok(NULL,"\n")) prf->DownloadQueueLimit = atoi(s);
		} else if(strcmp(s,"downloadpriority")==0) {
			if(s=strtok(NULL,"\n")) prf->DownloadTaskPri = atoi(s);
		} else if(strcmp(s,"uploadqueue")==0) {
			if(s=strtok(NULL,"\n")) prf->UploadQueueLimit = atoi(s);
		} else if(strcmp(s,"uploadpriority")==0) {
			if(s=strtok(NULL,"\n")) prf->UploadTaskPri = atoi(s);
		} else if(strcmp(s,"queueretries")==0) {
			if(s=strtok(NULL,"\n")) prf->QueueRetries = atoi(s);
		} else if(strcmp(s,"queuedelay")==0) {
			if(s=strtok(NULL,"\n")) {
				t = atoi(s);
				if (t > 0) prf->QueueDelay = t;
			}

		}
		else if (strcmp(s,"script")==0) {
			if (s=strtok(NULL," ")) {
				if (strcmp(s, "startup") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_STARTUP] = strdup(s);
				} else if (strcmp(s, "exit") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_EXIT] = strdup(s);
				} else if (strcmp(s, "connect") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_CONNECT] = strdup(s);
				} else if (strcmp(s, "disconnect") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_DISCONNECT] = strdup(s);
				} else if (strcmp(s, "downloadstart") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_DLSTART] = strdup(s);
				} else if (strcmp(s, "uploadstart") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_ULSTART] = strdup(s);
				} else if (strcmp(s, "dlfinish") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_DLFINISH] = strdup(s);
				} else if (strcmp(s, "ulfinish") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_ULFINISH] = strdup(s);
				} else if (strcmp(s, "downloaderror") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_DLERROR] = strdup(s);
				} else if (strcmp(s, "uploaderror") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_ULERROR] = strdup(s);
				} else if (strcmp(s, "transerror") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_DLERROR] = strdup(s); /* FOR BACKWARDS COMPATIBILITY ONLY! */
					prf->scripts[PRFE_ULERROR] = strdup(s); /* FOR BACKWARDS COMPATIBILITY ONLY! */
				} else if (strcmp(s, "downloadabort") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_DLABORT] = strdup(s);
				} else if (strcmp(s, "uploadabort") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_ULABORT] = strdup(s);
				} else if (strcmp(s, "incomingmsg") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_INMSG] = strdup(s);
				} else if (strcmp(s, "librarydoubleclick") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_LIB_DCLICK] = strdup(s);
				} else if (strcmp(s, "downloaddoubleclick") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_DL_DCLICK] = strdup(s);
				} else if (strcmp(s, "mp3play") == 0 && (s = strtok(NULL, "\n"))) {
					prf->scripts[PRFE_PLAYMP3] = strdup(s);
				}
			}

		}
		else if (strcmp(s,"sound")==0) {
			if (s=strtok(NULL," ")) {
				/* Old */
				i = atoi(s);
				if (i>0 && i<8 && (s=strtok(NULL,"\n")))
					prf->sounds[i-1] = strdup(s);
				/* New */
				else {
					if (strcmp(s, "startup") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_STARTUP] = strdup(s);
					} else if (strcmp(s, "exit") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_EXIT] = strdup(s);
					} else if (strcmp(s, "connect") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_CONNECT] = strdup(s);
					} else if (strcmp(s, "disconnect") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_DISCONNECT] = strdup(s);
					} else if (strcmp(s, "downloadstart") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_DLSTART] = strdup(s);
					} else if (strcmp(s, "uploadstart") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_ULSTART] = strdup(s);
					} else if (strcmp(s, "dlfinish") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_DLFINISH] = strdup(s);
					} else if (strcmp(s, "ulfinish") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_ULFINISH] = strdup(s);
					} else if (strcmp(s, "downloaderror") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_DLERROR] = strdup(s);
					} else if (strcmp(s, "uploaderror") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_ULERROR] = strdup(s);
					} else if (strcmp(s, "transerror") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_DLERROR] = strdup(s); /* FOR BACKWARDS COMPATIBILITY ONLY! */
						prf->sounds[PRFE_ULERROR] = strdup(s); /* FOR BACKWARDS COMPATIBILITY ONLY! */
					} else if (strcmp(s, "downloadabort") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_DLABORT] = strdup(s);
					} else if (strcmp(s, "uploadabort") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_ULABORT] = strdup(s);
					} else if (strcmp(s, "incomingmsg") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_INMSG] = strdup(s);
					} else if (strcmp(s, "librarydoubleclick") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_LIB_DCLICK] = strdup(s);
					} else if (strcmp(s, "downloaddoubleclick") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_DL_DCLICK] = strdup(s);
					} else if (strcmp(s, "mp3play") == 0 && (s = strtok(NULL, "\n"))) {
						prf->sounds[PRFE_PLAYMP3] = strdup(s);
					}
				}

			}

		} else if(strcmp(s,"user")==0) {
			if(s=strtok(NULL,"\n")) prf->user=strdup(s);
		} else if(strcmp(s,"pass")==0) {
			if(s=strtok(NULL,"\n")) prf->pass=strdup(s);
		} else if(strcmp(s,"email")==0) {
			if(s=strtok(NULL,"\n")) prf->email=strdup(s);
		} else if(strcmp(s,"bypassreg")==0) {
			prf->BypassRegistration = TRUE;
		} else if(strcmp(s,"dlpath")==0) {
			if(s=strtok(NULL,"\n")) prf->dlpath=strdup(s);
		} else if(strcmp(s,"linktype")==0) {
			if(s=strtok(NULL,"\n")) prf->link=atoi(s);
		} else if(strcmp(s,"optclrlist")==0) {
			prf->clrlist = 1;
		} else if(strcmp(s,"autoconnect")==0) {
			prf->autocon = 1;
		} else if(strcmp(s,"fullpath")==0) {
			prf->fullpath = 1;
		} else if(strcmp(s,"alwaysaskfilename")==0) {
			prf->askfile = 1;
		} else if(strcmp(s,"autoaddshares")==0) {
			prf->autoadd = 1;
		} else if(strcmp(s,"autosaveshares")==0) {
			prf->autosave = 1;
		} else if(strcmp(s,"lamptype")==0) {
			if(s=strtok(NULL,"\n")) prf->lamps=atoi(s);
		} else if(strcmp(s,"autocleanup")==0) {
			if(s=strtok(NULL,"\n")) prf->AutoCleanup=atoi(s);
		} else if(strcmp(s,"serverlist")==0) {
			if(s=strtok(NULL,"\n")) prf->ServerList=atoi(s);
		} else if(strcmp(s,"namelength")==0) {
			if(s=strtok(NULL,"\n")) {
				t = atoi(s);
				if (t > 7 && t < 108) prf->NameLength = t;
			}
		}
	}
	fclose(f);

	return TRUE;
}


void prf_save(char *fname)
{
	FILE *f;
	u_long tmp;

	f=fopen(fname,"w");
	if(f==0) {
		gui_debug((char *)MSG_ERROR_SAVE);
		return;
	}

	GetAttr(MUIA_Menuitem_Checked,gui->iconpanelmenu,&tmp);
	if (tmp==TRUE) fprintf(f,"iconpanel \n");

	/* Advanced */
	if (prf->MetaServer) fprintf(f, "metaserver %s\n", prf->MetaServer);
	if (prf->MetaPort)   fprintf(f, "metaport %d\n",   prf->MetaPort);
	if (prf->LeafServer) fprintf(f, "leafserver %s\n", prf->LeafServer);
	if (prf->LeafPort)   fprintf(f, "leafport %d\n",   prf->LeafPort);
	fprintf(f, "listport %d\n", prf->port);
	fprintf(f, "downloadqueue %d\n", prf->DownloadQueueLimit);
	fprintf(f, "downloadpriority %d\n", prf->DownloadTaskPri);
	fprintf(f, "uploadqueue %d\n", prf->UploadQueueLimit);
	fprintf(f, "uploadpriority %d\n", prf->UploadTaskPri);
	fprintf(f, "queueretries %d\n", prf->QueueRetries);
	fprintf(f, "queuedelay %d\n", prf->QueueDelay);

	/* User */
	if (prf->user) fprintf(f,"user %s\n",prf->user);
	if (prf->pass) fprintf(f,"pass %s\n",prf->pass);
	if (prf->email) fprintf(f,"email %s\n",prf->email);
	if (prf->BypassRegistration) fprintf(f, "bypassreg \n");
	if (prf->dlpath) fprintf(f,"dlpath %s\n",prf->dlpath);
	fprintf(f,"linktype %d\n",prf->link);

	/* Options */
	if (prf->clrlist) fprintf(f,"optclrlist \n");
	if (prf->autocon) fprintf(f,"autoconnect \n");
	if (prf->fullpath) fprintf(f,"fullpath \n");
	if (prf->askfile) fprintf(f,"alwaysaskfilename \n");
	if (prf->autoadd) fprintf(f,"autoaddshares \n");
	if (prf->autosave) fprintf(f,"autosaveshares \n");
	fprintf(f, "lamptype %d\n", prf->lamps);
	fprintf(f, "autocleanup %d\n", prf->AutoCleanup);
	fprintf(f, "serverlist %d\n", prf->ServerList);
	fprintf(f, "namelength %d\n", prf->NameLength);

	/* Events */
	if (prf->scripts[PRFE_STARTUP])    fprintf(f, "script startup %s\n",             prf->scripts[PRFE_STARTUP]   );
	if (prf->sounds[PRFE_STARTUP])     fprintf(f, "sound startup %s\n",              prf->sounds[PRFE_STARTUP]    );
	if (prf->scripts[PRFE_EXIT])       fprintf(f, "script exit %s\n",                prf->scripts[PRFE_EXIT]      );
	if (prf->sounds[PRFE_EXIT])        fprintf(f, "sound exit %s\n",                 prf->sounds[PRFE_EXIT]       );
	if (prf->scripts[PRFE_CONNECT])    fprintf(f, "script connect %s\n",             prf->scripts[PRFE_CONNECT]   );
	if (prf->sounds[PRFE_CONNECT])     fprintf(f, "sound connect %s\n",              prf->sounds[PRFE_CONNECT]    );
	if (prf->scripts[PRFE_DISCONNECT]) fprintf(f, "script disconnect %s\n",          prf->scripts[PRFE_DISCONNECT]);
	if (prf->sounds[PRFE_DISCONNECT])  fprintf(f, "sound disconnect %s\n",           prf->sounds[PRFE_DISCONNECT] );
	if (prf->scripts[PRFE_DLSTART] )   fprintf(f, "script downloadstart %s\n",       prf->scripts[PRFE_DLSTART]   );
	if (prf->sounds[PRFE_DLSTART])     fprintf(f, "sound downloadstart %s\n",        prf->sounds[PRFE_DLSTART]    );
	if (prf->scripts[PRFE_ULSTART] )   fprintf(f, "script uploadstart %s\n",         prf->scripts[PRFE_ULSTART]   );
	if (prf->sounds[PRFE_ULSTART])     fprintf(f, "sound uploadstart %s\n",          prf->sounds[PRFE_ULSTART]    );
	if (prf->scripts[PRFE_DLFINISH])   fprintf(f, "script dlfinish %s\n",            prf->scripts[PRFE_DLFINISH]  );
	if (prf->sounds[PRFE_DLFINISH])    fprintf(f, "sound dlfinish %s\n",             prf->sounds[PRFE_DLFINISH]   );
	if (prf->scripts[PRFE_ULFINISH])   fprintf(f, "script ulfinish %s\n",            prf->scripts[PRFE_ULFINISH]  );
	if (prf->sounds[PRFE_ULFINISH])    fprintf(f, "sound ulfinish %s\n",             prf->sounds[PRFE_ULFINISH]   );
	if (prf->scripts[PRFE_DLERROR])    fprintf(f, "script downloaderror %s\n",       prf->scripts[PRFE_DLERROR]   );
	if (prf->sounds[PRFE_DLERROR])     fprintf(f, "sound downloaderror %s\n",        prf->sounds[PRFE_DLERROR]    );
	if (prf->scripts[PRFE_ULERROR])    fprintf(f, "script uploaderror %s\n",         prf->scripts[PRFE_ULERROR]   );
	if (prf->sounds[PRFE_ULERROR])     fprintf(f, "sound uploaderror %s\n",          prf->sounds[PRFE_ULERROR]    );
	if (prf->scripts[PRFE_DLABORT])    fprintf(f, "script downloadabort %s\n",       prf->scripts[PRFE_DLABORT]   );
	if (prf->sounds[PRFE_DLABORT])     fprintf(f, "sound downloadabort %s\n",        prf->sounds[PRFE_DLABORT]    );
	if (prf->scripts[PRFE_ULABORT])    fprintf(f, "script uploadabort %s\n",         prf->scripts[PRFE_ULABORT]   );
	if (prf->sounds[PRFE_ULABORT])     fprintf(f, "sound uploadabort %s\n",          prf->sounds[PRFE_ULABORT]    );
	if (prf->scripts[PRFE_INMSG])      fprintf(f, "script incomingmsg %s\n",         prf->scripts[PRFE_INMSG]     );
	if (prf->sounds[PRFE_INMSG])       fprintf(f, "sound incomingmsg %s\n",          prf->sounds[PRFE_INMSG]      );
	if (prf->scripts[PRFE_LIB_DCLICK]) fprintf(f, "script librarydoubleclick %s\n",  prf->scripts[PRFE_LIB_DCLICK]);
	if (prf->sounds[PRFE_LIB_DCLICK])  fprintf(f, "sound librarydoubleclick %s\n",   prf->sounds[PRFE_LIB_DCLICK] );
	if (prf->scripts[PRFE_DL_DCLICK])  fprintf(f, "script downloaddoubleclick %s\n", prf->scripts[PRFE_LIB_DCLICK]);
	if (prf->sounds[PRFE_DL_DCLICK])   fprintf(f, "sound downloaddoubleclick %s\n",  prf->sounds[PRFE_LIB_DCLICK] );
	if (prf->scripts[PRFE_PLAYMP3])    fprintf(f, "script mp3play %s\n",             prf->scripts[PRFE_PLAYMP3]   );
	if (prf->sounds[PRFE_PLAYMP3])     fprintf(f, "sound mp3play %s\n",              prf->sounds[PRFE_PLAYMP3]    );

	DoMethod(gui->searchpanel, SEARCH_GET);

	fprintf(f,"<search> \n");
	fprintf(f,"advopts");
	fprintf(f," %d",prf->speedqual);
	fprintf(f," %d",prf->speedval);
	fprintf(f," %d",prf->bitratequal);
	fprintf(f," %d",prf->bitrateval);
	fprintf(f," %d",prf->freqqual);
	fprintf(f," %d\n",prf->freqval);
	fprintf(f,"max %d\n",prf->max);
	fprintf(f,"</search>\n");

	fclose(f);
}


void prf_entry(struct prfdata *data)
{
	u_long tmp,tmp2;

	GetAttr(MUIA_NList_EntryClick, data->EventList, &tmp);
	set(data->EventScriptString, MUIA_Disabled, FALSE);
	set(data->EventSoundString,  MUIA_Disabled, FALSE);
	if (tmp==-1 || tmp==-2) return;

	if (data->lastitem != -1) {
		int i = data->lastitem;
		if (prf_eventflags[i]&1) {
			GetAttr(MUIA_String_Contents, data->EventScriptString, &tmp2);
			if (((char*)tmp2)[0]==0) prf->scripts[i]=NULL;
			else prf->scripts[i]=strdup((char*)tmp2);
		}
		if (prf_eventflags[i]&2) {
			GetAttr(MUIA_String_Contents, data->EventSoundString, &tmp2);
			if (((char*)tmp2)[0]==0) prf->sounds[i]=NULL;
			else prf->sounds[i]=strdup((char*)tmp2);
		}
	}
	data->lastitem = tmp;

	set(data->EventScriptString, MUIA_String_Contents, prf->scripts[tmp]);
	set(data->EventSoundString,  MUIA_String_Contents, prf->sounds[tmp]);

	if (!(prf_eventflags[tmp]&1))
		set(data->EventScriptString, MUIA_Disabled, TRUE);
	if (!(prf_eventflags[tmp]&2))
		set(data->EventSoundString, MUIA_Disabled, TRUE);
}


void prf_event(enum Event no, ...)
{
	char *tmp, *command;
	char buf[1024];
	va_list ap;
	BOOL alloc = FALSE;
	u_long stmp;

	if (prf_eventflags[no]&2 && prf->sounds[no])
		snd_play(prf->sounds[no]);

	if (prf_eventflags[no]&1 && prf->scripts[no]) {
		va_start(ap, no);
		sprintf(buf, "Run <>NIL: %s", prf->scripts[no]);

		switch (no) {
			case PRFE_DLSTART:
			case PRFE_ULSTART:
			case PRFE_DLFINISH:
			case PRFE_ULFINISH:
			case PRFE_DLERROR:
			case PRFE_ULERROR:
			case PRFE_DLABORT:
			case PRFE_ULABORT:
			case PRFE_LIB_DCLICK:
			case PRFE_DL_DCLICK:
			case PRFE_PLAYMP3:
				if (command = strrep(buf, "%f", va_arg(ap, char *))) alloc = TRUE;
				break;
			case PRFE_CONNECT:
				{
				char port[6];

				if (tmp = strrep(buf, "%s", va_arg(ap, char *))) {
					sprintf(port, "%ld", va_arg(ap, int));
					if (command = strrep(tmp, "%p", port)) alloc = TRUE;
					free(tmp);
				}
				break;
				}
			case PRFE_INMSG:
				{
				if (tmp = strrep(buf, "%u", va_arg(ap, char *))) {
					if (command = strrep(tmp, "%m", va_arg(ap, char *))) alloc = TRUE;
					free(tmp);
				}
				break;
				}
			default:
				command = buf;
		}

		va_end(ap);

		GetAttr(MUIA_Application_Base, gui->app, &stmp);
		if (tmp = strrep(command, "%a", (char *)stmp)) {
			if (alloc) free(command);
			command = tmp;
			alloc = TRUE;
		}

		if (command) {
			Execute(command, 0, 0);
			if (alloc) free(command);
		}
	}
}
