
/***************************************************************************
 *   Copyright (C) 1997 to 2004 by Jonathan Duddington                     *
 *   email: jonsd@users.sourceforge.net                                    *
 *                                                                         *
 *   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 3 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 see:                           *
 *               <http://www.gnu.org/licenses/>.                           *
 ***************************************************************************/

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

/* Edit: News/Mail prefs, Delivery, Misc prefs

*/

#include "dbox.h"
#include "event.h"
#include "os.h"
#include "wimp.h"
#include "werr.h"
#include "ctype.h"

#include "narc.h"
#include "hdrs.h"


extern OPTIONS options;
extern int dbox_menu_field;
extern wimp_menustr *wmenu_boxes_names;
extern BLIST mboxlist;
extern TEXTR *text_view;
extern int transport_opts;
extern TEXTR *text_data_record[N_TEXT_DATA];

extern wimp_menustr *wmenu_ntransports;
extern wimp_menustr *wmenu_mtransports;
extern wimp_menustr *wmenu_acks;
extern wimp_menustr *wmenu_edit_styles;
extern wimp_menustr *wmenu_confirm_delete;
extern wimp_menustr *wmenu_sig_styles;
extern wimp_menustr *wmenu_open_thread;
extern wimp_menustr *wmenu_skip_thread;
extern wimp_menustr *wmenu_crossposts;
extern wimp_menustr *wmenu_undelivered;
extern wimp_menustr *wmenu_undeliv_news;
extern wimp_menustr *wmenu_new_to_unread;

wimp_menustr *menu_fontlist;

static dbox dbox_options=NULL;
static dbox dbox_news=NULL;
static dbox dbox_misc=NULL;
static dbox dbox_delivery=NULL;


int options_dbox_field;


/* bit 0:  separate mail and envs files
   bit 1:  multiple raw mail files - path is a directory
   bit 2:  put CR and LF in outgoing mail messages
   bit 3:  ANT style mail
   bit 4:  "From " separator for mail, not "#! rmail"
   bit 5:  separate raw mail by . not #! rmail
   bit 6:  start envelope file with domain name (POP, POPSTAR)

   bit 7:  put CR LF in outgoing news messages
   bit 8:  separate raw news by . not #! rnews
   bit 9:  multiple raw news files - path is a directory
   bit 10: fetch indivual news articles by message_id
   bit 11: put CR and LF in outgoing mail messages

   bit 12: Voyager (turn off flashings)
*/


/*    Voy    NH     Ant   Term  FreeSMTP POPStar Hermes */
int ntransport_data[] = {0,0x1000,0x1600,0x0f80,0x0000,0x0000,0x0000};
int mtransport_data[] = {0,0x1001,0x0043,0x002e,0x0043,0x001b,0x1043,0x1043};



static char *ntransports[] = {"","Voyager","NewsHound","ANT","Termite",NULL};
static char *mtransports[] = {"","Voyager","POP","ANT","Termite","FreeSMTP","POPStar","Hermes",NULL};
static char *ack_names[] = {"None","Hold+Open","Hold","Send"};
static char *edit_style_names[] = {"Clipboard","WipeOut","!Edit"};
static char *confirm_delete_names[] = {"Confirm All","Confirm Locked","Allow All"};
static char *open_thread_names[] = {"No","1st Article","1st Unread"};
static char *skip_thread_names[] = {"Skip","Mark Read","Delete"};
static char *sig_style_names[] = {"None","Before--","Sig.Start","Sig.End"};
static char *crossposts_names[] = {"Don't Show","Set Read","Delete","Leave"};
static char *undelivered_names[] = {"Deliver","Leave","Discard"};
static char *new_to_unread_names[] = {"by Box","by Source","All","None"};




void redraw_whole_screen()
/************************/
{
	os_regset regs;

	regs.r[0] = -1;  /* whole screen */
	regs.r[1] = 0;
	regs.r[2] = 0;
	regs.r[3] = 2000;
	regs.r[4] = 1500;
	os_swix(0x4000d1,&regs);   /* Wimp_ForceRedraw */
}   /* end of redraw_whole_screen */






void options_font_selected(int *hits)
/***********************************/
/* Called from unknown_event_handler.  Bodge to get menu on dialogue box */
{

	int i;
	os_error *error;
	char name[128];

	if(hits[0] == 0)
	{
		dbox_setfield(dbox_options,options_dbox_field,"System Font");
		return;
	}

	error = os_swi6(0x600a0,0,(int)menu_fontlist,(int)hits,(int)name,sizeof(name),0);  /* Font_DecodeMenu */
	/* terminate at territory name */
	i=2;
	while(name[i] != 0)
	{
		if(name[i] == '\\')
			name[i] = 0;
		i++;
	}
	dbox_setfield(dbox_options,options_dbox_field,&name[2]);
}   /* end of options_font_selected */






void options_set_display()
/************************/
{
	int  i;
	int  value;
	int  font_opt;
	int  field;
	int *p;
	double x;
	OPTIONS_DISPLAY dopt;
	char buf[16];

	for(font_opt=0; font_opt<N_FONTS; font_opt++)
	{
		field = font_opt*5 + 2;
		dbox_getfield(dbox_options,field,dopt.font[font_opt].name,63);

		p = &dopt.font[font_opt].height;
		for(i=1; i<=3; i++)
		{
			dbox_getfield(dbox_options,field+i,buf,15);
			x = atof(buf);
			value = (int)(x * 16);
			if(value < 0x60) value = 0x60;   /* minimum of 6 point */
			*p++ = value;
		}
		/*      dopt.font[font_opt].background = dbox_getnumeric(dbox_options,field+4); */
	}
	dopt.text_width = dbox_getnumeric(dbox_options,22);

	if(memcmp(&dopt,&options.d,sizeof(dopt)) != 0)
	{
		if(memcmp(&dopt.font[0],&options.d.font[0],sizeof(dopt.font[0])) != 0)
		{
			/* lists font has changed, redraw the whole screen */
			redraw_whole_screen();
		}

		/* display options have changed */
		memcpy(&options.d,&dopt,sizeof(dopt));

		options_save();
		change_display_mode(&options.d,2);   /* sets fonts and redraws the windows */

	}
}   /* end of options_set_display */








BOOL dbox_options_raw_handler(dbox d, void *event, void *handle)
/**************************************************************/
{
	wimp_mousestr *mouse;
	int bbits;
	int type;
	int  icon;
	wimp_eventstr *e = event;

	/* for which icon numbers do we show the fields menu */
	static char fields_icons[] = {
		0,0, 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1
	};

	switch(e->e)
	{
	case wimp_EBUT:
		/* click on icon.  get icon number. */
		mouse = &e->data.but.m;
		bbits = mouse->bbits;
		icon = mouse->i;

		if((icon <= 17) && ((type = fields_icons[icon]) > 0))
		{
			options_dbox_field = icon;
			dbox_menu(menu_fontlist,options_font_selected,mouse);
			return(TRUE);
		}
	}
	return(help_handler(event,HELP_OPDISPL));
}   /* end of dbox_options_raw_handler */







void dbox_options_handler(dbox d, void *handle)
/*********************************************/
{
	int  i;

	i = dbox_get(d);
	switch(i)
	{
	case 0:
	case 1:
		options_set_display();
		if(dbox_persist()) return;
		break;

	default:
		break;
	}


	dbox_dispose(&dbox_options);
	dbox_options = NULL;
}   /* end of dbox_options_handler */




void options_fonts()
/*****************/
{
	int  i;
	int  font_opt;
	int  field;
	int *p;
	double  x;
	char buf[16];

	menu_fontlist = make_font_menu(1);

	if(dbox_options == NULL)
	{
		dbox_options = dbox_new("DOptions");
	}

	dbox_raw_eventhandler(dbox_options,dbox_options_raw_handler,NULL);
	dbox_eventhandler(dbox_options, dbox_options_handler, NULL);

	for(font_opt=0; font_opt<N_FONTS; font_opt++)
	{
		field = font_opt*5 + 2;
		dbox_setfield(dbox_options,field,options.d.font[font_opt].name);

		p = &options.d.font[font_opt].height;
		for(i=1; i<=3; i++)
		{
			x = (double)*p++;
			sprintf(buf,"%3.1f",x/16);
			dbox_setfield(dbox_options,field+i,buf);
		}
		/*      dbox_setnumeric(dbox_options,field+4,options.d.font[font_opt].background); */
	}
	dbox_setnumeric(dbox_options,22,options.d.text_width);

	dbox_hide(dbox_options);
	dbox_showstatic(dbox_options);

}   /* end of options_fonts */


/******************************************************************************/
/*                         PREFERENCES -> NEWS                                */
/******************************************************************************/




void dbox_news_selected(int *hits)
/********************************/
{
	int  box;

	box = box_lookup_number(hits[0]);
	dbox_setfield(dbox_news,dbox_menu_field,get_box_name(box));

	switch(dbox_menu_field)
	{
	case 9:
		options.text_box = box;
		break;
	case 12:
		options.news_box = box;
		break;
	case 13:
		options.news_log = box;
		break;
	case 15:
		options.mailbox[0].box = box;
		break;
	case 16:
		options.mailbox[0].log = box;
		break;
	case 18:
		options.returned_box = box;
		break;
	}

	dbox_showstatic(dbox_news);
}   /* end of dbox_news_selected */




void err_no_transport()
/*********************/
{
	werr(0,"No Internet transport has been specified");
}   /* end of err_no_transport */





void provider_newshound()
/***********************/
{
	int  i;
	FILE*f;
	char *p;
	char buf[256];

	i = read_os_variable("NewsHound$NewsDir",buf,sizeof(buf)-1);
	if(i == 1)
	{
		err_please_run("NewsHound");
		return;
	}

	sprintf(options.news_in,"%s.folder",buf);
	sprintf(options.news_out,"%s.articles",buf);

	read_os_variable("NewsHound$ConfigDir",buf,sizeof(buf)-1);
	sprintf(options.ngroups_data,"%s",buf);

	sprintf(buf,"%s.Config",options.ngroups_data);
	f = fopen_werr(buf,"r",NULL);
	if(f != NULL)
	{
		for(;;)
		{
			if(fgets(buf,sizeof(buf),f) == NULL)
				break;

			if(memcmp(buf,"Default:",8)==0)
			{
				p = &buf[8];
				while(*p <= ' ') p++;
				p[3]=0;
				strcpy(options.newshound_mnem,p);
				break;
			}
		}
		fclose(f);
	}
}   /* end of provider_newshound */




void dbox_mail_provider_selected(int *hits)
/*****************************************/
/* options.transport is used in:
   cats:  category_load_news_names
   reply:  postedlist_delete
   text:   browser_not_running
*/
{
	int  i;
	char buf[256];


	switch(hits[0])
	{
	case 0:
		break;

	case X_VOYAGER:
		i = read_os_variable2("PMailIn$File", options.mail_in, sizeof(options.mail_in)-1);
		if(i == 1)
		{
			err_please_run("Voyager");
			return;
		}
		read_os_variable2("PMailOut$Dir", options.mail_out,sizeof(options.mail_out)-1);
		read_os_variable2("PMailEnv$Dir", options.mail_envs,sizeof(options.mail_envs)-1);
		break;


	case X_POP:
		i = read_os_variable("Pop$MailDir",buf,sizeof(buf)-1);
		if(i == 1)
		{
			err_please_run("POP");
			return;
		}
		sprintf(options.mail_in,"%s.spool.mail",buf);
		sprintf(options.mail_out,"%s.spool.mqueue.text",buf);
		sprintf(options.mail_envs,"%s.spool.mqueue.work",buf);
		break;

	case X_POPSTAR:
		i = read_os_variable("PopStar$MailDir",buf,sizeof(buf)-1);
		if(i == 1)
		{
			err_please_run("POPStar");
			return;
		}
		sprintf(options.mail_in,"%s.spool.mail.text",buf);
		sprintf(options.mail_out,"%s.spool.mqueue.text",buf);
		sprintf(options.mail_envs,"%s.spool.mqueue.work",buf);
		break;

	case X_HERMES:
		i = read_os_variable("Hermes$MailDir",buf,sizeof(buf)-1);
		if(i == 1)
		{
			err_please_run("Hermes");
			return;
		}
		sprintf(options.mail_in,"%s.mailin.spool",buf);
		sprintf(options.mail_out,"%s.mailout.text",buf);
		sprintf(options.mail_envs,"%s.mailout.work",buf);
		break;

	case X_FREESMTP:
		i = read_os_variable("SMTPServer$MailDir",buf,sizeof(buf)-1);
		if(i == 1)
		{
			err_please_run("FreeSMTP");
			return;
		}
		sprintf(options.mail_in,"%s.spool.mail.text",buf);
		sprintf(options.mail_out,"%s.spool.mqueue.text",buf);
		sprintf(options.mail_envs,"%s.spool.mqueue.work",buf);
		break;

	case X_ANT:
		i = read_os_variable("InetSuite$Dir",buf,sizeof(buf)-1);
		if(i == 1)
		{
			err_please_run("!InetSuite");
			return;
		}
		strcat(buf,".Internet.Spool.");
		sprintf(options.mail_in,"%sInput",buf);
		sprintf(options.mail_out,"%sQueue",buf);
		sprintf(options.mail_envs,"%sQueue",buf);
		break;

	case X_TERMITE:
		i = read_os_variable("Termite$MailBox",buf,sizeof(buf)-1);
		if(i == 1)
		{
			err_please_run("Termite");
			return;
		}
		sprintf(options.mail_in,"%s.InTray.Internet.Mail",buf);
		strcat(buf,".OutTray.Internet.");
		sprintf(options.mail_out,"%sMail.Text",buf);
		sprintf(options.mail_envs,"%sMail.Work",buf);
		break;
	}

	transport_opts = mtransport_data[hits[0]] + ntransport_data[options.news_transport];
	options.mail_transport = hits[0];
	dbox_setfield(dbox_news,4,mtransports[options.mail_transport]);

	options_save();

	dbox_showstatic(dbox_news);
	return;
}   /* end of options_mail_provider_selected */




void dbox_news_provider_selected(int *hits)
/*****************************************/
/* options.transport is used in:
   cats:  category_load_news_names
   reply:  postedlist_delete
   text:   browser_not_running
*/
{
	int  i;
	char buf[256];


	switch(hits[0])
	{
	case 0:
		break;

	case X_VOYAGER:
		i = read_os_variable("INNewsIn$File",options.news_in,sizeof(options.news_in)-1);
		if(i == 1)
		{
			err_please_run("Voyager");
			return;
		}
		read_os_variable("INNewsOut$Dir",options.news_out,sizeof(options.news_out)-1);

		read_os_variable("VTiInternet$Dir",buf,sizeof(buf)-1);
		sprintf(options.ngroups_data,"%s.apps.news.!NewsAgent",buf);
		break;


	case X_NEWSHOUND:
		provider_newshound();   /* set up newshound paths */
		break;


	case X_ANT:
		i = read_os_variable("InetSuite$Dir",buf,sizeof(buf)-1);
		if(i == 1)
		{
			err_please_run("!InetSuite");
			return;
		}
		strcat(buf,".Internet.Spool.");
		sprintf(options.news_in,"%sNews.Input",buf);
		sprintf(options.news_out,"%sQueuePost",buf);
		sprintf(options.ngroups_data,"%sNews",buf);
		break;

	case X_TERMITE:
		i = read_os_variable("Termite$MailBox",buf,sizeof(buf)-1);
		if(i == 1)
		{
			err_please_run("Termite");
			return;
		}
		sprintf(options.news_in,"%s.InTray.Internet.News",buf);
		strcat(buf,".OutTray.Internet.");
		sprintf(options.news_out,"%sNews",buf);

		i = read_os_variable("TermiteIP$Dir",buf,sizeof(buf)-1);
		sprintf(options.ngroups_data,"%s.Options",buf);   /* ??? */
		break;
	}

	transport_opts = ntransport_data[hits[0]] + mtransport_data[options.mail_transport];
	options.news_transport = hits[0];
	dbox_setfield(dbox_news,6,ntransports[options.news_transport]);

	options_save();

	dbox_showstatic(dbox_news);

	newsg_load(1);
	newsg_save(0);
	return;
}   /* end of options_news_provider_selected */



void selected_sig_styles(int *hits)
/*********************************/
{
	options.news_tags = hits[0];
	dbox_setfield(dbox_news,dbox_menu_field,sig_style_names[hits[0]]);
}   /* end of selected_sig_style */


void selected_acks(int *hits)
/***************************/
{
	options.send_mail_acks = hits[0];
	dbox_setfield(dbox_news,dbox_menu_field,ack_names[hits[0]]);
}

void selected_crossposts(int *hits)
/*********************************/
{
	options.crossposts = hits[0];
	dbox_setfield(dbox_news,dbox_menu_field,crossposts_names[hits[0]]);
}   /* end of selected_crossposts */


BOOL dbox_news_raw_handler(dbox d, void *event, void *handle)
/***********************************************************/
{
	wimp_eventstr *e;
	wimp_mousestr *mouse;

	e = (wimp_eventstr *)event;

	switch (e->e)
	{
	case wimp_EBUT:
		/* click on icon.  get icon number. */
		mouse = &e->data.but.m;
		switch(dbox_menu_field = mouse->i)
		{
		case 6:
			dbox_menu(wmenu_ntransports,dbox_news_provider_selected,mouse);
			return(TRUE);
		case 4:
			dbox_menu(wmenu_mtransports,dbox_mail_provider_selected,mouse);
			return(TRUE);

		case 14:
			dbox_menu(wmenu_sig_styles,selected_sig_styles,mouse);
			return(TRUE);

		case 17:
			dbox_menu(wmenu_acks,selected_acks,mouse);
			return(TRUE);

		case 20:
			dbox_menu(wmenu_crossposts,selected_crossposts,mouse);
			return(TRUE);
		}
		break;
	}
	return(help_handler(event,HELP_OPNEWS));
}   /* end of dbox_news_raw_handler */





void dbox_news_handler(dbox d, void *handle)
/*********************************************/
{
	int  i;
	char *p;
	char buf[80];

	i = dbox_get(d);
	switch(i)
	{
	case 0:
		dbox_getfield(d,7,buf,sizeof(options.domain));
		if(check_domain(buf)<0)
			break;

		if(buf[0] == 0)
		{
			werr(0,"Domain name is missing");
			break;
		}
		if((p = strpbrk(buf,",';:()<>[]@\\")) != NULL)
		{
			p[1] = 0;
			werr(0,"Bad character '%c' in Domain field",p);
			break;
		}
		strcpy(options.domain,buf);

		dbox_getfield(d,8,options.u_name,sizeof(options.u_name));
		dbox_getfield(d,10,options.organization,sizeof(options.organization));

		options.news_backups = dbox_getnumeric(d,11);
		options.mail_backups = dbox_getnumeric(d,16);
		options.mail_8bit = dbox_getnumeric(d,19);
		options.auto_debatch = dbox_getnumeric(d,22);
		options.keep_references = dbox_getnumeric(d,23);
		if(options.keep_references == 0)
			options.keep_references=1;
		options.browser_type = dbox_getnumeric(d,12);
		i = dbox_getnumeric(d,13);
		if(i > 255)
			i = 255;
		options.limit_recipients = i;

		if(options.auto_debatch)
			auto_debatch(0,NULL);

		options_save();
		if(dbox_persist()) return;
		break;

	case 4:   /* show mail users */
		break;

	default:
		break;
	}

	dbox_dispose(&dbox_news);
	dbox_news = NULL;
}   /* end of dbox_news_handler */




void options_news()
/*****************/
{
	if(dbox_news != NULL)
	{
		dbox_hide(dbox_news);
		dbox_showstatic(dbox_news);
		return;
	}

	options_load();

	dbox_news = dbox_new("NewsPrefs");
	dbox_raw_eventhandler(dbox_news,dbox_news_raw_handler,NULL);
	dbox_eventhandler(dbox_news, dbox_news_handler, NULL);

	dbox_setfield(dbox_news,6,ntransports[options.news_transport]);
	dbox_setfield(dbox_news,4,mtransports[options.mail_transport]);
	dbox_setfield(dbox_news,7,options.domain);
	dbox_setfield(dbox_news,8,options.u_name);
	dbox_setfield(dbox_news,10,options.organization);

	dbox_setnumeric(dbox_news,11,options.news_backups);

	dbox_setfield(dbox_news,14,sig_style_names[options.news_tags]);
	dbox_setfield(dbox_news,17,ack_names[options.send_mail_acks]);
	dbox_setfield(dbox_news,20,crossposts_names[options.crossposts]);

	dbox_setnumeric(dbox_news,16,options.mail_backups);
	dbox_setnumeric(dbox_news,19,options.mail_8bit);
	dbox_setnumeric(dbox_news,22,options.auto_debatch);
	dbox_setnumeric(dbox_news,23,options.keep_references);
	dbox_setnumeric(dbox_news,12,options.browser_type);
	dbox_setnumeric(dbox_news,13,options.limit_recipients);


	dbox_hide(dbox_news);
	dbox_showstatic(dbox_news);
}   /* end of options_news */





void dbox_delivery_selected(int *hits)
/************************************/
{
	int  box;
	int  bin_box_name = 0;

	box = box_lookup_number(hits[0]);

	switch(dbox_menu_field)
	{
	case 1:
		options.news_box = box;
		break;
	case 2:
		options.news_log = box;
		break;
	case 3:
		options.text_box = box;
		break;
	case 4:
		options.filter_box = box;
		break;
	case 5:
		options.returned_box = box;
		break;
	case 6:
		options.postmaster_box = box;
		break;
	case 9:
		options.mlist_box = box;
		break;
	case 10:
		options.draft_box = box;
		bin_box_name=2;
		break;
	}

	dbox_setfield(dbox_delivery,dbox_menu_field,get_box_name2(box,bin_box_name));
	dbox_showstatic(dbox_delivery);
}   /* end of dbox_delivery_selected */





void undelivered_selected(int *hits)
/**********************************/
{
	switch(dbox_menu_field)
	{
	case 7:
		if(hits[0]==1)
			hits[0]=2;
		options.leave_undelivered_news = hits[0];
		break;

	case 8:
		options.leave_undelivered_mail = hits[0];
		break;
	}

	dbox_setfield(dbox_delivery,dbox_menu_field,undelivered_names[hits[0]]);

	dbox_showstatic(dbox_delivery);
}   /* end of undelivered_selected */



void new_to_unread_selected(int *hits)
/************************************/
{
	options.new_to_unread = hits[0];
	dbox_setfield(dbox_delivery,dbox_menu_field,new_to_unread_names[hits[0]]);

}   /* end of new_to_unread_selected */



BOOL dbox_delivery_raw_handler(dbox d, void *event, void *handle)
/***************************************************************/
{
	wimp_eventstr *e;
	wimp_mousestr *mouse;
	int  box_control;

	e = (wimp_eventstr *)event;

	switch (e->e)
	{
	case wimp_EBUT:
		/* click on icon.  get icon number. */
		mouse = &e->data.but.m;
		switch(dbox_menu_field = mouse->i)
		{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
		case 9:
		case 10:

			if(wmenu_boxes_names == NULL)
				break;

			box_control=0;
			if(dbox_menu_field==10)
				box_control=0x400;  /* (log box) for Bin */
			make_boxes_menu(box_control,NULL);
			dbox_menu(wmenu_boxes_names,dbox_delivery_selected,mouse);
			return(TRUE);

		case 7:
			dbox_menu(wmenu_undeliv_news,undelivered_selected,mouse);
			return(TRUE);

		case 8:
			dbox_menu(wmenu_undelivered,undelivered_selected,mouse);
			return(TRUE);

		case 13:
			dbox_menu(wmenu_new_to_unread,new_to_unread_selected,mouse);
			return(TRUE);
		}
		break;
	}
	return(help_handler(event,HELP_DELIVERY));
}   /* end of dbox_delivery_raw_handler */





void dbox_delivery_handler(dbox d, void *handle)
/*********************************************/
{
	int  i;

	i = dbox_get(d);
	switch(i)
	{
	case 0:
		options.input_status = dbox_getnumeric(d,11) | (dbox_getnumeric(d,12) << 1);
		options.local_mail = dbox_getnumeric(d,14);
		options_save();
		if(dbox_persist()) return;
		break;

	default:
		break;
	}

	dbox_dispose(&dbox_delivery);
	dbox_delivery = NULL;
}   /* end of dbox_delivery_handler */





void options_delivery()
/*********************/
{
	if(dbox_delivery != NULL)
	{
		dbox_hide(dbox_delivery);
		dbox_showstatic(dbox_delivery);
		return;
	}

	options_load();

	dbox_delivery = dbox_new("Delivery");
	dbox_raw_eventhandler(dbox_delivery,dbox_delivery_raw_handler,NULL);
	dbox_eventhandler(dbox_delivery, dbox_delivery_handler, NULL);

	dbox_setfield(dbox_delivery,1,get_box_name(options.news_box));
	dbox_setfield(dbox_delivery,2,get_box_name(options.news_log));
	dbox_setfield(dbox_delivery,3,get_box_name(options.text_box));
	dbox_setfield(dbox_delivery,4,get_box_name(options.filter_box));
	dbox_setfield(dbox_delivery,5,get_box_name(options.returned_box));
	dbox_setfield(dbox_delivery,6,get_box_name(options.postmaster_box));
	dbox_setfield(dbox_delivery,9,get_box_name(options.mlist_box));
	dbox_setfield(dbox_delivery,10,get_box_name2(options.draft_box,2));

	dbox_setfield(dbox_delivery,7,undelivered_names[options.leave_undelivered_news]);
	dbox_setfield(dbox_delivery,8,undelivered_names[options.leave_undelivered_mail]);

	dbox_setnumeric(dbox_delivery,11,options.input_status & 1);
	dbox_setnumeric(dbox_delivery,12,options.input_status & 2);
	dbox_setfield(dbox_delivery,13,new_to_unread_names[options.new_to_unread]);
	dbox_setnumeric(dbox_delivery,14,options.local_mail);

	dbox_hide(dbox_delivery);
	dbox_showstatic(dbox_delivery);
}   /* end of options_delivery */





/******************************************************************************/
/*                         PREFERENCES -> MISC                                */
/******************************************************************************/



void dbox_misc_selected(int *hits)
/********************************/
{
	int  hit;

	hit = hits[0];

	switch(dbox_menu_field)
	{
	case 2:
		dbox_setfield(dbox_misc,dbox_menu_field,edit_style_names[hit]);
		options.edit_style = hit;
		break;

	case 4:
		dbox_setfield(dbox_misc,dbox_menu_field,confirm_delete_names[hit]);
		options.confirm_delete = hit;
		break;

	case 10:
		dbox_setfield(dbox_misc,dbox_menu_field,open_thread_names[hit]);
		options.thread_open = hit;
		break;

	case 17:
		dbox_setfield(dbox_misc,dbox_menu_field,skip_thread_names[hit]);
		options.skip_thread = hit;
		break;
	}

	dbox_showstatic(dbox_misc);
}   /* end of dbox_misc_selected */




BOOL dbox_misc_raw_handler(dbox d, void *event, void *handle)
/***********************************************************/
{
	wimp_eventstr *e;
	wimp_mousestr *mouse;

	e = (wimp_eventstr *)event;

	switch (e->e)
	{
	case wimp_ESEND:
	case wimp_ESENDWANTACK:
		switch(e->data.msg.hdr.action)
		{
		case wimp_MDATALOAD:
			/* set Path for Saved article */
			dbox_setfield(d,6,e->data.msg.data.dataload.name);
			return(TRUE);
		}
		break;

	case wimp_EBUT:
		/* click on icon.  get icon number. */
		mouse = &e->data.but.m;
		switch(dbox_menu_field = mouse->i)
		{
		case 2:
			dbox_menu(wmenu_edit_styles,dbox_misc_selected,mouse);
			return(TRUE);

		case 4:
			dbox_menu(wmenu_confirm_delete,dbox_misc_selected,mouse);
			return(TRUE);

		case 10:
			dbox_menu(wmenu_open_thread,dbox_misc_selected,mouse);
			return(TRUE);

		case 17:
			dbox_menu(wmenu_skip_thread,dbox_misc_selected,mouse);
			return(TRUE);
		}
		break;
	}
	return(help_handler(event,HELP_OPMISC));
}   /* end of dbox_misc_raw_handler */





void dbox_misc_handler(dbox d, void *handle)
/*********************************************/
{
	int  i;
	int  article_viewer_type;
	TEXTR *t;

	switch(dbox_get(d))
	{
	case 0:
		article_viewer_type = options.article_viewer_type;

		options.allow_expiry = dbox_getnumeric(d,3);
		options.initial_select_user = dbox_getnumeric(d,7);
		options.expire_active_threads = dbox_getnumeric(d,8);
		options.autosave = dbox_getnumeric(d,13);
		options.poll_og = dbox_getnumeric(d,14);
		options.dont_compress = dbox_getnumeric(d,15);
		options.article_viewer_type = dbox_getnumeric(d,16);
		options.box_show_locked = dbox_getnumeric(d,18);
		options.multi_task = dbox_getnumeric(d,19);
		options.move_aviewer = dbox_getnumeric(d,20);
		options.tabs = dbox_getnumeric(d,21);
		options.index_autosave = dbox_getnumeric(d,23);

		i = options.ext_edit;
		options.ext_edit = dbox_getnumeric(d,9);
		if(i != options.ext_edit)
		{
			if(options.ext_edit)
			{
				/* ext_edit option has been set.
				   change any open Write Mail and Write News windows */
				for(i=0; i<N_TEXT_DATA; i++)
				{
					if((t = text_data_record[i]) != NULL)
					{
						if(t->text_type > X_VIEW2)
						{
							reply_set_ext_edit(t,1);
						}
					}
				}
			}

			text_display_change(&options.d,2);   /* to set the wordwrap limit */
		}

		i = dbox_getnumeric(d,11);
		if(i > 78)  i = 78;
		if(i < 40)  i = 40;
		if(i != options.reply_wordwrap)
		{
			options.reply_wordwrap = i;
			text_display_change(&options.d,2);
		}

		i = dbox_getnumeric(d,12);
		if(i < 40)  i = 40;
		if(i != options.viewer_wordwrap)
		{
			options.viewer_wordwrap = i;
			text_view->wordwrap = i;
			text_display_change(&options.d,2);
		}


		dbox_getfield(d,6,options.save_path,sizeof(options.save_path));

		options_save();
		if(dbox_persist())
			return;

		if(article_viewer_type != options.article_viewer_type)
		{
			text_close_window(text_view);
			if(text_view->dbox_card != NULL)
				dbox_dispose(&text_view->dbox_card);
			init_dbox_card(text_view);
		}
		break;

	default:
		break;
	}

	dbox_dispose(&dbox_misc);
	dbox_misc = NULL;
}   /* end of dbox_misc_handler */




void options_misc()
/*****************/
{
	if(dbox_misc != NULL)
	{
		dbox_hide(dbox_misc);
		dbox_showstatic(dbox_misc);
		return;
	}

	options_load();

	dbox_misc = dbox_new("MiscOpts");
	dbox_raw_eventhandler(dbox_misc,dbox_misc_raw_handler,NULL);
	dbox_eventhandler(dbox_misc, dbox_misc_handler, NULL);

	dbox_setfield(dbox_misc,2,edit_style_names[options.edit_style]);
	dbox_setnumeric(dbox_misc,3,options.allow_expiry);
	dbox_setfield(dbox_misc,4,confirm_delete_names[options.confirm_delete]);
	dbox_setfield(dbox_misc,6,options.save_path);
	dbox_setnumeric(dbox_misc,7,options.initial_select_user);
	dbox_setnumeric(dbox_misc,8,options.expire_active_threads);
	dbox_setnumeric(dbox_misc,9,options.ext_edit);
	dbox_setfield(dbox_misc,10,open_thread_names[options.thread_open]);
	dbox_setnumeric(dbox_misc,11,options.reply_wordwrap);
	dbox_setnumeric(dbox_misc,12,options.viewer_wordwrap);
	dbox_setnumeric(dbox_misc,13,options.autosave);
	dbox_setnumeric(dbox_misc,14,options.poll_og);
	dbox_setnumeric(dbox_misc,15,options.dont_compress);
	dbox_setnumeric(dbox_misc,16,options.article_viewer_type);
	dbox_setfield(dbox_misc,17,skip_thread_names[options.skip_thread]);
	dbox_setnumeric(dbox_misc,18,options.box_show_locked);
	dbox_setnumeric(dbox_misc,19,options.multi_task);
	dbox_setnumeric(dbox_misc,20,options.move_aviewer);
	dbox_setnumeric(dbox_misc,21,options.tabs);
	dbox_setnumeric(dbox_misc,23,options.index_autosave);

	dbox_hide(dbox_misc);
	dbox_showstatic(dbox_misc);
}   /* end of options_misc */


