class Vector;
class Server;
class GroupData;
class MessageListData;
struct NewMessage;
struct MIMEType;

int getGMTOffset();

void sleepAll(BOOL sleep);
void getIndexPath(char *buffer,int gID);
void getFolderPath(char *buffer,int gID);
void getFilePath(char *buffer,int gID,int mID);

extern LONG returnID;
#define do_input returnID = DoMethod(app,MUIM_Application_NewInput,&signal); if(returnID != 0) do_input_func
int do_input_func();
char * getstr(Object *obj);
void setEnabled();
void setGdataHelpText(GroupData *gdata);
void clearThreadView();
void threadView();
void update_screen_title(GroupData *gdata);
void set_and_read(int gID,BOOL visible);
void set_and_read(GroupData * gdata,BOOL visible);
BOOL exists(char * buffer2);
void delete_file(GroupData * gdata,MessageListData * mdata);
void delete_file_n(GroupData * gdata,MessageListData * mdataptr,int n);
void delete_mess(GroupData * gdata,MessageListData * mdata,BOOL visible,BOOL close);
void delete_mess(GroupData * gdata,MessageListData * mdata,BOOL visible);
void move(GroupData * gdata,GroupData * gdata2,MessageListData * mdata,int type,BOOL visible,BOOL multi,BOOL close);
void move(GroupData * gdata,GroupData * gdata2,MessageListData * mdata,int type,BOOL visible,BOOL multi);
void getUserEmail(GroupData * gdata,char * buffer);
enum getrefs_t {
	GETREFS_NONE = 0,
	GETREFS_ALL = 1,
	GETREFS_LAST = 2
};
void get_refs(NewMessage * newmess,int gID,int mID,getrefs_t getRefs);
void get_refs(NewMessage * newmess,GroupData * gdata,MessageListData * mdata,getrefs_t getRefs);
Server * getServer(int ID);
Server * getDefaultServer();
Server * getPostingServer();
void killmess(GroupData * gdata,MessageListData * mdata,int type);
void killmess(GroupData * gdata,MessageListData * mdata);
void exportAddress(GroupData * gdata,MessageListData * mdata);
void readgrouplist(Server *server,int filepos);
void rot13(Object *ED);
void getNGChoice(char * title,char * text,Object * STR,BOOL poster);
BOOL readInText(Object * textEditor,char * filename);
BOOL exfile(MIMEType * mime);
int parse_index_version(char *version);

class library {
private:
	Library * Base;
public:
	library(char * name,int version);
	~library();
	BOOL isopen()
	{
		if(Base==NULL)
			return FALSE;
		return TRUE;
	}
};

class KillFile {
public:
	char header[64]; // exact match
	char text[256]; // substring search
	char ngroups[64]; // substring search
	struct DateStamp ds; // creation date
	struct DateStamp lastused; // last usage (==creation date to begin with)
	int expiretype; // 0=never, 1=from creation, 2=since last used
	int expire; // days to go before expiring (0 == never)
	//short type; // 0=kill, 1=keep, 2=mark important
	short match; // 0 = contains, 1 = doesn't contain;
	short action; // 0 = kill, 1 = mark important
	char carryon; // carry onto other killfiles? (0/1)
	char spare[91]; // was 94
	KillFile();
};

enum { 
	NG_CHANGED=1,
	APP_DOUBLESTART,
	NEW_SORT,
	NNG_OKAY,
	NNG_CANCEL,
	ENG_OKAY,
	ENG_CANCEL,
	NGADV_OKAY,
	NGADV_CANCEL,
	JOINMSGS_JOIN,
	JOINMSGS_CANCEL,
	ACC_PAGESIG,
	ACC_OKAY,
	ACC_CANCEL,
	ACC_ADDSERVER,
	ACC_EDITSERVER,
	ACC_MAKEDEFSERVER,
	ACC_MAKEPOSTSERVER,
	ACC_DELETESERVER,
	ACC_GETGROUPS,
	ACC_GETNEWGROUPS,
	ACC_GROUPMAN,
	SERVER_OKAY,
	SERVER_CANCEL,
	ACC_CYSIG,
	ACC_READSIG,
	ACC_STRKILL,
	ACC_STRKILLTEMP,
	ACC_KILLCHANGED,
	ACC_NEWKILL,
	ACC_DELKILL,
	ACC_DUPKILL,
	ACC_MIMECLICK,
	ACC_MIMENEW,
	ACC_MIMEDEL,
	ACC_MIMESTR,
	KILL_CLOSE,
	GROUPMAN_SUB,GROUPMAN_FIND,GROUPMAN_CLOSE, GROUPMAN_GETGROUPS,
	SEARCH_START, SEARCH_MESSAGE, SEARCH_SORT,
	STATS_START, STATS_SORT,
	ABORT_NEWS,
	CHOICE_SAVE, CHOICE_DISP, CHOICE_CANC,
	NEWUSER_OKAY,
	USERS_NEW, USERS_DELETE,
	LOGIN_OKAY, LOGIN_CANCEL,
	CPWD_OKAY,
	
	MEN_PROJECT,MEN_GETNEWS,MEN_GETNEWSSINGLE,MEN_SENDNEWS,MEN_GETGROUPSDEF,MEN_GETNEWGROUPSDEF,MEN_DISCONNECT,MEN_USER,MEN_ABOUT,MEN_ABOUTMUI,MEN_SYSINFO,MEN_ICONIFY,MEN_QUIT,
	MEN_NEWSGROUPS, MEN_NEWNEWSGROUP, MEN_EDITNG, MEN_NGADV, MEN_DELNG, MEN_ARCHIVENG,
	MEN_VIEWGROUPS, MEN_VIEWGROUPSLIST, MEN_VIEWGROUPSTREE,
	MEN_SORT, MEN_SEARCH, MEN_STATS, MEN_RESETGROUPPTR, MEN_RESETALLPTR, MEN_GROUPMANDEF, MEN_UPDATEGROUPS, MEN_UPDATEINDEX, MEN_UPDATEALLIND, MEN_IMPORT,
	MEN_MESSAGES,
	MEN_VIEWMESSAGES, MEN_VIEWMESSAGESLIST, MEN_VIEWMESSAGESTREE,
	MEN_READ, MEN_EDIT, MEN_SUPER, MEN_CANCEL, MEN_DELMESS, MEN_UNDELMESS, MEN_POST, MEN_FOLLOWUP, MEN_REPLY, MEN_BOTH, MEN_EXP, MEN_VIEWHEADER, MEN_MOVE, MEN_COPY, MEN_KILLMESS, MEN_YAMADDRESS,
	MEN_PD, MEN_PDTHIS, MEN_PDALL, MEN_PDREAD, MEN_PDONLINE, MEN_PDALLALL,
	MEN_MARK, MEN_MARKUNREAD, MEN_MARKREAD, MEN_MARKHELD, MEN_MARKQUEUED, MEN_MARKNORMAL, MEN_MARKIMPORTANT,
	MEN_SELECT, MEN_SELECTALL, MEN_SELECTNONE, MEN_SELECTTOGGLE, MEN_SELECTFROM, MEN_SELECTSUBJECT, MEN_SELECTREAD, MEN_SELECTUNREAD,
	MEN_CURRENTDATE, MEN_DOWNLOADBODY, MEN_JOINMSGS,
	MEN_PREFS, MEN_ACCOUNT, MEN_KILLFILE, MEN_USERS, MEN_CPWD, MEN_MUIPREFS,
	
	MENVIEW_MESSAGE, MENVIEW_EDIT, MENVIEW_ATTACH,
	VIEW_HEADERS, VIEW_O, VIEW_PREV, VIEW_PREVT, VIEW_KILL, VIEW_DELNEXT, VIEW_NEXT, VIEW_APP, VIEW_EXP, VIEW_EXPADD, VIEW_REPLY,
	VIEW_MARK, VIEW_MARKNORMAL, VIEW_MARKIMPORTANT,
	VIEW_FIND, VIEW_FINDNEXT, VIEW_COPY, VIEW_ROT13,
	VIEW_ATTACHVIEW, VIEW_ATTACHSAVE, VIEW_UUVIEW, VIEW_UUSAVE,

	MENWRITE_MESSAGE,
	WRITE_SAVE
};

/* The Default Signature cycle gadget under the New Newsgroup window (wnd_nng)
 */
static char *CYA_nng_sigs[] = {
	"None","Signature 1","Signature 2","Signature 3","Signature 4","Signature 5","Signature 6","Signature 7","Signature 8",NULL
};
const int NSIGS=8;
static char *StdEntries[] = {"Kind regards ", "Yours ", "Mvh ", NULL};
extern char *sigs[NSIGS];

/* Some MIME types
 */
static char *POPA_write_mime[] = {
	"text/plain","text/html","text/x-aguide","application/octet-stream","application/rtf","application/postscript","application/x-lha","application/x-lzx","application/x-zip","image/jpeg","image/png","image/gif","image/x-ilbm","audio/basic","audio/x-8svx","audio/x-wav","video/mpeg","video/quicktime","video/x-anim","message/rfc822",NULL
};

extern Object *app;
extern Object *wnd_main;
extern Object *wnd_newnewsgroup;
extern Object *wnd_editng;
extern Object *wnd_account;
extern Object *wnd_killfile;
extern Object *pages_account;
extern Object *wnd_groupman;
extern Object *wnd_choice;
extern Object *wnd_about;
extern Object *aboutwin;

extern Object *NLIST_groupdata;
extern Object *NLIST_messagelistdata;
extern Object *LISTTREE_messagelistdata;
extern Object *NLIST_groupman;
extern Object *NLIST_choice;

extern Object *BT_about_OKAY;

extern Object *TB_main;
enum TB_Index {
	TB_READ     = 0,
	TB_EXPORT 	= 1,
	TB_MOVE 		= 2,
	TB_COPY 		= 3,
	TB_DELETE 	= 4,
	TB_KILL 		= 5,
	// space
	TB_POST		= 7,
	TB_FOLLOWUP = 8,
	TB_EDIT 		= 9,
	// space
	TB_GETNEWS	= 11,
	TB_SENDNEWS	= 12,
	// space
	TB_SEARCH	= 14,
	TB_PROGSET	= 15,
	TB_KILLFILE	= 16
};

extern Object *BT_nng_OKAY;
extern Object *BT_nng_CANCEL;
extern Object *STR_nng_NAME;
extern Object *STR_nng_DESC;
extern Object *CY_nng_DEFSIG;
extern Object *CM_nng_S;
extern Object *CY_nng_MAXDL;
extern Object *STR_nng_MAXDL;
extern Object *CY_nng_MAXL;
extern Object *STR_nng_MAXL;

extern Object *BT_eng_OKAY;
extern Object *BT_eng_CANCEL;
extern Object *STR_eng_NAME;
extern Object *STR_eng_DESC;
extern Object *CY_eng_DEFSIG;
extern Object *CM_eng_S;
extern Object *CY_eng_MAXDL;
extern Object *STR_eng_MAXDL;
extern Object *CY_eng_MAXL;
extern Object *STR_eng_MAXL;
extern Object *TXT_eng_LASTDL;

extern Object *BT_acc_OKAY;
extern Object *BT_acc_CANCEL;
extern Object *STR_acc_NAME;
extern Object *STR_acc_EMAIL;
extern Object *STR_acc_REALEMAIL;
extern Object *STR_acc_ORG;
extern Object *STR_acc_SMTP;
extern Object *CY_acc_TIMEZONE;
extern Object *CM_acc_BST;
extern Object *CM_acc_XNEWS;
extern Object *STR_acc_NNTP;
extern Object *CM_acc_AUTH;
extern Object *STR_acc_USER;
extern Object *STR_acc_PASS;
extern Object *NLIST_acc_SERVERS;
extern Object *BT_acc_ADDSERVER;
extern Object *BT_acc_EDITSERVER;
extern Object *BT_acc_MAKEDEFSERVER;
extern Object *BT_acc_DELETESERVER;
extern Object *BT_server_OKAY;
extern Object *BT_server_CANCEL;
extern Object *CY_acc_SIG;
extern Object *CM_acc_USESIG;
extern Object *ED_acc_SIG;
extern Object *SLD_acc_SIG;
extern Object *STR_acc_LINELENGTH;
extern Object *CM_acc_REWRAP;
extern Object *CY_acc_XNO;
extern Object *NLIST_acc_KILLFILE;
extern Object *BT_acc_NEWKILLADD;
extern Object *STR_acc_NEWKILLHEAD;
extern Object *STR_acc_NEWKILLTEXT;
extern Object *STR_acc_NEWKILLGROUP;
extern Object *BT_acc_NEWKILL;
extern Object *BT_acc_DELKILL;
extern Object *BT_acc_DUPKILL;
extern Object *NLIST_acc_MIMEPREFS;
extern Object *POP_acc_MIME;
extern Object *LIST_acc_MIME;
extern Object *STR_acc_MIME;
extern Object *POP_acc_MIMEVIEW;
extern Object *STR_acc_MIMEVIEW;
extern Object *POP_acc_MIMEDEF;
extern Object *STR_acc_MIMEDEF;
extern Object *BT_acc_MIMENEW;
extern Object *BT_acc_MIMEDEL;
extern Object *BT_write_NG;
extern Object *BT_write_FU;
extern Object *BT_write_P;
extern Object *BT_write_PL;
extern Object *BT_write_H;
extern Object *BT_write_C;
extern Object *CY_write_SIG;
extern Object *ED_write_MESS;
extern Object *SLD_write_MESS;
extern Object *STR_write_NG;
extern Object *STR_write_TO;
extern Object *STR_write_SUBJECT;
extern Object *STR_write_FROM;
extern Object *STR_write_FOLLOWUP;
extern Object *NLIST_write_ATT;
extern Object *BT_write_ADDATT;
extern Object *BT_write_DELATT;
extern Object *POP_write_MIME;
extern Object *LIST_write_MIME;
extern Object *STR_write_MIME;
extern Object *STR_groupman_FIND;
extern Object *BT_groupman_SUB;
extern Object *BT_groupman_GET;
extern Object *BT_groupman_CLOSE;
extern Object *BT_groupman_SORT;

extern Object *NLIST_search_NG;
extern Object *BT_search_START;
extern Object *CY_search_WHERE;
extern Object *STR_search_HEAD;
extern Object *STR_search_WHAT;
extern Object *CM_search_CASESENS;
extern Object *NLIST_search_RES;

extern Object *NLIST_stats_NG;
extern Object *BT_stats_START;
extern Object *CY_stats_WHAT;
extern Object *NLIST_stats_RES;

extern Object *BT_choice_SAVE;
extern Object *BT_choice_DISP;
extern Object *BT_choice_CANC;

extern Object *NLIST_groupdata;
extern Object *LISTTREE_groupdata;
extern Object *NLIST_messagelistdata;
extern Object *LISTTREE_messagelistdata;

extern struct MUI_NListtree_TreeNode *tn_folders,*tn_newsgroups;

extern Object *menustrip;
extern Object *menuitem_GETNEWS;
extern Object *menuitem_GETNEWSSINGLE;
extern Object *menuitem_SENDNEWS;
extern Object *menuitem_GETGROUPSDEF;
extern Object *menuitem_GETNEWGROUPSDEF;
extern Object *menuitem_DISCONNECT;
extern Object *menuitem_VIEWGROUPS;
extern Object *menuitem_VIEWMESSAGES;
extern Object *menuitem_UPDATEGROUPS;
extern Object *menuitem_UPDATEINDEX;
extern Object *menuitem_UPDATEALLIND;
extern Object *menuitem_IMPORT;
extern Object *menuitem_READ;
extern Object *menuitem_EDIT;
extern Object *menuitem_SUPER;
extern Object *menuitem_DELMESS;
extern Object *menuitem_UNDELMESS;
extern Object *menuitem_EXP;
extern Object *menuitem_MOVE;
extern Object *menuitem_COPY;
extern Object *menuitem_KILLMESS;
extern Object *menuitem_YAMADDRESS;
extern Object *menuitem_POST;
extern Object *menuitem_FOLLOWUP;
extern Object *menuitem_REPLY;
extern Object *menuitem_BOTH;
extern Object *menuitem_PDTHIS;
extern Object *menuitem_MARK;
extern Object *menuitem_USERS;

extern char version[];
extern MUI_CustomClass *editor_mcc;
extern BOOL registered;
extern const Hook StrObjHook;
extern const Hook WindowHook;
extern const Hook DisplayHook_mime;
extern const Hook DestructHook_mime;
extern BOOL running;
extern BOOL accountpage;
extern BOOL delete_dis;
extern ULONG signal;
extern BOOL running;
extern int nextID;
extern Server *groupman_server;
extern GroupData * ng_edit;
extern GroupData *old_gdata;
extern GroupData *c_gdata;
extern GroupData *v_gdata;
extern library ASLlib; // constructor opens libraries
extern const int TAB;
extern const int MAXGROUPS;
extern int gdata_readID;
extern int topenum;

extern BOOL DEBUG;

const int MAXLINE = 4096;
