/*
** $VER: NetMail 1.3 (17.10.95)
** Copyright (c) 1995 Riccardo Solmi
**
*/

OPTIONS RESULTS
OPTIONS FAILAT 21
SIGNAL ON HALT
PARSE ARG opt parms

NETMAILVER = 'NetMail 1.3 (17.10.95)'
PREFSVER   = '1'
PREFSREV   = '5'
GROUPVER   = '1'
GROUPREV   = '2'
NICKVER    = '1'
NICKREV    = '0'
FILTERVER  = '1'
FILTERREV  = '2'

IF ~ABBREV(ADDRESS(), 'ZRX') THEN EXIT 5
IF ~SHOW('L', 'rexxdos.library') THEN DO
   ADDRESS COMMAND 'ZEDREXX:c/AddREXXLibs >NIL: <NIL:'
   IF ~SHOW('L', 'rexxdos.library') THEN EXIT 5
END

IF PersistLoad() ~= 0 THEN EXIT 5
CALL InterfaceMake

SELECT
   WHEN UPPER(opt) = 'EXCHANGE' THEN DO
      IF PersistLoad('GROUPS') ~= 0 THEN EXIT 5
      CALL GroupExchange
   END
   WHEN UPPER(opt) = 'SCAN' THEN DO
      IF PersistLoad('GROUPS FILTERS') ~= 0 THEN EXIT 5
      CALL GroupScan
   END
   WHEN UPPER(opt) = 'PURGE' THEN DO
      IF PersistLoad('GROUPS') ~= 0 THEN EXIT 5
      CALL PurgeGroups
   END
   OTHERWISE DO
      'zDoMethod NetMail Lock'
      CALL StatusWin_Open
      IF PersistLoad('GROUPS FILTERS NICKNAMES') ~= 0 THEN EXIT 5

      CALL MessagesWin_Open
      'zDoMethod StatusWin Open'
      IF Prefs.PrefsPurge = 'TRUE' THEN CALL PurgeGroups
      CALL GroupUpdate
      CALL GroupScan
      'zSetAttr MboxList ItemStem' Group.LIST.
      'zSetAttr MboxList ValueIndex' 0
      CALL MboxList_Activate(0)
      CALL StatusWin_Close
      'zDoMethod MessagesWin Open'
      'zDoMethod NetMail Unlock'

      DO FOREVER
         'zWaitForEvent stem.'
         INTERPRET "zRC="RESULT"()"
      END
   END
END

CALL PersistSave
ADDRESS COMMAND 'Assign "NetMail:" REMOVE'
EXIT



/*
** NetMail interface
*/


InterfaceMenu:
   'zMenu Project'
      'zObject Button MenuAbout      Label "About..." Key "?" Cause "zDoMethod AboutWin Open"'
      'zObject Line'
      'zObject Button MenuHide       Label "&Hide" Cause "zDoMethod NetMail Deactivate"'
      'zObject Button MenuSave       Label "Save" SelectEvent'
      'zObject Button Quit           Label "&Quit" SelectEvent'
   'zEndMenu'
   'zMenu Messages'
      'zObject Button MenuPrec       Label "Prec" SelectEvent'
      'zObject Button MenuNext       Label "Next" SelectEvent'
      'zObject Button MenuPrecUnread Label "Prec unread" SelectEvent'
      'zObject Button MenuNextUnread Label "Next unread" SelectEvent'
      'zObject Line'
      'zMenu Attributes'
         'zObject Button MenuRead    Label "Read/Unread" Key "M" SelectEvent'
         'zObject Button MenuLock    Label "Lock/Unlock" Key "L" SelectEvent'
         'zObject Button MenuDelay   Label "Queue/Delay" Key "D" SelectEvent'
      'zEndMenu'
      'zObject Line'
      'zObject Button MenuRegForm    Label "Registration form..." SelectEvent'
      'zObject Button MenuBugForm    Label "Bug report form..." SelectEvent'
      'zObject Button MenuReqForm    Label "Enhancement request..." SelectEvent'
      'zObject Button MenuComForm    Label "Comments..." SelectEvent'
   'zEndMenu'
   'zMenu Groups'
      'zObject Button MenuReadAll    Label "Read all" SelectEvent'
      'zObject Button MenuUnreadAll  Label "Unread all" SelectEvent'
      'zObject Line'
      'zObject Button MenuImport     Label "Import mailbox..." SelectEvent'
      'zObject Button MenuExport     Label "Export group..." SelectEvent'
      'zObject Line'
      'zObject Button MenuFilters    Label "Apply filters" SelectEvent'
      'zObject Button MenuPurge      Label "Purge messages" SelectEvent'
      'zObject Button MenuEmptyTrash Label "Empty TRASH" SelectEvent'
      'zObject Button MenuUpdate     Label "Update groups" SelectEvent'
   'zEndMenu'
   'zMenu Windows'
      'zObject Button MessagesWin    Label "Messages..." SelectEvent'
      'zObject Button GroupsWin      Label "Groups..." SelectEvent'
      'zObject Button FiltersWin     Label "Filters..." SelectEvent'
      'zObject Button NicknamesWin   Label "Nicknames..." SelectEvent'
      'zObject Button StatusWin      Label "Status..." SelectEvent'
      'zObject Line'
      'zObject Button Prefs1Win      Label "Accounts..." SelectEvent'
      'zObject Button Prefs2Win      Label "Settings..." SelectEvent'
      'zObject Button Prefs3Win      Label "Drivers..."  SelectEvent'
      'zObject Button Prefs4Win      Label "GUI prefs..." SelectEvent'
      'zObject Line'
      'zObject Button MenuSavePos    Label "Snapshot windows" SelectEvent'
   'zEndMenu'
   'zMenu Services'
      'zObject Button ArchieWin      Label "Mail-Archie" SelectEvent'
   'zEndMenu'
RETURN


InterfaceMake:
'zInterface NetMail Helpfile "'Prefs.helpfile'"'
   'zImage PopupImage  Width 11 Height 8  Depth 1 Data "00000000FFE07FC03F801F000E000400"'
   'zImage CycleImage  Width 11 Height 10 Depth 1 Data "3F006180618067E063C061806000600061803F00"'
   'zImage FolderImage Width 11 Height 9  Depth 1 Data "7800840087E0F8208020802080208020FFE0"'
   'zImage ComplImage  Width 11 Height 8  Depth 1 Data "000000000000000000000000CCC0CCC0"'
   'zImage AddImage    Width 11 Height 8  Depth 1 Data "006000C001800300C6006C0038001000"'
   'zImage RemImage    Width 11 Height 8  Depth 1 Data "60C031801B000E000E001B00318060C0"'
   'zImage UpImage     Width 23 Height 9  Depth 1 Data "000000000038000000FE000003C780000F01E0003C007800F0001E00C000060000000000"'
   'zImage DownImage   Width 23 Height 9  Depth 1 Data "00000000C0000600F0001E003C0078000F01E00003C7800000FE00000038000000000000"'
   'zImage NetMailIcon      File "'AddPart(Prefs.prgdir, "NetMail.info")'"'
   'zImage ForwardIcon      File "'AddPart(Prefs.prgdir, "Icons/Forward.info")'"'
   'zImage MailIcon         File "'AddPart(Prefs.prgdir, "Icons/Mail.info")'"'
   'zImage ReplyIcon        File "'AddPart(Prefs.prgdir, "Icons/Reply.info")'"'
   'zImage ReplyGroupIcon   File "'AddPart(Prefs.prgdir, "Icons/ReplyGroup.info")'"'
   'zImage TransferIcon     File "'AddPart(Prefs.prgdir, "Icons/Transfer.info")'"'
   'zImage DeleteIcon       File "'AddPart(Prefs.prgdir, "Icons/Delete.info")'"'
   'zImage DecodeIcon       File "'AddPart(Prefs.prgdir, "Icons/Decode.info")'"'
   'zImage CaptureIcon      File "'AddPart(Prefs.prgdir, "Icons/Capture.info")'"'
   'zImage CaptureGroupIcon File "'AddPart(Prefs.prgdir, "Icons/CaptureGroup.info")'"'
   'zImage SendIcon         File "'AddPart(Prefs.prgdir, "Icons/Send.info")'"'
   'zImage ExchangeIcon     File "'AddPart(Prefs.prgdir, "Icons/Exchange.info")'"'

   'zWindow MessagesWin Label "Messages" CloseEvent'
      CALL InterfaceMenu

      'zKey "Up"         UpEvent'
      'zKey "Down"       DownEvent'
      'zKey "RALT Up"    RAUpEvent'
      'zKey "RALT Down"  RADownEvent'
      'zKey "Return"     ReturnEvent'
      'zKey "Del"        DelEvent'
      'zKey "Backspace"  BackspaceEvent'
      'zKey "Left"       LeftEvent'
      'zKey "Right"      RightEvent'
      'zKey "RALT Left"  RALeftEvent'
      'zKey "RALT Right" RARightEvent'

      'zGroup Vertical ChildMaxWidth'
         'zGroup Vertical ChildMaxWidth NoMargY'
            'zObject TextDisplay MboxListMsg NoBorder Value "  ' LEFT("Group", Prefs.MsgListSize - 7) 'Msg"'
            'zObject ListView    MboxList NumLines 'Prefs.VisibleGroups' Fill ChangeEvent'
         'zEndGroup'
         'zGroup Vertical ChildMaxWidth NoMargY'
            'zObject TextDisplay MboxMailMsg NoBorder Value "  ' LEFT("Subject", Prefs.SubjectColumns) LEFT("From", Prefs.FromColumns) LEFT("Date", 7)'"'
            'zObject ListView    MboxMailList NumLines 'Prefs.VisibleMessages' NumColumns 'Prefs.MsgListSize' ChangeEvent'
         'zEndGroup'
         'zGroup Horizontal'
            'zGroup Horizontal Justification Left ChildMaxWidth NoMargX'
               'zObject ButtonG MboxForward    Image ForwardIcon UpEvent'
               'zObject ButtonG MboxMail       Image MailIcon UpEvent'
               'zObject ButtonG MboxReply      Image ReplyIcon UpEvent'
               'zObject ButtonG MboxReplyGrp   Image ReplyGroupIcon UpEvent'
               'zObject Line'
               'zObject ButtonG MboxCapture    Image CaptureIcon UpEvent'
               'zObject ButtonG MboxCaptureGrp Image CaptureGroupIcon UpEvent'
               'zObject ButtonG MboxMove       Image TransferIcon UpEvent'
               'zObject ButtonG MboxDelete     Image DeleteIcon UpEvent'
               'zObject Line'
               'zObject ButtonG MboxDecode     Image DecodeIcon UpEvent'
            'zEndGroup'
            'zGroup Horizontal Justification Right ChildMaxWidth NoMargX'
               'zObject Line'
               'zObject ButtonG MboxSend       Image SendIcon UpEvent'
               'zObject ButtonG MboxExchange   Image ExchangeIcon UpEvent'
            'zEndGroup'
         'zEndGroup'
      'zEndGroup'
   'zEndWindow'

   'zWindow GroupsWin Label "Groups"'
      CALL InterfaceMenu

      'zGroup Horizontal ChildMaxHeight'
         'zGroup Vertical ChildMaxWidth NoMargY'
            'zObject ListView GroupList Label "Group" Placelabel Above NumColumns 30 NumLines 9 Fill ChangeEvent'
            'zGroup Horizontal ChildMaxHeight NoMargX NoMargY'
               'zObject TextEntry GroupName Fill ChangeEvent'
               'zObject ButtonG GroupAdd Glyph AddImage UpEvent'
               'zObject ButtonG GroupRem Glyph RemImage UpEvent'
            'zEndGroup'
            'zGroup Horizontal ChildMaxWidth NoMargX'
               'zObject ButtonG GroupUp   Glyph UpImage Fill UpEvent'
               'zObject ButtonG GroupDown Glyph DownImage Fill UpEvent'
            'zEndGroup'
         'zEndGroup'
         'zObject Line'
         'zGroup Vertical ChildMaxWidth Justification Top'
            'zObject TextDisplay GroupMsg NoBorder Value "Options" Justification Center'
            'zObject TextEntry GroupPersistence Label "Message persistence in days" PlaceLabel Right NumColumns 2 ChangeEvent'
            'zObject CheckBox  GroupKeepUnread  Label "Keep unread messages" PlaceLabel Right ChangeEvent'
         'zEndGroup'
      'zEndGroup'
   'zEndWindow'

   ArchieSearches = "exact|substring case sensitive|substring|regular expression"
   ArchieRetries  = "substring case sensitive|substring| "
   ArchieSorts    = "filename|reverse filename|hostname|reverse hostname|size|reverse size|time|reverse time"
   ArchieOutputs  = "machine|terse|verbose"
   'zWindow ArchieWin Label "Mail-Archie client" Centered'
      CALL InterfaceMenu

      'zGroup Horizontal ChildMaxHeight'
         'zGroup Vertical ChildMaxWidth'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextEntry ArchieServer Label "Archie server:" NumColumns 35 Value "archie.rutgers.edu      USA (NJ)"'
               'zObject ButtonG ArchieServerB Glyph PopupImage UpEvent'
            'zEndGroup'
            'zObject Line'
            'zObject TextEntry ArchieFind Label "Find:" NumColumns 35'
            'zObject Cycle ArchieSearch Label "Search:"        Items "'ArchieSearches'" Value "exact"'
            'zObject Cycle ArchieRetry  Label "Search retry:"  Items "'ArchieRetries'" Value "substring"'
            'zObject Cycle ArchieSortBy Label "Sort by:"       Items "'ArchieSorts'" Value "reverse time"'
            'zObject Cycle ArchieOutput Label "Output format:" Items "'ArchieOutputs'" Value "Verbose"'
            'zObject IntegerEntry ArchieMaxHits   Label "Max hits (1-1000):" Value 20 MaxChars 5 Justification Left'
            'zObject IntegerEntry ArchieSplitSize Label "Split size (Bytes):" Value 51200 MaxChars 7 Justification Left'
            'zObject Line'
            'zObject TextEntry ArchieWhatIs Label "What is:" NumColumns 35'
            'zObject Line'
            'zObject CheckBox ArchieGetServers Label "Get Servers" PlaceLabel Right'
            'zObject CheckBox ArchieGetHelp    Label "Get Help"    PlaceLabel Right'
         'zEndGroup'
         'zObject Line'
         'zGroup Vertical Justification Bottom ChildMaxWidth'
            'zObject Line'
            'zObject Button ArchieQueue  Label "Queue" SelectEvent'
            'zObject Button ArchieDelete Label "Cancel" Cause "zDoMethod ArchieWin Close"'
         'zEndGroup'
      'zEndGroup'
   'zEndWindow'

   'zWindow AboutWin Label "About NetMail" Noclose Centered'
      'zGroup Vertical ChildMaxWidth'
         'zGroup Horizontal Alignment Center'
            'zFill'
            'zGroup Vertical'
               'zObject ButtonG About1 Image NetMailIcon'
            'zEndGroup'
            'zGroup Vertical ChildMaxWidth'
               'zObject TextDisplay About2 Justification Center NoBorder Value "'NETMAILVER'"'
               'zObject TextDisplay About3 Justification Center NoBorder Value "Copyright  1995. All Rights Reserved."'
               'zObject TextDisplay About4 Justification Center NoBorder Value "Written by Riccardo Solmi"'
               'zObject TextDisplay About5 Justification Center NoBorder Value ""'
               'zObject TextDisplay About6 Justification Center NoBorder Value "SHAREWARE"'
            'zEndGroup'
         'zEndGroup'
         'zObject Line'
         'zGroup Horizontal Justification Center'
            'zObject Button About55 Label "&OK" Cause "zDoMethod AboutWin Close"'
         'zEndGroup'
      'zEndGroup'
   'zEndWindow'

   'zWindow Prefs1Win Label "Accounts" Centered'
      CALL InterfaceMenu

      'zGroup Vertical ChildMaxWidth'
         'zObject TextEntry PrefsRealName Label "Real name:" NumColumns 31 ChangeEvent'
         'zGroup NoMargY ChildMaxWidth'
            'zGroup Horizontal Justification Right'
               'zObject ListView PrefsAccountList Label "Accounts:" NumLines 3 ChangeEvent'
            'zEndGroup'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextEntry PrefsAccount Label "Email address:" NumColumns 29 ChangeEvent'
               'zObject ButtonG PrefsAccountAdd Glyph AddImage UpEvent'
               'zObject ButtonG PrefsAccountRem Glyph RemImage UpEvent'
            'zEndGroup'
         'zEndGroup'
         'zObject TextEntry PrefsReplyTo      Label "Return address:" ChangeEvent'
         'zObject TextEntry PrefsOrganization Label "Organization:" ChangeEvent'
         'zObject TextEntry PrefsUsername     Label "Username:" ChangeEvent'
         'zObject TextEntry PrefsPassword     Label "Password:" ChangeEvent'
         'zObject TextEntry PrefsPOPHost      Label "POP server:" ChangeEvent'
         'zObject TextEntry PrefsSMTPHost     Label "SMTP server:" ChangeEvent'
      'zEndGroup'
   'zEndWindow'

   'zWindow Prefs2Win Label "Settings" Centered'
      CALL InterfaceMenu

      'zGroup Vertical ChildMaxWidth'
         'zGroup NoMargY ChildMaxWidth'
            'zGroup Horizontal Justification Right'
               'zObject ListView PrefsSignatureList Label "Signatures:" NumLines 3 ChangeEvent'
            'zEndGroup'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextEntry PrefsSignature Label "(Default)" NumColumns 29 ChangeEvent'
               'zObject ButtonG PrefsSignatureAdd Glyph AddImage UpEvent'
               'zObject ButtonG PrefsSignatureRem Glyph RemImage UpEvent'
            'zEndGroup'
         'zEndGroup'
         'zObject Line'
         'zObject TextEntry PrefsQuoteHeader   Label "Quote header:" NumColumns 31 ChangeEvent'
         'zObject TextEntry PrefsQuotePrefix   Label "Quote prefix:" NumColumns 31 ChangeEvent'
         'zObject Line'
         'zObject CheckBox PrefsLeaveMail      Label "Leave mail on server" PlaceLabel Right ChangeEvent'
         'zObject CheckBox PrefsGroupsOnDemand Label "Create groups on demand" PlaceLabel Right ChangeEvent'
         'zObject CheckBox PrefsCaptureFilter  Label "Apply filter on Capture" PlaceLabel Right ChangeEvent'
         'zObject CheckBox PrefsPurge          Label "Purge on startup" PlaceLabel Right ChangeEvent'
         'zObject CheckBox PrefsEmptyTrash     Label "Empty TRASH on exit" PlaceLabel Right ChangeEvent'
      'zEndGroup'
   'zEndWindow'

   'zWindow Prefs3Win Label "Drivers" Centered'
      CALL InterfaceMenu

      'zGroup Vertical ChildMaxWidth'
         'zObject Cycle PrefsQuotedCmd  Label "Quoted-printable Cmd:" Items "'Prefs.QuotedItems'" ChangeEvent'
         'zObject Cycle PrefsBase64Cmd  Label "Base64 Cmd:" Items "'Prefs.Base64Items'" ChangeEvent'
         'zObject Cycle PrefsUUCmd      Label "UUencode Cmd:" Items "'Prefs.UUItems'" ChangeEvent'
         'zObject Line'
         'zObject Cycle PrefsEditorCmd  Label "Editor Cmd:" Items "'Prefs.EditorItems'" ChangeEvent'
         'zObject Cycle PrefsReaderCmd  Label "Reader Cmd:" Items "'Prefs.ReaderItems'" ChangeEvent'
         'zObject Cycle PrefsSendCmd    Label "Send Cmd:" Items "'Prefs.SendItems'" ChangeEvent'
         'zObject Cycle PrefsReceiveCmd Label "Receive Cmd:" Items "'Prefs.ReceiveItems'" ChangeEvent'
      'zEndGroup'
   'zEndWindow'

   'zWindow Prefs4Win Label "GUI Prefs" Centered'
      CALL InterfaceMenu

      'zObject TextDisplay  PrefsGUIMessagesWin1 Value "Messages window" NoBorder Fill Justification Center'
      'zObject TextDisplay  PrefsGUIMessagesWin2 Value "(restart to activate)" NoBorder Fill Justification Center'
      'zObject IntegerEntry PrefsVisibleGroups   Label "Visible groups:" NumColumns 5 ChangeEvent Value' Prefs.VisibleGroups
      'zObject IntegerEntry PrefsVisibleMessages Label "Visible messages:" NumColumns 5 ChangeEvent Value' Prefs.VisibleMessages
      'zObject IntegerEntry PrefsSubjectColumns  Label "Subject columns:" NumColumns 5 ChangeEvent Value' Prefs.SubjectColumns
      'zObject IntegerEntry PrefsFromColumns     Label "From columns:" NumColumns 5 ChangeEvent Value' Prefs.FromColumns
      'zObject Line'
      'zObject TextDisplay  PrefsGUIMailWin      Value "Mail window" NoBorder Fill Justification Center'
      'zObject CheckBox     PrefsEditorWin       Label "Open editor window" PlaceLabel Right ChangeEvent'
   'zEndWindow'

   'zWindow NicknamesWin Label "Nicknames"'
      CALL InterfaceMenu

      'zGroup Horizontal ChildMaxHeight'
         'zGroup Vertical ChildMaxWidth Justification Top NoMargY'
            'zObject ListView NickList Label "Nickname" Placelabel Above NumColumns 20 NumLines 14 Order Ascend ChangeEvent'
            'zGroup Horizontal ChildMaxHeight NoMargX'
               'zObject TextEntry NickName Fill ChangeEvent'
               'zObject ButtonG NickNameAdd Glyph AddImage UpEvent'
               'zObject ButtonG NickNameRem Glyph RemImage UpEvent'
            'zEndGroup'
            'zObject Button NickCapture Label "Capture" SelectEvent'
         'zEndGroup'
         'zObject Line'
         'zGroup Vertical'
            'zGroup ChildMaxWidth NoMargY'
               'zObject ListView NickAddrList Label "Address(es)" Placelabel Above NumColumns 30 NumLines 5 ChangeEvent'
               'zGroup Horizontal ChildMaxHeight NoMargX'
                  'zObject TextEntry NickAddress Fill ChangeEvent'
                  'zObject ButtonG NickAddrAdd Glyph AddImage UpEvent'
                  'zObject ButtonG NickAddrRem Glyph RemImage UpEvent'
               'zEndGroup'
            'zEndGroup'
            'zGroup ChildMaxWidth NoMargY'
               'zObject ListView NickNotesList Label "Notes" PlaceLabel Above NumColumns 30 NumLines 5 ChangeEvent'
               'zGroup Horizontal ChildMaxHeight NoMargX'
                  'zObject TextEntry NickNote Fill ChangeEvent'
                  'zObject ButtonG NickNoteAdd Glyph AddImage UpEvent'
                  'zObject ButtonG NickNoteRem Glyph RemImage UpEvent'
               'zEndGroup'
            'zEndGroup'
            'zObject CheckBox NickInRecipients Label "In Recipients" PlaceLabel Right ChangeEvent'
         'zEndGroup'
      'zEndGroup'
   'zEndWindow'

   FilterTypes = "contains|doesn't contain|is|is not|starts with|ends with"
   'zWindow FiltersWin Label "Filters"'
      CALL InterfaceMenu

      'zGroup Horizontal ChildMaxHeight'
         'zGroup Vertical ChildMaxWidth Justification Top'
            'zGroup Vertical ChildMaxWidth NoMargY'
               'zObject ListView FilterList Label "Filter" Placelabel Above NumColumns 16 NumLines 14 ChangeEvent'
               'zGroup Horizontal ChildMaxHeight NoMargX'
                  'zObject TextEntry FilterName Fill ChangeEvent'
                  'zObject ButtonG FilterAdd Glyph AddImage UpEvent'
                  'zObject ButtonG FilterRem Glyph RemImage UpEvent'
               'zEndGroup'
               'zGroup Horizontal ChildMaxWidth NoMargX'
                  'zObject ButtonG FilterUp   Glyph UpImage Fill UpEvent'
                  'zObject ButtonG FilterDown Glyph DownImage Fill UpEvent'
               'zEndGroup'
            'zEndGroup'
            'zGroup Horizontal ChildMaxWidth NoMargX'
               'zObject Button FilterApply    Label "Apply" SelectEvent'
               'zObject Button FilterApplyAll Label "Apply all" SelectEvent'
            'zEndGroup'
         'zEndGroup'
         'zObject Line'
         'zGroup Vertical ChildMaxWidth Alignment Right'
            'zObject TextDisplay FilterApplyTo NoBorder Value "Apply to" Justification Center'
            'zGroup Horizontal ChildMaxWidth'
               'zObject CheckBox FilterIncoming Label "Incoming" PlaceLabel Right ChangeEvent'
               'zObject CheckBox FilterOutgoing Label "Outgoing" PlaceLabel Right ChangeEvent'
               'zObject CheckBox FilterManual   Label "Manual"   PlaceLabel Right ChangeEvent'
            'zEndGroup'
            'zObject Line'
            'zObject TextDisplay FilterMatch NoBorder Value "Match" Justification Center'
            'zGroup Vertical ChildMaxWidth NoMargY'
               'zGroup Horizontal ChildMaxHeight NoMargX'
                  'zObject TextEntry FilterHeader1 Fill ChangeEvent'
                  'zObject ButtonG FilterHeader1B Glyph PopupImage UpEvent'
                  'zObject Cycle FilterType1 Items "'FilterTypes'" ChangeEvent'
               'zEndGroup'
               'zObject TextEntry FilterMatch1 Fill ChangeEvent'
            'zEndGroup'
            'zGroup Vertical Alignment Center'
               'zObject Cycle FilterAndOr Items "and|or" ChangeEvent'
            'zEndGroup'
            'zGroup Vertical ChildMaxWidth NoMargY'
               'zGroup Horizontal ChildMaxHeight NoMargX'
                  'zObject TextEntry FilterHeader2 Fill ChangeEvent'
                  'zObject ButtonG FilterHeader2B Glyph PopupImage UpEvent'
                  'zObject Cycle FilterType2 Items "'FilterTypes'" ChangeEvent'
               'zEndGroup'
               'zObject TextEntry FilterMatch2 Fill ChangeEvent'
            'zEndGroup'
            'zObject Line'
            'zObject TextDisplay FilterAction NoBorder Value "Action" Justification Center'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextEntry FilterTransfer Label "Transfer to:" NumColumns 20 ChangeEvent'
               'zObject ButtonG FilterTransferB Glyph PopupImage UpEvent'
            'zEndGroup'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextEntry FilterMacro Label "Rexx macro:" NumColumns 20 ChangeEvent'
               'zObject ButtonG FilterMacroB Glyph FolderImage UpEvent'
            'zEndGroup'
         'zEndGroup'
      'zEndGroup'
   'zEndWindow'

   'zWindow MailWin Label "Mail" CloseEvent'
      CALL InterfaceMenu

      'zGroup Horizontal ChildMaxHeight'
         'zGroup Vertical ChildMaxWidth'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextEntry MailFrom  Label "From:" NumColumns 30'
               'zObject ButtonG   MailFromB Glyph CycleImage UpEvent'
            'zEndGroup'
            'zObject TextEntry MailSubject Label "Subject:"'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextEntry MailTo  Label "To:" NumColumns 30 MaxChars 1024'
               'zObject ButtonG   MailToB Glyph PopupImage UpEvent'
            'zEndGroup'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextEntry MailCc  Label "Cc:" NumColumns 30 MaxChars 1024'
               'zObject ButtonG   MailCcB Glyph PopupImage UpEvent'
            'zEndGroup'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextEntry MailBcc  Label "Bcc:" NumColumns 30 MaxChars 1024'
               'zObject ButtonG   MailBccB Glyph PopupImage UpEvent'
            'zEndGroup'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextEntry MailAttachments  Label "Attachments:" NumColumns 30'
               'zObject ButtonG   MailAttachmentsB Glyph FolderImage UpEvent'
            'zEndGroup'
            'zObject Cycle MailEncoder Label "Att. encoder:" Items "'Prefs.EncoderItems'"'
            'zGroup Horizontal ChildMaxHeight NoMargX Justification Right'
               'zObject TextDisplay MailSignature Label "Signature:" NumColumns 31'
               'zObject ButtonG     MailSignatureB Glyph CycleImage UpEvent'
            'zEndGroup'
         'zEndGroup'
         'zObject Line'
         'zGroup Vertical ChildMaxWidth'
            'zGroup Vertical Justification Top ChildMaxWidth'
               'zObject Button MailEdit Label "Edit" SelectEvent'
            'zEndGroup'
            'zGroup Vertical Justification Bottom ChildMaxWidth'
               'zObject Line'
               'zObject Button MailQueue  Label "Queue" SelectEvent'
               'zObject Button MailDelay  Label "Delay" SelectEvent'
               'zObject Button MailDelete Label "Delete" SelectEvent"'
            'zEndGroup'
         'zEndGroup'
      'zEndGroup'
   'zEndWindow'

   'zWindow PartsWin Label "Select message parts" Centered Vertical ChildMaxWidth NoMargY'
      'zObject Listview PartsList NumLines 10 ReadOnly'
      'zGroup Horizontal ChildMaxWidth NoMargX'
         'zObject Button PartsAdd    Label "Add" SelectEvent'
         'zObject Button PartsDecode Label "Decode" SelectEvent'
      'zEndGroup'
   'zEndWindow'

   'zWindow DestinationWin Label "Select destination" CloseEvent Centered Vertical ChildMaxWidth NoMargY'
      'zObject Listview DestinationList NumLines 10'
      'zObject Button   DestinationMove Label "Move" SelectEvent'
   'zEndWindow'

   'zWindow ToCcBccWin Label "Select recipients" RelMouse Vertical ChildMaxWidth NoMargY Blocking'
      'zObject Listview ToCcBccList NumLines 10 NumColumns 30 ChangeEvent'
      'zObject Button   ToCcBccOk Label "Ok" Cause "zDoMethod ToCcBccWin Close"'
   'zEndWindow'

   'zWindow TransferToWin Label "Select destination" RelMouse Vertical Blocking'
      'zObject Listview TransferToList NumLines 10 NumColumns 30 ChangeEvent'
   'zEndWindow'

   'zWindow HeaderWin Label "Select field" RelMouse Vertical Blocking'
      'zObject Listview HeaderList NumLines 5 NumColumns 15 Items "From|Reply-To|Sender|Subject|To" ChangeEvent'
   'zEndWindow'

   'zWindow StatusWin Label "Status" Centered Vertical ChildMaxWidth'
      'zObject Listview StatusList NumLines 5 NumColumns 54 Items "Loading configuration file: Prefs" ReadOnly'
   'zEndWindow'

   'zWindow ServerWin Label "Select a server" RelMouse Vertical Blocking'
      'zObject TextDisplay FilterAction NoBorder Value " Host                    State"'
      'zObject Listview ServerList NumLines 10 NumColumns 35 ChangeEvent'
   'zEndWindow'
'zEndInterface'

'zDoMethod TransferToWin Close'
'zDoMethod HeaderWin Close'
'zDoMethod ToCcBccWin Close'
'zDoMethod ServerWin Close'
'zDoMethod MailWin Close'
'zDoMethod NetMail Activate'
RETURN 0



/*
** Menu events
*/


MenuSave_Select:
   CALL StatusWin_Open("Clear")
   CALL PersistSave
   CALL StatusWin_Close
RETURN 0


MenuRegForm_Select:
   form = AddPart(Prefs.prgdir, "Help/"Prefs.Language"/RegistrationForm")
   IF ~EXISTS(form) THEN form = AddPart(Prefs.prgdir, "Help/English/RegistrationForm")
   CALL MailWin_Open 'NEW "'GroupIndex('OUT')'" "'form'" "slme10k1@bologna.nettuno.it" "NetMail: Registration form"'
RETURN 0


MenuBugForm_Select:
   form = AddPart(Prefs.prgdir, "Help/"Prefs.Language"/BugReportForm")
   IF ~EXISTS(form) THEN form = AddPart(Prefs.prgdir, "Help/English/BugReportForm")
   ADDRESS COMMAND
      'Copy QUIET "'form'" T:form'
      'Echo >>T:form ""'
      'Echo >>T:form --System--'
      'ShowConfig >>T:form'
      'Echo >>T:form ""'
      'Echo >>T:form --NetMail--'
      'Echo >>T:form Version:' NETMAILVER
      'Echo >>T:form Path:' PRAGMA('DIRECTORY')
      'Echo >>T:form Language:' Prefs.Language
      'Echo >>T:form Nextfile:' Group.NEXTFILE
      'Echo >>T:form Groups:' Group.0
      msgs = 0
      DO index = 1 TO Group.0
         msgs = msgs + Group.index.0
      END
      'Echo >>T:form Messages:' msgs
      'Echo >>T:form Filters:' Filter.0
      'Echo >>T:form Nicknames:' Nickname.0
      'Echo >>T:form Accounts:' Prefs.Account.0
      'Echo >>T:form Signatures:' Prefs.Signature.0
      'Echo >>T:form Quoted-printable Cmd:' Prefs.PrefsQuotedCmd
      'Echo >>T:form Base64 Cmd:' Prefs.PrefsBase64Cmd
      'Echo >>T:form UUencode Cmd:' Prefs.PrefsUUCmd
      'Echo >>T:form Editor Cmd:' Prefs.PrefsEditorCmd
      'Echo >>T:form Reader Cmd:' Prefs.PrefsReaderCmd
      'Echo >>T:form Send Cmd:' Prefs.PrefsSendCmd
      'Echo >>T:form Receive Cmd:' Prefs.PrefsReceiveCmd
   ADDRESS
   CALL MailWin_Open 'NEW "'GroupIndex('OUT')'" "T:form" "vat0062@iperbole.bologna.it" "NetMail Bug: <description>"'
   DeleteFile('T:form')
RETURN 0


MenuReqForm_Select:
   CALL MailWin_Open 'NEW "'GroupIndex('OUT')'" "" "vat0062@iperbole.bologna.it" "NetMail Request: <subject>"'
RETURN 0


MenuComForm_Select:
   CALL MailWin_Open 'NEW "'GroupIndex('OUT')'" "" "vat0062@iperbole.bologna.it" "NetMail: <subject>"'
RETURN 0


MenuPrec_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   midx = RESULT + 1
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1

   midx2 = midx
   name  = Group.midx2
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   DO UNTIL midx2 = midx
      DO msg = msg - 1 TO 1 BY - 1
         IF ABBREV(Group.mbox.msg, 'D') = 0 THEN DO
            IF midx2 ~= midx THEN DO
               'zSetAttr MboxList     ValueIndex' midx2 - 1
               'zSetAttr MboxMailList ItemStem' Group.mbox.
            END
            'zSetAttr MboxMailList ValueIndex' msg - 1
            CALL MessageRead(midx2, mbox, msg)
            'zSetAttr MboxList     ItemStem' Group.LIST.
            'zSetAttr MboxMailList ItemStem' Group.mbox.
            'zDoMethod NetMail Unlock'
            RETURN 0
         END
      END

      IF midx2 > 1 THEN midx2 = midx2 - 1
                   ELSE midx2 = Group.0
      name = Group.midx2
      uname = UPPER(name)
      mbox = Group.ITEM.uname
      msg  = Group.mbox.0 + 1
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MenuNext_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   midx = RESULT + 1
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1

   midx2 = midx
   name  = Group.midx2
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   DO UNTIL midx2 = midx
      DO msg = msg + 1 TO Group.mbox.0
         IF ABBREV(Group.mbox.msg, 'D') = 0 THEN DO
            IF midx2 ~= midx THEN DO
               'zSetAttr MboxList     ValueIndex' midx2 - 1
               'zSetAttr MboxMailList ItemStem' Group.mbox.
            END
            'zSetAttr MboxMailList ValueIndex' msg - 1
            CALL MessageRead(midx2, mbox, msg)
            'zSetAttr MboxList     ItemStem' Group.LIST.
            'zSetAttr MboxMailList ItemStem' Group.mbox.
            'zDoMethod NetMail Unlock'
            RETURN 0
         END
      END

      IF midx2 < Group.0 THEN midx2 = midx2 + 1
                         ELSE midx2 = 1
      name  = Group.midx2
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      msg   = 0
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MenuPrecUnread_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   midx = RESULT + 1
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1

   midx2 = midx
   name  = Group.midx2
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   DO UNTIL midx2 = midx
      DO msg = msg - 1 TO 1 BY - 1
         IF ABBREV(Group.mbox.msg, 'b7'x) THEN DO
            IF midx2 ~= midx THEN DO
               'zSetAttr MboxList     ValueIndex' midx2 - 1
               'zSetAttr MboxMailList ItemStem' Group.mbox.
            END
            'zSetAttr MboxMailList ValueIndex' msg - 1
            CALL MessageRead(midx2, mbox, msg)
            'zSetAttr MboxList     ItemStem' Group.LIST.
            'zSetAttr MboxMailList ItemStem' Group.mbox.
            'zDoMethod NetMail Unlock'
            RETURN 0
         END
      END

      IF midx2 > 1 THEN midx2 = midx2 - 1
                   ELSE midx2 = Group.0
      name  = Group.midx2
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      msg   = Group.mbox.0 + 1
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MenuNextUnread_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   midx = RESULT + 1
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1

   midx2 = midx
   name  = Group.midx2
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   DO UNTIL midx2 = midx
      DO msg = msg + 1 TO Group.mbox.0
         IF ABBREV(Group.mbox.msg, 'b7'x) THEN DO
            IF midx2 ~= midx THEN DO
               'zSetAttr MboxList     ValueIndex' midx2 - 1
               'zSetAttr MboxMailList ItemStem' Group.mbox.
            END
            'zSetAttr MboxMailList ValueIndex' msg - 1
            CALL MessageRead(midx2, mbox, msg)
            'zSetAttr MboxList     ItemStem' Group.LIST.
            'zSetAttr MboxMailList ItemStem' Group.mbox.
            'zDoMethod NetMail Unlock'
            RETURN 0
         END
      END

      IF midx2 < Group.0 THEN midx2 = midx2 + 1
                         ELSE midx2 = 1
      name  = Group.midx2
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      msg   = 0
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MenuRead_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1
   IF msg > 0 THEN DO
      IF ABBREV(Group.mbox.msg, 'b7'x) THEN DO
         Group.mbox.msg      = OVERLAY(' ', Group.mbox.msg)
         Group.mbox.msg.MSG1 = OVERLAY(' ', Group.mbox.msg.MSG1)
         CALL MessageChange(idx, 'Read')
         'zSetAttr MboxList     ItemStem' Group.LIST.
         'zSetAttr MboxMailList ItemStem' Group.mbox.
      END
      ELSE IF ABBREV(Group.mbox.msg, ' ') THEN DO
         Group.mbox.msg      = OVERLAY('b7'x, Group.mbox.msg)
         Group.mbox.msg.MSG1 = OVERLAY('b7'x, Group.mbox.msg.MSG1)
         CALL MessageChange(idx, 'Unread')
         'zSetAttr MboxList     ItemStem' Group.LIST.
         'zSetAttr MboxMailList ItemStem' Group.mbox.
      END
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MenuLock_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1
   IF msg > 0 THEN DO
      IF ABBREV(Group.mbox.msg, ' ') THEN DO
         Group.mbox.msg      = OVERLAY('L', Group.mbox.msg)
         Group.mbox.msg.MSG1 = OVERLAY('L', Group.mbox.msg.MSG1)
         'zSetAttr MboxMailList ItemStem' Group.mbox.
      END
      ELSE IF ABBREV(Group.mbox.msg, 'L') THEN DO
         Group.mbox.msg      = OVERLAY(' ', Group.mbox.msg)
         Group.mbox.msg.MSG1 = OVERLAY(' ', Group.mbox.msg.MSG1)
         'zSetAttr MboxMailList ItemStem' Group.mbox.
      END
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MenuDelay_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1
   IF msg > 0 THEN DO
      IF ABBREV(Group.mbox.msg, 'Q') THEN DO
         Group.mbox.msg      = OVERLAY('D', Group.mbox.msg)
         Group.mbox.msg.MSG1 = OVERLAY('D', Group.mbox.msg.MSG1)
         'zSetAttr MboxMailList ItemStem' Group.mbox.
         IF SYMBOL('Prefs.ReaderMbox') = 'VAR' & SYMBOL('Prefs.ReaderMsg') = 'VAR' THEN
            IF Prefs.ReaderMbox = mbox & Prefs.ReaderMsg = msg THEN DO
               cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsReaderCmd'.reader')"'"
               INTERPRET cmd '"CLEAR","'Prefs.ReaderPort'"'
               DROP Prefs.ReaderMbox Prefs.ReaderMsg
            END
      END
      ELSE IF ABBREV(Group.mbox.msg, 'D') & MailWin.MAILFILE ~= Group.mbox.msg.FILE & EXISTS(AddPart(Prefs.msgdir, Group.mbox.msg.FILE)) THEN DO
         Group.mbox.msg      = OVERLAY('Q', Group.mbox.msg)
         Group.mbox.msg.MSG1 = OVERLAY('Q', Group.mbox.msg.MSG1)
         'zSetAttr MboxMailList ItemStem' Group.mbox.
      END
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MenuReadAll_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   msgu  = 0
   DO msg = 1 TO Group.mbox.0
      IF ABBREV(Group.mbox.msg, 'b7'x) THEN DO
         Group.mbox.msg      = OVERLAY(' ', Group.mbox.msg)
         Group.mbox.msg.MSG1 = OVERLAY(' ', Group.mbox.msg.MSG1)
      END
      ELSE IF ABBREV(Group.mbox.msg, ' ') = 0 THEN
         msgu = msgu + 1
   END
   CALL MessageChange(idx, 'Readall', msgu)
   'zSetAttr MboxList ItemStem' Group.LIST.
   'zSetAttr MboxMailList ItemStem' Group.mbox.
   'zDoMethod NetMail Unlock'
RETURN 0


MenuUnreadAll_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   DO msg = 1 TO Group.mbox.0
      IF ABBREV(Group.mbox.msg, ' ') THEN DO
         Group.mbox.msg      = OVERLAY('b7'x, Group.mbox.msg)
         Group.mbox.msg.MSG1 = OVERLAY('b7'x, Group.mbox.msg.MSG1)
      END
   END
   CALL MessageChange(idx, 'Unreadall')
   'zSetAttr MboxList ItemStem' Group.LIST.
   'zSetAttr MboxMailList ItemStem' Group.mbox.
   'zDoMethod NetMail Unlock'
RETURN 0


MenuImport_Select:
   'zRequest File Label "Select a mailbox file" Value "SYS:"'
   fname = RESULT
   IF OPEN(fin, fname, 'Read') THEN DO
      DO UNTIL EOF(fin)~=0 | line ~= ''
         line = READLN(fin)
      END
      CLOSE(fin)
      IF ABBREV(UPPER(line), 'FROM ') & Prefs.Account.0 > 0 THEN DO
         uname    = UPPER(Prefs.Account.1)
         acnt     = Prefs.Account.ITEM.uname
         mbox     = Prefs.Account.acnt.PrefsUsername
         mboxfile = AddPart(Prefs.prgdir, mbox)
         IF EXISTS(mboxfile) THEN DO
            ADDRESS COMMAND 'Echo >>"'mboxfile'" ""'
            ADDRESS COMMAND 'Type >>"'mboxfile'" "'fname'"'
         END
         ELSE
            ADDRESS COMMAND 'Copy >NIL: QUIET "'fname'" "'mboxfile'"'
         'zDoMethod NetMail Lock'
         CALL StatusWin_Open("Clear")
         CALL GroupScan
         'zGetAttr MboxList ValueIndex'
         idx   = RESULT + 1
         name  = Group.idx
         uname = UPPER(name)
         mbox  = Group.ITEM.uname
         'zSetAttr MboxList     ItemStem' Group.LIST.
         'zSetAttr MboxMailList ItemStem' Group.mbox.
         CALL StatusWin_Close("Wait")
         'zDoMethod NetMail Unlock'
      END
   END
RETURN 0


MenuExport_Select:
   'zRequest Directory Label "Select the destination directory" Value "SYS:"'
   mboxfile = RESULT
   IF mboxfile ~= '' THEN DO
      'zDoMethod NetMail Lock'
      'zGetAttr MboxList ValueIndex'
      idx   = RESULT + 1
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname

      mboxfile = AddPart(mboxfile, name'.mbox')
      IF EXISTS(mboxfile) THEN ADDRESS COMMAND 'Echo >>"'mboxfile'" ""'
      DO msg = 1 TO Group.mbox.0
         IF ~ABBREV(Group.mbox.msg, 'D') & ~ABBREV(Group.mbox.msg, 'Q') THEN DO
            fname = AddPart(Prefs.msgdir, Group.mbox.msg.FILE)
            IF OPEN(fin, fname, 'Read') THEN DO
               line = UPPER(READLN(fin))
               CLOSE(fin)
               IF ABBREV(line, 'FROM ') THEN DO
                  ADDRESS COMMAND 'Echo >>"'mboxfile'" ""'
                  ADDRESS COMMAND 'Type >>"'mboxfile'" "'fname'"'
               END
               ELSE DO
                  ADDRESS COMMAND 'Echo >>"'mboxfile'" ""'
                  ADDRESS COMMAND 'Echo >>"'mboxfile'" "From localhost"'
                  ADDRESS COMMAND 'Type >>"'mboxfile'" "'fname'"'
               END
            END
         END
      END
      'zDoMethod NetMail Unlock'
   END
RETURN 0


MenuFilters_Select:
   'zDoMethod NetMail Lock'
   CALL StatusWin_Open("Clear")
   'zGetAttr GroupList Value'
   name1 = RESULT
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   CALL StatusWin_NewEvent("Applying filters to group: "name"...")
   CALL FilterGroup(idx, mbox)
   'zSetAttr GroupList    Value' name1
   'zSetAttr MboxList     ItemStem' Group.LIST.
   'zSetAttr MboxMailList ItemStem' Group.mbox.
   CALL StatusWin_UpdateEvent("Applying filters to group: "name". Done.")
   CALL GroupList_Activate(name1)
   CALL StatusWin_Close("Wait")
   'zDoMethod NetMail Unlock'
RETURN 0


MenuPurge_Select:
   'zDoMethod NetMail Lock'
   CALL StatusWin_Open("Clear")
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   CALL PurgeGroups
   'zSetAttr MboxList ItemStem' Group.LIST.
   'zSetAttr MboxMailList ItemStem' Group.mbox.
   CALL StatusWin_Close("Wait")
   'zDoMethod NetMail Unlock'
RETURN 0


MenuEmptyTrash_Select:
   'zDoMethod NetMail Lock'
   CALL StatusWin_Open("Clear")
   CALL GroupEmptyTrash
   'zSetAttr MboxList ItemStem' Group.LIST.
   'zGetAttr MboxList ValueIndex'
   idx  = RESULT + 1
   name = Group.idx
   IF name = 'TRASH' THEN DO
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      'zSetAttr MboxMailList ItemStem' Group.mbox.
   END
   IF SYMBOL('Prefs.ReaderMbox') = 'VAR' THEN IF Prefs.ReaderMbox = Group.ITEM.TRASH THEN DO
      cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsReaderCmd'.reader')"'"
      INTERPRET cmd '"CLEAR","'Prefs.ReaderPort'"'
      DROP Prefs.ReaderMbox Prefs.ReaderMsg
   END
   CALL StatusWin_Close("Wait")
   'zDoMethod NetMail Unlock'
RETURN 0


MenuUpdate_Select:
   'zDoMethod NetMail Lock'
   CALL StatusWin_Open("Clear")
   CALL GroupUpdate 'Force'
   'zSetAttr MboxList ItemStem' Group.LIST.
   'zGetAttr MboxList ValueIndex'
   CALL MboxList_Activate(RESULT)
   CALL StatusWin_Close("Wait")
   'zDoMethod NetMail Unlock'
RETURN 0


MenuSavePos_Select:
   IF EXISTS('ENV:NetMail') THEN DO
      ADDRESS COMMAND
         IF EXISTS('ENV:NetMail/PartsWin')       THEN 'Copy QUIET ENV:NetMail/PartsWin       "'AddPart(Prefs.envdir, "PartsWin")'"'
         IF EXISTS('ENV:NetMail/DestinationWin') THEN 'Copy QUIET ENV:NetMail/DestinationWin "'AddPart(Prefs.envdir, "DestinationWin")'"'
         IF EXISTS('ENV:NetMail/FiltersWin')     THEN 'Copy QUIET ENV:NetMail/FiltersWin     "'AddPart(Prefs.envdir, "FiltersWin")'"'
         IF EXISTS('ENV:NetMail/GroupsWin')      THEN 'Copy QUIET ENV:NetMail/GroupsWin      "'AddPart(Prefs.envdir, "GroupsWin")'"'
         IF EXISTS('ENV:NetMail/MailWin')        THEN 'Copy QUIET ENV:NetMail/MailWin        "'AddPart(Prefs.envdir, "MailWin")'"'
         IF EXISTS('ENV:NetMail/MessagesWin')    THEN 'Copy QUIET ENV:NetMail/MessagesWin    "'AddPart(Prefs.envdir, "MessagesWin")'"'
         IF EXISTS('ENV:NetMail/NicknamesWin')   THEN 'Copy QUIET ENV:NetMail/NicknamesWin   "'AddPart(Prefs.envdir, "NicknamesWin")'"'
         IF EXISTS('ENV:NetMail/ReaderWin')      THEN 'Copy QUIET ENV:NetMail/ReaderWin      "'AddPart(Prefs.envdir, "ReaderWin")'"'
         IF EXISTS('ENV:NetMail/EditorWin')      THEN 'Copy QUIET ENV:NetMail/EditorWin      "'AddPart(Prefs.envdir, "EditorWin")'"'
      ADDRESS
   END
RETURN 0



/*
** Status window events
*/

StatusWin_Select:
StatusWin_Open:
   IF UPPER(ARG(1)) = "CLEAR" THEN DO
      'zSetAttr StatusList Items ""'
      'zDoMethod StatusWin Open'
   END
   ELSE DO
      'zDoMethod StatusWin Open'
      'zGetAttr  StatusList Total'
      'zSetAttr  StatusList ValueIndex' RESULT - 1
   END
RETURN 0


StatusWin_Close:
   IF UPPER(ARG(1)) = "WAIT" THEN ADDRESS COMMAND 'Wait 2'
   'zDoMethod StatusWin Close'
RETURN 0


StatusWin_NewEvent: PROCEDURE
PARSE ARG string

   'zDoMethod StatusList Add' string
   'zGetAttr  StatusList Total'
   'zSetAttr  StatusList ValueIndex' RESULT - 1
RETURN 0


StatusWin_UpdateEvent: PROCEDURE
PARSE ARG string

   'zGetAttr StatusList ItemStem' stem.
   total      = stem.0
   stem.0     = total + 1
   stem.total = string
   'zSetAttr StatusList ItemStem' stem.
RETURN 0




/*
** Messages window events
*/


MessagesWin_UpEvent:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   midx = RESULT + 1
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1

   midx2 = midx
   name  = Group.midx2
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   DO UNTIL midx2 = midx
      DO msg = msg - 1 TO 1 BY - 1
         IF midx2 ~= midx THEN DO
            'zSetAttr MboxList     ValueIndex' midx2 - 1
            'zSetAttr MboxMailList ItemStem' Group.mbox.
         END
         'zSetAttr MboxMailList ValueIndex' msg - 1
         'zDoMethod NetMail Unlock'
         RETURN 0
      END

      IF midx2 > 1 THEN midx2 = midx2 - 1
                   ELSE midx2 = Group.0
      name  = Group.midx2
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      msg   = Group.mbox.0 + 1
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MessagesWin_DownEvent:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   midx = RESULT + 1
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1

   midx2 = midx
   name  = Group.midx2
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   DO UNTIL midx2 = midx
      DO msg = msg + 1 TO Group.mbox.0
         IF midx2 ~= midx THEN DO
            'zSetAttr MboxList     ValueIndex' midx2 - 1
            'zSetAttr MboxMailList ItemStem' Group.mbox.
         END
         'zSetAttr MboxMailList ValueIndex' msg - 1
         'zDoMethod NetMail Unlock'
         RETURN 0
      END

      IF midx2 < Group.0 THEN midx2 = midx2 + 1
                         ELSE midx2 = 1
      name  = Group.midx2
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      msg   = 0
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MessagesWin_RAUpEvent:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   midx = RESULT + 1
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1

   midx2 = midx
   name  = Group.midx2
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   DO UNTIL midx2 = midx
      DO msg = msg - 1 TO 1 BY - 1
         IF ABBREV(Group.mbox.msg, 'b7'x) THEN DO
            IF midx2 ~= midx THEN DO
               'zSetAttr MboxList     ValueIndex' midx2 - 1
               'zSetAttr MboxMailList ItemStem' Group.mbox.
            END
            'zSetAttr MboxMailList ValueIndex' msg - 1
            'zDoMethod NetMail Unlock'
            RETURN 0
         END
      END

      IF midx2 > 1 THEN midx2 = midx2 - 1
                   ELSE midx2 = Group.0
      name  = Group.midx2
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      msg   = Group.mbox.0 + 1
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MessagesWin_RADownEvent:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   midx = RESULT + 1
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1

   midx2 = midx
   name  = Group.midx2
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   DO UNTIL midx2 = midx
      DO msg = msg + 1 TO Group.mbox.0
         IF ABBREV(Group.mbox.msg, 'b7'x) THEN DO
            IF midx2 ~= midx THEN DO
               'zSetAttr MboxList     ValueIndex' midx2 - 1
               'zSetAttr MboxMailList ItemStem' Group.mbox.
            END
            'zSetAttr MboxMailList ValueIndex' msg - 1
            'zDoMethod NetMail Unlock'
            RETURN 0
         END
      END

      IF midx2 < Group.0 THEN midx2 = midx2 + 1
                         ELSE midx2 = 1
      name  = Group.midx2
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      msg   = 0
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MessagesWin_ReturnEvent:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   midx = RESULT + 1
   'zGetAttr MboxMailList ValueIndex'
   msg   = RESULT + 1
   name  = Group.midx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   IF msg > 0 THEN DO
      CALL MessageRead(midx, mbox, msg)
      'zSetAttr MboxList     ItemStem' Group.LIST.
      'zSetAttr MboxMailList ItemStem' Group.mbox.
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MessagesWin_DelEvent:
   CALL MboxDelete_Change
RETURN 0


MessagesWin_LeftEvent:
   CALL MenuPrec_Select
RETURN 0


MessagesWin_RightEvent:
   CALL MenuNext_Select
RETURN 0


MessagesWin_RALeftEvent:
   CALL MenuPrecUnread_Select
RETURN 0


MessagesWin_RARightEvent:
   CALL MenuNextUnread_Select
RETURN 0


MessagesWin_BackspaceEvent:
   IF SYMBOL('DestinationMove.OPENED') = 'LIT' THEN CALL DestinationWin_Open
                                               ELSE CALL DestinationMove_Select
RETURN 0


MessagesWin_Select:
MessagesWin_Open:
   'zSetAttr MboxList ItemStem' Group.LIST.
   'zSetAttr MboxList ValueIndex' 0
   CALL MboxList_Activate(0)
   'zDoMethod MessagesWin Open'
RETURN 0


Halt:
   echo "halt"
NetMail_Quit:
   echo "ctrl-c"
Quit_Select:
MessagesWin_Close:
   cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsEditorCmd'.editor')"'"
   INTERPRET cmd '"CLOSE","'Prefs.EditorPort'"'
   DROP Prefs.EditorPort
   cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsReaderCmd'.reader')"'"
   INTERPRET cmd '"CLOSE","'Prefs.ReaderPort'"'
   DROP Prefs.ReaderPort Prefs.ReaderMbox Prefs.ReaderMsg
   'zDoMethod NetMail Lock'
   'zDoMethod MessagesWin Close'
   'zDoMethod GroupsWin Close'
   'zDoMethod FiltersWin Close'
   'zDoMethod NicknamesWin Close'
   'zDoMethod MailWin Close'
   'zDoMethod ArchieWin Close'
   'zDoMethod Prefs1Win Close'
   'zDoMethod Prefs2Win Close'
   'zDoMethod Prefs3Win Close'
   'zDoMethod Prefs4Win Close'
   'zDoMethod TransferToWin Close'
   'zDoMethod HeaderWin Close'
   'zDoMethod ToCcBccWin Close'
   'zDoMethod ServerWin Close'
   'zDoMethod PartsWin Close'
   'zDoMethod DestinationWin Close'

   CALL StatusWin_Open("Clear")
   IF Prefs.PrefsEmptyTrash = 'TRUE' THEN CALL GroupEmptyTrash
   CALL PersistSave
   ADDRESS COMMAND 'Assign "NetMail:" REMOVE'
   CALL StatusWin_Close
   'zDoMethod NetMail Unlock'
EXIT


MboxList_Activate:
PARSE ARG stem.ValueIndex
   stem.Qualifiers = ""
MboxList_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      idx   = stem.ValueIndex + 1
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      'zSetAttr MboxMailList ItemStem' Group.mbox.
      'zSetAttr MboxMailList ValueIndex -1'
      'zDoMethod NetMail Unlock'
   END
RETURN 0


MboxMailList_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      'zGetAttr MboxList ValueIndex'
      idx   = RESULT + 1
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      msg   = stem.ValueIndex + 1

      IF SYMBOL('click.cTIME') = 'VAR' THEN
         IF TIME('s') < click.cTIME + 2 & mbox = click.cMBOX & msg = click.cMSG THEN DO
            CALL MessageRead(idx, mbox, msg)
            'zSetAttr MboxList     ItemStem' Group.LIST.
            'zSetAttr MboxMailList ItemStem' Group.mbox.
         END
      click.cMBOX = mbox
      click.cMSG  = msg
      click.cTIME = TIME('s')
      'zDoMethod NetMail Unlock'
   END
RETURN 0


MboxForward_Change:
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1
   IF msg > 0 THEN DO
      IF ABBREV(Group.mbox.msg, 'D') = 0 THEN
         CALL MailWin_Open 'FORWARD "'GroupIndex('OUT')'" "'Group.mbox.msg.FILE'"'
      ELSE DO
         CALL StatusWin_Open("Clear")
         StatusWin_NewEvent("Forward cannot be applied to delayed messages.")
         CALL StatusWin_Close("Wait")
      END
   END
   ELSE DO
      CALL StatusWin_Open("Clear")
      StatusWin_NewEvent("Select a message first.")
      CALL StatusWin_Close("Wait")
   END
RETURN 0


MboxMail_Change:
   'zGetAttr MboxList ValueIndex'
   idx = RESULT + 1
   CALL MailWin_Open 'NEW "'GroupIndex('OUT')'"'
RETURN 0


MboxReply_Change:
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1
   IF msg > 0 THEN DO
      IF ABBREV(Group.mbox.msg, 'D') + ABBREV(Group.mbox.msg, 'Q') = 0 THEN
         CALL MailWin_Open 'REPLY "'GroupIndex('OUT')'" "'Group.mbox.msg.FILE'"'
      ELSE DO
         CALL StatusWin_Open("Clear")
         StatusWin_NewEvent("Reply cannot be applied to delayed or queued messages.")
         CALL StatusWin_Close("Wait")
      END
   END
   ELSE DO
      CALL StatusWin_Open("Clear")
      StatusWin_NewEvent("Select a message first.")
      CALL StatusWin_Close("Wait")
   END
RETURN 0


MboxReplyGrp_Change:
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zGetAttr MboxMailList ValueIndex'
   msg  = RESULT + 1
   IF msg > 0 THEN DO
      IF ABBREV(Group.mbox.msg, 'D') + ABBREV(Group.mbox.msg, 'Q') = 0 THEN
         CALL MailWin_Open 'REPLYGROUP "'idx'" "'Group.mbox.msg.FILE'"'
      ELSE DO
         CALL StatusWin_Open("Clear")
         StatusWin_NewEvent("Reply To Group cannot be applied to delayed or queued messages.")
         CALL StatusWin_Close("Wait")
      END
   END
   ELSE DO
      CALL StatusWin_Open("Clear")
      StatusWin_NewEvent("Select a message first.")
      CALL StatusWin_Close("Wait")
   END
RETURN 0


MboxMove_Change:
DestinationWin_Open:
   IF SYMBOL('DestinationMove.OPENED') = 'LIT' THEN DO
      'zSetAttr  DestinationList ItemStem' Group.
      'zDoMethod DestinationList Remove "TRASH"'
      DestinationMove.OPENED = 1
   END
   'zDoMethod DestinationWin Open'
RETURN 0


DestinationWin_Close:
   DROP DestinationMove.OPENED
   'zDoMethod DestinationWin Close'
RETURN 0


DestinationMove_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox1 = Group.ITEM.uname
   'zGetAttr MboxMailList ValueIndex'
   msg = RESULT + 1
   IF msg > 0 THEN DO
      'zGetAttr DestinationList Value'
      name  = RESULT
      uname = UPPER(name)
      mbox2 = Group.ITEM.uname
      CALL MessageTransfer(idx, GroupIndex(name), mbox1, mbox2, msg)
      'zSetAttr MboxList ItemStem' Group.LIST.
      'zSetAttr MboxMailList ItemStem' Group.mbox1.
      IF Group.mbox1.0 < msg THEN 'zSetAttr MboxMailList ValueIndex' Group.mbox1.0 - 1

      IF SYMBOL('Prefs.ReaderMbox') = 'VAR' & SYMBOL('Prefs.ReaderMsg') = 'VAR' THEN
         IF Prefs.ReaderMbox = mbox1 & Prefs.ReaderMsg = msg THEN DO
            Prefs.ReaderMbox = mbox2
         END
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MboxDelete_Change:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zGetAttr MboxMailList ValueIndex'
   msg = RESULT + 1
   IF msg > 0 THEN DO
      CALL MessageRemove(idx, mbox, msg)
      'zSetAttr MboxList     ItemStem' Group.LIST.
      'zSetAttr MboxMailList ItemStem' Group.mbox.
      IF Group.mbox.0 < msg THEN 'zSetAttr MboxMailList ValueIndex' Group.mbox.0 - 1

      IF SYMBOL('Prefs.ReaderMbox') = 'VAR' & SYMBOL('Prefs.ReaderMsg') = 'VAR' THEN
         IF Prefs.ReaderMbox = mbox & Prefs.ReaderMsg = msg THEN DO
            IF mbox = Group.ITEM.TRASH THEN DO
               cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsReaderCmd'.reader')"'"
               INTERPRET cmd '"CLEAR","'Prefs.ReaderPort'"'
               DROP Prefs.ReaderMbox Prefs.ReaderMsg
            END
            ELSE
               Prefs.ReaderMbox = Group.ITEM.TRASH
         END
   END
   ELSE DO
      CALL StatusWin_Open("Clear")
      StatusWin_NewEvent("Select a message first.")
      CALL StatusWin_Close("Wait")
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MboxDecode_Change:
   'zDoMethod NetMail Lock'
   CALL StatusWin_Open("Clear")
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zGetAttr MboxMailList ValueIndex'
   msg = RESULT + 1
   IF msg > 0 THEN DO
      IF ABBREV(Group.mbox.msg, 'D') = 0 THEN DO
         CALL StatusWin_NewEvent("Message attachments:")
         attcount = 0
         msgfile = AddPart(Prefs.msgdir, Group.mbox.msg.FILE)
         IF OPEN(fin, msgfile, 'Read') THEN DO
            DROP mail.
            DO UNTIL EOF(fin)~=0 | line = ''
               line = READLN(fin)
               IF line ~= '' & ~ABBREV(line, ' ') & ~ABBREV(line, '09'x) THEN DO
                  PARSE VAR line fieldname ':' fieldbody
                  fieldname = TRIM(UPPER(fieldname))
                  mail.fieldname = STRIP(fieldbody)
               END
            END
            mail.FILE = msgfile

            header = 'CONTENT-TYPE'
            IF SYMBOL('mail.header') = 'VAR' THEN
               PARSE VAR mail.header ctype';' 'boundary=' boundary
            ELSE DO
               ctype    = 'text/plain'
               boundary = ''
            END
            ctype = UPPER(ctype)
            IF ABBREV(boundary, '"') THEN PARSE VAR boundary '"'boundary'"'
            boundary = '--'boundary

            cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsUUCmd'.encoder')"'"
            INTERPRET cmd '"DECODE","'msgfile'","'Prefs.attdir'","UUencode"'

            attlist = RESULT
            IF attlist ~= "" THEN DO UNTIL attlist = ''
               PARSE VAR attlist attfile '|' attlist
               CALL StatusWin_NewEvent('b7'x attfile)
               attcount = attcount + 1
            END

            IF ABBREV(ctype, 'MULTIPART') THEN DO
               line = READLN(fin)
               DO WHILE EOF(fin)=0
                  IF line = boundary THEN DO
                     DROP ctype cname ctenc
                     DO UNTIL EOF(fin)~=0 | line = boundary
                        line = READLN(fin)
                        IF ABBREV(UPPER(line), 'CONTENT-TYPE')              THEN PARSE VAR line ': ' ctype ';' 'name=' cname
                        IF ABBREV(UPPER(line), 'CONTENT-TRANSFER-ENCODING') THEN PARSE VAR line ': ' ctenc

                        IF line = '' & ABBREV(UPPER(ctype), 'APPLICATION') & cname ~= '' THEN DO
                           IF OPEN(fout, 'T:atttext', 'Write') THEN DO
                              DO UNTIL EOF(fin)~=0 | line ~= ''
                                 line = READLN(fin)
                              END

                              DO WHILE EOF(fin)=0 & line ~= '' & line ~= boundary
                                 CALL WRITELN(fout, line)
                                 line = READLN(fin)
                              END

                              DO WHILE EOF(fin)=0 & line ~= boundary
                                 line = READLN(fin)
                              END

                              CLOSE(fout)
                              IF ABBREV(cname, '"') THEN PARSE VAR cname '"'cname'"'
                              IF UPPER(ctenc) = 'BASE64' THEN DO
                                 cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsBase64Cmd'.encoder')"'"
                                 INTERPRET cmd '"DECODE","T:atttext","'AddPart(Prefs.attdir, cname)'","Base64"'

                                 CALL StatusWin_NewEvent('b7'x cname)
                                 attcount = attcount + 1
                              END
                              IF UPPER(ctenc) = 'QUOTED-PRINTABLE' THEN DO
                                 cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsQuotedCmd'.encoder')"'"
                                 INTERPRET cmd '"DECODE","T:atttext","'AddPart(Prefs.attdir, cname)'","Quoted-Printable"'

                                 CALL StatusWin_NewEvent('b7'x cname)
                                 attcount = attcount + 1
                              END
                              DeleteFile('T:atttext')
                           END
                        END
                     END
                  END
                  ELSE line = READLN(fin)
               END
            END
            CLOSE(fin)
         END
         IF attcount = 0 THEN CALL StatusWin_UpdateEvent("Message attachments: none.")
      END
      ELSE
         StatusWin_NewEvent("Decode cannot be applied to delayed messages.")
   END
   ELSE
      StatusWin_NewEvent("Select a message first.")
   CALL StatusWin_Close("Wait")
   'zDoMethod NetMail Unlock'
RETURN 0


MboxCapture_Change:
   CALL StatusWin_Open("Clear")
   CALL MboxCapture('People')
   CALL StatusWin_Close("Wait")
RETURN 0


MboxCaptureGrp_Change:
   CALL StatusWin_Open("Clear")
   CALL MboxCapture('Group')
   CALL StatusWin_Close("Wait")
RETURN 0


MboxCapture:
   'zDoMethod NetMail Lock'
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zGetAttr MboxMailList ValueIndex'
   msg = RESULT + 1
   IF msg > 0 THEN DO
      IF ABBREV(Group.mbox.msg, 'D') = 0 & ~MessageScan(AddPart(Prefs.msgdir, Group.mbox.msg.FILE)) THEN DO

         DROP fname faddr
         header = 'FROM'
         IF SYMBOL('mail.header') = 'VAR' THEN DO
            PARSE VAR mail.header fname '<' faddr '>'
            IF faddr = "" THEN PARSE VAR mail.header faddr '(' fname ')'
            faddr = STRIP(faddr)
            fname = STRIP(fname)
            IF LEFT(fname, 1) = '"' & RIGHT(fname, 1) = '"' THEN PARSE VAR fname '"' fname '"'
            IF fname = "" THEN fname = faddr
         END

         sname = fname
         saddr = faddr
         header = 'SENDER'
         IF SYMBOL('mail.header') = 'VAR' THEN DO
            PARSE VAR mail.header sname '<' saddr '>'
            IF saddr = "" THEN PARSE VAR mail.header saddr '(' sname ')'
            saddr = STRIP(saddr)
            sname = STRIP(sname)
            IF LEFT(sname, 1) = '"' & RIGHT(sname, 1) = '"' THEN PARSE VAR sname '"' sname '"'
            IF sname = "" THEN sname = saddr
         END

         rname = fname
         raddr = faddr
         header = 'REPLY-TO'
         IF SYMBOL('mail.header') = 'VAR' THEN DO
            PARSE VAR mail.header rname '<' raddr '>'
            IF raddr = "" THEN PARSE VAR mail.header raddr '(' rname ')'
            raddr = STRIP(raddr)
            rname = STRIP(rname)
            IF LEFT(rname, 1) = '"' & RIGHT(rname, 1) = '"' THEN PARSE VAR rname '"' rname '"'
            IF rname = "" THEN rname = raddr
         END

         header = 'NEWSGROUPS'
         IF SYMBOL('mail.header') = 'VAR' THEN DO
            PARSE VAR mail.header mboxname ','
            mboxtype = 'GROUP'
            mboxaddr = mboxname
            fheader  = 'Newsgroups'
            fcontain = mboxname
         END
         ELSE DO
            header = 'X-GROUPS'
            IF SYMBOL('mail.header') = 'VAR' THEN DO
               PARSE VAR mail.header mboxname ','
               mboxtype = 'GROUP'
               mboxaddr = mboxname
               fheader  = 'X-Groups'
               fcontain = mboxname
            END
            ELSE DO
               mboxtype = 'GROUP'
               header = 'TO'
               DO index = 1 TO Prefs.Account.0
                  IF INDEX(mail.header, Prefs.Account.index) > 0 THEN DO
                     mboxtype = 'PEOPLE'
                     LEAVE
                  END
               END

               IF mboxtype = 'PEOPLE' THEN DO
                  mboxname = fname
                  mboxaddr = raddr
                  fheader  = 'From'
                  fcontain = fname
               END
               ELSE IF UPPER(ARG(1)) = 'PEOPLE' THEN DO
                  mboxtype = 'PEOPLE'
                  mboxname = fname
                  IF raddr ~= saddr THEN mboxaddr = raddr
                                    ELSE mboxaddr = faddr
                  fheader  = 'From'
                  fcontain = fname
               END
               ELSE DO
                  header = 'TO'
                  PARSE VAR mail.header tname '<' taddr '>'
                  IF taddr = "" THEN PARSE VAR mail.header taddr '(' tname ')'
                  taddr = STRIP(taddr)
                  tname = STRIP(tname)
                  IF LEFT(tname, 1) = '"' & RIGHT(tname, 1) = '"' THEN PARSE VAR tname '"' tname '"'
                  IF tname = "" THEN tname = taddr
                  PARSE VAR tname 'list' tname2
                  IF tname2 = '' THEN PARSE VAR tname tname2 '@'
                  IF tname2 ~= '' THEN tname = tname2
                  tname = STRIP(tname)

                  mboxname = tname
                  mboxaddr = saddr
                  fheader  = 'To'
                  fcontain = taddr
               END
            END
         END

         DROP newnickname.
         newnickname.NickName     = mboxname
         newnickname.Address.1    = mboxaddr
         newnickname.InRecipients = 'TRUE'
         IF NickNameCreate() = 5 THEN CALL StatusWin_NewEvent('Nickname "'mboxname'" already exists.')
                                 ELSE CALL StatusWin_NewEvent('Nickname "'mboxname'" added.')

         IF UPPER(ARG(2)) ~= 'NICKNAMEONLY' THEN DO
            IF GroupCreate(mboxname) = 5 THEN CALL StatusWin_NewEvent('Group "'mboxname'" already exists.')
                                         ELSE CALL StatusWin_NewEvent('Group "'mboxname'" added.')

            DROP newfilter.
            newfilter.FilterName     = mboxname
            newfilter.FilterIncoming = 'TRUE'
            newfilter.FilterOutgoing = 'TRUE'
            newfilter.FilterManual   = 'FALSE'
            newfilter.FilterHeader1  = fheader
            newfilter.FilterType1    = 'contains'
            newfilter.FilterMatch1   = fcontain
            newfilter.FilterTransfer = mboxname
            IF FilterCreate() = 5 THEN CALL StatusWin_NewEvent('Filter "'mboxname'" already exists.')
                                  ELSE CALL StatusWin_NewEvent('Filter "'mboxname'" added.')

            IF Prefs.PrefsCaptureFilter = 'TRUE' THEN DO
               CALL StatusWin_NewEvent('Applying "'mboxname'" filter...')
               CALL FilterApply(mboxname)
               CALL StatusWin_UpdateEvent('Applying "'mboxname'" filter. Done.')
            END

            'zSetAttr GroupList Value' mboxname
            CALL GroupList_Activate(mboxname)
            'zSetAttr MboxList  ItemStem' Group.LIST.
            lidx = GroupIndex(mboxname) - 1
            'zSetAttr MboxList  Value' lidx
            CALL MboxList_Activate(lidx)
         END
      END
      ELSE
         StatusWin_NewEvent("Capture cannot be applied to delayed messages.")
   END
   ELSE
      StatusWin_NewEvent("Select a message first.")
   'zDoMethod NetMail Unlock'
RETURN 0


PartsAdd_Select:
RETURN 0


PartsDecode_Select:
RETURN 0


MboxSend_Change:
   'zDoMethod NetMail Lock'
   CALL StatusWin_Open("Clear")
   CALL GroupSend
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zSetAttr MboxList     ItemStem' Group.LIST.
   'zSetAttr MboxMailList ItemStem' Group.mbox.
   CALL StatusWin_Close("Wait")
   'zDoMethod NetMail Unlock'
RETURN 0


MboxExchange_Change:
   'zDoMethod NetMail Lock'
   CALL StatusWin_Open("Clear")
   CALL GroupExchange
   CALL GroupScan
   'zGetAttr MboxList ValueIndex'
   idx   = RESULT + 1
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   'zSetAttr MboxList     ItemStem' Group.LIST.
   'zSetAttr MboxMailList ItemStem' Group.mbox.
   CALL StatusWin_Close("Wait")
   'zDoMethod NetMail Unlock'
RETURN 0



/*
** Groups window events
*/


GroupsWin_Select:
GroupsWin_Open:
   'zSetAttr GroupList ItemStem' Group.
   'zGetAttr GroupList Value'
   CALL GroupList_Activate(RESULT)
   'zDoMethod GroupsWin Open'
RETURN 0


GroupList_Activate:
PARSE ARG stem.Value
   stem.Qualifiers = ""
GroupList_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      name  = stem.Value
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      'zSetAttr GroupName Value' name
      'zSetAttr GroupsWin Fields' Group.mbox.
      'zDoMethod NetMail Unlock'
   END
RETURN 0


GroupName_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      'zGetAttr GroupList ValueIndex'
      idx   = RESULT + 1
      name  = STRIP(stem.Value)
      uname = UPPER(name)
      IF SYMBOL('Group.ITEM.uname') = 'LIT' & name ~= '' & Group.idx ~= 'IN' & Group.idx ~= 'OUT' & Group.idx ~= 'TRASH' THEN DO
         oldname         = Group.idx
         Group.idx       = name
         uname           = UPPER(name)
         uoldname        = UPPER(oldname)
         Group.ITEM.uname = Group.ITEM.uoldname
         DROP Group.ITEM.uoldname
         CALL MessageChange(idx, 'Name')
         'zSetAttr GroupList ItemStem' Group.
         'zSetAttr MboxList  ItemStem' Group.LIST.
      END
      ELSE
         'zSetAttr GroupName Value' Group.idx
      'zDoMethod NetMail Unlock'
   END
RETURN 0


GroupAdd_Change:
   'zDoMethod NetMail Lock'
   CALL GroupCreate("groupname")
   'zDoMethod NetMail Unlock'
   'zDoMethod GroupName Activate'
RETURN 0


GroupCreate: PROCEDURE EXPOSE Group. Prefs.
PARSE ARG name

   uname = UPPER(name)
   IF SYMBOL('Group.ITEM.uname') = 'LIT' THEN DO
      mbox       = Group.NEXT
      Group.NEXT = Group.NEXT + 1

      idx                         = Group.0 + 1
      Group.0                     = idx
      Group.LIST.0                = idx
      Group.idx                   = name
      Group.ITEM.uname            = mbox
      Group.mbox.0                = 0
      Group.mbox.GroupPersistence = 0
      Group.mbox.GroupKeepUnread  = 'TRUE'

      CALL MessageChange(idx, 'VoidGroup')
      'zSetAttr  GroupList ItemStem' Group.
      'zSetAttr  GroupList Value' name
      'zSetAttr  MboxList  ItemStem' Group.LIST.
      dummy.GroupName = ''
      'zSetAttr GroupsWin Fields' Group.mbox.
      'zSetAttr GroupsWin Fields' dummy.
      DROP dummy.
      retval = 0
   END
   ELSE DO
      'zSetAttr GroupList ItemStem' Group.
      'zSetAttr GroupList Value' name
      'zGetAttr GroupList Value'
      CALL GroupList_Activate(RESULT)
      retval = 5
   END
RETURN retval


GroupRem_Change:
   IF Group.0 > 3 THEN DO
      'zDoMethod NetMail Lock'
      'zGetAttr GroupList ValueIndex'
      idx1   = RESULT + 1
      name1  = Group.idx1
      uname1 = UPPER(name1)
      mbox1  = Group.ITEM.uname1
      IF name1 ~= 'IN' & name1 ~= 'OUT' & name1 ~= 'TRASH' THEN DO
         CALL MessageChange(GroupIndex('TRASH'), 'AddGroup', idx1)

         name2  = 'TRASH'
         uname2 = UPPER(name2)
         mbox2  = Group.ITEM.uname2
         DO msg = 1 TO Group.mbox1.0
            msgt                  = Group.mbox2.0 + 1
            Group.mbox2.0         = msgt
            Group.mbox2.msgt      = Group.mbox1.msg
            Group.mbox2.msgt.MSG1 = Group.mbox1.msg.MSG1
            Group.mbox2.msgt.MSG2 = Group.mbox1.msg.MSG2
            Group.mbox2.msgt.FILE = Group.mbox1.msg.FILE
         END
         DROP Group.ITEM.uname1 Group.mbox1.

         'zGetAttr MboxList ValueIndex'
         idx2  = RESULT + 1
         name2 = Group.LIST.idx2
         name  = Group.idx2
         'zDoMethod GroupList Remove' name1
         'zGetAttr  GroupList ItemStem' Group.
         'zSetAttr  MboxList  ItemStem' Group.LIST.
         'zDoMethod MboxList  Remove "'Group.LIST.idx1'"'
         'zGetAttr  MboxList  ItemStem' Group.LIST.
         IF name1 = name | name = 'TRASH' THEN DO
            'zGetAttr MboxList ValueIndex'
            CALL MboxList_Activate(RESULT)
         END
         ELSE
            'zSetAttr MboxList Value "'name2'"'

         'zGetAttr GroupList Value'
         CALL GroupList_Activate(RESULT)
      END
      'zDoMethod NetMail Unlock'
   END
RETURN 0


GroupUp_Change:
   'zDoMethod NetMail Lock'
   'zGetAttr GroupList ValueIndex'
   idx1 = RESULT + 1
   idx2 = RESULT
   IF idx1 > 1 THEN DO
      name1           = Group.idx1
      Group.idx1      = Group.idx2
      Group.idx2      = name1
      name            = Group.LIST.idx1
      Group.LIST.idx1 = Group.LIST.idx2
      Group.LIST.idx2 = name
      'zSetAttr GroupList ItemStem' Group.
      'zSetAttr GroupList Value' name1
      'zGetAttr MboxList Value'
      name = RESULT
      'zSetAttr MboxList ItemStem' Group.LIST.
      'zSetAttr MboxList Value "'name'"'
   END
   'zDoMethod NetMail Unlock'
RETURN 0


GroupDown_Change:
   'zDoMethod NetMail Lock'
   'zGetAttr GroupList ValueIndex'
   idx1 = RESULT + 1
   idx2 = RESULT + 2
   IF idx1 < Group.0 THEN DO
      name1           = Group.idx1
      Group.idx1      = Group.idx2
      Group.idx2      = name1
      name            = Group.LIST.idx1
      Group.LIST.idx1 = Group.LIST.idx2
      Group.LIST.idx2 = name
      'zSetAttr GroupList ItemStem' Group.
      'zSetAttr GroupList Value' name1
      'zGetAttr MboxList Value'
      name = RESULT
      'zSetAttr MboxList ItemStem' Group.LIST.
      'zSetAttr MboxList Value "'name'"'
   END
   'zDoMethod NetMail Unlock'
RETURN 0


GroupPersistence_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr GroupList Value'
      uname = UPPER(RESULT)
      mbox = Group.ITEM.uname
      Group.mbox.GroupPersistence = stem.Value
   END
RETURN 0


GroupKeepUnread_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr GroupList Value'
      uname = UPPER(RESULT)
      mbox = Group.ITEM.uname
      Group.mbox.GroupKeepUnread = stem.Value
   END
RETURN 0



/*
** Archie mail window events
*/


ArchieWin_Select:
ArchieWin_Open:
   'zDoMethod ArchieWin Open'
RETURN 0


ArchieServerB_Change:
   dummy.0  = 28
   dummy.1  = 'archie.au               Australia'
   dummy.2  = 'archie.univie.ac.at     Austria'
   dummy.3  = 'archie.belnet.be        Belgium'
   dummy.4  = 'archie.bunyip.com       Canada'
   dummy.5  = 'archie.cs.mcgill.ca     Canada'
   dummy.6  = 'archie.uqam.ca          Canada'
   dummy.7  = 'archie.funet.fi         Finland'
   dummy.8  = 'archie.univ-rennes1.fr  France'
   dummy.9  = 'archie.th-darmstadt.de  Germany'
   dummy.10 = 'archie.ac.il            Israel'
   dummy.11 = 'archie.unipi.it         Italy'
   dummy.12 = 'archie.wide.ad.jp       Japan'
   dummy.13 = 'archie.hana.nm.kr       Korea'
   dummy.14 = 'archie.kornet.nm.kr     Korea'
   dummy.15 = 'archie.sogang.ac.kr     Korea'
   dummy.16 = 'archie.uninett.no       Norway'
   dummy.17 = 'archie.icm.edu.pl       Poland'
   dummy.18 = 'archie.rediris.es       Spain'
   dummy.19 = 'archie.luth.se          Sweden'
   dummy.20 = 'archie.switch.ch        Switzerland'
   dummy.21 = 'archie.ncu.edu.tw       Taiwan'
   dummy.22 = 'archie.doc.ic.ac.uk     UK'
   dummy.23 = 'archie.hensa.ac.uk      UK'
   dummy.24 = 'archie.sura.net         USA (MD)'
   dummy.25 = 'archie.unl.edu          USA (NE)'
   dummy.26 = 'archie.internic.net     USA (NJ)'
   dummy.27 = 'archie.rutgers.edu      USA (NJ)'
   dummy.28 = 'archie.ans.net          USA (NY)'

   'zSetAttr ServerList ItemStem' dummy.
   DROP dummy.
   'zGetAttr ArchieServer Value'
   IF RESULT ~= "" THEN 'zSetAttr ServerList Value' RESULT
                   ELSE 'zSetAttr ServerList ValueIndex -1'
   'zDoMethod ServerWin Open'
RETURN 0


ServerList_Change:
   IF stem.Qualifiers = "" THEN DO
      'zSetAttr ArchieServer Value' stem.Value
      'zDoMethod ServerWin Close'
   END
RETURN 0


ArchieQueue_Select:
   'zDoMethod NetMail Lock'
   'zGetAttr ArchieWin Fields' stem.
   IF stem.ArchieServer = '' | (stem.ArchieFind = '' & stem.ArchieWhatIs = '' & stem.ArchieGetServers = 'FALSE' & stem.ArchieGetHelp = 'FALSE') THEN DO
      'zDoMethod NetMail Unlock'
      RETURN 5
   END
   SELECT
      WHEN stem.ArchieSearch = 'exact'                    THEN stem.Search = 'exact'
      WHEN stem.ArchieSearch = 'substring case sensitive' THEN stem.Search = 'subcase'
      WHEN stem.ArchieSearch = 'substring'                THEN stem.Search = 'sub'
      WHEN stem.ArchieSearch = 'regular expression'       THEN stem.Search = 'regex'
      OTHERWISE stem.Search = 'exact'
   END
   SELECT
      WHEN stem.ArchieRetry = 'substring case sensitive' & stem.Search = 'exact' THEN stem.Search = stem.Search'_subcase'
      WHEN stem.ArchieRetry = 'substring' & (stem.Search = 'exact' | stem.Search = 'subcase') THEN stem.Search = stem.Search'_sub'
      OTHERWISE
   END
   SELECT
      WHEN stem.ArchieSortBy = 'filename'         THEN stem.SortBy = 'filename'
      WHEN stem.ArchieSortBy = 'reverse filename' THEN stem.SortBy = 'rfilename'
      WHEN stem.ArchieSortBy = 'hostname'         THEN stem.SortBy = 'hostname'
      WHEN stem.ArchieSortBy = 'reverse hostname' THEN stem.SortBy = 'rhostname'
      WHEN stem.ArchieSortBy = 'size'             THEN stem.SortBy = 'size'
      WHEN stem.ArchieSortBy = 'reverse size'     THEN stem.SortBy = 'rsize'
      WHEN stem.ArchieSortBy = 'time'             THEN stem.SortBy = 'time'
      WHEN stem.ArchieSortBy = 'reverse time'     THEN stem.SortBy = 'rtime'
   END
   mfile          = Group.NEXTFILE
   Group.NEXTFILE = Group.NEXTFILE + 1
   IF OPEN(fout, AddPart(Prefs.msgdir, mfile'.text'), 'Write') THEN DO
      IF stem.ArchieFind ~= '' THEN DO
         CALL WRITELN(fout, 'set maxhits' stem.ArchieMaxHits)
         CALL WRITELN(fout, 'set max_split_size' stem.ArchieSplitSize)
         CALL WRITELN(fout, 'set output_format' stem.ArchieOutput)
         CALL WRITELN(fout, 'set sortby' stem.SortBy)
         CALL WRITELN(fout, 'set search' stem.Search)
         CALL WRITELN(fout, 'find' stem.ArchieFind)
      END
      IF stem.ArchieWhatIs ~= ''        THEN CALL WRITELN(fout, 'whatis' stem.ArchieWhatIs)
      IF stem.ArchieGetServers = 'TRUE' THEN CALL WRITELN(fout, 'servers')
      IF stem.ArchieGetHelp = 'TRUE'    THEN CALL WRITELN(fout, 'help')
      CLOSE(fout)
   END
   headers.            = ''
   IF Prefs.Account.0 > 0 THEN headers.MailFrom = Prefs.Account.1
   PARSE VAR stem.ArchieServer headers.MailTo .
   IF ~ABBREV(headers.MailTo, 'archie@') THEN headers.MailTo = 'archie@'headers.MailTo
   headers.MailSubject = 'Archie request'

   CALL MailQueue(mfile)
   DROP stem. headers.

   'zGetAttr MboxList ValueIndex'
   idx2 = RESULT + 1
   IF idx2 = GroupIndex('OUT') THEN DO
      uname = 'OUT'
      mbox  = Group.ITEM.uname
      'zSetAttr MboxMailList ItemStem' Group.mbox.
   END
   'zSetAttr MboxList ItemStem' Group.LIST.
   'zDoMethod ArchieWin Close'
   'zDoMethod NetMail Unlock'
RETURN 0



/*
** Accounts window events
*/


Prefs1Win_Select:
Prefs1Win_Open:
   'zSetAttr PrefsAccountList ItemStem' Prefs.Account.
   'zSetAttr Prefs1Win Fields' Prefs.
   IF Prefs.Account.0 > 0 THEN DO
      'zGetAttr PrefsAccountList Value'
      CALL PrefsAccountList_Activate(RESULT)
   END
   'zDoMethod Prefs1Win Open'
RETURN 0


PrefsRealName_Change:
   Prefs.PrefsRealName = stem.Value
RETURN 0


PrefsAccountList_Activate:
PARSE ARG stem.Value
   stem.Qualifiers = ""
PrefsAccountList_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      name = stem.Value
      IF name ~= '' THEN DO
         uname = UPPER(name)
         acnt = Prefs.Account.ITEM.uname
         'zSetAttr PrefsAccount Value' name
         'zSetAttr Prefs1Win Fields' Prefs.Account.acnt.
      END
      ELSE DO
         dummy.PrefsAccount      = ""
         dummy.PrefsReplyTo      = ""
         dummy.PrefsOrganization = ""
         dummy.PrefsUsername     = ""
         dummy.PrefsPassword     = ""
         dummy.PrefsPOPHost      = ""
         dummy.PrefsSMTPHost     = ""
         'zSetAttr Prefs1Win Fields' dummy.
         DROP dummy.
      END
      'zDoMethod NetMail Unlock'
   END
RETURN 0


PrefsAccount_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      name = STRIP(stem.Value)
      IF Prefs.Account.0 > 0 THEN DO
         'zGetAttr PrefsAccountList ValueIndex'
         index = RESULT + 1
         uname = UPPER(name)
         IF SYMBOL('Prefs.Account.ITEM.uname') = 'LIT' & name ~= '' THEN DO
            oldname                  = Prefs.Account.index
            Prefs.Account.index      = name
            uoldname                 = UPPER(oldname)
            Prefs.Account.ITEM.uname = Prefs.Account.ITEM.uoldname
            DROP Prefs.Account.ITEM.uoldname
            'zSetAttr PrefsAccountList ItemStem' Prefs.Account.
            'zSetAttr PrefsAccountList Value' name

            acnt = Prefs.Account.ITEM.uname
            IF Prefs.Account.acnt.PrefsReplyTo = "" THEN DO
               'zSetAttr PrefsReplyTo Value "'name'"'
               Prefs.Account.acnt.PrefsReplyTo = name
            END
            PARSE VAR name username '@' host
            IF host ~= "" THEN DO
               IF Prefs.Account.acnt.PrefsUsername = "" THEN DO
                  'zSetAttr PrefsUsername Value "'username'"'
                  Prefs.Account.acnt.PrefsUsername = username
               END
               IF Prefs.Account.acnt.PrefsPOPHost = "" THEN DO
                  'zSetAttr PrefsPOPHost Value "'host'"'
                  Prefs.Account.acnt.PrefsPOPHost = host
               END
               IF Prefs.Account.acnt.PrefsSMTPHost = "" THEN DO
                  'zSetAttr PrefsSMTPHost Value "'host'"'
                  Prefs.Account.acnt.PrefsSMTPHost = host
               END
            END
         END
         ELSE
            'zSetAttr PrefsAccount Value' Prefs.Account.index
      END
      ELSE IF name ~= '' THEN DO
         acnt               = Prefs.Account.NEXT
         Prefs.Account.NEXT = acnt + 1

         'zDoMethod PrefsAccountList Add' name
         'zSetAttr  PrefsAccountList Value' name
         'zGetAttr  PrefsAccountList ItemStem' Prefs.Account.

         PARSE VAR name username '@' host
         IF host = "" THEN username = ""

         uname                                = UPPER(name)
         Prefs.Account.ITEM.uname             = acnt
         Prefs.Account.acnt.PrefsReplyTo      = name
         Prefs.Account.acnt.PrefsOrganization = ""
         Prefs.Account.acnt.PrefsUsername     = username
         Prefs.Account.acnt.PrefsPassword     = ""
         Prefs.Account.acnt.Password          = ""
         Prefs.Account.acnt.PrefsPOPHost      = host
         Prefs.Account.acnt.PrefsSMTPHost     = host
         'zSetAttr Prefs1Win Fields' Prefs.Account.acnt.
      END
      'zDoMethod NetMail Unlock'
      'zDoMethod PrefsReplyTo Activate'
   END
RETURN 0


PrefsAccountAdd_Change:
   'zDoMethod NetMail Lock'
   name  = "user@host.domain"
   uname = UPPER(name)
   IF SYMBOL('Prefs.Account.ITEM.uname') = 'LIT' THEN DO
      acnt               = Prefs.Account.NEXT
      Prefs.Account.NEXT = acnt + 1

      'zDoMethod PrefsAccountList Add' name
      'zSetAttr  PrefsAccountList Value' name
      'zGetAttr  PrefsAccountList ItemStem' Prefs.Account.

      Prefs.Account.ITEM.uname             = acnt
      Prefs.Account.acnt.PrefsReplyTo      = ""
      Prefs.Account.acnt.PrefsOrganization = ""
      Prefs.Account.acnt.PrefsUsername     = ""
      Prefs.Account.acnt.PrefsPassword     = ""
      Prefs.Account.acnt.Password          = ""
      Prefs.Account.acnt.PrefsPOPHost      = ""
      Prefs.Account.acnt.PrefsSMTPHost     = ""
      dummy.PrefsAccount                   = ""
      'zSetAttr Prefs1Win Fields' Prefs.Account.acnt.
      'zSetAttr Prefs1Win Fields' dummy.
      DROP dummy.
   END
   'zDoMethod NetMail Unlock'
   'zDoMethod PrefsAccount Activate'
RETURN 0


PrefsAccountRem_Change:
   IF Prefs.Account.0 > 0 THEN DO
      'zDoMethod NetMail Lock'
      'zGetAttr PrefsAccountList Value'
      name  = RESULT
      uname = UPPER(name)
      acnt  = Prefs.Account.ITEM.uname
      'zDoMethod PrefsAccountList Remove' name
      'zGetAttr  PrefsAccountList ItemStem' Prefs.Account.
      DROP Prefs.Account.ITEM.uname Prefs.Account.acnt.
      'zGetAttr PrefsAccountList Value'
      CALL PrefsAccountList_Activate(RESULT)
      'zDoMethod NetMail Unlock'
   END
RETURN 0


PrefsReplyTo_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr PrefsAccountList Value'
      uname = UPPER(RESULT)
      acnt  = Prefs.Account.ITEM.uname
      Prefs.Account.acnt.PrefsReplyTo = stem.Value
   END
RETURN 0


PrefsOrganization_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr PrefsAccountList Value'
      uname = UPPER(RESULT)
      acnt  = Prefs.Account.ITEM.uname
      Prefs.Account.acnt.PrefsOrganization = stem.Value
   END
RETURN 0


PrefsUsername_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr PrefsAccountList Value'
      uname = UPPER(RESULT)
      acnt  = Prefs.Account.ITEM.uname
      Prefs.Account.acnt.PrefsUsername = stem.Value
   END
RETURN 0


PrefsPassword_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr PrefsAccountList Value'
      uname = UPPER(RESULT)
      acnt  = Prefs.Account.ITEM.uname
      Prefs.Account.acnt.Password      = stem.Value
      Prefs.Account.acnt.PrefsPassword = COPIES('*', LENGTH(stem.Value))
      'zSetAttr PrefsPassword Value' Prefs.Account.acnt.PrefsPassword
   END
RETURN 0


PrefsPOPHost_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr PrefsAccountList Value'
      uname = UPPER(RESULT)
      acnt  = Prefs.Account.ITEM.uname
      Prefs.Account.acnt.PrefsPOPHost = stem.Value
   END
RETURN 0


PrefsSMTPHost_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr PrefsAccountList Value'
      uname = UPPER(RESULT)
      acnt  = Prefs.Account.ITEM.uname
      Prefs.Account.acnt.PrefsSMTPHost = stem.Value
   END
RETURN 0



/*
** Settings window events
*/


Prefs2Win_Select:
Prefs2Win_Open:
   'zSetAttr  PrefsSignatureList ItemStem' Prefs.Signature.
   'zSetAttr  PrefsSignatureList Value' Prefs.PrefsSignature
   'zSetAttr  Prefs2Win Fields' Prefs.
   'zDoMethod Prefs2Win Open'
RETURN 0


PrefsSignatureList_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      dummy.PrefsSignature = stem.Value
      'zSetAttr Prefs2Win Fields' dummy.
      DROP dummy.
      IF stem.Value ~= "" THEN DO
         Prefs.PrefsSignature = stem.Value
         signame = AddPart(Prefs.sigdir, stem.Value)

         IF SYMBOL('click.cTIME') = 'VAR' THEN
            IF TIME('s') < click.cTIME + 2 & signame = click.cSIG THEN DO
               cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsEditorCmd'.editor')"'"
               INTERPRET cmd '"SAVE","'Prefs.EditorPort'"'
               INTERPRET cmd '"EDIT","'signame'","'Prefs.EditorPort'"'
               Prefs.EditorPort = RESULT
            END
         click.cTIME = TIME('s')
         click.cSIG  = signame
      END
      'zDoMethod NetMail Unlock'
   END
RETURN 0


PrefsSignature_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      name  = STRIP(stem.Value)
      uname = UPPER(name)
      IF Prefs.Signature.0 > 0 THEN DO
         'zGetAttr PrefsSignatureList ValueIndex'
         index = RESULT + 1
         IF SYMBOL('Prefs.Signature.ITEM.uname') = 'LIT' & name ~= '' THEN DO
            oldname  = Prefs.Signature.index
            uoldname = UPPER(oldname)
            DROP Prefs.Signature.ITEM.uoldname
            oldname = AddPart(Prefs.sigdir, Prefs.Signature.index)
            newname = AddPart(Prefs.sigdir, name)
            Rename(oldname, newname)
            Rename(oldname'.info', newname'.info')
            Prefs.Signature.index      = name
            Prefs.Signature.ITEM.uname = 1
            Prefs.PrefsSignature       = name
            'zSetAttr PrefsSignatureList ItemStem' Prefs.Signature.
         END
         ELSE
            'zSetAttr PrefsSignature Value' Prefs.Signature.index
      END
      ELSE IF name ~= '' THEN DO
         'zDoMethod PrefsSignatureList Add' name
         'zSetAttr  PrefsSignatureList Value' name
         'zGetAttr  PrefsSignatureList ItemStem' Prefs.Signature.
         Prefs.Signature.ITEM.uname = 1
         Prefs.PrefsSignature       = name
         ADDRESS COMMAND 'Echo >"'AddPart(Prefs.sigdir, name)'" ""'
      END
      'zDoMethod NetMail Unlock'
   END
RETURN 0


PrefsSignatureAdd_Change:
   'zDoMethod NetMail Lock'
   name  = "signname"
   uname = UPPER(name)
   IF SYMBOL('Prefs.Signature.ITEM.uname') = 'LIT' THEN DO
      'zDoMethod PrefsSignatureList Add' name
      'zSetAttr  PrefsSignatureList Value' name
      'zGetAttr  PrefsSignatureList ItemStem' Prefs.Signature.
      Prefs.Signature.ITEM.uname = 1
      ADDRESS COMMAND 'Echo >"'AddPart(Prefs.sigdir, name)'" ""'

      Prefs.PrefsSignature = ''
      dummy.PrefsSignature = ''
      'zSetAttr Prefs2Win Fields' dummy.
      DROP dummy.
   END
   'zDoMethod NetMail Unlock'
   'zDoMethod PrefsSignature Activate'
RETURN 0


PrefsSignatureRem_Change:
   IF Prefs.Signature.0 > 0 THEN DO
      'zDoMethod NetMail Lock'
      'zGetAttr  PrefsSignatureList Value'
      name  = RESULT
      uname = UPPER(name)
      'zDoMethod PrefsSignatureList Remove' name
      DROP Prefs.Signature.ITEM.uname
      signame = AddPart(Prefs.sigdir, name)
      DeleteFile(signame)
      DeleteFile(signame'.info')
      'zGetAttr  PrefsSignatureList ItemStem' Prefs.Signature.
      'zGetAttr  PrefsSignatureList Value'
      Prefs.PrefsSignature = RESULT
      dummy.PrefsSignature = RESULT
      'zSetAttr  Prefs2Win Fields' dummy.
      DROP dummy.
      'zDoMethod NetMail Unlock'
   END
RETURN 0


PrefsQuoteHeader_Change:
   Prefs.PrefsQuoteHeader = stem.Value
RETURN 0


PrefsQuotePrefix_Change:
   Prefs.PrefsQuotePrefix = stem.Value
RETURN 0


PrefsLeaveMail_Change:
   Prefs.PrefsLeaveMail = stem.Value
RETURN 0


PrefsGroupsOnDemand_Change:
   Prefs.PrefsGroupsOnDemand = stem.Value
RETURN 0


PrefsCaptureFilter_Change:
   Prefs.PrefsCaptureFilter = stem.Value
RETURN 0


PrefsPurge_Change:
   Prefs.PrefsPurge = stem.Value
RETURN 0


PrefsEmptyTrash_Change:
   Prefs.PrefsEmptyTrash = stem.Value
RETURN 0



/*
** Drivers window events
*/


Prefs3Win_Select:
Prefs3Win_Open:
   'zSetAttr Prefs3Win Fields' Prefs.
   'zDoMethod Prefs3Win Open'
RETURN 0


PrefsQuotedCmd_Change:
   Prefs.PrefsQuotedCmd = WORD(TRANSLATE(Prefs.QuotedItems, ' ', '|'), stem.ValueIndex + 1)
RETURN 0


PrefsBase64Cmd_Change:
   Prefs.PrefsBase64Cmd = WORD(TRANSLATE(Prefs.Base64Items, ' ', '|'), stem.ValueIndex + 1)
RETURN 0


PrefsUUCmd_Change:
   Prefs.PrefsUUCmd = WORD(TRANSLATE(Prefs.UUItems, ' ', '|'), stem.ValueIndex + 1)
RETURN 0


PrefsEditorCmd_Change:
   Prefs.PrefsEditorCmd = WORD(TRANSLATE(Prefs.EditorItems, ' ', '|'), stem.ValueIndex + 1)
RETURN 0


PrefsReaderCmd_Change:
   Prefs.PrefsReaderCmd = WORD(TRANSLATE(Prefs.ReaderItems, ' ', '|'), stem.ValueIndex + 1)
RETURN 0


PrefsSendCmd_Change:
   Prefs.PrefsSendCmd = WORD(TRANSLATE(Prefs.SendItems, ' ', '|'), stem.ValueIndex + 1)
RETURN 0


PrefsReceiveCmd_Change:
   Prefs.PrefsReceiveCmd = WORD(TRANSLATE(Prefs.ReceiveItems, ' ', '|'), stem.ValueIndex + 1)
RETURN 0



/*
** GUI Prefs window events
*/


Prefs4Win_Select:
Prefs4Win_Open:
   'zSetAttr  Prefs4Win Fields' Prefs.
   'zDoMethod Prefs4Win Open'
RETURN 0


PrefsVisibleGroups_Change:
   Prefs.VisibleGroups = stem.Value
RETURN 0


PrefsVisibleMessages_Change:
   Prefs.VisibleMessages = stem.Value
RETURN 0


PrefsSubjectColumns_Change:
   Prefs.SubjectColumns = stem.Value
RETURN 0


PrefsFromColumns_Change:
   Prefs.FromColumns = stem.Value
RETURN 0


PrefsEditorWin_Change:
   Prefs.PrefsEditorWin = stem.Value
RETURN 0




/*
** Nicknames window events
*/


NicknamesWin_Select:
NicknamesWin_Open:
   'zSetAttr NickList ItemStem' Nickname.
   'zGetAttr NickList ItemStem' Nickname.
   IF Nickname.0 > 0 THEN DO
      'zGetAttr NickList Value'
      CALL NickList_Activate(RESULT)
   END
   'zDoMethod NicknamesWin Open'
RETURN 0


NickList_Activate:
PARSE ARG stem.Value
   stem.Qualifiers = ""
NickList_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      name  = stem.Value
      uname = UPPER(name)
      IF name ~= '' THEN DO
         nick = Nickname.ITEM.uname
         'zSetAttr NickName Value' name
         'zSetAttr NickAddrList ItemStem' Nickname.nick.Address.
         'zSetAttr NickNotesList ItemStem' Nickname.nick.Note.
         dummy.NickAddress      = ""
         dummy.NickNote         = ""
         dummy.NickInRecipients = Nickname.nick.InRecipients
         'zSetAttr NickNamesWin Fields' dummy.
         DROP dummy.
      END
      ELSE DO
         dummy.NickName         = ""
         dummy.NickAddress      = ""
         dummy.NickNote         = ""
         dummy.NickInRecipients = "TRUE"
         'zSetAttr NickNamesWin Fields' dummy.
         'zSetAttr NickAddrList Items' ""
         'zSetAttr NickNotesList Items' ""
         DROP dummy.
      END
      'zDoMethod NetMail Unlock'
   END
RETURN 0


NickName_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      name  = TRANSLATE(STRIP(stem.Value), ' ', ',')
      uname = UPPER(name)
      IF Nickname.0 > 0 THEN DO
         'zGetAttr NickList ValueIndex'
         index = RESULT + 1
         IF SYMBOL('Nickname.ITEM.uname') = 'LIT' & name ~= '' THEN DO
            oldname             = Nickname.index
            Nickname.index      = name
            uoldname            = UPPER(oldname)
            Nickname.ITEM.uname = Nickname.ITEM.uoldname
            DROP Nickname.ITEM.uoldname
            'zSetAttr NickList ItemStem' Nickname.
            'zGetAttr NickList ItemStem' Nickname.
            'zSetAttr NickList Value' name
         END
         ELSE
            'zSetAttr NickName Value' Nickname.index
      END
      ELSE IF name ~= '' THEN DO
         nick          = Nickname.NEXT
         Nickname.NEXT = nick + 1

         'zDoMethod NickList Add' name
         'zSetAttr  NickList Value' name
         'zGetAttr  NickList ItemStem' Nickname.

         Nickname.ITEM.uname        = nick
         Nickname.nick.Address.0    = 0
         Nickname.nick.Note.0       = 0
         Nickname.nick.InRecipients = "TRUE"

         dummy.NickAddress      = ''
         dummy.NickNote         = ''
         dummy.NickInRecipients = Nickname.nick.InRecipients
         'zSetAttr NickAddrList  Items' ""
         'zSetAttr NickNotesList Items' ""
         'zSetAttr NickNamesWin  Fields' dummy.
         DROP dummy.
      END
      'zDoMethod NetMail Unlock'
      'zDoMethod NickAddress Activate'
   END
RETURN 0


NickNameCreate: PROCEDURE EXPOSE Nickname. newnickname.
   name   = newnickname.NickName
   uname  = UPPER(name)
   IF SYMBOL('Nickname.ITEM.uname') = 'LIT' THEN DO
      nick          = Nickname.NEXT
      Nickname.NEXT = nick + 1

      'zSetAttr  NickList ItemStem' Nickname.
      'zDoMethod NickList Add' name
      'zSetAttr  NickList Value' name
      'zGetAttr  NickList ItemStem' Nickname.

      Nickname.ITEM.uname        = nick

      index = 1
      DO WHILE SYMBOL('newnickname.Address.index') = 'VAR'
         Nickname.nick.Address.index = newnickname.Address.index
         index = index + 1
      END
      Nickname.nick.Address.0    = index - 1

      index = 1
      DO WHILE SYMBOL('newnickname.Note.index') = 'VAR'
         Nickname.nick.Note.index = newnickname.Note.index
         index = index + 1
      END
      Nickname.nick.Note.0       = index - 1

      IF SYMBOL('newnickname.InRecipients') = 'VAR' THEN Nickname.nick.InRecipients = newnickname.InRecipients
                                                    ELSE Nickname.nick.InRecipients = "TRUE"
      retval = 0
   END
   ELSE DO
      'zSetAttr NickList ItemStem' Nickname.
      'zSetAttr NickList Value' name
      retval = 5
   END
   'zGetAttr NickList Value'
   CALL NickList_Activate(RESULT)
RETURN retval


NickNameAdd_Change:
   'zDoMethod NetMail Lock'
   name  = "name"
   uname = UPPER(name)
   IF SYMBOL('Nickname.ITEM.uname') = 'LIT' THEN DO
      nick          = Nickname.NEXT
      Nickname.NEXT = nick + 1

      'zDoMethod NickList Add' name
      'zSetAttr  NickList Value' name
      'zGetAttr  NickList ItemStem' Nickname.

      Nickname.ITEM.uname        = nick
      Nickname.nick.Address.0    = 0
      Nickname.nick.Note.0       = 0
      Nickname.nick.InRecipients = "TRUE"

      dummy.NickName         = ''
      dummy.NickAddress      = ''
      dummy.NickNote         = ''
      dummy.NickInRecipients = Nickname.nick.InRecipients
      'zSetAttr NickAddrList  Items' ""
      'zSetAttr NickNotesList Items' ""
      'zSetAttr NickNamesWin  Fields' dummy.
      DROP dummy.
   END
   'zDoMethod NetMail Unlock'
   'zDoMethod NickName Activate'
RETURN 0


NickNameRem_Change:
   IF Nickname.0 > 0 THEN DO
      'zDoMethod NetMail Lock'
      'zGetAttr NickList Value'
      name  = RESULT
      uname = UPPER(name)
      nick  = Nickname.ITEM.uname
      'zDoMethod NickList Remove' name
      'zGetAttr  NickList ItemStem' Nickname.
      DROP Nickname.ITEM.uname Nickname.nick.
      'zGetAttr NickList Value'
      CALL NickList_Activate(RESULT)
      'zDoMethod NetMail Unlock'
   END
RETURN 0


NickCapture_Select:
   CALL StatusWin_Open("Clear")
   CALL MboxCapture('People', 'NicknameOnly')
   CALL StatusWin_Close("Wait")
RETURN 0


NickAddrList_Change:
   IF stem.Qualifiers = "" THEN DO
      dummy.NickAddress = stem.Value
      'zSetAttr NickNamesWin Fields' dummy.
      DROP dummy.
   END
RETURN 0


NickAddress_Change:
   name = STRIP(stem.Value)
   IF stem.Qualifiers = "" & name ~= "" THEN DO
      'zDoMethod NetMail Lock'
      'zGetAttr NickList Value'
      uname = UPPER(RESULT)
      nick  = Nickname.ITEM.uname
      IF Nickname.nick.Address.0 > 0 THEN DO
         'zGetAttr NickAddrList ValueIndex'
         index = RESULT + 1
         Nickname.nick.Address.index = name
         'zSetAttr NickAddrList ItemStem' Nickname.nick.Address.
      END
      ELSE DO
        'zDoMethod NickAddrList Add' name
        'zSetAttr  NickAddrList Value' name
        'zGetAttr  NickAddrList ItemStem' Nickname.nick.Address.
      END
      'zDoMethod NetMail Unlock'
   END
RETURN 0


NickAddrAdd_Change:
   'zDoMethod NetMail Lock'
   'zGetAttr NickList Value'
   uname = UPPER(RESULT)
   nick  = Nickname.ITEM.uname
   name  = "address or group"
   'zDoMethod NickAddrList Add' name
   'zSetAttr  NickAddrList Value' name
   'zGetAttr  NickAddrList ItemStem' Nickname.nick.Address.
   dummy.NickAddress = ''
   'zSetAttr  NickNamesWin Fields' dummy.
   DROP dummy.
   'zDoMethod NetMail Unlock'
   'zDoMethod NickAddress Activate'
RETURN 0


NickAddrRem_Change:
   'zDoMethod NetMail Lock'
   'zGetAttr NickList Value'
   uname = UPPER(RESULT)
   nick  = Nickname.ITEM.uname
   'zGetAttr  NickAddrList Value'
   'zDoMethod NickAddrList Remove' RESULT
   'zGetAttr  NickAddrList ItemStem' Nickname.nick.Address.
   'zGetAttr  NickAddrList Value'
   dummy.NickAddress = RESULT
   'zSetAttr  NickNamesWin  Fields' dummy.
   DROP dummy.
   'zDoMethod NetMail Unlock'
RETURN 0


NickNotesList_Change:
   IF stem.Qualifiers = "" THEN DO
      dummy.NickNote = stem.Value
      'zSetAttr NickNamesWin Fields' dummy.
      DROP dummy.
   END
RETURN 0


NickNote_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      'zGetAttr NickList Value'
      uname = UPPER(RESULT)
      nick  = Nickname.ITEM.uname
      name  = stem.Value
      IF Nickname.nick.Note.0 > 0 THEN DO
         'zGetAttr NickNotesList ValueIndex'
         index = RESULT + 1
         Nickname.nick.Note.index = name
         'zSetAttr NickNotesList ItemStem' Nickname.nick.Note.
      END
      ELSE DO
         'zDoMethod NickNotesList Add' name
         'zSetAttr  NickNotesList Value' name
         'zGetAttr  NickNotesList ItemStem' Nickname.nick.Note.
      END
      'zDoMethod NetMail Unlock'
   END
RETURN 0


NickNoteAdd_Change:
   'zDoMethod NetMail Lock'
   'zGetAttr NickList Value'
   uname = UPPER(RESULT)
   nick  = Nickname.ITEM.uname
   name  = "note"
   'zDoMethod NickNotesList Add' name
   'zSetAttr  NickNotesList Value' name
   'zGetAttr  NickNotesList ItemStem' Nickname.nick.Note.
   dummy.NickNote = ''
   'zSetAttr  NickNamesWin Fields' dummy.
   DROP dummy.
   'zDoMethod NetMail Unlock'
   'zDoMethod NickNote Activate'
RETURN 0


NickNoteRem_Change:
   'zDoMethod NetMail Lock'
   'zGetAttr NickList Value'
   uname = UPPER(RESULT)
   nick  = Nickname.ITEM.uname
   'zGetAttr  NickNotesList Value'
   'zDoMethod NickNotesList Remove' RESULT
   'zGetAttr  NickNotesList ItemStem' Nickname.nick.Note.
   'zGetAttr  NickNotesList Value'
   dummy.NickNote = RESULT
   'zSetAttr  NickNamesWin  Fields' dummy.
   DROP dummy.
   'zDoMethod NetMail Unlock'
RETURN 0


NickInRecipients_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr NickList Value'
      uname = UPPER(RESULT)
      nick = Nickname.ITEM.uname
      Nickname.nick.InRecipients = stem.Value
   END
RETURN 0



/*
** Filters window events
*/


FiltersWin_Select:
FiltersWin_Open:
   'zSetAttr FilterList ItemStem' Filter.
   IF Filter.0 > 0 THEN DO
      'zGetAttr FilterList Value'
      CALL FilterList_Activate(RESULT)
   END
   'zDoMethod FiltersWin Open'
RETURN 0


FilterList_Activate:
PARSE ARG stem.Value
   stem.Qualifiers = ""
FilterList_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      name  = stem.Value
      uname = UPPER(name)
      IF name ~= '' THEN DO
         fltr = Filter.ITEM.uname
         'zSetAttr FilterName Value' name
         'zSetAttr FiltersWin Fields' Filter.fltr.
      END
      ELSE DO
         dummy.FilterName     = ""
         dummy.FilterIncoming = "FALSE"
         dummy.FilterOutgoing = "FALSE"
         dummy.FilterManual   = "FALSE"
         dummy.FilterHeader1  = ""
         dummy.FilterType1    = "contains"
         dummy.FilterMatch1   = ""
         dummy.FilterandOr    = "and"
         dummy.FilterHeader2  = ""
         dummy.FilterType2    = "contains"
         dummy.FilterMatch2   = ""
         dummy.FilterTransfer = ""
         dummy.FilterMacro    = ""
         'zSetAttr FiltersWin Fields' dummy.
         DROP dummy.
      END
      'zDoMethod NetMail Unlock'
   END
RETURN 0


FilterName_Change:
   IF stem.Qualifiers = "" THEN DO
      'zDoMethod NetMail Lock'
      name  = STRIP(stem.Value)
      uname = UPPER(name)
      IF Filter.0 > 0 THEN DO
         'zGetAttr FilterList ValueIndex'
         index = RESULT + 1
         IF SYMBOL('Filter.ITEM.uname') = 'LIT' & name ~= '' THEN DO
            oldname           = Filter.index
            Filter.index      = name
            uoldname          = UPPER(oldname)
            Filter.ITEM.uname = Filter.ITEM.uoldname
            DROP Filter.ITEM.uoldname
            'zSetAttr FilterList ItemStem' Filter.
         END
         ELSE
            'zSetAttr FilterName Value' Filter.index
      END
      ELSE IF name ~= '' THEN DO
         fltr        = Filter.NEXT
         Filter.NEXT = Filter.NEXT + 1

         'zDoMethod FilterList Add' name
         'zSetAttr  FilterList Value' name
         'zGetAttr  FilterList ItemStem' Filter.

         Filter.ITEM.uname          = fltr
         Filter.fltr.FilterIncoming = 'FALSE'
         Filter.fltr.FilterOutgoing = 'FALSE'
         Filter.fltr.FilterManual   = 'TRUE'
         Filter.fltr.FilterHeader1  = ""
         Filter.fltr.FilterType1    = 'contains'
         Filter.fltr.FilterMatch1   = ""
         Filter.fltr.FilterAndOr    = "and"
         Filter.fltr.FilterHeader2  = ""
         Filter.fltr.FilterType2    = 'contains'
         Filter.fltr.FilterMatch2   = ""
         Filter.fltr.FilterTransfer = ""
         Filter.fltr.FilterMacro    = ""

         'zSetAttr FiltersWin Fields' Filter.fltr.
      END
      'zDoMethod NetMail Unlock'
      'zDoMethod FilterHeader1 Activate'
   END
RETURN 0


FilterCreate: PROCEDURE EXPOSE Filter. newfilter.
   uname = UPPER(newfilter.FilterName)
   IF SYMBOL('Filter.ITEM.uname') = 'LIT' THEN DO
      fltr        = Filter.NEXT
      Filter.NEXT = Filter.NEXT + 1

      'zSetAttr  FilterList ItemStem' Filter.
      'zDoMethod FilterList Add' newfilter.FilterName
      'zSetAttr  FilterList Value' newfilter.FilterName
      'zGetAttr  FilterList ItemStem' Filter.

      Filter.ITEM.uname = fltr

      IF SYMBOL('newfilter.FilterIncoming') = 'VAR' THEN Filter.fltr.FilterIncoming = newfilter.FilterIncoming
                                                    ELSE Filter.fltr.FilterIncoming = "FALSE"
      IF SYMBOL('newfilter.FilterOutgoing') = 'VAR' THEN Filter.fltr.FilterOutgoing = newfilter.FilterOutgoing
                                                    ELSE Filter.fltr.FilterOutgoing = "FALSE"
      IF SYMBOL('newfilter.FilterManual') = 'VAR'   THEN Filter.fltr.FilterManual   = newfilter.FilterManual
                                                    ELSE Filter.fltr.FilterManual   = "FALSE"
      IF SYMBOL('newfilter.FilterHeader1') = 'VAR'  THEN Filter.fltr.FilterHeader1  = newfilter.FilterHeader1
                                                    ELSE Filter.fltr.FilterHeader1  = ""
      IF SYMBOL('newfilter.FilterType1') = 'VAR'    THEN Filter.fltr.FilterType1    = newfilter.FilterType1
                                                    ELSE Filter.fltr.FilterType1    = "contains"
      IF SYMBOL('newfilter.FilterMatch1') = 'VAR'   THEN Filter.fltr.FilterMatch1   = newfilter.FilterMatch1
                                                    ELSE Filter.fltr.FilterMatch1   = ""
      IF SYMBOL('newfilter.FilterAndOr') = 'VAR'    THEN Filter.fltr.FilterAndOr    = newfilter.FilterAndOr
                                                    ELSE Filter.fltr.FilterAndOr    = "and"
      IF SYMBOL('newfilter.FilterHeader2') = 'VAR'  THEN Filter.fltr.FilterHeader2  = newfilter.FilterHeader2
                                                    ELSE Filter.fltr.FilterHeader2  = ""
      IF SYMBOL('newfilter.FilterType2') = 'VAR'    THEN Filter.fltr.FilterType2    = newfilter.FilterType2
                                                    ELSE Filter.fltr.FilterType2    = "contains"
      IF SYMBOL('newfilter.FilterMatch2') = 'VAR'   THEN Filter.fltr.FilterMatch2   = newfilter.FilterMatch2
                                                    ELSE Filter.fltr.FilterMatch2   = ""
      IF SYMBOL('newfilter.FilterTransfer') = 'VAR' THEN Filter.fltr.FilterTransfer = newfilter.FilterTransfer
                                                    ELSE Filter.fltr.FilterTransfer = ""
      IF SYMBOL('newfilter.FilterMacro') = 'VAR'    THEN Filter.fltr.FilterMacro    = newfilter.FilterMacro
                                                    ELSE Filter.fltr.FilterMacro    = ""
      retval = 0
   END
   ELSE DO
      'zSetAttr FilterList ItemStem' Filter.
      'zSetAttr FilterList Value' newfilter.FilterName
      retval = 5
   END
   'zGetAttr FilterList Value'
   CALL FilterList_Activate(RESULT)
RETURN retval


FilterAdd_Change:
   'zDoMethod NetMail Lock'
   name  = "filter"
   uname = UPPER(name)
   IF SYMBOL('Filter.ITEM.uname') = 'LIT' THEN DO
      fltr        = Filter.NEXT
      Filter.NEXT = Filter.NEXT + 1

      'zDoMethod FilterList Add' name
      'zSetAttr  FilterList Value' name
      'zGetAttr  FilterList ItemStem' Filter.

      Filter.ITEM.uname          = fltr
      Filter.fltr.FilterIncoming = 'FALSE'
      Filter.fltr.FilterOutgoing = 'FALSE'
      Filter.fltr.FilterManual   = 'TRUE'
      Filter.fltr.FilterHeader1  = ""
      Filter.fltr.FilterType1    = 'contains'
      Filter.fltr.FilterMatch1   = ""
      Filter.fltr.FilterAndOr    = "and"
      Filter.fltr.FilterHeader2  = ""
      Filter.fltr.FilterType2    = 'contains'
      Filter.fltr.FilterMatch2   = ""
      Filter.fltr.FilterTransfer = ""
      Filter.fltr.FilterMacro    = ""
      dummy.FilterName           = ""
      'zSetAttr FiltersWin Fields' Filter.fltr.
      'zSetAttr FiltersWin Fields' dummy.
      DROP dummy.
   END
   'zDoMethod NetMail Unlock'
   'zDoMethod FilterName Activate'
RETURN 0


FilterRem_Change:
   IF Filter.0 > 0 THEN DO
      'zDoMethod NetMail Lock'
      'zGetAttr FilterList Value'
      name  = RESULT
      uname = UPPER(name)
      fltr  = Filter.ITEM.uname
      'zDoMethod FilterList Remove' name
      'zGetAttr  FilterList ItemStem' Filter.
      DROP Filter.ITEM.uname Filter.fltr.
      'zGetAttr FilterList Value'
      CALL FilterList_Activate(RESULT)
      'zDoMethod NetMail Unlock'
   END
RETURN 0


FilterUp_Change:
   'zDoMethod NetMail Lock'
   'zGetAttr FilterList ValueIndex'
   idx1 = RESULT + 1
   idx2 = RESULT
   IF idx1 > 1 THEN DO
      name = Filter.idx1
      Filter.idx1 = Filter.idx2
      Filter.idx2 = name
      'zSetAttr FilterList ItemStem' Filter.
      'zSetAttr FilterList Value' name
   END
   'zDoMethod NetMail Unlock'
RETURN 0


FilterDown_Change:
   'zDoMethod NetMail Lock'
   'zGetAttr FilterList ValueIndex'
   idx1 = RESULT + 1
   idx2 = RESULT + 2
   IF idx1 < Filter.0 THEN DO
      name = Filter.idx1
      Filter.idx1 = Filter.idx2
      Filter.idx2 = name
      'zSetAttr FilterList ItemStem' Filter.
      'zSetAttr FilterList Value' name
   END
   'zDoMethod NetMail Unlock'
RETURN 0


FilterApply_Select:
   'zDoMethod NetMail Lock'
   IF stem.Qualifiers = "" THEN DO
      CALL StatusWin_Open("Clear")
      'zGetAttr GroupList Value'
      name1 = RESULT
      'zGetAttr MboxList ValueIndex'
      idx   = RESULT + 1
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      'zGetAttr FilterList Value'
      fname = RESULT
      IF fname ~= '' THEN DO
         StatusWin_NewEvent('Applying "'fname'" filter...')
         CALL FilterApply(fname)

         'zSetAttr GroupList    Value' name1
         'zSetAttr MboxList     ItemStem' Group.LIST.
         'zSetAttr MboxMailList ItemStem' Group.mbox.
         CALL GroupList_Activate(name1)

         StatusWin_UpdateEvent('Applying "'fname'" filter. Done.')
      END
      ELSE
         StatusWin_NewEvent('Select a filter first.')
      CALL StatusWin_Close("Wait")
   END
   'zDoMethod NetMail Unlock'
RETURN 0


FilterApplyAll_Select:
   'zDoMethod NetMail Lock'
   IF stem.Qualifiers = "" THEN DO
      CALL StatusWin_Open("Clear")
      'zGetAttr GroupList Value'
      name1 = RESULT
      'zGetAttr MboxList ValueIndex'
      idx   = RESULT + 1
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname

      StatusWin_NewEvent('Applying filters...')
      CALL FilterApplyAll

      'zSetAttr GroupList    Value' name1
      'zSetAttr MboxList     ItemStem' Group.LIST.
      'zSetAttr MboxMailList ItemStem' Group.mbox.
      CALL GroupList_Activate(name1)

      StatusWin_UpdateEvent('Applying filters. Done.')
      CALL StatusWin_Close("Wait")
   END
   'zDoMethod NetMail Unlock'
RETURN 0


FilterIncoming_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr  = Filter.ITEM.uname
      Filter.fltr.FilterIncoming = stem.Value
   END
RETURN 0


FilterOutgoing_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr  = Filter.ITEM.uname
      Filter.fltr.FilterOutgoing = stem.Value
   END
RETURN 0


FilterManual_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr  = Filter.ITEM.uname
      Filter.fltr.FilterManual = stem.Value
   END
RETURN 0


FilterHeader1_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr  = Filter.ITEM.uname
      Filter.fltr.FilterHeader1 = stem.Value
   END
RETURN 0


FilterHeader1B_Change:
   'zGetAttr FilterHeader1 Value'
   IF RESULT ~= "" THEN 'zSetAttr HeaderList Value' RESULT
                   ELSE 'zSetAttr HeaderList ValueIndex -1'
   HeaderWin.ITEM = 1
   'zDoMethod HeaderWin Open'
RETURN 0


HeaderList_Change:
   IF stem.Qualifiers = "" THEN DO
      'zSetAttr FilterHeader'HeaderWin.ITEM 'Value' stem.Value
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr  = Filter.ITEM.uname
      INTERPRET 'Filter.fltr.FilterHeader'HeaderWin.ITEM '= "'stem.Value'"'
      'zDoMethod HeaderWin Close'
      INTERPRET "'zDoMethod FilterMatch"HeaderWin.ITEM "Activate'"
   END
RETURN 0


FilterType1_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr = Filter.ITEM.uname
      Filter.fltr.FilterType1 = stem.Value
   END
RETURN 0


FilterMatch1_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr = Filter.ITEM.uname
      Filter.fltr.FilterMatch1 = stem.Value
   END
RETURN 0


FilterAndOr_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr = Filter.ITEM.uname
      Filter.fltr.FilterAndOr = stem.Value
   END
RETURN 0


FilterHeader2_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr = Filter.ITEM.uname
      Filter.fltr.FilterHeader2 = stem.Value
   END
RETURN 0


FilterHeader2B_Change:
   'zGetAttr FilterHeader2 Value'
   IF RESULT ~= "" THEN 'zSetAttr HeaderList Value' RESULT
                   ELSE 'zSetAttr HeaderList ValueIndex -1'
   HeaderWin.ITEM = 2
   'zDoMethod HeaderWin Open'
RETURN 0


FilterType2_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr = Filter.ITEM.uname
      Filter.fltr.FilterType2 = stem.Value
   END
RETURN 0


FilterMatch2_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr = Filter.ITEM.uname
      Filter.fltr.FilterMatch2 = stem.Value
   END
RETURN 0


FilterTransfer_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr  = Filter.ITEM.uname
      Filter.fltr.FilterTransfer = stem.Value
   END
RETURN 0


FilterTransferB_Change:
   'zSetAttr TransferToList ItemStem' Group.
   'zGetAttr FilterTransfer Value'
   IF RESULT ~= "" THEN 'zSetAttr TransferToList Value' RESULT
                   ELSE 'zSetAttr TransferToList ValueIndex -1'
   'zDoMethod TransferToWin Open'
RETURN 0


TransferToList_Change:
   IF stem.Qualifiers = "" THEN DO
      'zSetAttr FilterTransfer Value' stem.Value
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr  = Filter.ITEM.uname
      Filter.fltr.FilterTransfer = stem.Value
      'zDoMethod TransferToWin Close'
   END
RETURN 0


FilterMacro_Change:
   IF stem.Qualifiers = "" THEN DO
      'zGetAttr FilterList Value'
      uname = UPPER(RESULT)
      fltr  = Filter.ITEM.uname
      Filter.fltr.FilterMacro = stem.Value
   END
RETURN 0


FilterMacroB_Change:
   'zGetAttr FilterMacro Value'
   'zRequest File Label "Select an arexx macro" Value "'AddPart(Prefs.macdir, RESULT)'"'
   name = RESULT
   'zSetAttr FilterMacro Value' name
   'zGetAttr FilterList Value'
   uname = UPPER(RESULT)
   fltr  = Filter.ITEM.uname
   Filter.fltr.FilterMacro = name
RETURN 0



/*
** Mailwin window events
*/


MailWin_Open:
PARSE ARG cmd parms
   IF SYMBOL('MailWin.MAILFILE') = 'VAR' THEN RETURN 0

   IF Prefs.Account.0 > 0 THEN dummy.MailFrom = Prefs.Account.1
                          ELSE dummy.MailFrom = ''
   dummy.MailSubject     = ''
   dummy.MailTo          = ''
   dummy.MailCc          = ''
   dummy.MailBcc         = ''
   dummy.MailAttachments = ''
   IF UPPER(cmd) = 'EDIT' THEN dummy.MailSignature = ''
                          ELSE dummy.MailSignature = Prefs.PrefsSignature
   'zSetAttr MailWin Fields' dummy.
   DROP dummy.

   SELECT
      WHEN UPPER(cmd) = 'NEW' THEN DO
         PARSE VAR parms '"'gidx'"' '"'name'"' '"'dest'"' '"'subject'"'

         MailWin.MAILIDX  = gidx
         MailWin.MAILFILE = Group.NEXTFILE
         Group.NEXTFILE   = Group.NEXTFILE + 1

         IF name ~= ''    THEN ADDRESS COMMAND 'Copy >NIL: QUIET "'name'" "'AddPart(Prefs.msgdir, MailWin.MAILFILE'.text')'"'
         IF dest ~= ''    THEN 'zSetAttr MailTo Value "'dest'"'
         IF subject ~= '' THEN 'zSetAttr MailSubject Value "'subject'"'
      END
      WHEN UPPER(cmd) = 'FORWARD' THEN DO
         PARSE VAR parms '"'gidx'"' '"'name'"'

         MailWin.MAILIDX  = gidx
         MailWin.MAILFILE = Group.NEXTFILE
         Group.NEXTFILE   = Group.NEXTFILE + 1
         text = AddPart(Prefs.msgdir, MailWin.MAILFILE'.text')

         IF OPEN(fout, text, 'Write') THEN DO
            IF OPEN(fin, AddPart(Prefs.msgdir, name), 'Read') THEN DO
               DROP mail.
               DO UNTIL EOF(fin)~=0 | line = ''
                  line = READLN(fin)
                  IF line ~= '' & ~ABBREV(line, ' ') & ~ABBREV(line, '09'x) THEN DO
                     PARSE VAR line fieldname ':' fieldbody
                     fieldname = TRIM(UPPER(fieldname))
                     mail.fieldname = STRIP(fieldbody)
                  END
               END
               mail.FILE = AddPart(Prefs.msgdir, name)

               header = 'FROM'
               PARSE VAR mail.header '<' from '>'
               IF from = "" THEN PARSE VAR mail.header from '('
               from = STRIP(from)

               header = 'SUBJECT'
               IF SYMBOL('mail.header') = 'VAR' THEN subject = mail.header
                                                ELSE subject = ''
               'zSetAttr MailSubject Value' subject

               dummy.MailSignature = ''
               'zSetAttr MailWin Fields' dummy.
               DROP dummy.

               DO WHILE EOF(fin)=0
                  CALL WRITELN(fout, READLN(fin))
               END
               CLOSE(fin)
            END
            CLOSE(fout)

            header = 'CONTENT-TRANSFER-ENCODING'
            IF UPPER(mail.header) = 'QUOTED-PRINTABLE' THEN DO
               cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsQuotedCmd'.encoder')"'"
               INTERPRET cmd '"DECODE","'text'","'text'2","Quoted-Printable"'
               IF EXISTS(text'2') THEN DO
                  DeleteFile(text)
                  Rename(text'2', text)
               END
            END
         END
      END
      WHEN ABBREV(UPPER(cmd), 'REPLY') THEN DO
         PARSE VAR parms '"'gidx'"' '"'name'"'


         MailWin.MAILIDX  = gidx
         MailWin.MAILFILE = Group.NEXTFILE
         Group.NEXTFILE   = Group.NEXTFILE + 1
         text = AddPart(Prefs.msgdir, MailWin.MAILFILE'.text')

         IF OPEN(fout, text, 'Write') THEN DO
            IF OPEN(fin, AddPart(Prefs.msgdir, name), 'Read') THEN DO
               DROP mail.
               DO UNTIL EOF(fin)~=0 | line = ''
                  line = READLN(fin)
                  IF line ~= '' & ~ABBREV(line, ' ') & ~ABBREV(line, '09'x) THEN DO
                     PARSE VAR line fieldname ':' fieldbody
                     fieldname = TRIM(UPPER(fieldname))
                     mail.fieldname = STRIP(fieldbody)
                  END
               END
               mail.FILE = AddPart(Prefs.msgdir, name)

               header = 'DATE'
               IF SYMBOL('mail.header') = 'VAR' THEN DO
                  IF INDEX(mail.header, ',') > 0 THEN PARSE VAR mail.header ',' dd mm yyyy time .
                                                 ELSE PARSE VAR mail.header dd mm yyyy time .
                  IF DATATYPE(dd, 'N') THEN date = RIGHT('0'dd, 2) || mm || RIGHT(yyyy, 2)
                                       ELSE date = RIGHT('0'mm, 2) || dd || RIGHT(yyyy, 2)
               END
               ELSE DO
                  date = ''
                  time = ''
               END

               header = 'FROM'
               PARSE VAR mail.header fname '<' faddr '>'
               IF faddr = "" THEN PARSE VAR mail.header faddr '(' fname ')'
               from = STRIP(fname)
               IF LEFT(from, 1) = '"' & RIGHT(from, 1) = '"' THEN PARSE VAR from '"' from '"'
               IF from = "" THEN from = STRIP(faddr)

               header = 'SUBJECT'
               IF SYMBOL('mail.header') = 'VAR' THEN subject = mail.header
                                                ELSE subject = ''
               IF ~ABBREV(UPPER(subject), 'RE:') THEN subject = 'Re:' subject
               'zSetAttr MailSubject Value' subject

               header = 'SENDER'
               IF SYMBOL('mail.header') = 'LIT' | UPPER(cmd) ~= 'REPLYGROUP' THEN DO
                  header = 'REPLY-TO'
                  IF SYMBOL('mail.header') = 'LIT' THEN header = 'FROM'
               END

               ugname = UPPER(Group.gidx)
               upname = UPPER(from)
               IF UPPER(cmd) = 'REPLYGROUP' & SYMBOL('Nickname.ITEM.ugname') = 'VAR' THEN
                  'zSetAttr MailTo Value' Group.gidx
               ELSE IF UPPER(cmd) = 'REPLY' THEN DO
                  upidx = Nickname.ITEM.upname
                  IF SYMBOL('Nickname.ITEM.upname') = 'VAR' & INDEX(mail.header, Nickname.upidx.Address.1) > 0 THEN
                     'zSetAttr MailTo Value' from
                  ELSE IF INDEX(mail.header, from) + INDEX(mail.header, '(') + INDEX(mail.header, '<') = 0 THEN
                     'zSetAttr MailTo Value' from '<'STRIP(mail.header)'>'
                  ELSE
                     'zSetAttr MailTo Value' mail.header
               END
               ELSE
                  'zSetAttr MailTo Value' mail.header

               header = Prefs.PrefsQuoteHeader
               IF INDEX(header, '$DATE') > 0 THEN DO
                  PARSE VAR header head '$DATE' tail
                  header = head||date||tail
               END
               IF INDEX(header, '$TIME') > 0 THEN DO
                  PARSE VAR header head '$TIME' tail
                  header = head||time||tail
               END
               IF INDEX(header, '$MSGID') > 0 THEN DO
                  PARSE VAR header head '$MSGID' tail
                  msgid  = 'MESSAGE-ID'
                  header = head||mail.msgid||tail
               END
               IF INDEX(header, '$USER') > 0 THEN DO
                  PARSE VAR header head '$USER' tail
                  header = head||from||tail
               END

               CALL WRITELN(fout, header)
               DO WHILE EOF(fin)=0
                  CALL WRITELN(fout, Prefs.PrefsQuotePrefix||READLN(fin))
               END

               CLOSE(fin)
            END
            CLOSE(fout)

            header = 'CONTENT-TRANSFER-ENCODING'
            IF UPPER(mail.header) = 'QUOTED-PRINTABLE' THEN DO
               cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsQuotedCmd'.encoder')"'"
               INTERPRET cmd '"DECODE","'text'","'text'2","Quoted-Printable"'
               IF EXISTS(text'2') THEN DO
                  DeleteFile(text)
                  Rename(text'2', text)
               END
            END
         END
      END
      WHEN UPPER(cmd) = 'EDIT' THEN DO
         PARSE VAR parms idx mbox msg .

         MailWin.MAILIDX  = idx
         MailWin.MAILMSG  = msg
         MailWin.MAILFILE = Group.mbox.msg.FILE
         IF OPEN(fin, AddPart(Prefs.msgdir, MailWin.MAILFILE'.head'), 'Read') THEN DO
            Examine(AddPart(Prefs.msgdir, MailWin.MAILFILE'.head'), stem.)
            IF stem.SIZE < 65536 THEN DO
               INTERPRET READCH(fin, stem.SIZE)
            END
            ELSE DO WHILE EOF(fin)=0
               INTERPRET READLN(fin)
            END
            CLOSE(fin)

            'zSetAttr MailFrom        Value' from
            'zSetAttr MailSubject     Value' subject
            'zSetAttr MailTo          Value' to
            'zSetAttr MailCc          Value' cc
            'zSetAttr MailBcc         Value' bcc
            'zSetAttr MailAttachments Value' attachments
            'zSetAttr MailEncoder     Value' encoder
            'zSetAttr MailSignature   Value' signature
            DROP signature
         END
      END
      OTHERWISE RETURN 0
   END
   'zDoMethod MailWin Open'
   IF Prefs.PrefsEditorWin = 'TRUE' THEN CALL MailEdit_Select
RETURN 0


MailFromB_Change:
   'zGetAttr MailFrom Value'
   name = TRIM(RESULT)
   IF Prefs.Account.0 > 0 THEN DO
      DO index = 1 TO Prefs.Account.0 WHILE Prefs.Account.index ~= name; END
      index = index + 1
      IF index <= Prefs.Account.0 THEN name = Prefs.Account.index
                                  ELSE name = Prefs.Account.1
   END
   ELSE name = ''

   dummy.MailFrom = name
   'zSetAttr MailWin Fields' dummy.
   DROP dummy.
RETURN 0


ToCcBccWin_Open:
   'zSetAttr  ToCcBccList ValueIndex -1'
   'zDoMethod ToCcBccWin Open'
RETURN 0


ToCcBccList_Change:
   IF stem.Qualifiers = "" THEN INTERPRET 'CALL' ToCcBcc.FUNCTION
RETURN 0


MailToB_Change:
   'zSetAttr ToCcBccList ItemStem' Nickname.
   DO index = 1 TO Nickname.0
      IF Nickname.index.InRecipients = 'FALSE' THEN
         'zDoMethod ToCcBccList Remove' Nickname.index
   END
   ToCcBcc.FUNCTION = 'MailToB_Do'
   CALL ToCcBccWin_Open
RETURN 0


MailToB_Do:
   'zGetAttr MailTo Value'
   string = TRIM(RESULT)
   'zGetAttr ToCcBccList Value'
   IF string = '' THEN string = RESULT
   ELSE IF RIGHT(string, 1) = ',' THEN string = string' 'RESULT
                                  ELSE string = string', 'RESULT
  'zSetAttr MailTo Value "'string'"'
RETURN 0


MailCcB_Change:
   'zSetAttr ToCcBccList ItemStem' Nickname.
   DO index = 1 TO Nickname.0
      IF Nickname.index.InRecipients = 'FALSE' THEN
         'zDoMethod ToCcBccList Remove' Nickname.index
   END
   ToCcBcc.FUNCTION = 'MailCcB_Do'
   CALL ToCcBccWin_Open
RETURN 0


MailCcB_Do:
   'zGetAttr MailCc Value'
   string = TRIM(RESULT)
   'zGetAttr ToCcBccList Value'
   IF string = '' THEN string = RESULT
   ELSE IF RIGHT(string, 1) = ',' THEN string = string' 'RESULT
                                  ELSE string = string', 'RESULT
   'zSetAttr MailCc Value "'string'"'
RETURN 0


MailBccB_Change:
   'zSetAttr ToCcBccList ItemStem' Nickname.
   DO index = 1 TO Nickname.0
      IF Nickname.index.InRecipients = 'FALSE' THEN
         'zDoMethod ToCcBccList Remove' Nickname.index
   END
   ToCcBcc.FUNCTION = 'MailBccB_Do'
   CALL ToCcBccWin_Open
RETURN 0


MailBccB_Do:
   'zGetAttr MailBcc Value'
   string = TRIM(RESULT)
   'zGetAttr ToCcBccList Value'
   IF string = '' THEN string = RESULT
   ELSE IF RIGHT(string, 1) = ',' THEN string = string' 'RESULT
                                  ELSE string = string', 'RESULT
   'zSetAttr MailBcc Value "'string'"'
RETURN 0


MailAttachmentsB_Change:
   'zGetAttr MailAttachments Value'
   string = TRIM(RESULT)
   IF RIGHT(string, 1) ~= ';' & LENGTH(string) > 0 THEN string = string';'
   'zRequest File Label "Select a file" Value ""'
   name = RESULT
   'zSetAttr MailAttachments Value' string name
RETURN 0


MailSignatureB_Change:
   'zGetAttr MailSignature Value'
   name  = TRIM(RESULT)
   uname = UPPER(name)
   IF SYMBOL('Prefs.Signature.ITEM.uname') = 'VAR' THEN DO
      DO index = 1 TO Prefs.Signature.0 WHILE Prefs.Signature.index ~= name; END
      index = index + 1
      IF index <= Prefs.Signature.0 THEN name = Prefs.Signature.index
                                    ELSE name = ''
   END
   ELSE IF Prefs.Signature.0 > 0 THEN name = Prefs.Signature.1
                                 ELSE name = ''

   dummy.MailSignature = name
   'zSetAttr MailWin Fields' dummy.
   DROP dummy.
RETURN 0


MailEdit_Select:
   text = AddPart(Prefs.msgdir, MailWin.MAILFILE'.text')
   cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsEditorCmd'.editor')"'"
   INTERPRET cmd '"SAVE","'Prefs.EditorPort'"'
   INTERPRET cmd '"EDIT","'text'","'Prefs.EditorPort'"'
   Prefs.EditorPort = RESULT
RETURN 0


MailQueue_Select:
   'zDoMethod NetMail Lock'

   'zGetAttr MailWin Fields' headers.
   IF headers.MailFrom ~= '' & headers.MailTo ~= '' THEN DO
      cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsEditorCmd'.editor')"'"
      INTERPRET cmd '"SAVE","'Prefs.EditorPort'"'
      INTERPRET cmd '"CLOSE","'Prefs.EditorPort'"'
      DROP Prefs.EditorPort

      IF SYMBOL('MailWin.MAILFILE') = 'LIT' THEN MailWin.MAILFILE = ''
      IF SYMBOL('MailWin.MAILIDX')  = 'LIT' THEN MailWin.MAILIDX  = GroupIndex('OUT')
      IF SYMBOL('MailWin.MAILMSG')  = 'LIT' THEN MailWin.MAILMSG  = ''
      CALL MailQueue(MailWin.MAILFILE, MailWin.MAILIDX, MailWin.MAILMSG)

      'zGetAttr MboxList ValueIndex'
      idx = RESULT + 1
      IF idx = MailWin.MAILIDX THEN DO
         name  = Group.idx
         uname = UPPER(name)
         mbox  = Group.ITEM.uname
         'zSetAttr MboxMailList ItemStem' Group.mbox.
      END
      'zSetAttr MboxList ItemStem' Group.LIST.

      DROP signature
      DROP MailWin.
      'zDoMethod MailWin Close'
   END
   'zDoMethod NetMail Unlock'
RETURN 0


MailQueue: PROCEDURE EXPOSE Group. Prefs. Nickname. headers. NETMAILVER
PARSE ARG mfile, idx, msg

   from        = headers.MailFrom
   subject     = headers.MailSubject
   to          = headers.MailTo
   cc          = headers.MailCc
   bcc         = headers.MailBcc
   attachments = headers.MailAttachments
   encoder     = headers.MailEncoder
   signature   = headers.MailSignature

   IF from = '' | to = '' THEN DO
      DROP signature
      RETURN 5
   END

   IF idx = '' THEN idx = GroupIndex('OUT')
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   IF msg = '' THEN DO
      msg          = Group.mbox.0 + 1
      Group.mbox.0 = msg
   END
   mail = AddPart(Prefs.msgdir, mfile)
   head = mail'.head'
   text = mail'.text'
   body = mail'.body'

   IF ~EXISTS(head) THEN CALL MessageChange(idx, 'AddUnread')
   Group.mbox.msg      = 'Q' LEFT(subject, Prefs.SubjectColumns) LEFT(Prefs.PrefsRealName, Prefs.FromColumns)
   Group.mbox.msg.FILE = mfile
   Group.mbox.msg.MSG1 = 'Q' subject
   Group.mbox.msg.MSG2 = '       ' Prefs.PrefsRealName

   IF OPEN(fout, head, 'Write') THEN DO
      CALL WRITELN(fout, 'from        = 'FixQuotes(from))
      CALL WRITELN(fout, 'subject     = 'FixQuotes(subject))
      CALL WRITELN(fout, 'to          = 'FixQuotes(to))
      CALL WRITELN(fout, 'cc          = 'FixQuotes(cc))
      CALL WRITELN(fout, 'bcc         = 'FixQuotes(bcc))
      CALL WRITELN(fout, 'attachments = "'attachments'"')
      CALL WRITELN(fout, 'encoder     = "'encoder'"')
      CALL WRITELN(fout, 'signature   = "'signature'"')
      CLOSE(fout)
   END

   ufrom = UPPER(from)
   acnt  = Prefs.Account.ITEM.ufrom
   IF SYMBOL('Prefs.Account.acnt.PrefsReplyTo') = 'VAR' THEN reply  = Prefs.Account.acnt.PrefsReplyTo
                                                        ELSE reply  = ''
   IF SYMBOL('Prefs.Account.acnt.PrefsOrganization') = 'VAR' THEN organ  = Prefs.Account.acnt.PrefsOrganization
                                                             ELSE organ  = ''
   IF SYMBOL('Prefs.Account.ITEM.ufrom') = 'LIT' & Prefs.Account.0 > 0 THEN sender = Prefs.Account.1
                                                                       ELSE sender = ''
   IF Prefs.PrefsRealName ~= '' THEN DO
      IF SYMBOL('Prefs.Account.ITEM.ufrom') = 'VAR' THEN
         from = from '('Prefs.PrefsRealName')'
      IF reply ~= '' THEN reply = Prefs.PrefsRealName '<'reply'>'
      IF sender ~= '' THEN sender = sender '('Prefs.PrefsRealName')'
   END
   IF signature ~= "" THEN sigfile = AddPart(Prefs.sigdir, signature)
                      ELSE sigfile = ""

   ADDRESS COMMAND
   IF EXISTS(text) THEN 'Type >"'body'" "'text'"'
                   ELSE 'Echo >>"'body'" ""'
   IF sigfile ~= "" & EXISTS(sigfile) THEN DO
      'Echo >>"'body'" ""'
      'Type >>"'body'" "'sigfile'"'
   END
   ADDRESS
   Examine(body, stem1.)
   cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsQuotedCmd'.encoder')"'"
   INTERPRET cmd '"ENCODE","'body'","'body'2","Quoted-Printable"'
   IF EXISTS(body'2') THEN DO
      DeleteFile(body)
      Rename(body'2', body)
   END
   Examine(body, stem2.)
   IF stem1.SIZE = stem2.SIZE THEN charset = 'us-ascii'
                              ELSE charset = 'iso-8859-1'

   IF OPEN(fout, mail, 'Write') THEN DO
      IF sender ~= "" THEN CALL WRITELN(fout, 'Sender:' sender)
      CALL WRITELN(fout, 'From:' from)
      IF subject ~= "" THEN CALL WRITELN(fout, 'Subject:' subject)
      NicknameExpand(to)
      CALL WRITELN(fout, 'To:' nickmembers.1)
      DO nick = 2 TO nickmembers.0
         CALL WRITELN(fout, ' 'nickmembers.nick)
      END
      IF cc ~= "" THEN DO
         NicknameExpand(cc)
         CALL WRITELN(fout, 'Cc:' nickmembers.1)
         DO nick = 2 TO nickmembers.0
            CALL WRITELN(fout, ' 'nickmembers.nick)
         END
      END
      IF bcc ~= "" THEN DO
         NicknameExpand(bcc)
         CALL WRITELN(fout, 'Bcc:' nickmembers.1)
         DO nick = 2 TO nickmembers.0
            CALL WRITELN(fout, ' 'nickmembers.nick)
         END
      END
      IF reply ~= "" THEN CALL WRITELN(fout, 'Reply-To:' reply)
      IF organ ~= "" THEN CALL WRITELN(fout, 'Organization:' organ)
      CALL WRITELN(fout, 'X-Mailer:' NETMAILVER)
      CALL WRITELN(fout, 'MIME-Version: 1.0')

      IF attachments ~= "" THEN DO
         CALL WRITELN(fout, 'Content-Type: multipart/mixed; boundary="gc0p4Jq0M2Yt08jU534c0p"')
         CALL WRITELN(fout, '')
         CALL WRITELN(fout, '--gc0p4Jq0M2Yt08jU534c0p')
      END
      CALL WRITELN(fout, 'Content-Type: text/plain; charset='charset)
      IF charset ~= 'us-ascii' THEN
         CALL WRITELN(fout, 'Content-Transfer-Encoding: quoted-printable')
      CALL WRITELN(fout, '')

      CLOSE(fout)

      ADDRESS COMMAND 'Type >>"'mail'" "'body'"'
      ADDRESS COMMAND 'Echo >>"'mail'" ""'
      DeleteFile(body)

      IF attachments ~= "" THEN DO
         DO WHILE attachments ~= ""
            PARSE VAR attachments attachment ';' attachments
            attachment = STRIP(attachment)
            filename = FilePart(attachment)

            ADDRESS COMMAND 'Echo >>"'mail'" --gc0p4Jq0M2Yt08jU534c0p'
            SELECT
               WHEN encoder = 'UUencode' THEN DO
                  cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsUUCmd'.encoder')"'"
                  INTERPRET cmd '"ENCODE","'attachment'","'body'","UUencode"'

                  IF EXISTS(body) THEN DO
                     OPEN(fout, mail, 'Append')
                     CALL WRITELN(fout, 'Content-Type: application/octed-stream; name="'filename'"')
                     CALL WRITELN(fout, 'Content-Transfer-Encoding: X-uuencode')
                     CALL WRITELN(fout, '')
                     CLOSE(fout)
                     ADDRESS COMMAND 'Type >>"'mail'" "'body'"'
                     DeleteFile(body)
                  END
               END
               WHEN encoder = 'MIME' THEN DO
                  cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsBase64Cmd'.encoder')"'"
                  INTERPRET cmd '"ENCODE","'attachment'","'body'","Base64"'

                  IF EXISTS(body) THEN DO
                     OPEN(fout, mail, 'Append')
                     CALL WRITELN(fout, 'Content-Type: application/octed-stream; name="'filename'"')
                     CALL WRITELN(fout, 'Content-Transfer-Encoding: base64')
                     CALL WRITELN(fout, '')
                     CLOSE(fout)
                     ADDRESS COMMAND 'Type >>"'mail'" "'body'"'
                     DeleteFile(body)
                  END
               END
               OTHERWISE
            END
            ADDRESS COMMAND 'Echo >>"'mail'" ""'
         END
         ADDRESS COMMAND 'Echo >>"'mail'" --gc0p4Jq0M2Yt08jU534c0p--'
      END
   END
RETURN 0


MailWin_Close:
MailDelay_Select:
   'zDoMethod NetMail Lock'
   idx   = MailWin.MAILIDX
   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   head  = AddPart(Prefs.msgdir, MailWin.MAILFILE'.head')
   IF SYMBOL('MailWin.MAILMSG') = 'LIT' THEN DO
      msg             = Group.mbox.0 + 1
      Group.mbox.0    = msg
      MailWin.MAILMSG = msg
   END
   msg = MailWin.MAILMSG

   'zGetAttr MailFrom Value'
   from = RESULT
   'zGetAttr MailSubject Value'
   subject = RESULT
   'zGetAttr MailTo Value'
   to = RESULT
   'zGetAttr MailCc Value'
   cc = RESULT
   'zGetAttr MailBcc Value'
   bcc = RESULT
   'zGetAttr MailAttachments Value'
   attachments = RESULT
   'zGetAttr MailEncoder Value'
   encoder = RESULT
   'zGetAttr MailSignature Value'
   signature = RESULT

   IF ~EXISTS(head) THEN CALL MessageChange(MailWin.MAILIDX, 'AddUnread')
   Group.mbox.msg      = 'D' LEFT(subject, Prefs.SubjectColumns) LEFT(Prefs.PrefsRealName, Prefs.FromColumns)
   Group.mbox.msg.FILE = MailWin.MAILFILE
   Group.mbox.msg.MSG1 = 'D' subject
   Group.mbox.msg.MSG2 = '       ' Prefs.PrefsRealName

   IF OPEN(fout, head, 'Write') THEN DO
      CALL WRITELN(fout, 'from        = 'FixQuotes(from))
      CALL WRITELN(fout, 'subject     = 'FixQuotes(subject))
      CALL WRITELN(fout, 'to          = 'FixQuotes(to))
      CALL WRITELN(fout, 'cc          = 'FixQuotes(cc))
      CALL WRITELN(fout, 'bcc         = 'FixQuotes(bcc))
      CALL WRITELN(fout, 'attachments = "'attachments'"')
      CALL WRITELN(fout, 'encoder     = "'encoder'"')
      CALL WRITELN(fout, 'signature   = "'signature'"')
      CLOSE(fout)
   END

   cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsEditorCmd'.editor')"'"
   INTERPRET cmd '"SAVE","'Prefs.EditorPort'"'
   INTERPRET cmd '"CLOSE","'Prefs.EditorPort'"'
   DROP Prefs.EditorPort

   'zGetAttr MboxList ValueIndex'
   idx  = RESULT + 1
   IF idx = MailWin.MAILIDX THEN DO
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      'zSetAttr MboxMailList ItemStem' Group.mbox.
   END
   'zSetAttr MboxList ItemStem' Group.LIST.

   DROP MailWin. signature
   'zDoMethod MailWin Close'
   'zDoMethod NetMail Unlock'
RETURN 0


MailDelete_Select:
   IF SYMBOL('MailWin.MAILMSG') = 'VAR' THEN DO
      idx  = MailWin.MAILIDX
      name  = Group.idx
      uname = UPPER(name)
      CALL MessageRemove(idx, Group.ITEM.uname, MailWin.MAILMSG)
      'zGetAttr MboxList ValueIndex'
      idx  = RESULT + 1
      IF idx = MailWin.MAILIDX | idx = GroupIndex('TRASH') THEN DO
         name  = Group.idx
         uname = UPPER(name)
         mbox  = Group.ITEM.uname
         'zSetAttr MboxMailList ItemStem' Group.mbox.
         IF Group.mbox.0 < msg THEN 'zSetAttr MboxMailList ValueIndex' Group.mbox.0 - 1
      END
      'zSetAttr MboxList ItemStem' Group.LIST.
   END
   ELSE IF SYMBOL('MailWin.MAILFILE') = 'VAR' THEN DO
      DeleteFile(AddPart(Prefs.msgdir, MailWin.MAILFILE'.text'))
      DeleteFile(AddPart(Prefs.msgdir, MailWin.MAILFILE'.text.info'))
   END
   cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsEditorCmd'.editor')"'"
   INTERPRET cmd '"CLOSE","'Prefs.EditorPort'"'
   DROP MailWin. Prefs.EditorPort
   'zDoMethod MailWin Close'
RETURN 0


PersistLoad:
   IF SYMBOL('Prefs.VERSION') = 'LIT' THEN DO
      user = GetVar('NetMail/User')
      IF user = 0 THEN user = ""

      Prefs.Language = GetVar('Language')
      Prefs.prgdir   = PRAGMA('DIRECTORY')
      IF AssignLate('NetMail', Prefs.prgdir) THEN Prefs.prgdir = 'NetMail:'

      Prefs.usrdir        = AddPart(Prefs.prgdir, user)
      Prefs.drvdir        = AddPart(Prefs.prgdir, "Drivers")
      Prefs.cchdir        = AddPart(Prefs.usrdir, "Cache")
      Prefs.msgdir        = AddPart(Prefs.usrdir, "Messages")
      Prefs.sigdir        = AddPart(Prefs.usrdir, "Signatures")
      Prefs.attdir        = AddPart(Prefs.usrdir, "Attachments")
      Prefs.macdir        = AddPart(Prefs.usrdir, "Macros")
      Prefs.envdir        = AddPart(Prefs.usrdir, "Env")
      Prefs.groupsfile    = AddPart(Prefs.usrdir, ".Groups")
      Prefs.filtersfile   = AddPart(Prefs.usrdir, ".Filters")
      Prefs.nicknamesfile = AddPart(Prefs.usrdir, ".Nicknames")
      Prefs.prefsfile     = AddPart(Prefs.usrdir, ".Prefs")
      Prefs.helpfile      = AddPart(Prefs.prgdir, "Help/"Prefs.Language"/NetMail.guide")

      IF ~EXISTS(Prefs.drvdir)   THEN CreateDir(Prefs.drvdir)
      IF ~EXISTS(Prefs.cchdir)   THEN CreateDir(Prefs.cchdir)
      IF ~EXISTS(Prefs.msgdir)   THEN CreateDir(Prefs.msgdir)
      IF ~EXISTS(Prefs.sigdir)   THEN CreateDir(Prefs.sigdir)
      IF ~EXISTS(Prefs.attdir)   THEN CreateDir(Prefs.attdir)
      IF ~EXISTS(Prefs.macdir)   THEN CreateDir(Prefs.macdir)
      IF ~EXISTS(Prefs.envdir)   THEN CreateDir(Prefs.envdir)
      IF ~EXISTS(Prefs.helpfile) THEN Prefs.helpfile = AddPart(Prefs.prgdir, "Help/English/NetMail.guide")

      IF PRAGMA('DIRECTORY') ~= GetVar('NetMail/NetMailDir') THEN DO
         SetVar('NetMail/NetMailDir', PRAGMA('DIRECTORY'))
         IF ~EXISTS('ENVARC:NetMail') THEN CreateDir('ENVARC:NetMail')
         ADDRESS COMMAND 'Copy QUIET ENV:NetMail/NetMailDir ENVARC:NetMail/NetMailDir'
         ADDRESS COMMAND 'Copy ALL QUIET "'Prefs.envdir'" ENV:NetMail'
      END
      IF ~EXISTS('ENV:NetMail/MessagesWin') THEN ADDRESS COMMAND 'Copy ALL QUIET "'Prefs.envdir'" ENV:NetMail'

      update = Examine(Prefs.prefsfile, stem.)
      IF OPEN(fin, Prefs.prefsfile, 'Read') THEN DO
         IF stem.SIZE < 65536 THEN DO
            INTERPRET READCH(fin, stem.SIZE)
         END
         ELSE DO WHILE EOF(fin)=0
            INTERPRET READLN(fin)
         END
         CLOSE(fin)

         PARSE VAR Prefs.VERSION ver'.'rev
         SELECT
            WHEN ver > PREFSVER THEN RETURN 5
            WHEN ver < PREFSVER | rev < PREFSREV THEN IF ConvertPrefs(ver, rev) ~= 0 THEN RETURN 5
            OTHERWISE
         END

         DO index = 1 TO Prefs.Account.0
            Prefs.Account.index.PrefsPassword = COPIES('*', LENGTH(Prefs.Account.index.Password))
            name                     = Prefs.Account.index
            uname                    = UPPER(name)
            Prefs.Account.ITEM.uname = index
         END
      END
      ELSE DO
         Prefs.VERSION             = '"'PREFSVER'.'PREFSREV'"'

         cmd = "Ed"
         ADDRESS COMMAND 'Which >NIL: "TTX"'
         IF RC = 0 THEN cmd = "TurboText"
         ELSE DO
            ADDRESS COMMAND 'Which >NIL: "CED"'
            IF RC = 0 THEN cmd = "CED"
            ELSE DO
               ADDRESS COMMAND 'Which >NIL: "Edge"'
               IF RC = 0 THEN cmd = "Edge"
               ELSE DO
                  ADDRESS COMMAND 'Which >NIL: "SE"'
                  IF RC = 0 THEN cmd = "SE"
               END
            END
         END
         Prefs.PrefsEditorCmd      = cmd

         cmd = "Ed"
         ADDRESS COMMAND 'Which >NIL: "TTX"'
         IF RC = 0 THEN cmd = "TurboText"
         ELSE DO
            ADDRESS COMMAND 'Which >NIL: "MultiView"'
            IF RC = 0 THEN cmd = "MultiView"
            ELSE DO
               ADDRESS COMMAND 'Which >NIL: "SE"'
               IF RC = 0 THEN cmd = "SE"
            END
         END
         Prefs.PrefsReaderCmd      = cmd

         cmd = "PutMail"
         ADDRESS COMMAND 'Which >NIL: "PutMail"'
         IF RC ~= 0 THEN DO
            ADDRESS COMMAND 'Which >NIL: "SMTPpost"'
            IF RC = 0 THEN cmd = "SMTPpost"
         END
         Prefs.PrefsSendCmd        = cmd

         cmd = "GetMail"
         ADDRESS COMMAND 'Which >NIL: "GetMail"'
         IF RC ~= 0 THEN DO
            ADDRESS COMMAND 'Which >NIL: "AmiPOP"'
            IF RC = 0 THEN cmd = "AmiPOP"
         END
         Prefs.PrefsReceiveCmd     = cmd

         Prefs.PrefsQuotedCmd      = "MMencode"

         cmd = "MMencode"
         ADDRESS COMMAND 'Which >NIL: "MMencode"'
         IF RC ~= 0 THEN DO
            ADDRESS COMMAND 'Which >NIL: "Base64"'
            IF RC = 0 THEN cmd = "Base64"
         END
         Prefs.PrefsBase64Cmd      = cmd

         cmd = "UUxT"
         ADDRESS COMMAND 'Which >NIL: "UUxT"'
         IF RC ~= 0 THEN DO
            ADDRESS COMMAND 'Which >NIL: "uuIn"'
            IF RC = 0 THEN DO
               ADDRESS COMMAND 'Which >NIL: "uuOut"'
               IF RC = 0 THEN cmd = "uuInOut"
            END
         END
         Prefs.PrefsUUCmd          = cmd

         Prefs.VisibleGroups       = 5
         Prefs.VisibleMessages     = 7
         Prefs.SubjectColumns      = 35
         Prefs.FromColumns         = 20
         Prefs.PrefsRealName       = ''
         Prefs.Account.0           = 0
         Prefs.PrefsSignature      = ''
         Prefs.PrefsQuoteHeader    = 'At $TIME $DATE, $USER wrote:'
         Prefs.PrefsQuotePrefix    = '>'
         Prefs.PrefsLeaveMail      = 'FALSE'
         Prefs.PrefsGroupsOnDemand = 'TRUE'
         Prefs.PrefsCaptureFilter  = 'FALSE'
         Prefs.PrefsPurge          = 'TRUE'
         Prefs.PrefsEmptyTrash     = 'TRUE'
         Prefs.PrefsEditorWin      = 'TRUE'
      END
      Prefs.Account.NEXT = Prefs.Account.0 + 1

      Prefs.MsgListSize = 2 + Prefs.SubjectColumns + 1 + Prefs.FromColumns + 8

      Examine(Prefs.sigdir, info.)
      IF update = 0 | CompareDates(info.DAY info.DATE info.TIME, stem.DAY stem.DATE stem.TIME) < 0 THEN
         CALL ScanSignatures

      Examine(Prefs.drvdir, info.)
      IF update = 0 | CompareDates(info.DAY info.DATE info.TIME, stem.DAY stem.DATE stem.TIME) < 0 THEN
         CALL ScanDrivers

      IF INDEX(Prefs.EditorItems, Prefs.PrefsEditorCmd) = 0   THEN Prefs.PrefsEditorCmd  = 'TurboText'
      IF INDEX(Prefs.ReaderItems, Prefs.PrefsReaderCmd) = 0   THEN Prefs.PrefsReaderCmd  = 'TurboText'
      IF INDEX(Prefs.SendItems, Prefs.PrefsSendCmd) = 0       THEN Prefs.PrefsSendCmd    = 'PutMail'
      IF INDEX(Prefs.ReceiveItems, Prefs.PrefsReceiveCmd) = 0 THEN Prefs.PrefsReceiveCmd = 'GetMail'
      IF INDEX(Prefs.QuotedItems, Prefs.PrefsQuotedCmd) = 0   THEN Prefs.PrefsQuotedCmd  = 'MMencode'
      IF INDEX(Prefs.Base64Items, Prefs.PrefsBase64Cmd) = 0   THEN Prefs.PrefsBase64Cmd  = 'MMencode'
      IF INDEX(Prefs.UUItems, Prefs.PrefsUUCmd) = 0           THEN Prefs.PrefsUUCmd      = 'UUxT'

      DO index = 1 TO Prefs.Signature.0
         uname = UPPER(Prefs.Signature.index)
         Prefs.Signature.ITEM.uname = 1
      END
   END

   IF SYMBOL('Group.VERSION') = 'LIT' & INDEX(UPPER(ARG(1)), 'GROUPS') > 0 THEN DO
      CALL StatusWin_NewEvent("Loading configuration file: Groups")
      IF OPEN(fin, Prefs.groupsfile, 'Read') THEN DO
         Examine(Prefs.groupsfile, stem.)
         IF stem.SIZE < 65536 THEN DO
            INTERPRET READCH(fin, stem.SIZE)
         END
         ELSE DO WHILE EOF(fin)=0
            INTERPRET READLN(fin)
         END
         CLOSE(fin)

         PARSE VAR Group.VERSION ver'.'rev
         SELECT
            WHEN ver > GROUPVER THEN RETURN 5
            WHEN ver < GROUPVER | rev < GROUPREV THEN IF ConvertGroups(ver, rev) ~= 0 THEN RETURN 5
            OTHERWISE
         END
      END
      ELSE DO
         Group.VERSION            = '"'GROUPVER'.'GROUPREV'"'
         Group.NEXTFILE           = 1
         Group.0                  = 3
         Group.1                  = "IN"
         Group.1.GroupPersistence = 0
         Group.1.GroupKeepUnread  = "TRUE"
         Group.1.0                = 0
         Group.2                  = "OUT"
         Group.2.GroupPersistence = 0
         Group.2.GroupKeepUnread  = "TRUE"
         Group.2.0                = 0
         Group.3                  = "TRASH"
         Group.3.GroupPersistence = 0
         Group.3.GroupKeepUnread  = "FALSE"
         Group.3.0                = 0
      END
      Group.NEXT = Group.0 + 1

      DO idx = 1 TO Group.0
         name             = Group.idx
         uname            = UPPER(name)
         Group.ITEM.uname = idx
      END

      Group.LIST.0 = Group.0
      DO idx = 1 TO Group.0
         name   = Group.idx
         uname  = UPPER(name)
         mbox   = Group.ITEM.uname
         unread = 0
         allmsg = Group.mbox.0
         DO msg = 1 TO allmsg
            Group.mbox.msg = LEFT(Group.mbox.msg.MSG1, Prefs.SubjectColumns + 2) SUBSTR(Group.mbox.msg.MSG2, 9, Prefs.FromColumns) LEFT(Group.mbox.msg.MSG2, 7)
            IF ABBREV(Group.mbox.msg, 'b7'x) | ABBREV(Group.mbox.msg, 'D') | ABBREV(Group.mbox.msg, 'Q') THEN unread = unread + 1
         END

         IF unread = 0 THEN DO
            mark = ' '
            IF allmsg = 0 THEN msg = '-'
                          ELSE msg = allmsg
         END
         ELSE DO
            mark = 'b7'x
            msg = unread'-'allmsg
         END
         Group.LIST.idx = LEFT(mark Group.idx, Prefs.MsgListSize - 12) RIGHT(msg, 11)
      END
   END

   IF SYMBOL('Filter.VERSION') = 'LIT' & INDEX(UPPER(ARG(1)), 'FILTERS') > 0 THEN DO
      CALL StatusWin_NewEvent("Loading configuration file: Filters")
      IF OPEN(fin, Prefs.filtersfile, 'Read') THEN DO
         Examine(Prefs.filtersfile, stem.)
         IF stem.SIZE < 65536 THEN DO
            INTERPRET READCH(fin, stem.SIZE)
         END
         ELSE DO WHILE EOF(fin)=0
            INTERPRET READLN(fin)
         END
         CLOSE(fin)

         PARSE VAR Filter.VERSION ver'.'rev
         SELECT
            WHEN ver > FILTERVER THEN RETURN 5
            WHEN ver < FILTERVER | rev < FILTERREV THEN IF ConvertFilters(ver, rev) ~= 0 THEN RETURN 5
            OTHERWISE
         END
      END
      ELSE DO
         Filter.VERSION = '"'FILTERVER'.'FILTERREV'"'
         Filter.0       = 0
      END
      Filter.NEXT = Filter.0 + 1

      DO index = 1 TO Filter.0
         name              = Filter.index
         uname             = UPPER(name)
         Filter.ITEM.uname = index
         PARSE VAR Filter.index.FilterInOutMan Filter.index.FilterIncoming Filter.index.FilterOutgoing Filter.index.FilterManual .
      END
   END

   IF SYMBOL('Nickname.VERSION') = 'LIT' & INDEX(UPPER(ARG(1)), 'NICKNAMES') > 0 THEN DO
      CALL StatusWin_NewEvent("Loading configuration file: Nicknames")
      IF OPEN(fin, Prefs.nicknamesfile, 'Read') THEN DO
         Examine(Prefs.nicknamesfile, stem.)
         IF stem.SIZE < 65536 THEN DO
            INTERPRET READCH(fin, stem.SIZE)
         END
         ELSE DO WHILE EOF(fin)=0
            INTERPRET READLN(fin)
         END
         CLOSE(fin)

         PARSE VAR Nickname.VERSION ver'.'rev
         SELECT
            WHEN ver > NICKVER THEN RETURN 5
            WHEN ver < NICKVER | rev < NICKREV THEN IF ConvertNicknames(ver, rev) ~= 0 THEN RETURN 5
            OTHERWISE
         END
      END
      ELSE DO
         Nickname.VERSION = '"'NICKVER'.'NICKREV'"'
         Nickname.0       = 0
      END
      Nickname.NEXT = Nickname.0 + 1

      DO index = 1 TO Nickname.0
         name                = Nickname.index
         uname               = UPPER(name)
         Nickname.ITEM.uname = index
      END
   END
RETURN 0


PersistSave:
   IF SYMBOL('Group.VERSION') = 'VAR' THEN DO
      CALL StatusWin_NewEvent("Saving configuration file: Groups")
      IF OPEN(fout, Prefs.groupsfile'.tmp', 'Write') THEN DO
         CALL WRITELN(fout, '/* NetMail Configuration File */')
         CALL WRITELN(fout, 'Group.VERSION  = "'GROUPVER'.'GROUPREV'"')
         CALL WRITELN(fout, 'Group.NEXTFILE = 'Group.NEXTFILE)
         CALL WRITELN(fout, 'Group.0        = 'Group.0)
         DO index = 1 TO Group.0
            name  = Group.index
            uname = UPPER(name)
            mbox  = Group.ITEM.uname
            CALL WRITELN(fout, 'Group.'index'        = 'FixQuotes(name))
            CALL WRITELN(fout, 'Group.'index'.0      = 'Group.mbox.0)
            CALL WRITELN(fout, 'Group.'index'.GroupPersistence = 'Group.mbox.GroupPersistence)
            CALL WRITELN(fout, 'Group.'index'.GroupKeepUnread  = "'Group.mbox.GroupKeepUnread'"')
            DO msg = 1 TO Group.mbox.0
               CALL WRITELN(fout, 'Group.'index'.'msg'.MSG1 = 'FixQuotes(Group.mbox.msg.MSG1))
               CALL WRITELN(fout, 'Group.'index'.'msg'.MSG2 = 'FixQuotes(Group.mbox.msg.MSG2))
               CALL WRITELN(fout, 'Group.'index'.'msg'.FILE = "'Group.mbox.msg.FILE'"')
            END
         END
         CLOSE(fout)
         DeleteFile(Prefs.groupsfile)
         Rename(Prefs.groupsfile'.tmp', Prefs.groupsfile)
      END
   END

   IF SYMBOL('Filter.VERSION') = 'VAR' THEN DO
      CALL StatusWin_NewEvent("Saving configuration file: Filters")
      IF OPEN(fout, Prefs.filtersfile'.tmp', 'Write') THEN DO
         CALL WRITELN(fout, '/* NetMail Configuration File */')
         CALL WRITELN(fout, 'Filter.VERSION          = "'FILTERVER'.'FILTERREV'"')
         CALL WRITELN(fout, 'Filter.0                = 'Filter.0)
         DO index = 1 TO Filter.0
            name  = Filter.index
            uname = UPPER(name)
            fltr  = Filter.ITEM.uname
            CALL WRITELN(fout, 'Filter.'index'                = 'FixQuotes(name))
            CALL WRITELN(fout, 'Filter.'index'.FilterInOutMan = "'Filter.fltr.FilterIncoming Filter.fltr.FilterOutgoing Filter.fltr.FilterManual'"')
            CALL WRITELN(fout, 'Filter.'index'.FilterHeader1  = "'Filter.fltr.FilterHeader1'"')
            CALL WRITELN(fout, 'Filter.'index'.FilterType1    = "'Filter.fltr.FilterType1'"')
            CALL WRITELN(fout, 'Filter.'index'.FilterMatch1   = "'Filter.fltr.FilterMatch1'"')
            CALL WRITELN(fout, 'Filter.'index'.FilterAndOr    = "'Filter.fltr.FilterAndOr'"')
            CALL WRITELN(fout, 'Filter.'index'.FilterHeader2  = "'Filter.fltr.FilterHeader2'"')
            CALL WRITELN(fout, 'Filter.'index'.FilterType2    = "'Filter.fltr.FilterType2'"')
            CALL WRITELN(fout, 'Filter.'index'.FilterMatch2   = "'Filter.fltr.FilterMatch2'"')
            CALL WRITELN(fout, 'Filter.'index'.FilterTransfer = 'FixQuotes(Filter.fltr.FilterTransfer))
            CALL WRITELN(fout, 'Filter.'index'.FilterMacro    = "'Filter.fltr.FilterMacro'"')
         END
         CLOSE(fout)
         DeleteFile(Prefs.filtersfile)
         Rename(Prefs.filtersfile'.tmp', Prefs.filtersfile)
      END
   END

   IF SYMBOL('Nickname.VERSION') = 'VAR' THEN DO
      CALL StatusWin_NewEvent("Saving configuration file: Nicknames")
      IF OPEN(fout, Prefs.nicknamesfile'.tmp', 'Write') THEN DO
         CALL WRITELN(fout, '/* NetMail Configuration File */')
         CALL WRITELN(fout, 'Nickname.VERSION        = "'NICKVER'.'NICKREV'"')
         CALL WRITELN(fout, 'Nickname.0              = 'Nickname.0)
         DO index = 1 TO Nickname.0
            name  = Nickname.index
            uname = UPPER(name)
            nick  = Nickname.ITEM.uname
            CALL WRITELN(fout, 'Nickname.'index'              = 'FixQuotes(name))
            CALL WRITELN(fout, 'Nickname.'index'.Address.0    = 'Nickname.nick.Address.0)
            DO addr = 1 TO Nickname.nick.Address.0
               CALL WRITELN(fout, 'Nickname.'index'.Address.'addr'    = 'FixQuotes(Nickname.nick.Address.addr))
            END
            CALL WRITELN(fout, 'Nickname.'index'.Note.0       = 'Nickname.nick.Note.0)
            DO inote = 1 TO Nickname.nick.Note.0
               CALL WRITELN(fout, 'Nickname.'index'.Note.'inote'       = "'Nickname.nick.Note.inote'"')
            END
            CALL WRITELN(fout, 'Nickname.'index'.InRecipients = "'Nickname.nick.InRecipients'"')
         END
         CLOSE(fout)
         DeleteFile(Prefs.nicknamesfile)
         Rename(Prefs.nicknamesfile'.tmp', Prefs.nicknamesfile)
      END
   END

   IF SYMBOL('Prefs.VERSION') = 'VAR' THEN DO
      CALL StatusWin_NewEvent("Saving configuration file: Prefs")
      IF OPEN(fout, Prefs.prefsfile'.tmp', 'Write') THEN DO
         CALL WRITELN(fout, '/* NetMail Configuration File */')
         CALL WRITELN(fout, 'Prefs.VERSION                 = "'PREFSVER'.'PREFSREV'"')
         CALL WRITELN(fout, 'Prefs.VisibleGroups           = "'Prefs.VisibleGroups'"')
         CALL WRITELN(fout, 'Prefs.VisibleMessages         = "'Prefs.VisibleMessages'"')
         CALL WRITELN(fout, 'Prefs.SubjectColumns          = "'Prefs.SubjectColumns'"')
         CALL WRITELN(fout, 'Prefs.FromColumns             = "'Prefs.FromColumns'"')
         CALL WRITELN(fout, 'Prefs.PrefsEditorCmd          = "'Prefs.PrefsEditorCmd'"')
         CALL WRITELN(fout, 'Prefs.PrefsReaderCmd          = "'Prefs.PrefsReaderCmd'"')
         CALL WRITELN(fout, 'Prefs.PrefsSendCmd            = "'Prefs.PrefsSendCmd'"')
         CALL WRITELN(fout, 'Prefs.PrefsReceiveCmd         = "'Prefs.PrefsReceiveCmd'"')
         CALL WRITELN(fout, 'Prefs.PrefsQuotedCmd          = "'Prefs.PrefsQuotedCmd'"')
         CALL WRITELN(fout, 'Prefs.PrefsBase64Cmd          = "'Prefs.PrefsBase64Cmd'"')
         CALL WRITELN(fout, 'Prefs.PrefsUUCmd              = "'Prefs.PrefsUUCmd'"')
         CALL WRITELN(fout, 'Prefs.EditorItems             = "'Prefs.EditorItems'"')
         CALL WRITELN(fout, 'Prefs.ReaderItems             = "'Prefs.ReaderItems'"')
         CALL WRITELN(fout, 'Prefs.SendItems               = "'Prefs.SendItems'"')
         CALL WRITELN(fout, 'Prefs.ReceiveItems            = "'Prefs.ReceiveItems'"')
         CALL WRITELN(fout, 'Prefs.EncoderItems            = "'Prefs.EncoderItems'"')
         CALL WRITELN(fout, 'Prefs.QuotedItems             = "'Prefs.QuotedItems'"')
         CALL WRITELN(fout, 'Prefs.Base64Items             = "'Prefs.Base64Items'"')
         CALL WRITELN(fout, 'Prefs.UUItems                 = "'Prefs.UUItems'"')
         CALL WRITELN(fout, 'Prefs.PrefsRealName           = 'FixQuotes(Prefs.PrefsRealName))
         CALL WRITELN(fout, 'Prefs.PrefsSignature          = "'Prefs.PrefsSignature'"')
         CALL WRITELN(fout, 'Prefs.Signature.0             = "'Prefs.Signature.0'"')
         DO index = 1 TO Prefs.Signature.0
            CALL WRITELN(fout, 'Prefs.Signature.'index'             = "'Prefs.Signature.index'"')
         END
         CALL WRITELN(fout, 'Prefs.PrefsQuoteHeader        = 'FixQuotes(Prefs.PrefsQuoteHeader))
         CALL WRITELN(fout, 'Prefs.PrefsQuotePrefix        = 'FixQuotes(Prefs.PrefsQuotePrefix))
         CALL WRITELN(fout, 'Prefs.PrefsLeaveMail          = "'Prefs.PrefsLeaveMail'"')
         CALL WRITELN(fout, 'Prefs.PrefsGroupsOnDemand     = "'Prefs.PrefsGroupsOnDemand'"')
         CALL WRITELN(fout, 'Prefs.PrefsCaptureFilter      = "'Prefs.PrefsCaptureFilter'"')
         CALL WRITELN(fout, 'Prefs.PrefsPurge              = "'Prefs.PrefsPurge'"')
         CALL WRITELN(fout, 'Prefs.PrefsEmptyTrash         = "'Prefs.PrefsEmptyTrash'"')
         CALL WRITELN(fout, 'Prefs.PrefsEditorWin          = "'Prefs.PrefsEditorWin'"')
         CALL WRITELN(fout, 'Prefs.Account.0               = 'Prefs.Account.0)
         DO index = 1 TO Prefs.Account.0
            name  = Prefs.Account.index
            uname = UPPER(name)
            acnt  = Prefs.Account.ITEM.uname
            CALL WRITELN(fout, 'Prefs.Account.'index'                   = "'name'"')
            CALL WRITELN(fout, 'Prefs.Account.'index'.PrefsReplyTo      = 'FixQuotes(Prefs.Account.acnt.PrefsReplyTo))
            CALL WRITELN(fout, 'Prefs.Account.'index'.PrefsOrganization = "'Prefs.Account.acnt.PrefsOrganization'"')
            CALL WRITELN(fout, 'Prefs.Account.'index'.PrefsUsername     = "'Prefs.Account.acnt.PrefsUsername'"')
            CALL WRITELN(fout, 'Prefs.Account.'index'.Password          = "'Prefs.Account.acnt.Password'"')
            CALL WRITELN(fout, 'Prefs.Account.'index'.PrefsPOPHost      = "'Prefs.Account.acnt.PrefsPOPHost'"')
            CALL WRITELN(fout, 'Prefs.Account.'index'.PrefsSMTPHost     = "'Prefs.Account.acnt.PrefsSMTPHost'"')
         END
         CLOSE(fout)
         DeleteFile(Prefs.prefsfile)
         Rename(Prefs.prefsfile'.tmp', Prefs.prefsfile)
      END
   END
RETURN


FixQuotes: PROCEDURE
PARSE ARG src

dst = ''
DO FOREVER
   sqidx = INDEX(src, "'")
   dqidx = INDEX(src, '"')
   SELECT
      WHEN dqidx = 0 THEN DO
         dst = dst'"'src'"'
         LEAVE
      END
      WHEN sqidx = 0 THEN DO
         dst = dst"'"src"'"
         LEAVE
      END
      WHEN sqidx < dqidx THEN DO
         PARSE VAR src part =dqidx src
         dst = dst'"'part'"'
      END
      OTHERWISE DO
         PARSE VAR src part =sqidx src
         dst = dst"'"part"'"
      END
   END
END
RETURN dst


GroupExchange: PROCEDURE EXPOSE Group. Filter. Prefs.

   CALL GroupSend
   DO index = 1 TO Prefs.Account.0
      name  = Prefs.Account.index
      uname = UPPER(name)
      acnt  = Prefs.Account.ITEM.uname
      CALL StatusWin_NewEvent("Receiving mail of" name"...")
      cmd   = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsReceiveCmd'.mailget')"'"
      parm1 = '"'name'"'
      parm2 = '"'Prefs.Account.acnt.PrefsUsername'"'
      parm3 = '"'Prefs.Account.acnt.Password'"'
      parm4 = '"'Prefs.Account.acnt.PrefsPOPHost'"'
      parm5 = '"'AddPart(Prefs.prgdir, Prefs.Account.acnt.PrefsUsername)'"'
      parm6 = '""'
      IF Prefs.PrefsLeaveMail = 'TRUE' THEN parm6 = '"LEAVE"'

      INTERPRET cmd parm1','parm2','parm3','parm4','parm5','parm6

      IF RESULT = 0 THEN DO
         CALL StatusWin_UpdateEvent("Receiving mail of" name". Done.")
         IF Prefs.PrefsLeaveMail = 'FALSE' & EXISTS(AddPart(Prefs.prgdir, Prefs.Account.acnt.PrefsUsername)) THEN
            CALL StatusWin_NewEvent("Deleted mail on server.")
      END
      ELSE
         CALL StatusWin_UpdateEvent("Receiving mail of" name". Failed.")
   END
RETURN 0


GroupSend: PROCEDURE EXPOSE Group. Filter. Prefs.

   total   = 0
   totdone = 0
   totfail = 0
   DO idx = 1 TO Group.0
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      DO msg = 1 TO Group.mbox.0
         IF ABBREV(Group.mbox.msg, 'Q') THEN total = total + 1
      END
   END
   IF total = 0 THEN DO
      CALL StatusWin_NewEvent("No messages to send.")
      RETURN 0
   END

   current = 0
   CALL StatusWin_NewEvent("Sending message 1 of" total"...")

   DO idx = 1 TO Group.0
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      DO msg = Group.mbox.0 TO 1 BY -1
         IF ABBREV(Group.mbox.msg, 'Q') THEN DO
            current = current + 1
            CALL StatusWin_UpdateEvent("Sending message" current "of" total"...")

            msgfile = AddPart(Prefs.msgdir, Group.mbox.msg.FILE)
            name    = Prefs.Account.1
            uname   = UPPER(name)
            acnt    = Prefs.Account.ITEM.uname

            cmd     = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsSendCmd'.mailput')"'"
            parm1   = '"'Prefs.Account.1'"'
            parm2   = '"'Prefs.Account.acnt.PrefsSMTPHost'"'
            parm3   = '"'msgfile'"'

            INTERPRET cmd parm1','parm2','parm3

            IF RESULT = 0 THEN DO
               CALL StatusWin_UpdateEvent("Sending message" current "of" total". Done.")
               totdone = totdone + 1
               Group.mbox.msg      = OVERLAY(' ', Group.mbox.msg)
               Group.mbox.msg.MSG1 = OVERLAY(' ', Group.mbox.msg.MSG1)
               DeleteFile(msgfile'.text')
               DeleteFile(msgfile'.text.info')
               DeleteFile(msgfile'.head')
               DeleteFile(msgfile'.body')
               today = DATE()
               PARSE VAR today dd mmm yyyy .
               Group.mbox.msg      = OVERLAY(dd||mmm||RIGHT(yyyy, 2), Group.mbox.msg, 3 + Prefs.SubjectColumns + 1 + Prefs.FromColumns + 1)
               Group.mbox.msg.MSG2 = OVERLAY(dd||mmm||RIGHT(yyyy, 2), Group.mbox.msg.MSG2)
               CALL MessageChange(idx, 'Read')
               CALL MessageScan(msgfile)
               CALL MessageCache(msgfile)
               CALL MessageFilter('FilterOutgoing', idx, mbox, msg)
            END
            ELSE DO
               CALL StatusWin_UpdateEvent("Sending message" current "of" total". Fail.")
               totfail = totfail + 1
            END
         END
      END
   END
   done1 = ''
   IF totdone > 1 THEN done1 = 's'
   fail1 = ''
   IF totfail > 1 THEN fail1 = 's'
   IF totfail = 0 THEN CALL StatusWin_UpdateEvent(totdone "message"done1" sent.")
                  ELSE CALL StatusWin_UpdateEvent(totdone "message"done1" sent;" totfail "message"fail1" not sent.")
RETURN 0


GroupScan: PROCEDURE EXPOSE Group. Filter. Prefs.

   CALL StatusWin_NewEvent("Scanning for new messages:")
   count = 0
   nextmsg = Group.NEXTFILE
   DO index = 1 TO Prefs.Account.0
      name     = Prefs.Account.index
      uname    = UPPER(name)
      acnt     = Prefs.Account.ITEM.uname
      mbox     = Prefs.Account.acnt.PrefsUsername
      mboxfile = AddPart(Prefs.prgdir, mbox)

      IF OPEN(fin, mboxfile, 'Read') THEN DO
         line = READLN(fin)
         DO WHILE EOF(fin)=0
            IF ABBREV(UPPER(line), 'FROM ') THEN DO
               IF OPEN(fout, AddPart(Prefs.msgdir, nextmsg), 'Write') THEN DO
                  CALL WRITELN(fout, line)

                  DROP mail.
                  DO UNTIL EOF(fin)~=0 | line = ''
                     line = READLN(fin)
                     CALL WRITELN(fout, line)
                     IF line ~= '' & ~ABBREV(line, ' ') & ~ABBREV(line, '09'x) THEN DO
                        PARSE VAR line fieldname ':' fieldbody
                        fieldname = TRIM(UPPER(fieldname))
                        mail.fieldname = STRIP(fieldbody)
                     END
                  END

                  mailflag = 1
                  line1 = READLN(fin)
                  line  = READLN(fin)
                  DO WHILE EOF(fin)=0 & mailflag
                     IF line1 = "" & ABBREV(UPPER(line), 'FROM ') THEN
                        mailflag = 0
                     ELSE IF line ~= "" THEN DO
                        CALL WRITELN(fout, line1)
                        CALL WRITELN(fout, line)
                        line1 = READLN(fin)
                        line  = READLN(fin)
                     END
                     ELSE DO
                        CALL WRITELN(fout, line1)
                        line1 = line
                        line  = READLN(fin)
                     END
                  END
                  CLOSE(fout)

                  CALL MessageCache(AddPart(Prefs.msgdir, nextmsg))
                  CALL MessageFilter('FilterIncoming', nextmsg)

                  count = count + 1
                  IF count = 1 THEN CALL StatusWin_NewEvent(count "new message")
                               ELSE CALL StatusWin_UpdateEvent(count "new messages")

                  nextmsg = nextmsg + 1
               END
            END
            ELSE DO
               IF line ~= "" THEN DO
                  CALL StatusWin_NewEvent("Mailbox file is corrupted.")
                  CALL StatusWin_NewEvent("...")
               END
               line = READLN(fin)
            END
         END
         CLOSE(fin)
         DeleteFile(mboxfile'.bak')
         Rename(mboxfile, mboxfile'.bak')
         Group.NEXTFILE = nextmsg
      END
   END
   IF count = 0      THEN CALL StatusWin_UpdateEvent("Scanning for new messages done. No mail.")
   ELSE IF count = 1 THEN CALL StatusWin_UpdateEvent(count "new message.")
                     ELSE CALL StatusWin_UpdateEvent(count "new messages.")
RETURN


GroupUpdate: PROCEDURE EXPOSE Group. Filter. Prefs.

   CALL StatusWin_NewEvent("Consistency check:")
   addcount = 0
   remcount = 0
   Examine(Prefs.msgdir, info1.)
   update = Examine(Prefs.groupsfile, info2.)
   IF update = 0 | CompareDates(info1.DAY info1.DATE info1.TIME, info2.DAY info2.DATE info2.TIME) < 0 | UPPER(ARG(1)) = 'FORCE' THEN DO
      files.COUNT = 0
      DO idx = 1 TO Group.0
         name  = Group.idx
         uname = UPPER(name)
         mbox  = Group.ITEM.uname
         DO msg = 1 TO Group.mbox.0
            name = Group.mbox.msg.FILE
            files.name = 1
            files.COUNT = files.COUNT + 1
         END
      END

      CALL ExAll(Prefs.msgdir, entries.)
      DO idx = 0 TO entries.COUNT - 1
         name = entries.idx.FILENAME

/*
         IF RIGHT(name, 5) = '.head' THEN DO
            PARSE VAR name name '.head'
            IF SYMBOL('files.name') = 'LIT' & DATATYPE(name) = 'NUM' THEN DO
               dgroup  = 'OUT'
               udgroup = UPPER(dgroup)
               CALL MessageAdd(Group.ITEM.udgroup, name)
               CALL MessageChange(GroupIndex(dgroup), 'AddUnread')
               IF Group.NEXTFILE <= name THEN Group.NEXTFILE = name + 1
               IF addcount + remcount = 0 THEN CALL StatusWin_NewEvent("Message" name "added")
                                          ELSE CALL StatusWin_UpdateEvent("Message" name "added")
               addcount = addcount + 1

            END
            DROP files.name
         END
*/
         IF SYMBOL('files.name') = 'LIT' & DATATYPE(name) = 'NUM' THEN DO
            CALL MessageScan(AddPart(Prefs.msgdir, name))
            CALL MessageCache(AddPart(Prefs.msgdir, name))
            CALL MessageFilter('FilterIncoming', name)
            IF Group.NEXTFILE <= name THEN Group.NEXTFILE = name + 1
            IF addcount + remcount = 0 THEN CALL StatusWin_NewEvent("Message" name "added")
                                       ELSE CALL StatusWin_UpdateEvent("Message" name "added")
            addcount = addcount + 1
         END
         ELSE DO
            DROP files.name
         END
      END

      DO idx = 1 TO Group.0
         name  = Group.idx
         uname = UPPER(name)
         mbox  = Group.ITEM.uname
         DO msg = Group.mbox.0 TO 1 BY -1
            name = Group.mbox.msg.FILE
            IF SYMBOL('files.name') = 'VAR' THEN DO
               IF ~EXISTS(AddPart(Prefs.msgdir, name'.head')) THEN DO
                  CALL MessageDelete(idx, mbox, msg)
                  IF addcount + remcount = 0 THEN CALL StatusWin_NewEvent("Reference to message" name "removed")
                                             ELSE CALL StatusWin_UpdateEvent("Reference to message" name "removed")
                  remcount = remcount + 1
               END
            END
         END
      END
   END
   IF addcount + remcount = 0 THEN
      CALL StatusWin_UpdateEvent("Consistency check done.")
   ELSE DO
      add1 = ''
      IF addcount > 1 THEN add1 = 's'
      rem1 = ''
      IF remcount > 1 THEN rem1 = 's'
      CALL StatusWin_UpdateEvent(addcount "message"add1" added;" remcount "reference"rem1" removed.")
   END
RETURN


GroupEmptyTrash: PROCEDURE EXPOSE Group. Prefs.
   CALL StatusWin_NewEvent("Empting TRASH:")
   name  = 'TRASH'
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   IF Group.mbox.0 = 0 THEN
      CALL StatusWin_UpdateEvent("Empting TRASH done.")
   ELSE DO
      CALL StatusWin_NewEvent("...")
      DO msg = 1 TO Group.mbox.0
         msgfile = AddPart(Prefs.msgdir, Group.mbox.msg.FILE)
         cchfile = AddPart(Prefs.cchdir, Group.mbox.msg.FILE)
         DeleteFile(cchfile)
         DeleteFile(msgfile)
         DeleteFile(msgfile'.head')
         DeleteFile(msgfile'.text')
         DeleteFile(msgfile'.text.info')
         DeleteFile(msgfile'.body')
         IF msg = 1 THEN CALL StatusWin_UpdateEvent(msg "message deleted.")
                    ELSE CALL StatusWin_UpdateEvent(msg "messages deleted.")
      END
      CALL MessageChange(GroupIndex(name), "VoidGroup")
      DROP Group.mbox.
      Group.mbox.0 = 0
   END
RETURN


GroupIndex: PROCEDURE EXPOSE Group.
PARSE ARG name

   DO idx = 1 TO Group.0
      IF Group.idx = name THEN LEAVE
   END
RETURN idx


MessageChange: PROCEDURE EXPOSE Group. Prefs.
ARG idx, oper, idx2

   msg = STRIP(RIGHT(Group.LIST.idx, 11))
   PARSE VAR msg unread'-'allmsg
   IF unread = '' THEN unread = 0
   IF allmsg = '' THEN DO
      allmsg = unread
      unread = 0
   END

   name  = Group.idx
   uname = UPPER(name)
   mbox  = Group.ITEM.uname
   SELECT
      WHEN oper = 'READ'      THEN unread = unread - 1
      WHEN oper = 'UNREAD'    THEN unread = unread + 1
      WHEN oper = 'READALL'   THEN unread = idx2
      WHEN oper = 'UNREADALL' THEN unread = Group.mbox.0
      WHEN oper = 'ADD'       THEN allmsg = allmsg + 1
      WHEN oper = 'REM'       THEN allmsg = allmsg - 1
      WHEN oper = 'ADDUNREAD' THEN DO
                                      allmsg = allmsg + 1
                                      unread = unread + 1
                                   END
      WHEN oper = 'REMUNREAD' THEN DO
                                      allmsg = allmsg - 1
                                      unread = unread - 1
                                   END
      WHEN oper = 'VOIDGROUP'  THEN DO
                                      unread = 0
                                      allmsg = 0
                                   END
      WHEN oper = 'ADDGROUP'  THEN DO
                                      msg = STRIP(RIGHT(Group.LIST.idx2, 11))
                                      PARSE VAR msg unread2'-'allmsg2
                                      IF unread2 = '' THEN unread2 = 0
                                      IF allmsg2 = '' THEN DO
                                         allmsg2 = unread2
                                         unread2 = 0
                                      END
                                      unread = unread + unread2
                                      allmsg = allmsg + allmsg2
                                   END
      OTHERWISE
   END

   IF unread > allmsg THEN unread = allmsg
   IF unread < 0 THEN unread = 0
   IF allmsg < 0 THEN allmsg = 0

   IF unread = 0 THEN DO
      mark = ' '
      IF allmsg = 0 THEN msg = '-'
                    ELSE msg = allmsg
   END
   ELSE DO
      mark = 'b7'x
      msg = unread'-'allmsg
   END

   Group.LIST.idx = LEFT(mark name, Prefs.MsgListSize - 12) RIGHT(msg, 11)
RETURN


MessageRead: PROCEDURE EXPOSE Group. Prefs. MailWin.
PARSE ARG idx, mbox, msg

   IF Group.mbox.0 >= msg THEN DO
      IF ABBREV(Group.mbox.msg, 'b7'x) THEN DO
         Group.mbox.msg      = OVERLAY(' ', Group.mbox.msg)
         Group.mbox.msg.MSG1 = OVERLAY(' ', Group.mbox.msg.MSG1)
         CALL MessageChange(idx, 'Read')
      END
      IF ABBREV(Group.mbox.msg, 'D') THEN DO
         CALL MailWin_Open 'EDIT' idx mbox msg
      END
      ELSE DO
         msgname = AddPart(Prefs.cchdir, Group.mbox.msg.FILE)
         IF ~EXISTS(msgname) THEN msgname = AddPart(Prefs.msgdir, Group.mbox.msg.FILE)
         cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsReaderCmd'.reader')"'"
         INTERPRET cmd '"READ","'msgname'","'Prefs.ReaderPort'"'
         Prefs.ReaderPort = RESULT
         Prefs.ReaderMbox = mbox
         Prefs.ReaderMsg  = msg
      END
   END
RETURN


MessageCache: PROCEDURE EXPOSE Group. Prefs. mail.
PARSE ARG msgfile

   header = 'CONTENT-TRANSFER-ENCODING'
   IF UPPER(mail.header) = 'QUOTED-PRINTABLE' THEN DO
      cchfile = AddPart(Prefs.cchdir, FilePart(msgfile))
      cmd = "CALL '"AddPart(Prefs.drvdir, Prefs.PrefsQuotedCmd'.encoder')"'"
      INTERPRET cmd '"DECODE","'msgfile'","'cchfile'","Quoted-Printable"'
   END
RETURN


MessageScan: PROCEDURE EXPOSE mail.
PARSE ARG msgfile

   IF OPEN(fin, msgfile, 'Read') THEN DO
      DROP mail.
      DO UNTIL EOF(fin)~=0 | line = ''
         line = READLN(fin)
         IF line ~= '' & ~ABBREV(line, ' ') & ~ABBREV(line, '09'x) THEN DO
            PARSE VAR line fieldname ':' fieldbody
            fieldname = TRIM(UPPER(fieldname))
            mail.fieldname = STRIP(fieldbody)
         END
      END
      mail.FILE = msgfile
      CLOSE(fin)
      RETURN 0
   END
RETURN 1


MessageAdd: PROCEDURE EXPOSE Group. Prefs. mail.
PARSE ARG mbox, msgfile

   header = 'DATE'
   IF SYMBOL('mail.header') = 'VAR' THEN DO
      IF INDEX(mail.header, ',') > 0 THEN PARSE VAR mail.header ',' dd mm yyyy .
                                     ELSE PARSE VAR mail.header dd mm yyyy .
      IF DATATYPE(dd, 'N') THEN date = RIGHT('0'dd, 2) || mm || RIGHT(yyyy, 2)
                           ELSE date = RIGHT('0'mm, 2) || dd || RIGHT(yyyy, 2)
   END
   ELSE
      date = '       '

   header = 'FROM'
   PARSE VAR mail.header fname '<' faddr '>'
   IF faddr = "" THEN PARSE VAR mail.header faddr '(' fname ')'
   from = STRIP(fname)
   IF LEFT(from, 1) = '"' & RIGHT(from, 1) = '"' THEN PARSE VAR from '"' from '"'
   IF from = "" THEN from = STRIP(faddr)

   header = 'SUBJECT'
   IF SYMBOL('mail.header') = 'VAR' THEN subject = mail.header
                                    ELSE subject = ''

   msg                 = Group.mbox.0 + 1
   Group.mbox.0        = msg
   Group.mbox.msg      = 'b7'x LEFT(subject, Prefs.SubjectColumns) LEFT(from, Prefs.FromColumns) LEFT(date, 7)
   Group.mbox.msg.MSG1 = 'b7'x subject
   Group.mbox.msg.MSG2 = LEFT(date, 7) from
   Group.mbox.msg.FILE = msgfile
RETURN


MessageRemove: PROCEDURE EXPOSE Group. Prefs.
PARSE ARG idx, mbox, msg

   IF Group.mbox.0 >= msg THEN
      IF mbox = Group.ITEM.TRASH THEN CALL MessageDelete(idx, mbox, msg)
                                 ELSE CALL MessageTransfer(idx, GroupIndex('TRASH'), mbox, Group.ITEM.TRASH, msg)
RETURN


MessageTransfer: PROCEDURE EXPOSE Group. Prefs.
PARSE ARG idx1, idx2, mboxf, mboxt, msgf

   IF ABBREV(Group.mboxf.msgf, ' ') | ABBREV(Group.mboxf.msgf, 'L') THEN DO
      CALL MessageChange(idx1, 'Rem')
      CALL MessageChange(idx2, 'Add')
   END
   ELSE DO
      CALL MessageChange(idx1, 'RemUnread')
      CALL MessageChange(idx2, 'AddUnread')
      IF ABBREV(Group.mboxf.msgf, 'Q') & mboxt = Group.ITEM.TRASH THEN DO
         Group.mboxf.msgf      = OVERLAY('D', Group.mboxf.msgf)
         Group.mboxf.msgf.MSG1 = OVERLAY('D', Group.mboxf.msgf.MSG1)
      END
   END

   IF mboxf ~= mboxt & Group.mboxf.0 >= msgf THEN DO
      msgt                  = Group.mboxt.0 + 1
      Group.mboxt.0         = msgt
      Group.mboxt.msgt      = Group.mboxf.msgf
      Group.mboxt.msgt.MSG1 = Group.mboxf.msgf.MSG1
      Group.mboxt.msgt.MSG2 = Group.mboxf.msgf.MSG2
      Group.mboxt.msgt.FILE = Group.mboxf.msgf.FILE

      msgl          = Group.mboxf.0 - 1
      Group.mboxf.0 = msgl
      DO msg = msgf TO msgl
         tmp = msg + 1
         Group.mboxf.msg      = Group.mboxf.tmp
         Group.mboxf.msg.MSG1 = Group.mboxf.tmp.MSG1
         Group.mboxf.msg.MSG2 = Group.mboxf.tmp.MSG2
         Group.mboxf.msg.FILE = Group.mboxf.tmp.FILE
      END
   END
RETURN


MessageDelete: PROCEDURE EXPOSE Group. Prefs.
PARSE ARG idx, mbox, msg

   IF ABBREV(Group.mbox.msg, ' ') THEN CALL MessageChange(idx, 'Rem')
                                  ELSE CALL MessageChange(idx, 'RemUnread')

   msgfile = AddPart(Prefs.msgdir, Group.mbox.msg.FILE)
   cchfile = AddPart(Prefs.cchdir, Group.mbox.msg.FILE)
   DeleteFile(cchfile)
   DeleteFile(msgfile)
   DeleteFile(msgfile'.head')
   DeleteFile(msgfile'.text')
   DeleteFile(msgfile'.text.info')
   DeleteFile(msgfile'.body')

   msgl         = Group.mbox.0 - 1
   Group.mbox.0 = msgl
   DO msgt = msg TO msgl
      msgf = msgt + 1
      Group.mbox.msgt      = Group.mbox.msgf
      Group.mbox.msgt.MSG1 = Group.mbox.msgf.MSG1
      Group.mbox.msgt.MSG2 = Group.mbox.msgf.MSG2
      Group.mbox.msgt.FILE = Group.mbox.msgf.FILE
   END
RETURN


FilterMatch: PROCEDURE EXPOSE mail.
PARSE ARG mtype, mfield, mvalue

   mtype  = UPPER(mtype)
   mfield = UPPER(mfield)
   mres = 0
   IF mfield = '' THEN mres = 1
   ELSE SELECT
      WHEN mtype = "CONTAINS"        THEN IF INDEX(mail.mfield, mvalue) > 0              THEN mres = 1
      WHEN mtype = "DOESN'T CONTAIN" THEN IF INDEX(mail.mfield, mvalue) = 0              THEN mres = 1
      WHEN mtype = "IS"              THEN IF mail.mfield = mvalue                        THEN mres = 1
      WHEN mtype = "IS NOT"          THEN IF mail.mfield ~= mvalue                       THEN mres = 1
      WHEN mtype = "STARTS WITH"     THEN IF ABBREV(mail.mfield, mvalue) > 0             THEN mres = 1
      WHEN mtype = "ENDS WITH"       THEN IF RIGHT(mail.mfield, LENGTH(mvalue)) = mvalue THEN mres = 1
      OTHERWISE
   END
RETURN mres


MessageFilter: PROCEDURE EXPOSE Group. Filter. Prefs. mail.

   inoutman = UPPER(ARG(1))
   IF inoutman = 'FILTERINCOMING' THEN DO
      msgname = ARG(2)
      name = 'NEWSGROUPS'
      IF SYMBOL('mail.name' ) = 'VAR' THEN PARSE var mail.name grp ','
                                      ELSE grp = 'IN'
      grp = TRIM(grp)
   END
   ELSE DO
      idx  = ARG(2)
      mbox = ARG(3)
      msg  = ARG(4)
      DROP grp
   END

   DO index = 1 TO Filter.0
      name  = Filter.index
      uname = UPPER(name)
      fltr  = Filter.ITEM.uname
      IF Filter.fltr.inoutman = 'TRUE' THEN DO
         head1 = UPPER(Filter.fltr.FilterHeader1)
         head2 = UPPER(Filter.fltr.FilterHeader2)
         IF inoutman = 'FILTEROUTGOING' THEN IF Filter.fltr.FilterIncoming = 'TRUE' THEN DO
            IF head1 = 'FROM' THEN head1 = 'TO'
            IF head2 = 'FROM' THEN head2 = 'TO'
         END
         match1 = FilterMatch(Filter.fltr.FilterType1, head1, Filter.fltr.FilterMatch1)
         match2 = FilterMatch(Filter.fltr.FilterType2, head2, Filter.fltr.FilterMatch2)
         IF Filter.fltr.FilterAndOr = 'and' THEN match = match1 & match2
                                            ELSE match = match1 | match2
         IF match THEN DO
            IF Filter.fltr.FilterMacro ~= '' THEN DO
               EXAMINE(Filter.fltr.FilterMacro, stem.)
               IF stem.SIZE < 65536 THEN
                  IF OPEN(fin, Filter.fltr.FilterMacro, 'Read') THEN DO
                     INTERPRET READCH(fin, stem.SIZE)
                     CLOSE(fin)
                  END
            END
            IF Filter.fltr.FilterTransfer ~= '' THEN DO
               grp = Filter.fltr.FilterTransfer
               LEAVE
            END
         END
      END
   END

   IF inoutman = 'FILTERINCOMING' THEN DO
      ugrp = UPPER(grp)
      IF SYMBOL('Group.ITEM.ugrp') = 'LIT' THEN
         IF Prefs.PrefsGroupsOnDemand = 'TRUE' THEN
            CALL GroupCreate(grp)
         ELSE DO
            name = 'NEWSGROUPS'
            IF SYMBOL('mail.name') = 'VAR' THEN grp = 'JUNK'
                                           ELSE grp = 'IN'
            ugrp = grp
            IF SYMBOL('Group.ITEM.ugrp') = 'LIT' THEN
               CALL GroupCreate(grp)
         END
      IF SYMBOL('Group.ITEM.ugrp') = 'VAR' THEN DO
         CALL MessageAdd(Group.ITEM.ugrp, msgname)
         CALL MessageChange(GroupIndex(grp), 'AddUnread')
      END
   END
   ELSE IF SYMBOL('grp') = 'VAR' THEN DO
      ugrp = UPPER(grp)
      IF SYMBOL('Group.ITEM.ugrp') = 'LIT' & Prefs.PrefsGroupsOnDemand = 'TRUE' THEN
         CALL GroupCreate(grp)
      IF SYMBOL('Group.ITEM.ugrp') = 'VAR' THEN
         CALL MessageTransfer(idx, GroupIndex(grp), mbox, Group.ITEM.ugrp, msg)
   END
RETURN


FilterGroup: PROCEDURE EXPOSE Group. Filter. Prefs.
PARSE ARG idx, mbox

   DO msg = Group.mbox.0 TO 1 BY -1
      IF ~MessageScan(AddPart(Prefs.msgdir, Group.mbox.msg.FILE)) THEN
         CALL MessageFilter('FilterManual', idx, mbox, msg)
   END
RETURN


FilterApplyAll: PROCEDURE EXPOSE Group. Filter. Prefs.

   grpod = Prefs.PrefsGroupsOnDemand
   Prefs.PrefsGroupsOnDemand = 'FALSE'

   DO idx = 1 TO Group.0
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      DO msg = Group.mbox.0 TO 1 BY -1
         IF ~MessageScan(AddPart(Prefs.msgdir, Group.mbox.msg.FILE)) THEN
            CALL MessageFilter('FilterManual', idx, mbox, msg)
      END
   END

   Prefs.PrefsGroupsOnDemand = grpod
RETURN


FilterApply: PROCEDURE EXPOSE Group. Filter. Prefs.
PARSE ARG fname

   uname  = UPPER(fname)
   fltr   = Filter.ITEM.uname
   ftype1 = Filter.fltr.FilterType1
   fhead1 = Filter.fltr.FilterHeader1
   fbody1 = Filter.fltr.FilterMatch1
   IF Filter.fltr.FilterAndOr = 'and' THEN fandor = 2
                                      ELSE fandor = 1
   ftype2 = Filter.fltr.FilterType2
   fhead2 = Filter.fltr.FilterHeader2
   fbody2 = Filter.fltr.FilterMatch2
   fmacro = Filter.fltr.FilterMacro
   mbody  = ''
   IF fmacro ~= '' THEN DO
      EXAMINE(fmacro, stem.)
      IF stem.SIZE < 65536 THEN IF OPEN(fin, fmacro, 'Read') THEN DO
         mbody = READCH(fin, stem.SIZE)
         CLOSE(fin)
      END
   END
   fgroup = Filter.fltr.FilterTransfer
   ugroup = UPPER(fgroup)
   IF fgroup ~= '' & SYMBOL('Group.ITEM.ugroup') = 'LIT' & Prefs.PrefsGroupsOnDemand = 'TRUE' THEN
      CALL GroupCreate(fgroup)

   DO idx = 1 TO Group.0
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      DO msg = Group.mbox.0 TO 1 BY -1
         IF ~MessageScan(AddPart(Prefs.msgdir, Group.mbox.msg.FILE)) THEN DO
            match1 = FilterMatch(ftype1, fhead1, fbody1)
            match2 = FilterMatch(ftype2, fhead2, fbody2)
            IF match1 + match2 >= fandor THEN DO
               IF mbody ~= '' THEN
                  INTERPRET mbody
               IF fgroup ~= '' & SYMBOL('Group.ITEM.ugroup') = 'VAR' THEN
                  CALL MessageTransfer(idx, GroupIndex(fgroup), mbox, Group.ITEM.ugroup, msg)
            END
         END
      END
   END
RETURN


PurgeGroups: PROCEDURE EXPOSE Group. Prefs.

   CALL StatusWin_NewEvent("Purging groups:")
   month = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'
   days  = '000 031 059 090 120 151 181 212 243 273 304 334'

   today = DATE()
   PARSE VAR today dd mmm yyyy .
   today = RIGHT(yyyy, 2)*365 + SUBSTR(days, POS(mmm, month), 3) + dd

   count = 0
   DO idx = 1 TO Group.0
      name  = Group.idx
      uname = UPPER(name)
      mbox  = Group.ITEM.uname
      IF Group.mbox.GroupPersistence > 0 THEN DO
         DO msg = Group.mbox.0 TO 1 BY -1
            IF ~ABBREV(Group.mbox.msg, 'L') & (ABBREV(Group.mbox.msg, ' ') | Group.mbox.GroupKeepUnread = 'FALSE') THEN DO
               date = RIGHT(Group.mbox.msg, 7)
               IF date ~= "" THEN DO
                  PARSE VAR date dd +2 mmm +3 yy +2
                  day = yy*365 + SUBSTR(days, POS(mmm, month), 3) + dd
                  IF today < day THEN day = day + 100*365
                  IF today - day > Group.mbox.GroupPersistence THEN DO
                     CALL MessageRemove(idx, mbox, msg)
                     count = count + 1
                     IF count = 1 THEN CALL StatusWin_NewEvent(count "message removed.")
                                  ELSE CALL StatusWin_UpdateEvent(count "messages removed.")
                  END
               END
            END
         END
      END
   END
   IF count = 0 THEN CALL StatusWin_UpdateEvent("Purging groups done.")
RETURN


NicknameExpand: PROCEDURE EXPOSE Nickname. nickmembers.
PARSE ARG nick

   stack0 = 0
   DROP nickmembers.
   count = 0
   DO WHILE nick ~= ''
      PARSE VAR nick name ',' nick
      stack0 = stack0 + 1
      stack.stack0 = STRIP(name)
   END
   DO WHILE stack0 > 0
      name  = stack.stack0
      uname = UPPER(name)
      stack0 = stack0 - 1
      IF SYMBOL('nicklist.uname') = 'LIT' THEN DO
         nicklist.uname = 1
         IF SYMBOL('Nickname.ITEM.uname') = 'LIT' THEN DO
            IF LENGTH(nickmembers.count) > 900 | count = 0 THEN DO
               nickmembers.count = nickmembers.count','
               count = count + 1
               nickmembers.count = name
            END
            ELSE
               nickmembers.count = nickmembers.count','name
         END
         ELSE DO
            nick = Nickname.ITEM.uname
            IF Nickname.nick.Address.0 = 1 THEN DO
               stack0 = stack0 + 1
               uaddr  = UPPER(Nickname.nick.Address.1)
               IF SYMBOL('Nickname.ITEM.uaddr') = 'LIT' THEN
                  stack.stack0 = Nickname.nick.Address.1 '('name')'
               ELSE
                  stack.stack0 = Nickname.nick.Address.1
            END
            ELSE DO index = 1 TO Nickname.nick.Address.0
               stack0 = stack0 + 1
               stack.stack0 = Nickname.nick.Address.index
            END
         END
      END
   END
   nickmembers.0 = count
RETURN count


ConvertPrefs: PROCEDURE EXPOSE Prefs. PREFSVER PREFSREV
ARG ver, rev

   IF ver = 1 THEN DO
      IF rev = 0 THEN DO
         Prefs.PrefsLeaveMail = 'FALSE'
         rev = 1
      END
      IF rev = 1 THEN DO
         Prefs.PrefsEditorWin = 'TRUE'
         rev = 2
      END
      IF rev = 2 THEN DO
         Prefs.PrefsUUCmd = Prefs.PrefsUUCmd
         DROP Prefs.PrefsUUCmd
         CALL ScanSignatures
         CALL ScanDrivers
         CALL MenuSavePos_Select
         DeleteFile('ENVARC:NetMail/AboutWin')
         DeleteFile('ENVARC:NetMail/DestinationWin')
         DeleteFile('ENVARC:NetMail/EditorWin')
         DeleteFile('ENVARC:NetMail/FiltersWin')
         DeleteFile('ENVARC:NetMail/GroupsWin')
         DeleteFile('ENVARC:NetMail/MailWin')
         DeleteFile('ENVARC:NetMail/MessagesWin')
         DeleteFile('ENVARC:NetMail/NicknamesWin')
         DeleteFile('ENVARC:NetMail/PartsWin')
         DeleteFile('ENVARC:NetMail/Prefs1Win')
         DeleteFile('ENVARC:NetMail/Prefs2Win')
         DeleteFile('ENVARC:NetMail/Prefs3Win')
         DeleteFile('ENVARC:NetMail/ReaderWin')
         DeleteFile('ENVARC:NetMail/StatusWin')
         DeleteFile('ENVARC:NetMail/FromColumns')
         DeleteFile('ENVARC:NetMail/SubjectColumns')
         DeleteFile('ENVARC:NetMail/VisibleGroups')
         DeleteFile('ENVARC:NetMail/VisibleMessages')
         rev = 3
      END
      IF rev = 3 THEN DO
         Prefs.PrefsCaptureFilter = 'FALSE'
         Prefs.VisibleGroups   = GetVar('NetMail/VisibleGroups')
         Prefs.VisibleMessages = GetVar('NetMail/VisibleMessages')
         Prefs.SubjectColumns  = GetVar('NetMail/SubjectColumns')
         Prefs.FromColumns     = GetVar('NetMail/FromColumns')
         IF Prefs.VisibleGroups < 4   THEN Prefs.VisibleGroups = 5
         IF Prefs.VisibleMessages < 4 THEN Prefs.VisibleMessages = 7
         IF Prefs.SubjectColumns < 30 THEN Prefs.SubjectColumns = 35
         IF Prefs.FromColumns < 15    THEN Prefs.FromColumns = 20
         DeleteFile(AddPart(Prefs.envdir, 'FromColumns'))
         DeleteFile(AddPart(Prefs.envdir, 'SubjectColumns'))
         DeleteFile(AddPart(Prefs.envdir, 'VisibleGroups'))
         DeleteFile(AddPart(Prefs.envdir, 'VisibleMessages'))
         rev = 4
      END
      IF rev = 4 THEN DO
         DO index = 1 TO Prefs.Account.0
            Prefs.Account.index.PrefsOrganization = ''
         END
         rev = 5
      END
   END

   IF ver ~= PREFSVER | rev ~= PREFSREV THEN RETURN 1
RETURN 0


ConvertGroups: PROCEDURE EXPOSE Group. Prefs. GROUPVER GROUPREV
ARG ver, rev

   CALL StatusWin_NewEvent("Converting...")
   IF ver = 1 THEN DO
      IF rev = 0 THEN DO
         DO mbox = 1 TO Group.0
            DO msg = 1 TO Group.mbox.0
               CALL MessageScan(AddPart(Prefs.msgdir, Group.mbox.msg.FILE))

               header = 'DATE'
               IF SYMBOL('mail.header') = 'VAR' THEN DO
                  IF INDEX(mail.header, ',') > 0 THEN PARSE VAR mail.header ',' dd mm yyyy .
                                                 ELSE PARSE VAR mail.header dd mm yyyy .
                  IF DATATYPE(dd, 'N') THEN date = RIGHT('0'dd, 2) || mm || RIGHT(yyyy, 2)
                                       ELSE date = RIGHT('0'mm, 2) || dd || RIGHT(yyyy, 2)
               END
               ELSE
                  date = '       '

               header = 'FROM'
               PARSE VAR mail.header fname '<' faddr '>'
               IF faddr = "" THEN PARSE VAR mail.header faddr '(' fname ')'
               from = STRIP(fname)
               IF LEFT(from, 1) = '"' & RIGHT(from, 1) = '"' THEN PARSE VAR from '"' from '"'
               IF from = "" THEN from = STRIP(faddr)

               header = 'SUBJECT'
               IF SYMBOL('mail.header') = 'VAR' THEN subject = mail.header
                                                ELSE subject = ''

               Group.mbox.msg.MSG1 = LEFT(Group.mbox.msg, 1) subject
               Group.mbox.msg.MSG2 = LEFT(date, 7) from
            END
         END
         rev = 1
      END
      IF rev = 1 THEN DO
         DO mbox = 1 TO Group.0
            DO msg = 1 TO Group.mbox.0
               msgfile = AddPart(Prefs.msgdir, Group.mbox.msg.FILE)
               CALL MessageScan(msgfile)
               CALL MessageCache(msgfile)
            END
         END
         rev = 2
      END
   END

   IF ver ~= GROUPVER | rev ~= GROUPREV THEN RETURN 1
   CALL StatusWin_UpdateEvent("Convertion Done.")
RETURN 0


ConvertFilters: PROCEDURE EXPOSE Filter. Prefs. FILTERVER FILTERREV
ARG ver, rev

   CALL StatusWin_NewEvent("Converting...")

   IF ver = 1 THEN DO
      IF rev = 0 THEN DO
         DO fltr = 1 TO Filter.0
            Filter.fltr.FilterInOutMan = 'TRUE FALSE FALSE'
            Filter.fltr.FilterType1    = 'contains'
            Filter.fltr.FilterType2    = 'contains'
         END
         rev = 1
      END
      IF rev = 1 THEN DO
         DO fltr = 1 TO Filter.0
            Filter.fltr.FilterAndOr = 'and'
         END
         rev = 2
      END
   END

   IF ver ~= FILTERVER | rev ~= FILTERREV THEN RETURN 1
   CALL StatusWin_UpdateEvent("Convertion Done.")
RETURN 0


ConvertNicknames: PROCEDURE EXPOSE Nickname. Prefs. NICKVER NICKREV
ARG ver, rev

   CALL StatusWin_NewEvent("Converting...")

   IF ver ~= NICKVER | rev ~= NICKREV THEN RETURN 1
   CALL StatusWin_UpdateEvent("Convertion Done.")
RETURN 0


ScanSignatures: PROCEDURE EXPOSE Prefs.
   DROP Prefs.Signature.
   CALL ExAll(Prefs.sigdir, entries.)
   idx = 0
   DO index = 0 TO entries.count - 1
      IF RIGHT(entries.index.filename, 5) ~= '.info' THEN DO
         idx = idx + 1
         name                       = entries.index.filename
         uname                      = UPPER(name)
         Prefs.Signature.ITEM.uname = 1
         Prefs.Signature.idx        = name
      END
   END
   Prefs.Signature.0 = idx
RETURN

ScanDrivers: PROCEDURE EXPOSE Prefs.
   DROP Prefs.EditorItems Prefs.ReaderItems Prefs.SendItems Prefs.ReceiveItems
   DROP Prefs.EncoderItems Prefs.QuotedItems Prefs.Base64Items Prefs.UUItems
   Prefs.EditorItems  = "(VOID)"
   Prefs.ReaderItems  = "(VOID)"
   Prefs.SendItems    = "(VOID)"
   Prefs.ReceiveItems = "(VOID)"
   Prefs.EncoderItems = "(VOID)|MIME|UUencode"
   Prefs.QuotedItems  = "(VOID)"
   Prefs.Base64Items  = "(VOID)"
   Prefs.UUItems      = "(VOID)"
   CALL ExAll(Prefs.drvdir, entries.)
   DO index = 0 TO entries.count - 1
      ext = SUBSTR(entries.index.filename, LASTPOS('.', entries.index.filename))
      PARSE VAR entries.index.filename name (ext)
      SELECT
         WHEN ext = '.editor'  THEN Prefs.EditorItems  = Prefs.EditorItems'|'name
         WHEN ext = '.reader'  THEN Prefs.ReaderItems  = Prefs.ReaderItems'|'name
         WHEN ext = '.mailput' THEN Prefs.SendItems    = Prefs.SendItems'|'name
         WHEN ext = '.mailget' THEN Prefs.ReceiveItems = Prefs.ReceiveItems'|'name
         WHEN ext = '.encoder' THEN DO
            cmd = "CALL '"AddPart(Prefs.drvdir, entries.index.filename)"'"
            INTERPRET cmd '"Info"'
            info = UPPER(RESULT)

            DO WHILE info ~= ""
               PARSE VAR info encoder info
               SELECT
                  WHEN encoder = 'QUOTED-PRINTABLE' THEN Prefs.QuotedItems = Prefs.QuotedItems'|'name
                  WHEN encoder = 'BASE64'           THEN Prefs.Base64Items = Prefs.Base64Items'|'name
                  WHEN encoder = 'UUENCODE'         THEN Prefs.UUItems     = Prefs.UUItems'|'name
                  OTHERWISE
               END
            END
         END
         OTHERWISE
      END
   END
   IF LENGTH(Prefs.EditorItems) > 6  THEN Prefs.EditorItems  = SUBSTR(Prefs.EditorItems, 8)
   IF LENGTH(Prefs.ReaderItems) > 6  THEN Prefs.ReaderItems  = SUBSTR(Prefs.ReaderItems, 8)
   IF LENGTH(Prefs.SendItems) > 6    THEN Prefs.SendItems    = SUBSTR(Prefs.SendItems, 8)
   IF LENGTH(Prefs.ReceiveItems) > 6 THEN Prefs.ReceiveItems = SUBSTR(Prefs.ReceiveItems, 8)
   IF LENGTH(Prefs.EncoderItems) > 6 THEN Prefs.EncoderItems = SUBSTR(Prefs.EncoderItems, 8)
   IF LENGTH(Prefs.QuotedItems) > 6  THEN Prefs.QuotedItems  = SUBSTR(Prefs.QuotedItems, 8)
   IF LENGTH(Prefs.Base64Items) > 6  THEN Prefs.Base64Items  = SUBSTR(Prefs.Base64Items, 8)
   IF LENGTH(Prefs.UUItems) > 6      THEN Prefs.UUItems      = SUBSTR(Prefs.UUItems, 8)
RETURN
