;MailRun v2.11:  Header File
;1992-1993 Gerald P. Sully, all rights reserved.

#comment
**************************************************************************
**************************************************************************
* 
* This header file contains routines that are used in various
* places throughout the MailRun source files.  It also contains
* global variable definitions and macros.
* 
* #ifdef commands have been used to exclude procedures and global
* variables from being compiled in any script module where they
* are not needed.  In theory, it should not be necessary to do
* this:  Datastorm's documentation says that any procedure or
* variable that isn't used is ignored.  In practice, however, the
* compiler will use up its limited memory resources allocating
* space to variables and procedures that never make their way into
* the compiled script.
* 
* The following procedures/functions are found in this file
* (roughly in order of appearance):
* 
* makefullname(), makemrn(), makebbslist(), maketasklist(), 
* makemailrunlist(), makedesc(), loadsettings(), loadbbsinfo(), 
* loadprompts(), loadmaildoor(), writesettings(), writebbsinfo(), 
* writeprompts(), writemaildoor(), readbbs(), readitem(), 
* writebbs(), writeitem(), getfirstitem(), getlastitem(), 
* gettaskstring(), updatecount(), copymrn(), fverify(), inlist(), 
* openfile(), cleardir(), clearfiledesc(), insertitem(), 
* insertbbs(), changemailrun(), checkpending(), checkchild(), 
* checkrunning(), checkchanged(), checkfile(), checktask(), 
* checknew(), menudim(), sortidx(), fieldcompare(), findstring(), 
* interfaceon(), interfaceoff(), parsedialog(), swapbbs(), 
* swapitem(), changestatus(), taskfilefwd(), taskfileend(), 
* parsemenu(), parseobject(), filenewmrun(), filesave(), filesaveas(), 
* filereset(), filedelmrun(), fileautorun(), fileexit(), editcut(), 
* editcopy(), editpaste(), editdelete(), cfgmrun(), cfgbbs(), 
* cfgprompts(), cfgmaildoor(), configbbs(), configmrun(), 
* configprompts(), configmaildoor(), defaultsmailrun(), defaultsbbs(), 
* defaultsprompts(), defaultsdoor(), addnewbbs(), addgetsend(), 
* addupload(), adddownload(), addsendcmd(), addscript(), 
* executemailrun(), executeqwkreader(), executearchiver(), 
* executelogviewer(), helpcontents(), helpcontext(), helpabout(),
* callscript()
* 
**************************************************************************
**************************************************************************
#endcomment

;Open file indexes

#define IniFile 0
#define MailRunFile 1
#define BBSFile 0
#define TaskFile 1
#define OldTaskFile 2
#define TempTaskFile 3
#define BBSidxFile 0
#define BBSdbfFile 1
#define NewFilesFile 2
#define MRUnarcFile 3
#define OldidxFile 4
#define OlddbfFile 5
#define ScriptFile 0
#define QueueListFile 5
#define OldUBFFile 0
#define OldUDXFile 1
#define MRunUBFFile 2
#define MRunUDXFile 3
#define FileDescFile 4
#define SourceFile 5

;Flags

#define ALLFLAGS 255				; 2^8 - 1
#define RUNNING 1					; 2^0
#define CHANGED 2					; 2^1
#define NEW 4						; 2^2
#define AGM 8						; 2^3
#define CMD 16						; 2^4
#define SCR 32						; 2^5
#define ABT 64						; 2^6
#define USR 8						; 2^3
#define PRMPT 16					; 2^4
#define QMD 32						; 2^5
#define DEFAULTS 128				; 2^7
#define IDLE (ALLFLAGS - RUNNING)
#define UNCHANGED (ALLFLAGS - CHANGED)
#define OLD (ALLFLAGS - NEW)
#define CLEARCMD (ALLFLAGS - AGM - CMD - SCR - ABT)

;System global variables

#define FLAGS i9
#define IdleTimeout i8
#define LogRun i7
#define AppendLog i6
#define AnsiInLog i5
#define NewfileFilter i4
#define GraphicsOn i3
#define HelpPage i2
#define PostRun i1
#define IdleTimer i0

#define TaskItem s9
#define MailRun s8
#define MailRunIni s7
#define TempDir s6
#define MailRunDir s5
#define TaskList s4
#define BBS s3
#define Item s2
#define Conf s1
#define CurrentConf s0

;Macros

#define EscapeFail 0
#define ErrorFail 1
#define ALPHA 0
#define NUMERIC 1
#define MMDDYY 2
#define _READWRITE 0
#define _CREATE 1
#define _TEXT 0
#define _NORMAL 1

;Miscellaneous global variables

string 	MailRunTrunc

#ifndef MRUN211G
#ifndef MRUN211B
string	BBSList
#endif
#ifndef MRUN211F
string	BBSType
#endif
#ifndef MRUN211AB
#ifndef MRUN211C
integer PermRadio
#endif
#endif
#endif

#ifdef MRUN211AB
string MailRunList
#endif

#ifdef MRUN211DE
string 	FileName,		FileDesc,		FileChoice
#endif

;Global variables containing values displayed in the main dialogbox

#ifdef MRUN211AG
string 	BBSTotal, 		BBSComplete, 	BBSRemaining,	AttemptNum
string 	ItemTotal, 		ItemComplete,	ItemError, 		ItemRemaining
integer 	BBST, BBSC, BBSR, ItemT, ItemC, ItemE, ItemR
#endif


;Global variables containing values from [MailRun] section of *.MRN

#ifdef MRUN211AB
string 	MailDir,			ReplyDir,		DownloadDir,	UploadDir
string	DialAttempts,	DialTimeout,	DialPause
string	SavePackets,	IdleTime,		ExecTime
string	Archiver,		QWKReader,		LogViewer
integer  GoWait
#endif


#ifndef MRUN211DE
#ifndef MRUN211F
#ifndef MRUN211G

;Global variables containing general BBS info from *.MRN

string	BBSName,			UserName,		PWord,		XferProt
string	CallingFrom,	UserResp1,		UserResp2
string 	Number_1,		Number_2,		Number_3
string	LangNumber,		MailDoorType

;Global variables containing BBS prompts from MAILRUN.INI

string 	LangPrompt,		GraphicsPrompt,	NamePrompt,			UserPrompt1
string	PWordPrompt,	ViewPrompt,			FilePrompt,			UserPrompt2
string	ScanPrompt,		MorePrompt,			ContinuePrompt,	CommandPrompt
string	DLPrompt,		DLUnavPrompt,		ULPrompt,			ULDescPrompt

;Global variables containing Mail Door prompts from MAILRUN.INI

string	MailPrompt,		ReceiveQWKPrompt,	MailDLPrompt,  MsgMenuPrompt
string 	MailXferProt,	MailULPrompt, 		QWKArchiver,	MailDoor

#endif
#endif
#endif


#comment
*********************************************************************
* 
* MAKEFULLNAME()
* 
* Called by all modules, various procedures
* 
* Appends a filename to a directory name.
* 
*********************************************************************
#endcomment

func makefullname : string
strparm Directory, FileNamen
string FullName
	FullName = Directory
	addfilename FullName FileNamen
	return FullName
endfunc


#comment
*********************************************************************
* 
* MAKEMRN()
* 
* Calls loadsettings(), loadbbsinfo(), loadprompts(), loadmaildoor(),
* writesettings(), writebbsinfo(), writeprompts(), writemaildoor(),
* makefullname(), filesave()
* 
* Called by:
* 	MRUN211A:  initialize()
* 	MRUN211B:  newmailrun()
* 
* Create the file MAILRUN.MRN and initialize it.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AB
proc makemrn
string DLPurgeLimit
#ifndef MRUN211A
string RingInterrupt
#endif
	;load the defaults 
	loadsettings(MailRunIni)
	loadbbsinfo(MailRunIni, "DEFAULT")
	loadprompts(MailRunIni, "DEFAULT")
	loadmaildoor(MailRunIni, "DEFAULT")
	profilerd MailRunIni "MailRun" "DLPurgeLimit" DLPurgeLimit
	profilerd MailRunIni "MailRun" "ExecTime" ExecTime
	profilerd MailRunIni "MailRun" "GoWait" GoWait
	profilerd MailRunIni "MailRun" "PostRun" PostRun
	profilerd MailRunIni "MailRun" "RingInterrupt" RingInterrupt
	;write the defaults to the new mailrun
	MailRun = makefullname(TempDir, MailRunTrunc)
	writesettings(MailRun)
	writebbsinfo(MailRun, "DEFAULT")
	writeprompts(MailRun, "DEFAULT")
	writemaildoor(MailRun, "DEFAULT")
	profilewr MailRun "MailRun" "DLPurgeLimit" DLPurgeLimit
	profilewr MailRun "MailRun" "ExecTime" ExecTime
	profilewr MailRun "MailRun" "GoWait" GoWait
	profilewr MailRun "MailRun" "PostRun" PostRun
	profilewr MailRun "MailRun" "RingInterrupt" RingInterrupt
	;write the new mailrun to disk
	filesave()
endproc
#endif


#comment
*********************************************************************
* 
* MAKEBBSLIST()
* 
* Calls readbbs()
* 
* Called by:
* 	MRUN211H:  editdelete(), editpaste(), callscript()
* 	MRUN211C:  changeuserinfo(), changeprompts(), changemaildoor()
* 	MRUN211D:  main()
* 	MRUN211E:  main()
* 	MRUN211F:  addgetmail(), addsendcommand(), adddoscript()
* 
* Creates a list of BBSs for display the BBS combobox of
* various dialog boxes.
* 
*********************************************************************
#endcomment

#ifndef MRUN211G
#ifndef MRUN211B
proc makebbslist
string BBSid
integer i
	BBSList = ""
	i = 1
	BBSid = readbbs(i)
	while not NULLSTR BBSid
		strlwr BBSid
		strfmt BBSList "%s,%s" BBSList BBSid
		i++
		BBSid = readbbs(i)
	endwhile
	if i > 1
		strdelete BBSList 0 1
	endif
endproc
#endif
#endif


#comment
*********************************************************************
* 
* MAKETASKLIST()
* 
* Calls openfile(), gettaskstring(), readbbs(), readitem(),
* makefullname(), updatecount()
* 
* Called by:
* 	MRUN211H:  parsedialog(), changestatus(), filereset(),
* 				  filedelmrun(), editpaste(), editdelete(),
*             callscript()
* 	MRUN211A:  main(), executor()
* 	MRUN211G:  main(), dobbs()
* 
* 
* Creates the Task List displayed in the main MailRun
* dialog box.  Each item of each BBS is read from the *.MRN
* file and a "TaskString" is produced to describe its contents.
* The BBS and Item coordinates are appended to the TaskString
* as an index back into the *.MRN file.  Tabstops are used to
* push these indexes beyond the right edge of the Task List
* flistbox so that they are not visible.  TaskStrings for BBS
* names have an item coordinate of zero.
* 
* Also calculates the values of variables displayed in the
* statistics section of the main dialog box.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc maketasklist
string TaskString, Tasks, Pending
string BBSid, Itemj
integer i, j
	;set all values displayed in main dialog box to 0
	BBST = 0
	BBSC = 0
	BBSR = 0
	ItemT = 0
	ItemC = 0
	ItemE = 0
	Tasks = makefullname(TempDir, "TASKLIST.TMP")
	;Save the values for the current BBS and Item
	openfile(TaskFile, Tasks, _CREATE, _TEXT)
	i = 1
	BBSid = readbbs(i)
	while not NULLSTR BBSid
		;Loop through each BBS in the MailRun
		ItemR = 0
		j = 0
		TaskString = gettaskstring(BBSid, 0)
		fputs TaskFile TaskString
		j++
		Itemj = readitem(BBSid, j)
		while not NULLSTR Itemj
			;Loop through each Item
			strextract Pending Itemj "," 0
			if strcmpi Pending "0"
				ItemC++
			elseif strcmpi Pending "1"
				ItemR++
			else
				ItemE++
			endif
			TaskString = gettaskstring(BBSid, j)
			fputs TaskFile TaskString
			ItemT++
			j++
			Itemj = readitem(BBSid, j)
		endwhile
		BBST++
		if ItemR == 0
			BBSC++
		endif
		i++
		BBSid = readbbs(i)
	endwhile
	fclose TaskFile
	;prepare statistics variables for display in the main box
	BBSR = BBST - BBSC
	ItemR = ItemT - ItemC - ItemE
	updatecount()
endproc
#endif


#comment
*********************************************************************
* 
* MAKEMAILRUNLIST()
* 
* Calls makefullname()
* 
* Called by:
* 	MRUN211H:  filesaveas(), filedelmrun(), callscript()
* 	MRUN211A:  main()
* 	MRUN211B:  main(), newmailrun()
* 
* Creates a list of MailRuns for display in the main
* MailRun and MailRun Settings dialog boxes.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AB
proc makemailrunlist
string FileTrunc, MRNFile
	MailRunList = ""
	MRNFile = makefullname(MailRunDir, "*.MRN")
	findfirst MRNFile
	;Loop through all files in the directory
	while FOUND
		FileTrunc = $FILENAME
		strlwr FileTrunc
		strfmt MailRunList "%s,%s" MailRunList FileTrunc
		findnext
	endwhile
	if not NULLSTR MailRunList
		strdelete MailRunList 0 1
	endif
endproc
#endif


#comment
*********************************************************************
* 
* MAKEDESC()
* 
* Calls openfile()
* 
* Called by:
* 	MRUN211D:  main(), deldlfile()
* 	MRUN211E:  getnewdesc()
* 
* Creates the file description for display in the upload
* and download dialog boxes.
* 
*********************************************************************
#endcomment

#ifdef MRUN211DE
proc makedesc
strparm DescSource
string DB, DL
integer char
long DescBegin, DescLength, counter
	strextract DB FileChoice "`t" 4
	atol DB DescBegin
	strextract DL FileChoice "`t" 5
	atol DL DescLength
	if DescLength != 0
		;if there is a description in the database, retrieve it
		openfile(FileDescFile, FileDesc, _CREATE, _NORMAL)
		openfile(SourceFile, DescSource, _READWRITE, _NORMAL)
		fseek SourceFile DescBegin 0
		for counter = 1 upto DescLength
			fgetc SourceFile char
			fputc FileDescFile char
		endfor
		fclose FileDescFile
		fclose SourceFile
	else
		;otherwise, just delete the previous description
		openfile(FileDescFile, FileDesc, _CREATE, _NORMAL)
		fclose FileDescFile
	endif
endproc
#endif


#comment
*********************************************************************
* 
* LOADSETTINGS()
* 
* Called by:
* 	MRUN211H:  makemrn(), changemailrun()
* 	MRUN211B:  main()
* 
* Initializes MailRun settings.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AB
proc loadsettings
strparm _MailRun
	profilerd _MailRun "MailRun" "MailDir" MailDir
	profilerd _MailRun "MailRun" "ReplyDir" ReplyDir
	profilerd _MailRun "MailRun" "DownloadDir" DownloadDir
	profilerd _MailRun "MailRun" "UploadDir" UploadDir
	profilerd _MailRun "MailRun" "SavePackets" SavePackets
	profilerd _MailRun "MailRun" "DialAttempts" DialAttempts
	profilerd _MailRun "MailRun" "DialTimeout" DialTimeout
	profilerd _MailRun "MailRun" "DialPause" DialPause
	profilerd _MailRun "MailRun" "IdleTimeout" IdleTime
	profilerd _MailRun "MailRun" "LogRun" LogRun
	profilerd _MailRun "MailRun" "AppendLog" AppendLog
	profilerd _MailRun "MailRun" "AnsiInLog" AnsiInLog
	profilerd _MailRun "MailRun" "NewfileFilter" NewfileFilter
	profilerd _MailRun "MailRun" "Archiver" Archiver
	profilerd _MailRun "MailRun" "QWKReader" QWKReader
	profilerd _MailRun "MailRun" "LogViewer" LogViewer
endproc
#endif


#comment
*********************************************************************
* 
* WRITESETTINGS()
* 
* Called by:  
* 	MRUN211H:  makemrn()
* 	MRUN211B:  main()
* 
* Writes MailRun settings to the *.MRN file.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AB
proc writesettings
strparm _MailRun
	profilewr _MailRun "MailRun" "MailDir" MailDir
	profilewr _MailRun "MailRun" "ReplyDir" ReplyDir
	profilewr _MailRun "MailRun" "DownloadDir" DownloadDir
	profilewr _MailRun "MailRun" "UploadDir" UploadDir
	profilewr _MailRun "MailRun" "DialAttempts" DialAttempts
	profilewr _MailRun "MailRun" "DialTimeout" DialTimeout
	profilewr _MailRun "MailRun" "DialPause" DialPause
	profilewr _MailRun "MailRun" "IdleTimeout" IdleTime
	profilewr _MailRun "MailRun" "SavePackets" SavePackets
	profilewr _MailRun "MailRun" "LogRun" LogRun
	profilewr _MailRun "MailRun" "AppendLog" AppendLog
	profilewr _MailRun "MailRun" "AnsiInLog" AnsiInLog
	profilewr _MailRun "MailRun" "NewfileFilter" NewfileFilter
	profilewr _MailRun "MailRun" "Archiver" Archiver
	profilewr _MailRun "MailRun" "QWKReader" QWKReader
	profilewr _MailRun "MailRun" "LogViewer" LogViewer
endproc
#endif


#comment
*********************************************************************
* 
* LOADBBSINFO()
* 
* Called by:
* 	MRUN211H:  makemrn(), editcopy(), editpaste()
* 	MRUN211C:  changeuserinfo(), addbbs()
* 
* Initializes BBS information.
* 
*********************************************************************
#endcomment

#ifndef MRUN211DE
#ifndef MRUN211F
#ifndef MRUN211G
proc loadbbsinfo
strparm _MailRun, _BBS
	profilerd _MailRun _BBS "BBSName" BBSName
	profilerd _MailRun _BBS "UserName" UserName
	profilerd _MailRun _BBS "PWord" Pword
	profilerd _MailRun _BBS "XferProt" XferProt
	profilerd _MailRun _BBS "MailXferProt" MailXferProt
	profilerd _MailRun _BBS "QWKArchiver" QWKArchiver
	profilerd _MailRun _BBS "Number_1" Number_1
	profilerd _MailRun _BBS "Number_2" Number_2
	profilerd _MailRun _BBS "Number_3" Number_3
	profilerd _MailRun _BBS "BBSType" BBSType
	profilerd _MailRun _BBS "MailDoorType" MailDoorType
endproc
#endif
#endif
#endif


#comment
*********************************************************************
* 
* WRITEBBSINFO()
* 
* Called by:
* 	MRUN211H:  makemrn(), editcopy(), editpaste()
* 	MRUN211C:  changeuserinfo()
* 
* Writes information for current BBS to the *.MRN file.
* 
*********************************************************************
#endcomment

#ifndef MRUN211DE
#ifndef MRUN211F
#ifndef MRUN211G
proc writebbsinfo
strparm _MailRun, _BBS
	profilewr _MailRun _BBS "BBSName" BBSName
	profilewr _MailRun _BBS "UserName" UserName
	profilewr _MailRun _BBS "PWord" PWord
	profilewr _MailRun _BBS "XferProt" XferProt
	profilewr _MailRun _BBS "MailXferProt" MailXferProt
	profilewr _MailRun _BBS "QWKArchiver" QWKArchiver
	profilewr _MailRun _BBS "Number_1" Number_1
	profilewr _MailRun _BBS "Number_2" Number_2
	profilewr _MailRun _BBS "Number_3" Number_3
	profilewr _MailRun _BBS "BBSType" BBSType
	profilewr _MailRun _BBS "MailDoorType" MailDoorType
endproc
#endif
#endif
#endif


#comment
*********************************************************************
* 
* LOADPROMPTS()
* 
* Called by:
* 	MRUN211H:  makemrn(), editcopy(), editpaste()
* 	MRUN211C:  changeuserinfo(), changeprompts(), addbbs()
* 
* Initializes BBS prompts.
* 
*********************************************************************
#endcomment

#ifndef MRUN211DE
#ifndef MRUN211F
#ifndef MRUN211G
proc loadprompts
strparm _MailRun, _BBS
	profilerd _MailRun _BBS "CallingFrom" CallingFrom
	profilerd _MailRun _BBS "UserResp1" UserResp1
	profilerd _MailRun _BBS "UserResp2" UserResp2
	profilerd _MailRun _BBS "LangNumber" LangNumber
	profilerd _MailRun _BBS "GraphicsOn" GraphicsOn
	profilerd _MailRun _BBS "LangPrompt" LangPrompt
	profilerd _MailRun _BBS "GraphicsPrompt" GraphicsPrompt
	profilerd _MailRun _BBS "NamePrompt" NamePrompt
	profilerd _MailRun _BBS "PWordPrompt" PWordPrompt
	profilerd _MailRun _BBS "UserPrompt1" UserPrompt1
	profilerd _MailRun _BBS "UserPrompt2" UserPrompt2
	profilerd _MailRun _BBS "ViewPrompt" ViewPrompt
	profilerd _MailRun _BBS "ScanPrompt" ScanPrompt
	profilerd _MailRun _BBS "FilePrompt" FilePrompt
	profilerd _MailRun _BBS "MorePrompt" MorePrompt
	profilerd _MailRun _BBS "ContinuePrompt" ContinuePrompt
	profilerd _MailRun _BBS "CommandPrompt" CommandPrompt
	profilerd _MailRun _BBS "DLPrompt" DLPrompt
	profilerd _MailRun _BBS "DLUnavPrompt" DLUnavPrompt
	profilerd _MailRun _BBS "ULPrompt" ULPrompt
	profilerd _MailRun _BBS "ULDescPrompt" ULDescPrompt
endproc
#endif
#endif
#endif


#comment
*********************************************************************
* 
* WRITEPROMPTS()
* 
* Called by:
* 	MRUN211H:  makemrn(), editcopy(), editpaste()
* 	MRUN211C:  changeuserinfo(), changeprompts(), exportprompts()
* 
* Writes prompts for current BBS to the *.MRN file.
* 
*********************************************************************
#endcomment

#ifndef MRUN211DE
#ifndef MRUN211F
#ifndef MRUN211G
proc writeprompts
strparm _MailRun, _BBS
	profilewr _MailRun _BBS "CallingFrom" CallingFrom
	profilewr _MailRun _BBS "UserResp1" UserResp1
	profilewr _MailRun _BBS "UserResp2" UserResp2
	profilewr _MailRun _BBS "LangNumber" LangNumber
	profilewr _MailRun _BBS "GraphicsOn" GraphicsOn
	profilewr _MailRun _BBS "LangPrompt" LangPrompt
	profilewr _MailRun _BBS "GraphicsPrompt" GraphicsPrompt
	profilewr _MailRun _BBS "NamePrompt" NamePrompt
	profilewr _MailRun _BBS "PWordPrompt" PWordPrompt
	profilewr _MailRun _BBS "UserPrompt1" UserPrompt1
	profilewr _MailRun _BBS "UserPrompt2" UserPrompt2
	profilewr _MailRun _BBS "ViewPrompt" ViewPrompt
	profilewr _MailRun _BBS "ScanPrompt" ScanPrompt
	profilewr _MailRun _BBS "FilePrompt" FilePrompt
	profilewr _MailRun _BBS "MorePrompt" MorePrompt
	profilewr _MailRun _BBS "ContinuePrompt" ContinuePrompt
	profilewr _MailRun _BBS "CommandPrompt" CommandPrompt
	profilewr _MailRun _BBS "DLPrompt" DLPrompt
	profilewr _MailRun _BBS "DLUnavPrompt" DLUnavPrompt
	profilewr _MailRun _BBS "ULPrompt" ULPrompt
	profilewr _MailRun _BBS "ULDescPrompt" ULDescPrompt
endproc
#endif
#endif
#endif


#comment
*********************************************************************
* 
* LOADMAILDOOR()
* 
* Called by:
* 	MRUN211H:  makemrn(), editcopy(), editpaste()
* 	MRUN211C:  changeuserinfo(), changemaildoor(), addbbs()
* 
* Initializes mail door prompts.
* 
*********************************************************************
#endcomment

#ifndef MRUN211DE
#ifndef MRUN211F
#ifndef MRUN211G
proc loadmaildoor
strparm _MailRun, _BBS
	profilerd _MailRun _BBS "MailDoor" MailDoor
	profilerd _MailRun _BBS "MailPrompt" MailPrompt
	profilerd _MailRun _BBS "ReceiveQWKPrompt" ReceiveQWKPrompt
	profilerd _MailRun _BBS "MailDLPrompt" MailDLPrompt
	profilerd _MailRun _BBS "MailULPrompt" MailULPrompt
	profilerd _MailRun _BBS "MsgMenuPrompt" MsgMenuPrompt
endproc
#endif
#endif
#endif


#comment
*********************************************************************
* 
* WRITEMAILDOOR()
* 
* Called by:
* 	MRUN211H:  makemrn(), editcopy(), editpaste()
* 	MRUN211C:  changeuserinfo(), changemaildoor(), 
* 				  exportmaildoor()
* 
* Writes mail door prompts for the current BBS to the .MRN
* file.
* 
*********************************************************************
#endcomment

#ifndef MRUN211DE
#ifndef MRUN211F
#ifndef MRUN211G
proc writemaildoor
strparm _MailRun, _BBS
	profilewr _MailRun _BBS "MailDoor" MailDoor
	profilewr _MailRun _BBS "MailPrompt" MailPrompt
	profilewr _MailRun _BBS "ReceiveQWKPrompt" ReceiveQWKPrompt
	profilewr _MailRun _BBS "MailDLPrompt" MailDLPrompt
	profilewr _MailRun _BBS "MailULPrompt" MailULPrompt
	profilewr _MailRun _BBS "MsgMenuPrompt" MsgMenuPrompt
endproc
#endif
#endif
#endif


#comment
*********************************************************************
* 
* READBBS()
* 
* Called by:
* 	MRUN211H:  makebbslist(), maketasklist(), getbbscoord(), 
* 				  insertbbs(), swapbbs(), filereset(), editdelete()
* 	MRUN211G:  main(), makequeue()
* 
* Reads the BBS associated with a BBS coordinate in the
* current mailrun.
* 
*********************************************************************
#endcomment

func readbbs : string
intparm i
string BBS_X, BBSid
	strfmt BBS_X "BBS_%d" i
	profilerd MailRun "MailRun" BBS_X BBSid
	return BBSid
endfunc


#comment
*********************************************************************
* 
* READITEM()
* 
* Called by:
* 	MRUN211H:  maketasklist(), getlastitem(), insertitem(), 
* 				  checkpending(), swapitem(), filereset(), 
* 				  changestatus(), editcopy(), editdelete()
* 	MRUN211G:  dobbs()
* 
* Reads the Item associated with a BBS coordinate in the
* current mailrun.
* 
*********************************************************************
#endcomment

func readitem : string
strparm BBSid
intparm i
string Item_X, Itemi
	strfmt Item_X "Item_%d" i
	profilerd MailRun BBSid Item_X Itemi
	return Itemi
endfunc


#comment
*********************************************************************
* 
* WRITEBBS()
* 
* Called by:
* 	MRUN211H:  insertbbs(), swapbbs(), editdelete()
* 	MRUN211C:  changeusersettings()
* 
* Writes a BBS ID to the given coordinate in the current
* mailrun.
* 
*********************************************************************
#endcomment

proc writebbs
intparm i
strparm BBSid
string BBS_X
	strfmt BBS_X "BBS_%d" i
	profilewr MailRun "MailRun" BBS_X BBSid
endproc


#comment
*********************************************************************
* 
* WRITEITEM()
* 
* Called by:
* 	MRUN211H:  swapitem(), insertitem(), editdelete(), filereset(),
* 				  changestatus()
* 	MRUN211G:  dobbs()
* 
* Writes an Item to the given Item coordinate for the
* current BBS and MailRun.
* 
*********************************************************************
#endcomment

proc writeitem
strparm BBSid
intparm i
strparm Itemi
string Item_X
	strfmt Item_X "Item_%d" i
	profilewr MailRun BBSid Item_X Itemi
endproc


#comment
*********************************************************************
* 
* GETBBSCOORD()
* 
* Calls readbbs()
* 
* Called by:
* 	MRUN210H:  parsedialog(), editdelete()
* 
* Gets the BBS coordinate for a given BBS ID.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
func getbbscoord : integer
strparm BBSid
integer i
string BBSi
	i = 1
	BBSi = readbbs(i)
	while not strcmpi BBSid BBSi
		i++
		BBSi = readbbs(i)
	endwhile
	return i
endfunc
#endif


#comment
*********************************************************************
* 
* GETFIRSTITEM()
*
* Calls gettaskstring()
* 
* Called by:
* 	MRUN211H:  parsedialog(), filereset(), filedelmrun(),
*             callscript()
* 	MRUN211A:  main()
*  MRUN211B:  main()
* 
* Highlights the first item in the task list.
* 
*********************************************************************
#endcomment

proc getfirstitem
string BBSid
	profilerd MailRun "MailRun" "BBS_1" BBSid
	if not NULLSTR BBSid
		TaskItem = gettaskstring(BBSid, 0)
	else
		TaskItem = ""
	endif
endproc


#comment
*********************************************************************
* 
* GETLASTITEM()
* 
* Calls readitem()
* 
* Called by:
* 	MRUN211D:  main()
* 	MRUN211E:  main()
* 	MRUN211F:  addgetmail(), addsendcommand(), adddoscript()
* 
* Gets the Item coordinate for a given Item in the current
* BBS.
* 
*********************************************************************
#endcomment

func getlastitem : integer
strparm BBSid
string Itemi
integer i
	i = 1
	Itemi = readitem(BBSid, i)
	while not NULLSTR Itemi
		i++
		Itemi = readitem(BBSid, i)
	endwhile
	i--
	return i
endfunc


#comment
*********************************************************************
* 
* GETTASKSTRING()
* 
* Called by:
* 	MRUN211H:  maketasklist(), parsedialog(), swapbbs(), swapitem(), 
*             editdelete(), changestatus(), editpaste()
* 	MRUN211C:  changeuserinfo(), changeprompts(), changemaildoor()
* 	MRUN211D:  main()
* 	MRUN211E:  main()
* 	MRUN211F:  addgetmail(), addsendmail(), adddoscript()
* 	MRUN211G:  dobbs()
* 
* Produces a TaskString from the current *.MRN Item.
* Items are strings with the format:
* 
* 		"Pending,Perm,TaskType,FileName,Conf"
* 
* Pending = 0 if item is completed, 1 if pending, 2 if an
* 		error occurred in previous attempt to execute it.
* Perm = 1 if the item is permanent; Perm = 2 if temporary.
* TaskType may be SendMail, GetMail, SendFile, GetFile,
* 		SendCommand or SendScript.
* FileName is the name of the file to be transferred, used
* 		by SendFile and GetFile items.
* Conf is the number of the conference to be joined, used
* 		by SendFile and GetFile items.
* 
*********************************************************************
#endcomment

func gettaskstring : string
strparm BBSid
intparm j
string Pending, Perm, TaskType, TaskString, KeyString, BBSNamen
string char, Item_X, Itemi, Confi
	if j == 0
		;if this is for a BBS name
		profilerd MailRun BBSid "BBSName" BBSNamen
		strfmt TaskString "%s`t`t`t%s`t%d" BBSNamen BBSid j
	else
		;if this is for an item
		strfmt Item_X "Item_%d" j
		profilerd MailRun BBSid Item_X Itemi
		strextract Pending Itemi "," 0
		strextract Perm Itemi "," 1
		strextract TaskType Itemi "," 2
		if strcmpi Pending "1"
			If strcmpi Perm "1"
				char = "#"
			else
				char = "¤"
			endif
		elseif strcmpi Pending "0"
			char = "@"
		else
			char = " !"
		endif
		switch TaskType
			case "SendMail"
				TaskString = "Send REP Packet"
			endcase
			case "GetMail"
				TaskString = "Get QWK Packet"
			endcase
			case "SendFile"
				strextract KeyString Itemi "," 3
				strextract Confi Itemi "," 4
				strfmt TaskString "Upload %s to File Area %s" KeyString Confi
			endcase
			case "GetFile"
				strextract keystring Itemi "," 3
				strextract Confi Itemi "," 4
				strfmt TaskString "Download %s from File Area %s" KeyString Confi
			endcase
			case "SendCommand"
				strextract KeyString Itemi "," 3
				strfmt TaskString "Send Command:  %s" KeyString
			endcase
			case "SendScript"
				strextract KeyString Itemi "," 3
				strfmt TaskString "Execute Script:  %s" KeyString
			endcase
		endswitch
		strfmt TaskString "`t%s`t%s`t%s`t%d" char TaskString BBSid j
	endif
	return TaskString
endfunc


#comment
*********************************************************************
* 
* UPDATECOUNT()
* 
* Called by:
* 	MRUN211H:  maketasklist(), changestatus()
* 	MRUN211G:  dobbs()
* 
* Updates the statistics section of the main MailRun dialog box.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc updatecount
	itoa BBST BBSTotal
	itoa BBSC BBSComplete
	itoa BBSR BBSRemaining
	itoa ItemT ItemTotal
	itoa ItemC ItemComplete
	itoa ItemE ItemError
	itoa ItemR ItemRemaining
endproc
#endif


#comment
*********************************************************************
* 
* COPYMRN()
* 
* Calls makefullname()
* 
* Called by:
* 	MRUN211H:  changemailrun(), filesaveas(), filedelmrun()
* 
* Copies a mailrun from MailRunDir to TempDir.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AB
proc copymrn
string LastRun
	delfile MailRun
	LastRun = makefullname(MailRunDir, MailRunTrunc)
	MailRun = makefullname(TempDir, MailRunTrunc)
	copyfile LastRun MailRun
endproc
#endif


#comment
*********************************************************************
* 
* FVERIFY()
* 
* Called by:
* 	MRUN211H:  filesaveas()
* 	MRUN211B:  newmailrun()
* 	MRUN211C:  addbbs()
* 
* Checks for a valid DOS filename (sans extension).
* Returns 1 if valid, 0 if invalid.
* 
*********************************************************************
#endcomment

#ifndef MRUN211DE
#ifndef MRUN211F
#ifndef MRUN211G
func fverify : integer
strparm LookString
string DOSChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&()-_{}"
string char
integer i, j
	strlen LookString i
	if (i > 8) || (i == 0)
		return 0
	else
		i = 0
		strpeek LookString i j
		while j != 0
			strfmt char "%c" j
			if not strfind DOSChars char
				return 0
			endif
			i++
			strpeek LookString i j
		endwhile
		return 1
	endif
endfunc
#endif
#endif
#endif


#comment
*********************************************************************
* 
* INLIST()
* 
* Called by:
*  MRUN211H: editpaste()
*	MRUN211C: addbbs(), exportprompts(), exportmaildoor()
* 
* Returns 1 if the first string parameter is contained in
* the second string, which must be a comma delimited list;
* otherwise returns 0.
* 
*********************************************************************
#endcomment

#ifndef MRUN211B
#ifndef MRUN211DE
#ifndef MRUN211F
func inlist: integer
strparm LookString, ListString
string Element
integer i = 0
	strextract Element ListString "," i
	while not NULLSTR Element
		if strcmpi Element LookString
			return 1
		endif
		i++
		strextract Element ListString "," i
	endwhile
	return 0 
endfunc
#endif
#endif
#endif


#comment
*********************************************************************
* 
* OPENFILE()
* 
* Calls fileexit()
* 
* Called by:
* 	MRUN211H:  maketasklist(), makedesc(), clearfiledesc(),
* 				  sortidx(), swapbbs(), taskfilefwd(), fileautorun()
* 	MRUN211D:  main(), purgeoldfiles(), getnewfiles(),
* 				  import(), deldlfile()
* 	MRUN211E:  insertulfile(), killfile(), getulfiles(),
* 				  updateudx()
* 	MRUN211F:  makescriptlist()
* 	MRUN211G:  makequeue(), getdialstring(), senddesc(), putdesc()
* 
* Opens a file in the manner specified.  If the file could
* not be opened successfully, displays an error message and
* terminates the script.
* 
*********************************************************************
#endcomment

proc openfile
intparm FileIndex
strparm FileNamen
intparm OpenMethod, OpenType
	switch OpenMethod
		case _CREATE
			switch OpenType
				case _TEXT
					fopen FileIndex FileNamen CREATE TEXT
				endcase
				case _NORMAL
					fopen FileIndex FileNamen CREATE
				endcase
			endswitch
		endcase
		case _READWRITE
			switch OpenType
				case _TEXT
					fopen FileIndex FileNamen READWRITE TEXT
				endcase
				case _NORMAL
					fopen FileIndex FileNamen READWRITE
				endcase
			endswitch
		endcase
	endswitch
	if FAILURE
		errormsg "Unable to open file %s;`r`nscript aborted...." FileNamen
		fileexit()
	endif
endproc


#comment
*********************************************************************
* 
* CLEARDIR()
* 
* Calls makefullname()
* 
* Called by:
* 	MRUN211H:  fileexit()
* 	MRUN211A:  initialize()
* 	MRUN211G:  getmail()
* 
* Deletes the contents of a directory.
* 
*********************************************************************
#endcomment

proc cleardir
strparm DirName
string DeadFile, DirFiles
	DirFiles = makefullname(DirName, "*.*")
	findfirst DirFiles
	while FOUND
		DeadFile = makefullname(DirName, $FILENAME)
		delfile DeadFile
		findnext
	endwhile
endproc


#comment
*********************************************************************
* 
* CLEARFILEDESC()
* 
* Calls openfile()
* 
* Called by:
* 	MRUN211D:  main(), deldlfile()
* 	MRUN211E:  main(), insertulfile(), killfile()
* 
* Clears the current file description box by creating a
* new file.
* 
*********************************************************************
#endcomment

#ifdef MRUN211DE
proc clearfiledesc
	openfile(FileDescFile, FileDesc, _CREATE, _NORMAL)
	fclose FileDescFile
endproc
#endif


#comment
*********************************************************************
* 
* INSERTITEM()
* 
* Calls readitem(), writeitem()
* 
* Called by:
* 	MRUN211H:  editpaste()
* 	MRUN211D:  main()
* 	MRUN211E:  insertulfile()
* 	MRUN211F:  addgetmail(), addsendcommand(), adddoscript()
* 
* Inserts a new item into the *.MRN file.
* 
*********************************************************************
#endcomment

proc insertitem
strparm BBSid
intparm i
strparm NovumItem
string Itemi
integer j, k
	j = i - 1
	Itemi = readitem(BBSid, i)
	while not NULLSTR Itemi
		i++
		Itemi = readitem(BBSid, i)
	endwhile
	k = i - 1
	while k > j
		Itemi = readitem(BBSid, k)
		writeitem(BBSid, i, Itemi)
		i--
		k--
	endwhile
	writeitem(BBSid, i, NovumItem)
endproc


#comment
*********************************************************************
* 
* INSERTBBS()
* 
* Calls readbbs(), writebbs()
* 
* Called by:
* 	MRUN211H:  editpaste()
* 	MRUN211C:  changeuserinfo()
* 
* Inserts a new BBS into the *.MRN file.
* 
*********************************************************************
#endcomment

#ifndef MRUN211B
#ifndef MRUN211DE
#ifndef MRUN211F
#ifndef MRUN211G
proc insertbbs
strparm BBSid, NewBBS
string BBSi
integer j, k
	j =  1
	BBSi = readbbs(j)
	;Go to the last BBS
	while not NULLSTR BBSi
		j++
		BBSi = readbbs(j)
	endwhile
	k = j - 1
	;Count back down, renumbering on the way
	while not strcmp BBSi BBSid
		BBSi = readbbs(k)
		writebbs(j, BBSi)
		j--
		k--
	endwhile
	writebbs(j, NewBBS)
endproc
#endif
#endif
#endif
#endif


#comment
*********************************************************************
* 
* CHANGEMAILRUN()
* 
* Calls filesave(), copymrn(), loadsettings()
* 
* Called by: 
* 	MRUN211H:  parsedialog()
* 	MRUN211B:  main()
* 
* Saves the last mailrun and loads a new one.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AB
proc changemailrun
	;Update the last mailrun
	filesave()
	;Get the next mailrun and copy it to the temp directory
	copymrn()
	loadsettings(MailRun)
endproc
#endif


#comment
*********************************************************************
* 
* CHECKPENDING()
* 
* Calls readitem()
* 
* Called by:
* 	MRUN211H:  changestatus()
* 	MRUN211G:  makequeue()
* 
* Checks a BBS for currently pending items.  Returns "1" if
* items are pending, "0" if none are pending.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
func checkpending : integer
strparm BBSid
string Pending, Itemi
integer i
	i = 1
	Itemi = readitem(BBSid, i)
	while not NULLSTR Itemi
		strextract Pending Itemi "," 0
		if strcmpi Pending "1"
			return 1
		endif
		i++
		Itemi = readitem(BBSid, i)
	endwhile
	return 0
endfunc
#endif


#comment
*********************************************************************
* 
* CHECKCHILD()
* 
* Called by:
* 	MRUN211A-G:  main()
* 
* Halts the script if the current script has not been
* called by another script.
* 
*********************************************************************
#endcomment

proc checkchild
	if not ($CHILD || $CHAINED)
		errormsg "This script can only be run from MRUN211.WAX."
		halt
	endif
endproc


#comment
*********************************************************************
* 
* CHECKRUNNING()
* 
* Called by:
* 	MRUN211H:  filenewmrun()
* 
* Checks whether a mailrun is executing.  Returns 0 and
* generates a message if running, returns 1 if not.
* 
*********************************************************************
#endcomment

#ifndef MRUN211G
func checkrunning : integer
	if FLAGS & RUNNING
		usermsg "You cannot create a new mailrun while a mailrun is executing."
		return 0
	else
		return 1
	endif
endfunc
#endif


#comment
*********************************************************************
* 
* CHECKCHANGED()
* 
* Called by:
* 	MRUN211H:  filenewmrun(), cfgmrun(), cfgbbs(), cfgprompts(),
* 				  cfgmaildoor(), defaultsmailrun(), defaultsbbs(),
* 				  defaultsprompts(), defaultsdoor(), addnewbbs(),
* 				  addgetsend(), adddownload(), addupload(), 
* 				  addsendcmd(), addscript(), helpabout()
* 	MRUN211B:  main()
* 	MRUN211C:  changebbsinfo(), changeprompts(), changemaildoor()
* 	MRUN211E:  main()
* 
* Checks whether the contents of the current dialog box
* have changed and generates a warning.  Returns 1 if
* user elects to proceed or if there has been no change,
* 0 if user cancels.
* 
*********************************************************************
#endcomment

func checkchanged : integer
integer Response
	if FLAGS & CHANGED
		sdlgmsgbox "MailRun Message" "Discard Changes?" QUESTION YESNO \
			Response 2
		switch Response
			case 6
				FLAGS &= UNCHANGED
				return 1
			endcase
			case 7
				return 0
			endcase
		endswitch
	else
		return 1
	endif
endfunc


#comment
*********************************************************************
* 
* CHECKFILE()
* 
* Called by:
* 	MRUN211A:  initialize()
* 	MRUN211D:  purgeoldfiles(), getnewfiles(), import()
* 	MRUN211E:  main(), getulfiles()
* 	MRUN211G:  senddesc(), putdesc()
* 
* Checks for a file's existence.  Returns 1 if the file is
* found, 0 if not found.
* 
*********************************************************************
#endcomment

#ifndef MRUN211BC
#ifndef MRUN211F
func checkfile : integer
strparm FileNom
	if isfile FileNom
		return 1
	else
		return 0
	endif
endfunc
#endif
#endif


#comment
*********************************************************************
* 
* CHECKTASK()
* 
* Called by:
* 	MRUN211H:  executearchiver(), executeqwkreader(),
* 				  executelogviewer()
* 
* Returns 1 if the specified application is already running;
* otherwise returns 0.
* 
*********************************************************************
#endcomment

func checktask : integer
strparm Called
string AppName
integer i
	firsttask i
	while i
		taskname i AppName
		if strfind Called AppName
			return i
		endif
		nexttask i
	endwhile
	return 0
endfunc


#comment
*********************************************************************
* 
* CHECKNEW()
* 
* Called by:
* 	MRUN211H:  cfgbbs(), cfgprompts(), cfgmaildoor(), 
* 				  addgetsend(), adddlfile(), addulfile(),
* 				  addsendcmd(), addscript()
* 
* Returns 0 if the current mailrun is empty; else returns 1.
* 
*********************************************************************
#endcomment

func checknew : integer
	if NULLSTR TaskItem
		usermsg "You must add a BBS before selecting this function!"
		return 0
	else
		return 1
	endif
endfunc


#comment
*********************************************************************
* 
* MENUDIM()
* 
* Called by:
* 	MRUN211H:  callscript()
* 	MRUN211B-G:  main()
* 
* Enables all menu controls, then disables those which
* cannot be used in the current module.
* 
*********************************************************************
#endcomment

proc menudim
	enable MENU 1 32
#ifndef MRUN211AG
	disable MENU 3 5
	disable MENU 8 11
#endif
#ifdef MRUN211G
	disable MENU 1
	disable MENU 3
	disable MENU 5 6
#endif
endproc


#comment
*********************************************************************
* 
* SORTIDX()
* 
* Calls fieldcompare(), makefullname(), openfile(),
* interfaceoff(), interfaceon()
* 
* Called by:
* 	MRUN211D:  main(), getnewfiles()
* 	MRUN211E:  main(), getulfiles(), updateudx()
* 
* Sorts an index file for display in the upload or download
* dialog box.  This routine uses two temp files to sort the
* contents of the referenced file.  It is used to sort an
* index file that has not been previously sorted.  The
* method used is too slow when only a couple of new items
* need to be sorted in the file.
* 
*********************************************************************
#endcomment

#ifdef MRUN211DE
proc sortidx
strparm idxName
intparm SortField
string temp1, temp2, Line1, Line2, LastLine
integer Unsorted, Readidx, Writeidx, i, counter
	SortField -=2
	if SortField < 0
		return
	endif
	interfaceoff()
	counter = 0
	temp1 = makefullname(TempDir, "temp1.tmp")
	temp2 = makefullname(TempDir, "temp2.tmp")
	Unsorted = 0
	Readidx = 1
	Writeidx = 2
	openfile(Unsorted, idxName, _READWRITE, _TEXT)
	fgets Unsorted Line1
	statmsg "Sorting...     %d" counter
	if feof Unsorted
		;if the index is empty, return
		fclose Unsorted
		interfaceon()
		return
	else
		;otherwise, open temp files and sort
		openfile(Readidx, temp1, _CREATE, _TEXT)
		openfile(Writeidx, temp2, _CREATE, _TEXT)
		;put the first line into the read file
		fputs Readidx Line1
		rewind Readidx
		;get the next line of the unsorted file
		fgets Unsorted Line1
		counter++
		statmsg "Sorting...     %d" counter
		fgets Readidx Line2
		if feof Unsorted
			;prevents a single file from being deleted
			fputs Writeidx Line2
		endif
		while not feof Unsorted
			while not feof Readidx
				if fieldcompare(Line1, Line2, SortField)
					exitwhile
				endif
				fputs Writeidx Line2
				fgets Readidx Line2
			endwhile
			fputs Writeidx Line1
			LastLine = Line1
			fgets Unsorted Line1
			counter++
			statmsg "Sorting...     %d" counter
			if feof Unsorted
				while not feof Readidx
					fputs Writeidx Line2
					fgets Readidx Line2
				endwhile
				exitwhile
			elseif !(fieldcompare(Line1, LastLine, SortField))
				loopwhile
			endif
			while not feof Readidx
				fputs Writeidx Line2
				fgets Readidx Line2
			endwhile
			rewind Readidx
			rewind Writeidx
			i = Readidx
			Readidx = Writeidx
			Writeidx = i
			fgets Readidx Line2
		endwhile
		fclose Unsorted
		fclose Readidx
		fclose Writeidx
		delfile idxName
		if Writeidx == 1
			copyfile temp1 idxName
		else
			copyfile temp2 idxName
		endif
		delfile temp1
		delfile temp2
	endif
	statmsg ""
	interfaceon()
endproc
#endif


#comment
*********************************************************************
* 
* FIELDCOMPARE()
* 
* Called by:
* 	MRUN211H:  sortidx()
* 
* Compares two fields.  Returns 0 if Field1 > Field2,
* 1 if Field1 <= Field2.
* 
*********************************************************************
#endcomment

#ifdef MRUN211DE
func fieldcompare : integer
strparm Line1, Line2
intparm FieldType
string Field1, Field2
long number1, number2, Date1, Date2
	strextract Field1 Line1 "`t" FieldType
	strextract Field2 Line2 "`t" FieldType
	switch FieldType
		case ALPHA
			strcmpi Field1 Field2
			if $STRCMP >= 0
				return 0
			else
				return 1
			endif
		endcase
		case NUMERIC
			atol Field1 number1
			atol Field2 number2
			if number1 >= number2
				return 0
			else
				return 1
			endif
		endcase
		case MMDDYY
			strsltime Field1 "00:00:00" Date1
			strsltime Field2 "00:00:00" Date2
			if Date1 >= Date2
				return 0
			else
				return 1
			endif
		endcase
	endswitch
endfunc
#endif


#comment
*********************************************************************
* 
* FINDSTRING()
* 
* Called by:
* 	MRUN211B:  main()
* 	MRUN211C:  exportprompts()
* 	MRUN211D:  getnewfiles(), import()
* 	MRUN211E:  shortdesc()
* 	MRUN211G:  main(), checkcommandprompt(), getconfprompt(),
* 				  checkmailprompt(), checkdescprompt(), 
* 				  checkbaseset(), getotherprompt(), sendmail(),
* 				  getmail(), checkmail(), ulfile(), checkverifyprompt(),
* 				  senddesc(), dlfile(), sendcommand(), sendscript()
* 
* Returns a value of 1 if the second string is contained
* in the first string; otherwise returns 0.
* 
*********************************************************************
#endcomment

#ifndef MRUN211A
#ifndef MRUN211F
func findstring : integer
strparm String1, String2
	if not NULLSTR String2
		if strfind String1 String2
			return 1
		endif
	endif
	return 0
endfunc
#endif
#endif


#comment
**************************************************************************
**************************************************************************
* 
* The following routines comprise the user interface of MailRun.
* parsedialog controls the behavior of the main mailrun dialog box,
* parsemenu() controls the menu and parseobject() controls the
* toolbar.  The menus and toolbar are defined in MRUN211A in the
* procedures mrunmenu(), which creates the main menu system, 
* runmenu(), which creates the alternate menu used when a mailrun
* is executing, and mrunwin(), which creates the toolbar.
* 
**************************************************************************
**************************************************************************
#comment


#comment
*********************************************************************
* 
* INTERFACEON()
* 
* Calls parsemenu(), parseobject()
* 
* Called by:
* 	MRUN211H:  sortidx(), taskfileend()
* 	MRUN211A:  main()
* 	MRUN211B:  main()
* 	MRUN211C:  changeuserinfo(), changeprompts(), changemaildoor()
* 	MRUN211D:  main(), purgeoldfiles(), getnewfiles(), deldlfile()
* 	MRUN211E:  main(), insertulfile(), getulfiles(), updateudx(),
* 	MRUN211F:  addgetmail(), addsendcommand(), adddoscript()
* 	MRUN211G:  makequeue(), getdialstring(), senddesc(), putdesc()
* 
* Activate and deactivate the menu and iconbar.
* 
*********************************************************************
#endcomment

proc interfaceon
	when menu call parsemenu
	when object call parseobject
endproc


#comment
*********************************************************************
* 
* INTERFACEOFF()
* 
* Called by:
* 	MRUN211H:  sortidx(), taskfilefwd()
* 	MRUN211D:  main(), purgeoldfiles(), getnewfiles(), deldlfile()
* 	MRUN211E:  insertulfile(), geulfiles(), updateudx()
* 	MRUN211G:  makequeue(), getdialstring(), senddesc(), putdesc()
* 
* Activate and deactivate the menu and iconbar.
* 
*********************************************************************
#endcomment

#ifndef MRUN211BC
#ifndef MRUN211F
proc interfaceoff
	clearwhen menu
	clearwhen object
endproc
#endif
#endif


#comment
*********************************************************************
* 
* PARSEDIALOG()
* 
* Calls changestatus(), changemailrun(), maketasklist(),
* getfirstitem(), gettaskstring(), swapbbs(), swapitem(),
* getbbscoord(), makequeue()
* 
* Called by
*  MRUN211A:  main(), executor()
*  MRUN211G:  main()
* 
* Checks for dialog box selection and dispatches the
* appropriate task.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc parsedialog
string BBSid, char
integer dialogstatus, i, j
	dialogstatus = $DIALOG
	switch dialogstatus
		case 10
			;User double clicked on an item
			changestatus()
			updatedlg 80
		endcase
		case 11
			;User selected Alt-U to move an item up
			strextract BBSid TaskItem "`t" 3
			i = getbbscoord(BBSid)
			strextract char TaskItem "`t" 4
			atoi char j
			if j == 0
				;if the selected TaskItem is a BBS
				i--
				swapbbs(i)
			else
				;if the selected TaskItem is an Item
				j--
				if swapitem(BBSid, j)
					TaskItem = gettaskstring(BBSid, j)
				endif
			endif
			updatedlg 80
		endcase
		case 12
			;User selected Alt-I to move an item down
			strextract BBSid TaskItem "`t" 3
			i = getbbscoord(BBSid)
			strextract char TaskItem "`t" 4
			atoi char j
			if j == 0
				;If the selected TaskItem is a BBS
				swapbbs(i)
			else
				;If the selected TaskItem is an Item
				if swapitem(BBSid, j)
					j++
					TaskItem = gettaskstring(BBSid, j)
				endif
			endif
			updatedlg 80
		endcase
#ifdef MRUN211A
		case 170
			;User changed mailruns with combobox
			changemailrun()
			maketasklist()
			getfirstitem()
			updatedlg 80
		endcase
#endif
	endswitch
#ifdef MRUN211G
	makequeue()
#endif
endproc
#endif


#comment
*********************************************************************
* 
* SWAPBBS()
* 
* Calls readbbs(), writebbs(), openfile(), gettaskstring(),
* taskfilefwd(), taskfileend()
* 
* Called by:
*  MRUN211H: parsedialog()
* 
* Swaps two BBSs in the task list.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc swapbbs
intparm i
string FirstBBS, SecondBBS, BBSid, TempTasks, TaskString, temp
integer j
	j = i + 1
	FirstBBS = readbbs(i)
	SecondBBS = readbbs(j)
	if NULLSTR FirstBBS
		return
	endif
	if NULLSTR SecondBBS
		return
	endif
	;Unless this is the last (or first) BBS, swap with the next BBS
	TaskString = gettaskstring(FirstBBS, 0)
	taskfilefwd(TaskString)
	TempTasks = makefullname(TempDir, "tmptasks.tmp")
	openfile(TempTaskFile, TempTasks, _CREATE, _TEXT)
	BBSid = FirstBBS
	while strcmp FirstBBS BBSid
		fputs TempTaskFile TaskString
		fgets OldTaskFile TaskString
		strextract BBSid TaskString "`t" 3
	endwhile
	while strcmp SecondBBS BBSid
		fputs TaskFile TaskString
		fgets OldTaskFile TaskString
		strextract BBSid TaskString "`t" 3
	endwhile
	temp = TaskString
	rewind TempTaskFile
	fgets TempTaskFile TaskString
	while not feof TempTaskFile
		fputs TaskFile TaskString
		fgets TempTaskFile TaskString
	endwhile
	fputs TaskFile temp
	taskfileend()
	fclose TempTaskFile
	delfile TempTasks
	writebbs(i, SecondBBS)
	writebbs(j, FirstBBS)
endproc
#endif


#comment
*********************************************************************
* 
* SWAPITEM()
* 
* Calls readitem(), writeitem(), gettaskstring(), taskfilefwd(),
* taskfileend()
* 
* Called by:
*  MRUN211H: parsedialog()
* 
* Swaps two Items in the task list.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
func swapitem : integer
strparm BBSid
intparm j
string Itemj, Iteml, TaskString
integer l
	if j == 0
		return 0
	endif
	l = j + 1
	Itemj = readitem(BBSid, j)
	Iteml = readitem(BBSid, l)
	if not NULLSTR Iteml
		;Unless this is the last Item, swap with the next Item
		TaskString = gettaskstring(BBSid, j)
		taskfilefwd(TaskString)
		writeitem(BBSid, j, Iteml)
		writeitem(BBSid, l, Itemj)
		TaskString = gettaskstring(BBSid, j)
		fputs TaskFile TaskString
		TaskString = gettaskstring(BBSid, l)
		fputs TaskFile TaskString
		fgets OldTaskFile TaskString
		taskfileend()
		return 1
	else
		return 0
	endif
endfunc
#endif


#comment
*********************************************************************
* 
* CHANGESTATUS()
* 
* Calls readitem(), writeitem(), maketasklist(), gettaskstring(), 
* checkpending(), taskfilefwd(), taskfileend(), updatecount()
* 
* Called by:
* 	MRUN211H:  parsedialog()
* 
* Changes the pending/complete permanent/temporary status
* of the selected item on the task list.  Responds to user
* double-clicking on the item.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc changestatus
string Pending, Perm, BBSid, Itemi, char
integer j
	strextract BBSid TaskItem "`t" 3
	strextract char TaskItem "`t" 4
	atoi char j
	if j == 0
		;If the item is a BBS
		;Check for pending items
		if checkpending(BBSid)
			;If at least one item is pending, set all to completed status
			Pending = "0"
		else
			;If no items are pending, set all to pending status
			Pending = "1"
		endif
		j = 1
		Itemi = readitem(BBSid, j)
		;Update all items
		while not NULLSTR Itemi
			strupdt Itemi Pending 0 1
			writeitem(BBSid, j, Itemi)
			j++
			Itemi = readitem(BBSid, j)
		endwhile
		maketasklist()
		TaskItem = gettaskstring(BBSid, 0)
	else
		;If it is not a BBS
		Itemi = readitem(BBSid, j)
		strextract Pending Itemi "," 0
		strextract Perm Itemi "," 1
		if not strcmpi Pending "1"
			if strcmpi Pending "0"
				ItemC--
			else
				ItemE--
			endif
			ItemR++
			Pending = "1"
			Perm = "0"
		else
			if strcmpi Perm "0"
				Perm = "1"
			else
				Pending = "0"
				ItemC++
				ItemR--
			endif
		endif
		updatecount()
		strupdt Itemi Pending 0 1
		strupdt Itemi Perm 2 1
		taskfilefwd(TaskItem)
		writeitem(BBSid, j, Itemi)
		TaskItem = gettaskstring(BBSid, j)
		fputs TaskFile TaskItem
		taskfileend()
	endif
endproc
#endif


#comment
*********************************************************************
*
* TASKFILEFWD()
*
* Calls makefullname(), openfile(), interfaceoff()
*
* Called by:
*  MRUN211H:  swapbbs(), swapitem(), changestatus()
*
* Opens the Task List file and moves forward to the designated
* coordinates.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc taskfilefwd
strparm OldTaskString
string OldTasks, TaskString
	interfaceoff()
	OldTasks = makefullname(TempDir, "oldtasks.tmp")
	copyfile TaskList OldTasks
	openfile(OldTaskFile, OldTasks, _READWRITE, _TEXT)
	openfile(TaskFile, TaskList, _CREATE, _TEXT)
	fgets OldTaskFile TaskString
	while not strcmpi OldTaskString TaskString
		fputs TaskFile TaskString
		fgets OldTaskFile TaskString
	endwhile
endproc
#endif


#comment
*********************************************************************
*
* TASKFILEEND()
*
* Calls makefullname(), interfaceon()
*
* Called by:
*  MRUN211H:  swapbbs(), swapitem(), changestatus()
*
* Reads to the end of the Task List file and closes it.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc taskfileend
string TaskString, OldTasks
	fgets OldTaskFile TaskString
	while not feof OldTaskFile
		fputs TaskFile TaskString
		fgets OldTaskFile TaskString
	endwhile
	fclose OldTaskFile
	fclose TaskFile
	OldTasks = makefullname(TempDir, "oldtasks.tmp")
	delfile OldTasks
	interfaceon()
endproc
#endif


#comment
*********************************************************************
* 
* PARSEMENU()
* 
* Calls filenewmrun(), filesave(), filesaveas(), filereset(),
* filedelmrun(), fileautorun(), fileexit(), editcut(), editcopy(), 
* editpaste(), editdelete(), cfgmrun(), cfgbbs(), cfgprompts(), 
* cfgmaildoor(), defaultsmailrun(), defaultsbbs(), defaultsprompts(),
* defaultsdoor(), addnewbbs(), addgetsend(), addupload(),
* adddownload(), addsendcmd(), addscript(), executemailrun(),
* executeqwkreader(), executearchiver(), executelogviewer(),
* helpcontents(), helpcontext(), helpabout()
* 
* Called by:
* 	MRUN211H:  interfaceon()
* 
* Parses a selection from the MailRun menu.
* 
*********************************************************************
#endcomment

proc parsemenu
integer menustatus
	menustatus = $MENU
	switch menustatus
#ifndef MRUN211G
		case 1
			;User selected file.new
			filenewmrun()
		endcase
#endif
		case 2
			;User selected file.save
			filesave()
		endcase
#ifdef MRUN211A
		case 3
			;User selected file.save_as
			filesaveas()
		endcase
#endif
#ifdef MRUN211AG
		case 4
			;User selected file.reset
			filereset()
		endcase
#endif
#ifdef MRUN211A
		case 5
			;User selected file.delete_mailrun
			filedelmrun()
		endcase
#endif
#ifndef MRUN211G
		case 6
			;User selected file.create_autorun
			fileautorun()
		endcase
#endif
		case 7
			;User selected file.exit
			fileexit()
		endcase
#ifdef MRUN211AG
		case 8
			;User selected edit.cut
			editcut()
		endcase
		case 9
			;User selected edit.copy
			editcopy()
		endcase
		case 10
			;User selected edit.paste
			editpaste()
		endcase
		case 11
			;User selected delete_item
			editdelete()
		endcase
#endif
		case 12
			;User selected configure.mailrun_settings
			cfgmrun()
		endcase
		case 13
			;User selected configure.bbs_settings
			cfgbbs()
		endcase
		case 14
			;User selected configure.bbs_prompts
			cfgprompts()
		endcase
		case 15
			;User selected configure.bbs_mail_door
			cfgmaildoor()
		endcase
		case 16
			;User selected configure.defaults.mailrun
			defaultsmailrun()
		endcase
		case 17
			;User selected configure.defaults.bbs
			defaultsbbs()
		endcase
		case 18
			;User selected configure.defaults.prompts
			defaultsprompts()
		endcase
		case 19
			;User selected configure.defaults.maildoor
			defaultsdoor()
		endcase
		case 20
			;User selected add.new_bbs
			addnewbbs()
		endcase
		case 21
			;User selected add.get/send_mail
			addgetsend()
		endcase
		case 22
			;User selected add.upload_file
			addupload()
		endcase
		case 23
			;User selected add.download_file
			adddownload()
		endcase
		case 24
			;User selected add.send_command
			addsendcmd()
		endcase
		case 25
			;User selected add.execute_script
			addscript()
		endcase
		case 26
			;User selected execute.mailrun
			executemailrun()
		endcase
		case 27
			;User selected execute.qwk_reader
			executeqwkreader()
		endcase
		case 28
			;User selected execute.archiver
			executearchiver()
		endcase
		case 29
			;User selected execute.view_log_file
			executelogviewer()
		endcase
		case 30
			;User selected help.contents
			helpcontents()
		endcase
		case 31
			;User selected help.current_window
			helpcontext()
		endcase
		case 32
			;User selected help.about
			helpabout()
		endcase
	endswitch
endproc


#comment
*********************************************************************
* 
* PARSEOBJECT()
* 
* Calls executemailrun(), filereset(), filenewmrun(), 
* cfgbbs(), addnewbbs(), addgetsend(), addupload(),
* adddownload(), addsendcmd(), addscript(), editdelete(),
* executelogviewer(), executeqwkreader(), executearchiver(), 
* fileexit(), helpabout()
* 
* Called by:
* 	MRUN211H:  interfaceon()
* 
* Parses a selection from the MailRun icon bar.
* 
*********************************************************************
#endcomment

proc parseobject
integer objectstatus
	objectstatus = $OBJECT
	switch objectstatus
		case 1
			;User selected icon for execute.mailrun
			executemailrun()
		endcase
#ifdef MRUN211AG
		case 2
			;User selected icon for file.reset
			filereset()
		endcase
#endif
#ifndef MRUN211G
		case 3
			;User selected icon for file.new
			filenewmrun()
		endcase
#endif
		case 4
			;User selected icon for configure.bbs
			cfgbbs()
		endcase
		case 5
			;User selected icon for add.new_bbs
			addnewbbs()
		endcase
		case 6
			;User selected icon for add.get/send_mail
			addgetsend()
		endcase
		case 7
			;User selected icon for add.upload_file
			addupload()
		endcase
		case 8
			;User selected icon for add.download_file
			adddownload()
		endcase
		case 9
			;User selected icon for add.send_command
			addsendcmd()
		endcase
		case 10
			;User selected icon for add.execute_script
			addscript()
		endcase
#ifdef MRUN211AG
		case 11
			;User selected icon for file.delete_item
			editdelete()
		endcase
#endif
		case 12
			;User selected icon for execute.view_log_file
			executelogviewer()
		endcase
		case 13
			;User selected icon for execute.qwk_reader
			executeqwkreader()
		endcase
		case 14
			;User selected icon for execute.archiver
			executearchiver()
		endcase
		case 15
			;User selected icon for file.exit
			fileexit()
		endcase
		case 16
			;User selected icon for context sensitive help
			helpcontext()
		endcase
	endswitch
endproc


#comment
**************************************************************************
**************************************************************************
* 
* The following procedures correspond to menu selections
* and are called from parsemenu() and parseobject().
* 
**************************************************************************
**************************************************************************
#endcomment


#comment
*********************************************************************
* 
* FILENEWMRUN()
* 
* Calls checkrunning(), checkchanged(), makefullname(),
* callscript(), MRUN211B\main()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 	
* Corresponds to File.New_MailRun menu selection.  Creates a 
* new mailrun.
* 	
*********************************************************************
#endcomment

#ifndef MRUN211G
proc filenewmrun
#ifndef MRUN211B
string changesettings
#endif
	if checkrunning() && checkchanged()
		FLAGS = NEW
#ifndef MRUN211B
		changesettings = makefullname(MailRunDir, "MRUN211B")
		callscript(changesettings)
#else
		main()
#endif
	endif
endproc
#endif


#comment
*********************************************************************
* 
* FILESAVE()
* 
* Calls makefullname()
* 
* Called by:
* 	MRUN211H:  parsemenu(), makemrn(), changemailrun(), fileexit()
* 	MRUN211B:  newmailrun()
* 
* Corresponds to the File.Save menu selection.  Saves the 
* current mailrun.
* 	
*********************************************************************
#endcomment

proc filesave
string LastRun
	if !(FLAGS & DEFAULTS)
		findfirst MailRun
		LastRun = makefullname(MailRunDir, $FILENAME)
		if not NULLSTR $FILENAME
			delfile LastRun
		endif
		copyfile MailRun LastRun
		profilewr MailRunIni "MailRun" "MailRun" $FILENAME
	endif
endproc


#comment
*********************************************************************
* 
* FILESAVEAS()
* 
* Calls fverify(), makefullname(), copymrn(), makemailrunlist()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 
* Corresponds to the File.Save_AS menu selection.  Saves the
* current mailrun under a new name and makes the new mailrun
* current.
* 
*********************************************************************
#endcomment

#ifdef MRUN211A
proc filesaveas
string NewRun, temp
integer Response
	;Make sure the entered MailRun ID is the correct length
	;and that it doesn't already exist
	while 1
		NewRun = ""
		sdlginput "New MailRun" \
			"Save the current mailrun as:" NewRun
		if FAILURE
			exit
		endif
		strlwr NewRun
		if not fverify(NewRun)
			usermsg \
			"A mailrun ID must be a valid DOS file name without the extension."
			loopwhile
		endif
		strfmt temp "%s.mrn" NewRun
		NewRun = makefullname(MailRunDir, temp)
		if isfile NewRun
			sdlgmsgbox "MailRun Message" \
				"%s already exists!`r`n`r`nReplace it?" QUESTION YESNO Response 2
			if Response == 7
				;if user selected "No"
				NewRun = ""
				loopwhile
			endif
		endif
		exitwhile
	endwhile
	delfile NewRun
	MailRunTrunc = temp
	copyfile MailRun NewRun
	copymrn()
	makemailrunlist()
	updatedlg 512
endproc
#endif


#comment
*********************************************************************
* 
* FILERESET()
* 
* Calls maketasklist(), getfirstitem(), readbbs(), readitem(),
* writeitem()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject(), filereset()
* 
* Corresponds to the File.Reset_MailRun menu selection.
* Resets completed permenant items to pending.  Deletes
* completed temporary items.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc filereset
string Pending, Perm, BBSid, Itemi
integer p1, p2, i, j, k
	i = 1
	BBSid = readbbs(i)
	;Loop through each BBS
	while not NULLSTR BBSid
		j = 1
		k = 1
		Itemi = readitem(BBSid, j)
		;Loop through each Item
		while not NULLSTR Itemi
			;Clear the old item
			writeitem(BBSid, j, "")
			strextract pending Itemi "," 0
			strextract perm Itemi "," 1
			atoi pending p1
			atoi perm p2

			;Items that are completed and temporary will not be updated
			;The second counter "k" is required to avoid gaps where items
			;are deleted.

			if (p1 != 0) || (p2 != 0)
				strupdt Itemi "1" 0 1
				writeitem(BBSid, k, Itemi)
				k++
			endif
			j++
			Itemi = readitem(BBSid, j)
		endwhile
		i++
		BBSid = readbbs(i)
	endwhile
	maketasklist()
	getfirstitem()
	updatedlg 80
endproc
#endif


#comment
*********************************************************************
* 
* FILEDELMRUN()
* 
* Calls makefullname(), copymrn(), makemailrunlist(),
* maketasklist(), getfirstitem()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 
* Corresponds to the File.Delete_MailRun menu selection.
* Deletes the current mailrun and makes the next available
* mailrun current.
* 
*********************************************************************
#endcomment

#ifdef MRUN211A
proc filedelmrun
string LastMRun
	findfirst MailRun
	LastMRun = makefullname(MailRunDir, $FILENAME)
	delfile LastMRun
	LastMRun = makefullname(MailRunDir, "*.MRN")
	findfirst LastMRun
	MailRunTrunc = $FILENAME
	copymrn()
	makemailrunlist()
	maketasklist()
	getfirstitem()
	updatedlg -1
endproc
#endif


#comment
*********************************************************************
* 
* FILEAUTORUN()
* 
* Calls makefullname(), openfile()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 
* Corresponds to the File.Create_AutoRun menu selection.
* Creates an AutoRun script file.
* 
*********************************************************************
#endcomment

#ifndef MRUN211G
proc fileautorun
string AutoRunFile
	findfirst MailRun
	AutoRunFile = makefullname(MailRunDir, $FNAME)
	strcat AutoRunFile ".WAS"
	openfile(0, AutoRunFile, _CREATE, _TEXT)
	fstrfmt 0 ";MailRun autostart script for %s`r`n`r`n" MailRunTrunc
	fputs 0 "proc main"
	fputs 0 "string MailRunIni"
	fputs 0 "`tMailRunIni = $WINPATH"
	fputs 0 "`taddfilename MailRunIni `"MAILRUN.INI`""
	fputs 0 "`tprofilewr MailRunIni `"MailRun`" `"AutoRun`" 1"
	fstrfmt 0 "`tprofilewr MailRunIni `"MailRun`" `"MailRun`" `"%s`"`r`n" \
		MailRunTrunc
	fputs 0 "`tchain `"MRUN211`""
	fputs 0 "endproc"
	fclose 0
endproc
#endif


#comment
*********************************************************************
* 
* FILEEXIT()
* 
* Calls filesave(), cleardir(), makefullname()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 	MRUN211A:  executor()
* 	MRUN211B:  changemrundir()
* 	MRUN211G:  dobbs()
* 
* Corresponds to the File.Exit menu selection.  Restores
* system settings, deletes temporary files, and halts script.
* 
*********************************************************************
#endcomment

proc fileexit
string StateCapPath, StateCapFile, StateDnldPath, StateUpldPath
string CleanupFile
integer StateAutoDL, StateActionBar, StateMetaKeys

	;Update the last mailrun
	filesave()

	;Retrieve the previous system state from the cleanup file
	cleanupfile = makefullname(TempDir, "CLEANUP.TMP")
	profilerd CleanupFile "Cleanup" "StateAutoDL" StateAutoDL
	profilerd CleanupFile "Cleanup" "StateCapPath" StateCapPath
	profilerd CleanupFile "Cleanup" "StateCapFile" StateCapFile
	profilerd CleanupFile "Cleanup" "StateDnldPath" StateDnldPath
	profilerd CleanupFile "Cleanup" "StateUpldPath" StateUpldPath
	profilerd CleanupFile "Cleanup" "StateActionBar" StateActionBar
	profilerd CleanupFile "Cleanup" "StateMetaKeys" StateMetaKeys

	;Restore the settings
	capture OFF
	set capture path StateCapPath
	set capture file StateCapFile
	set dnldpath StateDnldPath
	set upldpath StateUpldPath
	set aspect rangechk ON
	if StateAutoDL != 0
		set autodnld ON
	endif
	if StateActionBar != 0
		actionbar ON
	endif
	if StateMetaKeys != 0
		metakeys ON
	endif

	cleardir(TempDir)
	chdir MailRunDir
	rmdir TempDir
	statmsg ""
	remove USERWIN
#ifdef MRUN211A
	if PostRun == 3
		closepw
	endif
#endif
	halt
endproc


#comment
*********************************************************************
* 
* EDITCUT()
* 
* Calls editcopy(), editdelete()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 
* Corresponds to the Edit.Cut menu selection.  Copies the
* current item in the Task List to the clipboard and deletes
* it from the Task List.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc editcut
	editcopy()
	editdelete()
endproc
#endif


#comment
*********************************************************************
* 
* EDITCOPY()
* 
* Calls makefullname(), loadbbsinfo(), loadprompts(), 
* loadmaildoor(), writebbsinfo(), writeprompts(),
* writemaildoor(), readitem()
* 
* Called by:
* 	MRUN211H:  parsemenu(), editcut()
* 
* Coresponds to the Edit.Copy menu selection.  Copies the 
* currently selected item in the Task List to the clipboard.
* If the item is a BBS, all user info and prompts are copied
* as well.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc editcopy
string BBSid, Itemi, char, temp
integer j
	if NULLSTR TaskItem
		return
	endif
	strextract BBSid TaskItem "`t" 3
	strextract char TaskItem "`t" 4
	atoi char j
	temp = makefullname(TempDir, "TEMP.TMP")
	;If the current TaskItem is a BBS...
	if j == 0
#ifdef MRUN211G
		usermsg "Cannot copy/cut a BBS while a mailrun is executing!"
#else
		loadbbsinfo(MailRun, BBSid)
		loadprompts(MailRun, BBSid)
		loadmaildoor(MailRun, BBSid)
		profilewr temp "MailRun Data" "BBS" BBSid
		writebbsinfo(temp, BBSid)
		writeprompts(temp, BBSid)
		writemaildoor(temp, BBSid)
		filetoclip TEXT temp
#endif
	else
		Itemi = readitem(BBSid, j)
		profilewr temp "MailRun Data" "Item" Itemi
		filetoclip TEXT temp
	endif
	delfile temp
endproc
#endif


#comment
*********************************************************************
* 
* EDITPASTE()
* 
* Calls makefullname(), gettaskstring(), inlist(), 
* insertitem(), makebbslist(), insertbbs(), loadbbsinfo(),
* loadprompts(), loadmaildoor(), writebbsinfo(), writeprompts(),
* writemaildoor(), maketasklist()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 
* Corresponds to the Edit.Paste menu selection.  Pastes an
* item from the clipboard into the current mailrun.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc editpaste
string BBSid, NewBBS, Itemi, char, temp
integer j
	strextract BBSid TaskItem "`t" 3
	strextract char TaskItem "`t" 4
	atoi char j
	temp = makefullname(TempDir, "TEMP.TMP")
	cliptofile TEXT temp
	profilerd temp "MailRun Data" "Item" Itemi
	profilerd temp "MailRun Data" "BBS" NewBBS
	if not NULLSTR Itemi
		;if the clipboard contains an item...
		if NULLSTR TaskItem
			usermsg "You must add a BBS first!"
			return
		endif
		insertitem(BBSid, j, Itemi)
		TaskItem = gettaskstring(BBSid, j)
	elseif not NULLSTR NewBBS
		;if the clipboard contains a BBS...
#ifdef MRUN211G
		usermsg "Cannot paste a BBS while a mailrun is executing!"
#else
		makebbslist()
		if inlist(NewBBS, BBSList) 
			errormsg "That BBS is already in the MailRun!"
			return
		endif
		if not NULLSTR BBSList
			insertbbs(BBSid, NewBBS)
		else
			profilewr MailRun "MailRun" "BBS_1" NewBBS
		endif
		loadbbsinfo(temp, NewBBS)
		loadprompts(temp, NewBBS)
		loadmaildoor(temp, NewBBS)
		writebbsinfo(MailRun, NewBBS)
		writeprompts(MailRun, NewBBS)
		writemaildoor(MailRun, NewBBS)
		TaskItem = gettaskstring(NewBBS, 0)
#endif
	else
		usermsg "Nothing to paste!"
		return
	endif
	maketasklist()
	updatedlg 80
endproc
#endif


#comment
*********************************************************************
* 
* EDITDELETE()
* 
* Calls readbbs(), readitem(), writebbs(), writeitem(), 
* maketasklist(), makebbslist(), gettaskstring(), getbbscoord()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject(), editcut()
* 	MRUN211A:  parsekeystate()
* 
* Corresponds to the Edit.Delete menu selection.  Deletes
* the currently selected item in the Task List.
* 
*********************************************************************
#endcomment

#ifdef MRUN211AG
proc editdelete
string BBSid, char, Itemi
integer i, j, k, l
	strextract BBSid TaskItem "`t" 3
	i = getbbscoord(BBSid)
	strextract char TaskItem "`t" 4
	atoi char j
	if j == 0
		;If the current TaskItem is a BBS...
		l = i
		k = l + 1
		BBSid = readbbs(k)

		;Decrement the BBS coordinate of each BBS after the one selected

		while not NULLSTR BBSid
			writebbs(l, BBSid)
			l++
			k++
			BBSid = readbbs(k)
		endwhile
		writebbs(l, "")
		;Update the task list
		maketasklist()

		;Reset the TaskItem.  If the selected BBS was the last one
		;in the list, set TaskItem to the previous BBS; otherwise,
		;set it to the next BBS

		BBSid = readbbs(i)
		if NULLSTR BBSid
			i--
			BBSid = readbbs(i)
			if NULLSTR BBSid
				TaskItem = ""
			else
				TaskItem = gettaskstring(BBSid, 0)
			endif
		else
			TaskItem = gettaskstring(BBSid, 0)
		endif

	else
		;If the current TaskItem is an Item
		l = j
		k = l + 1

		;Decrement the Item coordinate of each item after the one selected

		Itemi = readitem(BBSid, k)
		while not NULLSTR Itemi
			writeitem(BBSid, l, Itemi)
			l++
			k++
			Itemi = readitem(BBSid, k)
		endwhile
		writeitem(BBSid, l, "")
		;Update the task list
		maketasklist()

		;Reset the TaskItem to the next Item for that BBS.  If the selected
		;Item was the last one for that BBS, set TaskItem to the previous
		;Item.  If it was the only item for that BBS, set it to the BBS name.

		Itemi = readitem(BBSid, j)
		if not NULLSTR Itemi
			;If it wasn't the last item...
			TaskItem = gettaskstring(BBSid, j)
		elseif j == 1
			;If it was the only item...
			TaskItem = gettaskstring(BBSid, 0)
		else
			;If it was the last of multiple items...
			j--
			TaskItem = gettaskstring(BBSid, j)
		endif
	endif
	updatedlg 80
endproc
#endif


#comment
*********************************************************************
* 
* CFGMRUN()
* 
* Calls checkchanged(), configmrun()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 
* Corresponds to the Configure.MailRun_Settings menu selection.
* 
*********************************************************************
#endcomment

proc cfgmrun
	if checkchanged()
		;reset all flags except RUNNING
		FLAGS &= RUNNING
		configmrun()
	endif
endproc


#comment
*********************************************************************
* 
* DEFAULTSMAILRUN()
* 
* Calls checkchanged(), configmrun()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 
* Corresponds to the Configure.Defaults.MailRun menu selection.
* 	
*********************************************************************
#endcomment

proc defaultsmailrun
#ifdef MRUN211B
	if FLAGS & DEFAULTS
		return
	endif
#endif
	if checkchanged()
		;reset all flags but RUNNING and set the DEFAULTS flag
		FLAGS &= RUNNING
		FLAGS |= DEFAULTS
		configmrun()
	endif
endproc


#comment
*********************************************************************
* 
* CONFIGMRUN()
* 
* Calls MRUN211B\main(), makefullname(), callscript()
* 
* Called by:
* 	MRUN211H:  cfgmrun(), defaultsmailrun()
* 
* Calls the changesettings script module.
* 	
*********************************************************************
#endcomment

proc configmrun
#ifdef MRUN211B
		main()
#else
string changesettings
		changesettings = makefullname(MailRunDir, "MRUN211B")
		callscript(changesettings)
#endif
endproc


#comment
*********************************************************************
* 
* CFGBBS()
* 
* Calls checkchanged(), checknew(), configbbs()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 	MRUN211C:  changeprompts(), changemaildoor()
* 
* Corresponds to the Configure.BBS_Settings menu selection.
* 
*********************************************************************
#endcomment

proc cfgbbs
	if checkchanged() && checknew()
		FLAGS &= RUNNING
		configbbs()
	endif
endproc


#comment
*********************************************************************
* 
* DEFAULTSBBS()
* 
* Calls checkchanged(), configbbs()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 	MRUN211C:  changeprompts(), changemaildoor()
* 
* Corresponds to the Configure.Defaults.BBS menu selection.
* 
*********************************************************************
#endcomment

proc defaultsbbs
	if checkchanged()
		FLAGS &= RUNNING
		FLAGS |= DEFAULTS
		configbbs()
	endif
endproc


#comment
*********************************************************************
* 
* CONFIGBBS()
* 
* Calls makefullname(), callscript(), changeuserinfo()
* 
* Called by:
* 	MRUN211H:  cfgbbs(), defaultsbbs()
* 
* Calls the changebbs script module for the changeuserinfo()
* procedure.
* 
*********************************************************************
#endcomment

proc configbbs
#ifndef MRUN211C
string changebbs
		FLAGS = (FLAGS & CLEARCMD) | USR
		changebbs = makefullname(MailRunDir, "MRUN211C")
		callscript(changebbs)
#else
		changeuserinfo()
#endif
endproc


#comment
*********************************************************************
* 
* CFGPROMPTS()
* 
* Calls checkchanged(), checknew(), configprompts
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 	MRUN211C:  changeuserinfo(), changemaildoor()
* 
* Corresponds to the Configure.BBS_Prompts menu settings.
* 
*********************************************************************
#endcomment

proc cfgprompts
	if checkchanged() && checknew()
		FLAGS &= RUNNING
		configprompts()
	endif
endproc


#comment
*********************************************************************
* 
* DEFAULTSPROMPTS()
* 
* Calls checkchanged(), configprompts()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 	MRUN211C:  changeuserinfo(), changemaildoor()
* 
* Corresponds to the Configure.Defaults.Prompts menu selection.
* 
*********************************************************************
#endcomment

proc defaultsprompts
	if checkchanged()
		FLAGS &= RUNNING
		FLAGS |= DEFAULTS
		configprompts()
	endif
endproc


#comment
*********************************************************************
* 
* CONFIGPROMPTS()
* 
* Calls makefullname(), callscript(), changeprompts()
* 
* Called by:
* 	MRUN211H:  cfgprompts(), defaultsprompts()
* 
* Calls the changebbs script module for the changeprompts()
* procedure.
* 
*********************************************************************
#endcomment

proc configprompts
#ifndef MRUN211C
string changebbs
	FLAGS = (FLAGS & CLEARCMD) | PRMPT
	changebbs = makefullname(MailRunDir, "MRUN211C")
	callscript(changebbs)
#else
	changeprompts()
#endif
endproc


#comment
*********************************************************************
* 
* CFGMAILDOOR()
* 
* Calls checkchanged(), checknew(), configmaildoor()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 	MRUN211C:  changeuserinfo(), changeprompts()
* 
* Corresponds to the Configure.BBS_Mail_Door menu selection.
* 
*********************************************************************
#endcomment

proc cfgmaildoor
	if checkchanged() && checknew()
		FLAGS &= RUNNING
		configmaildoor()
	endif
endproc


#comment
*********************************************************************
* 
* DEFAULTSDOOR()
* 
* Calls checkchanged(), configmaildoor()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 	MRUN211C:  changeuserinfo(), changeprompts()
* 
* Corresponds to the Configure.Defaults.Mail_Door menu selection.
* 
*********************************************************************
#endcomment

proc defaultsdoor
	if checkchanged()
		FLAGS &= RUNNING
		FLAGS |= DEFAULTS
		configmaildoor()
	endif
endproc


#comment
*********************************************************************
* 
* CONFIGMAILDOOR()
* 
* Calls makefullname(), callscript(), changemaildoor()
* 
* Called by:
* 	MRUN211H:  cfgmaildoor(), defaultsmaildoor()
* 
* Calls the changebbs script module for the changemaildoor()
* procedure.
* 
*********************************************************************
#endcomment

proc configmaildoor
#ifndef MRUN211C
string changebbs
	FLAGS = (FLAGS & CLEARCMD) | QMD
	changebbs = makefullname(MailRunDir, "MRUN211C")
	callscript(changebbs)
#else
	changemaildoor()
#endif
endproc


#comment
*********************************************************************
* 
* ADDNEWBBS()
* 
* Calls checkchanged(), makefullname(), callscript()
* MRUN211C\changeuserinfo()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 
* Corresponds to the Add.New_BBS menu selection.  Calls the
* changebbs module for the changeuserinfo() procedure with 
* the NEW flag set.
* 
*********************************************************************
#endcomment

proc addnewbbs
#ifndef MRUN211C
string changebbs
#endif
	if checkchanged()
		FLAGS &= RUNNING
		FLAGS |= NEW
#ifndef MRUN211C
		FLAGS = (FLAGS & CLEARCMD) | USR
		changebbs = makefullname(MailRunDir, "MRUN211C")
		callscript(changebbs)
#else
		changeuserinfo()
#endif
	endif
endproc


#comment
*********************************************************************
* 
* ADDGETSEND()
* 
* Calls checkchanged(), checknew(), makefullname(), callscript()
* MRUN211F\addgetmail()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 
* Corresponds to the Add.Get/Send_Mail menu selection.  Calls
* the othercmds script module for the addgetmail() procedure.
* 
*********************************************************************
#endcomment

proc addgetsend
#ifndef MRUN211F
string othercmds
#endif
	if checkchanged() && checknew()
		FLAGS &= RUNNING
#ifndef MRUN211F
		FLAGS = (FLAGS & CLEARCMD) | AGM
		othercmds = makefullname(MailRunDir, "MRUN211F")
		callscript(othercmds)
#else
		addgetmail()
#endif
	endif
endproc


#comment
*********************************************************************
* 
* ADDDOWNLOAD()
* 
* Calls checkchanged(), checknew(), makefullname(), callscript()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 
* Corresponds to the Add.Download_File menu selection.  Calls
* the adddlfile script module.
* 
*********************************************************************
#endcomment

proc adddownload
#ifndef MRUN211D
string adddlfile
	if checkchanged() && checknew()
		FLAGS &= RUNNING
		adddlfile = makefullname(MailRunDir, "MRUN211D")
		callscript(adddlfile)
	endif
#endif
endproc


#comment
*********************************************************************
* 
* ADDUPLOAD()
* 
* Calls checkchanged(), checknew(), makefullname(), callscript()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 	
* Corresponds to the Add.Upload_File menu selection.  Calls
* the addulfile script module.
* 
*********************************************************************
#endcomment

proc addupload
#ifndef MRUN211E
string addulfile
	if checkchanged() && checknew()
		FLAGS &= RUNNING
		addulfile = makefullname(MailRunDir, "MRUN211E")
		callscript(addulfile)
	endif
#endif
endproc


#comment
*********************************************************************
* 
* ADDSENDCMD()
* 
* Calls checkchanged(), checknew(), makefullname(), callscript(),
* MRUN211F\addsendcommand()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 	
* Corresponds to the Add.Send_Command menu selection.  Calls
* the othercmds script module for the addsendcommand() procedure.
* 
*********************************************************************
#endcomment

proc addsendcmd
#ifndef MRUN211F
string othercmds
#endif
	if checkchanged() && checknew()
		FLAGS &= RUNNING
#ifndef MRUN211F
		FLAGS = (FLAGS & CLEARCMD) | CMD
		othercmds = makefullname(MailRunDir, "MRUN211F")
		callscript(othercmds)
#else
		addsendcommand()
#endif
	endif
endproc


#comment
*********************************************************************
* 
* ADDSCRIPT()
* 
* Calls checkchanged(), checknew(), makefullname(), callscript(),
* MRUN211F\adddoscript()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 	
* Corresponds to the Add.Execute_Script menu selection.  Calls
* the othercmds script module for the adddoscript() procedure.
* 
*********************************************************************
#endcomment

proc addscript
#ifndef MRUN211F
string othercmds
#endif
	if checkchanged() && checknew()
		FLAGS &= RUNNING
#ifndef MRUN211F
		FLAGS = (FLAGS & CLEARCMD) | SCR
		othercmds = makefullname(MailRunDir, "MRUN211F")
		callscript(othercmds)
#else
		adddoscript()
#endif
	endif
endproc


#comment
*********************************************************************
* 
* EXECUTEMAILRUN()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 	
* Corresponds to the Execute.Execute/Terminate_MailRun menu
* selection.
* 
*********************************************************************
#endcomment

proc executemailrun
#ifdef MRUN211G
	hangup
	FLAGS &= IDLE
	capture OFF
	exit
#else
	if FLAGS & RUNNING
		FLAGS &= IDLE
	else
		FLAGS |= RUNNING
	endif
#endif
endproc


#comment
*********************************************************************
* 
* EXECUTEARCHIVER()
* 
* Calls checktask()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 
* Corresponds to the Execute.Archiver menu selection.  Calls
* the archive utility specified in the MailRun Settings
* dialog.
* 
*********************************************************************
#endcomment

proc executearchiver
integer i
#ifndef MRUN211AB
string Archiver
#endif
	profilerd MailRun "MailRun" "Archiver" Archiver
	if not NULLSTR Archiver
		i = checktask(Archiver)
		if i
			activatetask i
		else
			run Archiver
		endif
		if FAILURE
			usermsg "Unable to run Archive Utility %s .`r`n\
The file does not exist or is not in your DOS path." Archiver
		endif
	else
		usermsg "You must specify an Archive Utility in`r`n\
the MailRun Settings dialog box."
	endif
endproc


#comment
*********************************************************************
* 
* EXECUTEQWKREADER()
* 
* Calls checktask()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 
* Corresponds to the Execute.QWK_Reader menu selection.  Calls
* the QWK mail reader specified in the MailRun Settings
* dialog.
* 
*********************************************************************
#endcomment

proc executeqwkreader
integer i
#ifndef MRUN211AB
string QWKReader
#endif
	profilerd MailRun "MailRun" "QWKReader" QWKReader
	if not NULLSTR QWKReader
		i = checktask(QWKReader)
		if i
			activatetask i
		else
			run QWKReader
		endif
		if FAILURE
			usermsg "Unable to run QWK Mail Reader %s.`r`n\
The file does not exist or is not in your DOS path." QWKReader
		endif
	else
		usermsg "You must specify a QWK Mail Reader in`r`n\
the MailRun Settings dialog box."
	endif
endproc


#comment
*********************************************************************
* 
* EXECUTELOGVIEWER()
* 
* Calls checktask(), makefullname()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 	
* Corresponds to the Execute.View_Log_File menu selection.  
* Calls the file viewer specified in the MailRun Settings
* dialog and loads the log file for the current mailrun.
* 
*********************************************************************
#endcomment

proc executelogviewer
string CapFile, RunLine, WinTitle
integer i, j
#ifndef MRUN211AB
string LogViewer
#endif
	profilerd MailRun "MailRun" "LogViewer" LogViewer
	if not NULLSTR LogViewer
		if not NULLSTR MailRunTrunc
			CapFile = makefullname(MailRunDir, MailRunTrunc)
			strlwr CapFile
			strreplace CapFile ".mrn" ".cap"
		else
			CapFile = ""
		endif
		i = checktask(LogViewer)
		if i
			taskwin i j
			getwintext j WinTitle
			if strfind WinTitle CapFile
				activatetask i
				return
			endif
		endif
		strfmt RunLine "%s %s" LogViewer CapFile
		run RunLine
		if FAILURE
			usermsg "Unable to run Log File Viewer %s.`r`n\
The file does not exist or is not in your DOS path." LogViewer
		endif
	else
		usermsg "You must specify a Log File Viewer in`r`n\
the MailRun Settings dialog box."
	endif
endproc


#comment
*********************************************************************
* 
* HELPCONTENTS()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 
* Corresponds to the Help.Contents menu selection.  Calls 
* the help file and displays the contents page.
* 
*********************************************************************
#endcomment

proc helpcontents
	help 1
endproc


#comment
*********************************************************************
* 
* HELPCONTEXT()
* 
* Called by:
* 	MRUN211H:  parsemenu(), parseobject()
* 
* Corresponds to the Help.On_current_window menu selection.
* Calls the help file and displays the page appropriate for
* the current dialog box.  HelpPage is a global variable set
* in each procedure that calls a dialog box.
* 
*********************************************************************
#endcomment

proc helpcontext
	help HelpPage
endproc


#comment
*********************************************************************
* 
* HELPABOUT()
* 
* Calls checkchanged(), makefullname(), callscript(),
* MRUN211F\showabout()
* 
* Called by:
* 	MRUN211H:  parsemenu()
* 	MRUN211A:  main()
* 
* Corresponds to the Help.About_MailRun menu selection.  Calls
* the othercmds script module for the showabout() procedure.
* 
*********************************************************************
#endcomment

proc helpabout
#ifndef MRUN211F
string othercmds
#endif
	if checkchanged()
		FLAGS &= RUNNING
#ifndef MRUN211F
		FLAGS = (FLAGS & CLEARCMD) | ABT
		othercmds = makefullname(MailRunDir, "MRUN211F")
		callscript(othercmds)
#else
		showabout()
#endif
	endif
endproc


#comment
*********************************************************************
* 
* CALLSCRIPT()
* 
* Calls menudim(), makemailrunlist(), makebbslist(),
* maketasklist(), getfirstitem(), MRUN211AG\mailrunbox(),
* MRUN211G\makequeue()
* 
* Called by:
* 	MRUN211H:  filenewmrun(), configmrun(), configbbs(),
* 				  configprompts(), configmaildoor(), addnewbbs(),
* 				  addgetsend(), adddownload(), addupload(),
* 				  addsendcmd(), addscript(), helpabout()
* 
* Executes the specified MailRun script module.
* 
*********************************************************************
#endcomment

proc callscript
strparm ScriptTitle
#ifndef MRUN211AG
	chain ScriptTitle
#else
string LastMRun
	LastMRun = MailRun
	execute ScriptTitle
	menudim()
	FLAGS &= RUNNING
#ifdef MRUN211G
	if !(FLAGS & RUNNING)
		;if the mailrun has been terminated from another script module...
		executemailrun()
	endif
	profilerd MailRun "MailRun" "LogRun" LogRun
	if LogRun
		profilerd MailRun "MailRun" "AnsiInLog" AnsiInLog
		if AnsiInLog
			set capture mode append RAW
		else
			set capture mode append VISUAL
		endif
		capture ON
	else
		capture OFF
	endif
	makequeue()
#else
	findfirst MailRun
	MailRunTrunc = $FILENAME
	makemailrunlist()
	makebbslist()
	if not strcmpi LastMRun MailRun
		getfirstitem()
	endif
#endif
	maketasklist()
	mailrunbox()
	statmsg ""
#endif
endproc



