{$R-,S-,I-,D-,F+,V-,B-,N-,L+,O+ }

unit bulletin;               (* Message Section for ViSiON *)

interface

uses crt,dos,windows,
gentypes,configrt,statret,gensubs,subs1,subs2,
userret,textret,mainr1,mainr2,overret1,flags,mainmenu,mycomman;

procedure bulletinmenu;

implementation

procedure bulletinmenu;
var q,curbul,lastreadnum:integer;
    b:bulrec;
    reading,quitmasterinc,cscan:boolean;

procedure readfromtext; forward;

  procedure togglecscan;
  begin
   if cscan then cscan:=false else
    cscan:=true;
   writeln;
   write (^R'Auto-Scan is now: '^S);
   if cscan then writeln ('On') else writeln ('Off');
   writeln;
  end;

  procedure makeboard; forward;

  function sponsoron:boolean;
  begin
    sponsoron:=match(curboard.sponsor,unam)
  end;

  procedure clearorder (var bo:boardorder);
  var cnt:integer;
  begin
    for cnt:=0 to 255 do bo[cnt]:=cnt
  end;

  procedure carryout (var bo:boardorder);
  var u:userrec;
      cnt,un:integer;

    procedure doone;
    var cnt,q:integer;
        ns,a1,a2:set of byte;
    begin
      fillchar (ns,32,0);
      fillchar (a1,32,0);
      fillchar (a2,32,0);
      for cnt:=0 to 255 do begin
        q:=bo[cnt];
        if q in u.newscanconfig then ns:=ns+[cnt];
        if q in u.access1 then a1:=a1+[cnt];
        if q in u.access2 then a2:=a2+[cnt]
      end;
      u.newscanconfig:=ns;
      u.access1:=a1;
      u.access2:=a2;
      seek (ufile,un);
      write (ufile,u)
    end;

  begin
    writeln (^B'Now Adjusting the Flags.....');
    seek (ufile,1);
    for un:=1 to numusers do begin
      if (un mod 10)=0 then write (' ',un);
      read (ufile,u);
      if length(u.handle)>0 then doone
    end
  end;

  procedure switchboards (bnum1,bnum2:integer; var bo:boardorder);
  var bd1,bd2:boardrec;
      n1:integer;
  begin
    seekbdfile (bnum1);
    read (bdfile,bd1);
    seekbdfile (bnum2);
    read (bdfile,bd2);
    seekbdfile (bnum1);
    writebdfile (bd2);
    seekbdfile (bnum2);
    writebdfile (bd1);
    n1:=bo[bnum1];
    bo[bnum1]:=bo[bnum2];
    bo[bnum2]:=n1
  end;

  procedure setfirstboard; forward;


  procedure seekbfile (n:integer);
  begin
    seek (bfile,n-1); che
  end;


  function numbuls:integer;
  begin
    numbuls:=filesize(bfile)
  end;

  procedure getlastreadnum;
  var oldb:boolean;
      b:bulrec;
      lr:word;
  begin
    lastreadnum:=numbuls;
    oldb:=false;
    lr:=urec.lastread[curboardnum+(50*(CurrentConference-1))];
    if lr=0
      then lastreadnum:=0
      else
        while (lastreadnum>0) and (not oldb) do begin
          seekbfile (lastreadnum);
          read (bfile,b);
          oldb:=b.id=lr;
          if not oldb then lastreadnum:=lastreadnum-1
        end;
        if (lastreadnum=0) then urec.lastread[curboardnum+(50*(currentconference-1))]:=0;
  end;

  procedure assignbfile;
  Var S:Mstr;
  begin
  close(bfile);
    S:=ConfigSet.BoardDi+CurBoardName;
    If CurrentConference=1 then S:=S+'.BUL'
       Else
    S:=S+'.BU'+Strr(CurrentConference);
    assign (bfile,s)
  end;

  procedure formatbfile;
  begin
    assignbfile;
    rewrite (bfile);
    curboardnum:=searchboard(curboardname);
    if curboardnum=-1 then begin
      curboardnum:=filesize(bdfile);
      fillchar (curboard,sizeof(curboard),0);
      writecurboard
    end
  end;

  procedure openbfile;
  var b:bulrec;
      i:integer;
  begin
    curboardnum:=searchboard (curboardname);
    if curboardnum=-1 then begin
      makeboard;
      exit
    end;
    close (bfile);
    assignbfile;
    reset (bfile);
    i:=ioresult;
    if ioresult<>0 then formatbfile;
    seekbdfile (curboardnum);
    read (bdfile,curboard);
    getlastreadnum;
  end;

  function boardexist(n:sstr):boolean;
  begin
    boardexist:=not (searchboard(n)=-1)
  end;

procedure addbul (var b:bulrec);
  var b2:bulrec;
  begin
    if numbuls=0 then b.id:=1 else begin
      seekbfile (numbuls);
      read (bfile,b2);
      if b2.id=65535
        then b.id:=1
        else b.id:=b2.id+1
    end;
    seekbfile (numbuls+1);
    write (bfile,b);
  end;

  function checkcurbul:boolean;
  begin
    if (curbul<1) or (curbul>numbuls) then begin
      checkcurbul:=false;
      curbul:=0
    end else checkcurbul:=true
  end;

  procedure getbrec;
  var n:integer;
      u:userrec;
  begin
    if checkcurbul then begin
      seekbfile (curbul);
      read (bfile,b); che;
      n:=lookupuser(b.leftby);
      b.status:='';
      if n>0 then begin
      seek(ufile,n);
      read(ufile,u);
      b.status:='['+u.usernote+']';
      end;
    end
  end;

  procedure delbul (bn:integer; deltext:boolean);
  var c,un:integer;
      b:bulrec;
      u:userrec;
  begin
    if (bn<1) or (bn>numbuls) then exit;
    seekbfile (bn);
    read (bfile,b);
    if deltext then deletetext (b.line);
    for c:=bn to numbuls-1 do begin
      seekbfile (c+1);
      read (bfile,b);
      seekbfile (c);
      write (bfile,b)
    end;
    seekbfile (numbuls);
    truncate (bfile);
    getlastreadnum
  end;

  procedure delboard (bdn:integer);
  var bd1:boardrec;
      cnt,nbds:integer;
      bo:boardorder;
  begin
    clearorder (bo);
    nbds:=filesize(bdfile)-1;
    if nbds=0 then begin
      close (bdfile);
      rewrite (bdfile);
      exit
    end;
    for cnt:=bdn to nbds-1 do begin
      seekbdfile (cnt+1);
      read (bdfile,bd1);
      seekbdfile (cnt);
      writebdfile (bd1);
      bo[cnt]:=cnt+1
    end;
    seek (bdfile,nbds);
    truncate (bdfile);
    seek (bifile,nbds);
    truncate (bifile);
    carryout (bo)
  end;


  procedure getbnum (txt:mstr);
  var q:boolean;
  begin
    if length(input)>1
      then curbul:=valu(copy(input,2,255))
      else begin
        writestr (^M'Message to '+txt+':');
        curbul:=valu(input)
      end;
    q:=checkcurbul
  end;

procedure killbul;
  var un:integer;
      u:userrec;
  begin
    writehdr ('Message Deletion');
    if not reading then
    getbnum ('delete');
    if not checkcurbul then exit;
    getbrec;
    if (not match(b.leftby,unam)) and (not issysop) and (not sponsoron)
      then begin
        writeln ('Hey You didnt post that!');
        exit
      end;
    writeln ('Subject: ',b.title,
           ^M'Left by: ',b.leftby,^M^M);
    writestr ('Delete this? *');
    if not yes then exit;
    un:=lookupuser (b.leftby);
    if un<>0 then begin
      writeurec;
      seek (ufile,un);
      read (ufile,u);
      u.nbu:=u.nbu-1;
      seek (ufile,un);
      write (ufile,u);
      readurec
    end;
    delbul (curbul,true);
    writeln ('Message deleted.');
    writelog (4,5,b.title)
  end;

  procedure autodelete;
  var c,un,bn,cnt:integer;
      B:bulrec;
      u:userrec;
  begin
    bn:=2;
    if (bn<1) or (bn>numbuls) then exit;
    writeln (^R^A'Please wait... Deleting first 5 messages..');
    for cnt:=6 downto 2 do begin
     {delbul (cnt,true) }
    seekbfile(cnt);
    read(bfile,b);
    deletetext(b.line);
    end;
    for c:=bn to numbuls-5 do begin
    seekbfile(c+5);
    read(bfile,b);
    seekbfile(c);
    write(bfile,b);
    end;
    seekbfile(numbuls-4);
    truncate(bfile);
    getlastreadnum;
    end;



  function wipe(amount:byte):string;
  var z:integer;
      gee:string[80];
   begin
   for z:=1 to amount do gee:=gee+' ';
   wipe:=gee;
   end;

  procedure postbul;
  var l:integer;
      m:message;
      b:bulrec;
      ds:longint;
  begin
    if ulvl<configset.postleve then begin
      reqlevel(configset.postleve);
      exit
    end;
    l:=editor(m,true,true,'0','0');
    if l>=0 then
      begin
        inc(urec.nbu);
        writeurec;
        b.Where:=Configset.Origin1;
        B.Where2:=Configset.Origin2;
        B.Version:=NetMailVer;
        B.Cnet:=False;
        B.FidoNet:=False;
        B.Flag3:=False;
        B.Flag4:=False;
        B.Flag5:=False;
        B.Flag6:=False;
        B.Flag7:=False;
        B.Flag8:=False;
        B.RealName:=Urec.RealName;
        b.anon:=m.anon;
        b.title:=m.title;
        b.when:=now;
        b.leftby:=unam;
        b.status:='[ ha ]';
        b.recieved:=false;
        b.leftto:=m.sendto;
        b.line:=l;
        b.plevel:=ulvl;
        addbul (b);
        inc(newposts);
        inc(gnup);
        with curboard do
          if autodel<=numbuls then autodelete
      end
  end;

  procedure readcurbul;
  var q:anystr;
      t:sstr;
      cnt,emusux,anarkyamerika:integer;
      oligarch:mstr;
  begin
    q:=wipe(80);
    if checkcurbul then begin
     getbrec;
     If (ansigraphics in urec.config) and (urec.msgheader=2) then begin
      clearscr;
      WriteLn(^O'ΥΝΝ['^P'Msg'^O' -       ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ['^P'When:'^O'       ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΈ');
      oligarch:=^S+strr(curbul)+' of '+strr(numbuls)+^O']';
      printxy(1,11,oligarch+^M);
      WriteLn(^O'³'^P' Title'^O':'^P'                               To'^O':                                  ³');
      if issysop or (not b.anon) then
      printxy(1,53,^S+datestr(b.when)+^R' at '^S+timestr(b.when)+^O']');
      printxy(2,10,^S+b.title);
      printxy(2,44,^S+b.leftto+^M);
      WriteLn(^O'³'^P' From'^O' :                                                                    '^O'³');
      q:='';
      if b.anon then
          begin
            q:=q+configset.anonymousst;
            if (issysop) or (ulvl>=configset.sysopleve) then q:=q+' ['+^A+b.leftby+^S+']'
          end
        else
          begin
            if b.plevel=-1
              then t:='unknown'
              else t:=strr(b.plevel);
           q:=q+b.leftby+' '^S'(Level '^P+t+^S') '+b.status;
          end;
      printxy(3,10,q+^M);
      WriteLn(^O'ΤΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΎ');
      EnD Else Begin
      clearscr;
      Writeln(^A'Sub-Board'^R': '^S,curboard.boardname);
      write   (^B^M^A'['^F'Message'^A']'^R': '^S);
      oligarch:=^S+strr(curbul)+' '^S' of '+strr(numbuls);
      writeln (oligarch);
      writeln (^A'['^F'When'^A'   ]'^R': '^S,datestr(b.when),' at ',timestr(b.when),^R);
      writeln (^A'['^F'Subject'^A']'^R': '^S,b.title);
      write   (^A'['^F'To'^A'     ]'^R': '^S,b.leftto);
      if (b.recieved) then begin
      for anarkyamerika:=1 to 25-(length(b.leftto)+3) do
      write (' ');
       write (^R'['^A'Received'^R']'^R);
       end;
       writeln;
      q:=^A'['^F'From'^A'   ]'^R': '^S;
      if b.anon then
      begin
      q:=q+configset.anonymousst;
      if (issysop) or (ulvl>=configset.sysopleve) then q:=q+' ['+^A+b.leftby+^S+']'
      end
      else
      begin
      if b.plevel=-1
      then t:='unknown'
      else t:=strr(b.plevel);
      q:=q+b.leftby;
           if urec.level>=b.plevel then q:=q+' '+^R+'['^S'Level '+^F+t+^R+'] '+^S else q:=q+' <Classified> ';
	   q:=q+b.status;
	   end;
	   writeln (q);
      End;
      ansicolor(urec.regularcolor);
      if break then exit;
      printtext (b.line);
      If Curboard.Echo>0 then WriteLn(^P'['^A'Net Origin: '+B.Where+^P']'^M'['^A+B.Where2+^P']'^M);
      if match (b.leftto,unam) then begin
       b.recieved:=true;
       seekbfile (curbul);
       write (bfile,b);
      end;
      ansicolor (urec.regularcolor);
    end;
    begin
      if (urec.lastread[curboardnum+(50*(currentconference-1))]<=b.id) or (curbul>=lastreadnum) then
      urec.lastread[curboardnum+(50*(CurrentConference-1))]:=b.id;
      if lastreadnum<curbul then lastreadnum:=curbul;
    end
  end;

  function queryaccess:accesstype;
  begin
    queryaccess:=getuseraccflag (urec,curboardnum)
  end;

  procedure readbul;
  begin
    getbnum ('Read');
    readcurbul
  end;

  procedure readnextbul;
  var t:integer;
  begin
    t:=curbul;
    inc(curbul);
    readcurbul;
    if curbul=0 then curbul:=t
  end;

  procedure readnum (n:integer);
  begin
    curbul:=n;
    readcurbul
  end;

  function haveaccess (n:integer):boolean;
  var a:accesstype;
  begin
    curboardnum:=n;
    seekbdfile (n);
    read (bdfile,curboard);
    a:=queryaccess;
    if curboard.conference>0 then begin
       haveaccess:=false;
       if urec.confset[curboard.conference]>0 then haveaccess:=true;
     exit;
    end;
    if a=bylevel
      then haveaccess:=ulvl>=curboard.level
      else haveaccess:=a=letin
  end;

  procedure makeboard;
  begin
    formatbfile;
    If FileSize(BDfile)=51 then Begin
       WriteLn('You may not have more then 51 message areas per conference!');
       Exit;
    End;
    with curboard do begin
      shortname:=curboardname;
      WriteHdr('Creating Sub-Board: '+shortname);
      buflen:=30;
      writestr (^M^R'Board Name'^A': &');
      boardname:=input;
      buflen:=30;
      writestr (^R'Sponsor '^F'['^S'CR/'+unam+^F']'^A':');
      if input='' then input:=unam;
      sponsor:=input;
      writestr(^R'Area Flag '^F'('^S'1-30'^F') ['^S'CR/None'^F']'^A':');
      if input='' then input:='0';
      conference:=valu(input);
      writestr (^R'Minimum Level for entry'^A':');
      level:=valu(input);
      writestr (^R'Autodelete after '^F'['^S'CR/100'^F']'^A':');
      if length(input)<1 then input:='100';
      autodel:=valu(input);
      if autodel<10 then begin
        writeln ('Must be at least 10!');
        autodel:=10
      end;
      WriteStr(^R'Is this a Net-Mail Sub? '^F'['^S'N'^F']'^A':*');
        If yes then begin
      WriteStr(^R'EchoMail ID Number '^F'('^S'0=None'^F') ['^S'0'^F']'^A':');
      if Input='' then input:='0';
      echo:=Valu(Input);
        end else echo:=0;
      setallflags (curboardnum,bylevel);
      writecurboard;
      writeln (^M^U'Board created!');
      writelog (4,4,boardname+' ['+shortname+']')
    end
  end;

  Procedure Sdw;
  Begin
  ansicolor(8);
  WriteLn('Ϋ');
  end;

 procedure setactive (nn:sstr);

    procedure doswitch;
    begin
      openbfile;
      curbul:=lastreadnum;
      with curboard do
     begin
      curbul:=lastreadnum;
      with curboard do
      if not (ansigraphics in urec.config) then  writeln (^M'Sub-board: '^S,boardname,
                 ^M'Sponsor:   '^S,sponsor,
                 ^M'Bulletins: '^S,numbuls,
                 ^M'Last read: '^S,lastreadnum,^M)
           else begin
                clearscr;
writeln(^R'                      ΥΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΈ');
write(^R'                      ³'^P' Sub:                              '^R'  ³');sdw;
write(^R'                      ΤΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΎ');sdw;
write(^R'                      ΥΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΈ');sdw;
write(^R'                      ³'^P' Messages'^A'....'^R'                        ³');sdw;
write(^R'                      ³'^P' Last Read'^A'...'^R'                        ³');sdw;
write(^R'                      ³'^P' Sponsor'^A'.....'^R'                        ³');sdw;
write(^R'                      ³'^P' Posts by You'^R'                        ³');sdw;
write(^R'                      ³'^P' Date/Time'^A'...'^R'                        ³');sdw;
write(^R'                      ΤΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΎ');sdw;ANSiColoR(8);
WriteLn('                         ίίίίίίίίίίίίίίίίίίίίίίίίίίίίίίίίίίίίί');ANsiColor(urec.regularcolor);
printxy(2,30,curboard.boardname);
printxy(5,38,strr(numbuls));
printxy(6,38,strr(lastreadnum));
printxy(7,38,Curboard.sponsor);
printxy(8,38,strr(urec.nbu));
PrintXy(9,38,DateStr(Now)+' - '+TimeStr(Now)+^M^M^M);
End;
end;
End;



    procedure tryswitch;
    var n,s:integer;

      procedure denyaccess;
      var b:bulrec;
      begin
        writeln(^M^P'Invalid Board!'^G);
        setfirstboard
      end;

    begin
      curboardname:=nn;
      curboardnum:=searchboard(nn);
      if haveaccess(curboardnum)
        then doswitch
        else denyaccess
    end;

  var b:bulrec;
  begin
    curbul:=0;
    close (bfile);
    curboardname:=nn;
    if boardexist(nn) then tryswitch else begin
      writeln ('No such board: ',curboardname,'!');
      if issysop
        then
          begin
            writestr (^M'Create one [y/n]? *');
            if yes
              then
                begin
                  makeboard;
                  setactive (curboardname)
                end
              else setfirstboard
          end
        else setfirstboard
    end
  end;

  function validbname (n:sstr):boolean;
  var cnt:integer;
  begin
    validbname:=false;
    if (length(n)=0) or (length(n)>8) then exit;
    for cnt:=1 to length(n) do
      if not (upcase(n[cnt]) in ['0'..'9','A'..'Z']) then exit;
    validbname:=true
  end;

  procedure listboards;
  var cnt,oldcurboard:integer;
      printed:boolean;
  begin
    oldcurboard:=curboardnum;
    clearscr;writehdr(' Message Areas ');
   writeln(^R'ΥΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΈ');
   writeln(^R'³ '^P'Number      Sub-Board Name                 Level/Conference'^R' ³');
   writeln(^R'ΖΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ΅');
    if break then exit;
    for cnt:=0 to filesize(bdfile)-1 do
      if haveaccess(cnt) then
        with curboard do begin
        write(^R'³ ');
          tab (^U+shortname,11); write('  ');
          tab (^A+boardname,31); write('  ');
          if (conference>0) then tab(^R'Conference '^S+strr(conference),18) else
          tab(^S+strr(level),17);
           writeln(^R'³');
          if break then exit
        end;
   writeln(^R'ΤΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΎ'^M);
    curboardnum:=oldcurboard;
    seekbdfile (curboardnum);
    read (bdfile,curboard)
  end;


  procedure activeboard;
  begin
    if length(input)>1
      then input:=copy(input,2,255)
      else begin
        listboards;
        repeat
          writestr (^M^M^P'Board Number '^S'['^F'?'^A'/'^F'List'^S']'^P':');
          if input='?' then listboards
        until (input<>'?') or hungupon;
      end;
    if hungupon or (length(input)=0) then exit;
    if input[1]='*' then input:=copy(input,2,255);
    if validbname(input)
      then setactive (input)
      else
        begin
          writeln (^M'Invalid board name!');
          setfirstboard
        end
  end;

  procedure setfirstboard; { FORWARD }
  var fbn:sstr;
  begin
    if filesize(bdfile)=0 then exit;
    if not haveaccess(0)
      then error ('Sorry user cannot access first sub board!','','');
    seek (bifile,0);
    read (bifile,fbn);
    setactive (fbn)
  end;

  procedure listbuls;
  var cnt,bn:integer;
      q:boolean;
  begin
    if length(input)>1 then begin
      curbul:=valu(copy(input,2,255));
      q:=checkcurbul
    end;
    if curbul=0
      then
        begin
          writestr (^M'List titles starting at #*');
          curbul:=valu(input)
        end
      else
        if length(input)>1
          then curbul:=valu(input)
          else curbul:=curbul+10;
    if not checkcurbul then curbul:=1;
    writeln ('Titles:'^M);
    for cnt:=0 to 9 do
      begin
        bn:=curbul+cnt;
        if (bn>0) and (bn<=numbuls) then
          begin
            seekbfile (bn);
            read (bfile,b);
            write (bn,'. '^S,b.title,^R' by ');
            if b.anon
              then writeln (configset.anonymousst)
              else writeln (b.leftby);
            if break then exit
          end
      end
  end;

  procedure editbul;
  var me:message;
  begin
    getbnum ('edit');
    if not checkcurbul then exit;
    getbrec;
    if (not match(b.leftby,unam)) and (not issysop) and (not sponsoron)
      then begin
        writeln ('You can not edit a message you didn''t post!');
        exit
      end;
    reloadtext (b.line,me);
    me.title:=b.title;
    me.anon:=b.anon;
    me.sendto:=b.leftto;
    if reedit (me,true) then begin
      writelog (4,6,b.title);
      deletetext (b.line);
      b.line:=maketext (me);
      if b.line<0 then begin
        writestr (^M'Deleting bulletin...');
        delbul (curbul,false)
      end else begin
        seekbfile (curbul);
        write (bfile,b)
      end
    end
  end;


  procedure sendbreply;
  begin
    if checkcurbul then begin
      getbrec;
      sendmailto (b.leftby,b.anon)
    end else begin
      getbnum ('reply to');
      if checkcurbul then sendbreply
    end
  end;

procedure uploadfile;
  var f:text;
      b:bulrec;
      me:message;
      tu:mstr;
      sub,ls:lstr;
      lne:integer;
  begin
    writeln(^M^S'Message Upload Via Z-Modem.'^M);
    writestr(^M^P'Subject'^A':*');
    if input='' then exit;
    sub:=input;
    writestr(^R'Post to ['^A'CR'^R'/'^S'All'^R']:*');
    if input='' then input:='All';
    tu:=input;
    writeln(^M^S'Ready to receive via Z-Modem Upload!');
    assign(f,configset.forumdi+'Message.Xyz');
    if exist(configset.forumdi+'Message.Xyz') then erase(f);
    delay(500);
    exec('DSZ.COM',' port '+strlong(configset.useco)+' speed '+strlong(baudrate)+' rz '+configset.forumdi+'Message.Xyz');
    if dosexitcode<>0 then begin
       writeln(^G^G'Aborted!');
       if exist(configset.forumdi+'Message.Xyz') then erase(f);
       exit;
    end;
    lne:=0;
    reset(f);
    while not eof(f) do begin
      readln(f,ls);
      inc(lne);
      if lne>100 then begin
        Writeln(^G^G^G^S'You may NOT have more then 100 lines in a message!');
        textclose(f);
        erase(f);
        exit;
      end;
      me.text[lne]:=ls;
    end;
    me.anon:=false;
    me.numlines:=lne;
    me.sendto:=tu;
    me.note:=urec.usernote;
    lne:=maketext(me);
    b.anon:=false;
    b.title:=sub;
    B.Where:=Configset.origin1;
    B.Where2:=Configset.origin2;
    B.Version:=NetMailVer;
    B.Cnet:=False;
    B.FidoNet:=False;
    B.Flag3:=False;
    B.Flag4:=False;
    B.Flag5:=False;
    B.Flag6:=False;
    B.Flag7:=False;
    B.Flag8:=False;
    B.RealName:=Urec.RealName;
    b.when:=now;
    b.leftby:=unam;
    b.status:='[ ha ]';
    b.recieved:=false;
    b.leftto:=tu;
    b.line:=lne;
    b.plevel:=ulvl;
    addbul(b);
    inc(newposts);
    inc(gnup);
    with curboard do if autodel<=numbuls then autodelete;
    writeln(^M^S'Message posted!');
  end;

  procedure boardsponsor;

    procedure getbgen (txt:mstr; var q);
    var s:lstr absolute q;
    begin
      writeln (^B'Current ',txt,': ',s);
      buflen:=30;
      writestr ('Enter new '+txt+': &');
      if length(input)>0 then s:=input
    end;

    procedure getbint (txt:mstr; var i:integer);
    var a:anystr;
    begin
      a:=strr(i);
      getbgen (txt,a);
      i:=valu(a);
      writecurboard
    end;

    procedure getbstr (txt:mstr; var q);
    begin
      getbgen (txt,q);
      writecurboard
    end;

    procedure setacc (ac:accesstype; un:integer);
    var u:userrec;
    begin
      seek (ufile,un);
      read (ufile,u);
      setuseraccflag (u,curboardnum,ac);
      seek (ufile,un);
      write (ufile,u)
    end;

    function queryacc (un:integer):accesstype;
    var u:userrec;
    begin
      seek (ufile,un);
      read (ufile,u);
      queryacc:=getuseraccflag (u,curboardnum)
    end;

    procedure setnameaccess;
    var un,n:integer;
        ac:accesstype;
        q,unm:mstr;
    begin
      writestr (^M'Change Access for User:');
      un:=lookupuser(input);
      if un=0 then begin
        writeln ('No such user!');
        exit
      end;
      unm:=input;
      ac:=queryacc(un);
      writeln (^B^M'Current access: ',accessstr[ac]);
      getacflag (ac,q);
      if ac=invalid then exit;
      if un=unum then writeurec;
      setacc (ac,un);
      if un=unum then readurec;
      case ac of
        letin:n:=1;
        keepout:n:=2;
        bylevel:n:=3
      end;
      writelog (5,n,unm)
    end;

    procedure setallaccess;
    var cnt:integer;
        ac:accesstype;
        q:mstr;
    begin
      writehdr ('Set Everyone''s Access');
      getacflag (ac,q);
      if ac=invalid then exit;
      writeurec;
      setallflags (curboardnum,ac);
      readurec;
      writeln ('Done.');
      writelog (5,4,accessstr[ac])
    end;

    procedure listaccess;

      procedure listacc (all:boolean);
      var cnt:integer;
          a:accesstype;
          u:userrec;

        procedure writeuser;
        begin
          if all
            then
              begin
                tab (u.handle,30);
                if a=bylevel
                  then writeln ('Level='+strr(u.level))
                  else writeln ('Let in')
              end
            else writeln (u.handle)
        end;

      begin
        seek (ufile,1);
        for cnt:=1 to numusers do begin
          read (ufile,u);
          if curboard.conference=0 then Begin
          a:=getuseraccflag (u,curboardnum);
          case a of
            letin:writeuser;
            bylevel:if all and (u.level>=curboard.level) then writeuser
          end;
          end Else If U.ConfSet[Curboard.Conference]>0 then WriteUser;
          if break then exit
        end
      end;

    begin
      writestr (
'List [A]ll users who have access, or only those with [S]pecial access? *');
      if length(input)=0 then exit;
      case upcase(input[1]) of
        'A':listacc (true);
        'S':listacc (false)
      end
    end;

    procedure getblevel;
    var b:bulrec;
    begin
      getbint ('level',curboard.level);
      writelog (5,12,strr(curboard.level))
    end;

   procedure setanon;
   var b:bulrec;
   begin
     writestr ('Which Conference [0]: *');
     if input='' then input:='0';
     curboard.conference:=valu(input);
     writecurboard;
   end;

   procedure getautodel;
    var b:bulrec;
    begin
      with curboard do begin
        getbint ('auto-delete',autodel);
        if autodel<10
          then
            begin
              writeln (^B'HEY!  It can''t be less than ten!');
              autodel:=numbuls+1;
              if autodel<10 then autodel:=10;
              writeln (^B'Setting autodelete to ',autodel);
              writecurboard
            end
          else
            if autodel<=numbuls
              then
                begin
                  writeln (^B'Deleting bulletins...');
                  while autodel<=numbuls do delbul (2,true)
                end
      end;
      writelog (5,11,strr(curboard.autodel))
    end;


    procedure movebulletin;
    var b:bulrec;
        tcb:boardrec;
        tcbn,dbn,bnum:integer;
        tcbname,dbname:sstr;
    begin
      writehdr ('Message Move');
      getbnum ('move');
      if not checkcurbul then exit;
      bnum:=curbul;
      seekbfile (bnum);
      read (bfile,b);
      writestr ('Move "'+b.title+'" posted by '+b.leftby+
        ' to which board? *');
      if length(input)=0 then exit;
      tcbname:=curboardname;
      dbname:=input;
      dbn:=searchboard(dbname);
      if dbn=-1 then begin
        writeln ('No such board!');
        exit
      end;
      writeln ('Moving...');
      delbul (bnum,false);
      close (bfile);
      curboardname:=dbname;
      openbfile;
      addbul (b);
      close (bfile);
      curboardname:=tcbname;
      openbfile;
      writelog (5,13,b.title);
      writeln (^B'Done!')
    end;


    procedure setsponsor;
    var un:integer;
        b:bulrec;
    begin
      writestr ('New sponsor:');
      if length(input)=0 then exit;
      un:=lookupuser (input);
      if un=0
        then writeln ('No such user.')
        else
          begin
            curboard.sponsor:=input;
            writelog (5,8,input);
            writecurboard
          end
    end;

    procedure renameboard;
    var sn:sstr;
        nfp,nbf,nff:lstr;
        qf:file;
       q,d:integer;
    begin
     repeat
            clearscr;
            sn:=curboard.shortname;
            writehdr('Sub-Board Rename');
            writeln(^R'1) Area Name            : '^S,curboard.boardname);
            writeln(^R'2) Echo Mail Conference : '^S,Curboard.Echo);
            write(^R'3) Area Flag Number     : '^S); if curboard.conference=0 then writeln('None') else
            writeln(curboard.conference);
            writeln(^R'4) Access Level         : '^S,curboard.level);
            writeln(^R'5) Access Name/Number   : '^S,curboard.shortname);
            writeln(^R'6) Maximum messages     : '^S,curboard.autodel);
            writeln(^R'7) Sponsor              : '^S,curboard.sponsor);
            writestr(^M'Number to change or [X] to exit : [X]:');
            if match(input,'X') or (input='') then input:='100';
            q:=valu(input);
            case q of
            1:begin getbstr ('Board Name',curboard.boardname);
                    sn:=curboard.shortname;
                    end;
            2:begin
                   WriteStr(^M'Echo Conference (0=None): [0]:');
                   if input='' then input:='0';
                   Curboard.Echo:=Valu(Input);
               end;
            3:begin
                  writestr(^M'Current Conference :'+strr(curboard.conference)+^M'New conference, [Ret=No Change]:');
                  if input='' then input:=strr(curboard.conference);
                  curboard.conference:=valu(input);
                  end;
            6:getautodel;
            7:setsponsor;
            4:begin
                    writestr(^M'Current Access Level :'+strr(curboard.level)+^M'New Level [Ret=No Change]:');
                    if input='' then input:=strr(curboard.level);
                    curboard.level:=valu(input);
                    end;
            5:begin
                  writeln;
                   getbgen ('Access Name/Number',sn);
                   writelog (5,5,curboard.boardname+' ['+sn+']');
                   if not validbname(sn) then begin
                   writeln ('Invalid board name!');
                   end else
                   if boardexist(sn) then begin
                    writeln ('Sorry!  Board already exists!');
                    end else
                    curboard.shortname:=sn;
            end;
     end
     until (q=100) or hungupon;
      writecurboard;
      close (bfile);
      nfp:=configset.boarddi+curboard.shortname+'.';
      If CurrentConference=1 then nbf:=nfp+'BUL'
      Else
        Nbf:=Nfp+'BU'+Strr(CurrentConference);
      if not exist(nbf) then
      rename (bfile,nbf);
      close(bfile); assign(bfile,nbf); reset(bfile);
      q:=9
    end;

    procedure killboard;
    var cnt:integer;
        f:file;
        bd:boardrec;
    begin
      writestr ('Kill Board - You sure [y/n]? *');
      if not yes then exit;
      writelog (5,10,'');
      writeln (^B^M'Deleting messages...');
      for cnt:=numbuls downto 1 do
        begin
          delbul(cnt,true);
          write (cnt,' ');
        end;
      writeln (^B^M'Deleting sub-board files...');
      close (bfile);
      assignbfile;
      erase (bfile);
      if ioresult<>0 then writeln (^B'Error erasing board file.');
      writeln (^M'Removing sub-board...');
      delboard (curboardnum);
      writeln (^B'Sub-board erased!');
      setfirstboard;
      q:=9
    end;

    procedure sortboards;
    var cnt,mark,temp:integer;
        bd1,bd2:boardrec;
        bn1,bn2:sstr;
        bo:boardorder;
    begin
      writestr ('Sort sub-boards: Are you sure? *');
      if not yes then exit;
      clearorder (bo);
      mark:=filesize(bdfile)-1;
      repeat
        if mark<>0 then begin
          temp:=mark;
          mark:=0;
          for cnt:=0 to temp-1 do begin
            seek (bifile,cnt);
            read (bifile,bn1);
            read (bifile,bn2);
            if upstring(bn1)>upstring(bn2) then begin
              mark:=cnt;
              switchboards (cnt,cnt+1,bo)
            end
          end
        end
      until mark=0;
      carryout (bo);
      writelog (5,16,'');
      setfirstboard;
      q:=9
    end;

    procedure orderboards;
    var numb,curb,newb:integer;
        bo:boardorder;
     label exit;

    begin
      clearorder (bo);
      writehdr ('Re-order sub-boards');
      numb:=filesize (bdfile);
      thereare (numb,'sub-board','sub-boards');
      for curb:=0 to numb-2 do begin
        repeat
          writestr ('New Board #'+strr(curb+1)+' [?/List, CR/Quit]:');
          if length(input)=0 then goto exit;
          if input='?'
            then
              begin
                listboards;
                newb:=-1
              end
            else
              begin
                newb:=searchboard(input);
                if newb<0 then writeln ('Not found!  Please re-enter...')
              end
        until (newb>=0);
        switchboards (curb,newb,bo)
      end;
      exit:
      carryout (bo);
      writelog (5,14,'');
      q:=9;
      setfirstboard
    end;

  begin
    if (not sponsoron) and (not issysop) then begin
			writeln ('Nice try, but you aren''t the sponsor.');
			inc(hackattempts);
			DoHackShit;
      exit
    end;
    writelog (4,3,curboard.boardname+' ['+curboard.shortname+']');
    repeat
      q:=menu ('Message Bases Sponsor','SPONSOR','DLSTMWUEQRKCNBOVH!');
      case q of                                               (* |  |  *)
        1:getautodel;
        2:getblevel;
        3:setsponsor;
        4,5,6,16:writeln(^M^S'Function Removed.');
        7:setnameaccess;
        8:setallaccess;
        10:renameboard;
        11:killboard;
        12:sortboards;
        13:movebulletin;
        14:orderboards;
        15:listaccess;
        18:readfromtext;
        17:help ('Sponsor.Hlp');
      end
    until (q=9) or hungupon
  end;

  var beenaborted:boolean;

  function aborted:boolean;
  begin
    if beenaborted then begin
      aborted:=true;
      exit
    end;
    aborted:=xpressed or hungupon;
    if xpressed then begin
      beenaborted:=true;
      writeln (^B'Message Newscan Aborted!')
    end
  end;

  Function capfir(inString:STRING):char;
 begin
   capfir:=upcase(inString[1]);
 end;


  function forwardbackthread(search:lstr; forard:boolean):boolean;
  var Done:Boolean;
      old:word;
      cnt:integer;

      function matched(se:lstr):Boolean;
      Begin
        Matched:=Pos(Search,UpString(Se))>0;
      End;

      procedure stripsearch;
      Begin
        If pos(' [Reply',search)>0 then Search:=Copy(Search,1,pos(' [Reply',search)-1);
        Search:=UpString(Search);
      End;

      Begin
        StripSearch;
        Done:=False;
        Old:=CurBul;
        if forard then
            Repeat
              inc(curbul);
              getbrec;
              if matched(b.title) then done:=true;
            until Done or (curbul>=numbuls)
            else
             Repeat
               dec(curbul);
               getbrec;
               if matched(b.title) then done:=true;
             until done or (curbul<=1);
        if not done then curbul:=old;
        forwardbackthread:=done;
      end;

  procedure newscanboard;

    function getnumnum(title:lstr):integer;
var reprep      :byte;
    startpoint  :byte;
    endpoint    :byte;
    a           :string[1];
begin
   reprep    :=79;
   startpoint:=0;
   endpoint  :=0;
   getnumnum :=0;
  repeat
   a:=copy (title,reprep,1);
   if a='#' then
     begin;
       startpoint:=reprep;
         repeat
           if valu(copy(title,reprep,1))>0 then endpoint:=reprep;
           inc(reprep);
         until (reprep>=79);
     end;
   if (startpoint>0) and (endpoint>0) then
      begin
        dec(endpoint,startpoint);
        getnumnum:=valu(copy(title,startpoint+1,endpoint));
        exit;
      end;
    dec(reprep);
  until reprep<=0
end;

function gettitle(title:lstr;reply:word):lstr;
var search   :boolean;
    srcstr   :sstr;
    cursrc   :word;
    tit      :lstr;
begin

   srcstr  :=' [Reply #';
   search  :=false;
   tit     :='';
   cursrc  :=0;

   repeat
    if copy(title,cursrc,length(srcstr))=srcstr then
      begin;
        tit:=copy(title,1,cursrc-1);
        gettitle:=tit+' [Reply #'+strr(reply)+']';
        exit;
      end;

    if cursrc=79 then
      begin
        gettitle:=title+' [Reply #'+strr(reply)+']';
        exit;
      end;
    inc(cursrc);
   until cursrc=80;
end;


  var newmsgs,oldb:boolean;
      tt:text;
      q:anystr;
      wock:char;
      wock2:word;
      m,me:message;
      l,stonerslive,swash,kook:integer;
      t:sstr;
      fcpiskool:mstr;
      repnumber:word;
      lameo    :string;
  begin
    beenaborted:=false;
    newmsgs:=false;
    curbul:=lastreadnum+1;
    while curbul<=numbuls do begin
      getbrec;
        readnum (curbul);
        newmsgs:=true;
      repeat
       wock:='N';
       If (TimeLeft<1) and Not Local then
         Begin
            PrintFile(ConfigSet.TextFileDi+'TimesUp');
            ForceHangup:=True;
            Exit;
         End;
       writestr (^P'['^A'Newscanning '^R'- '+curboard.boardname+^P'] - ['^S+strr(curbul)+'/'+strr(numbuls)+^R' ?/Help'^P']:*');
       if length(input)<1 then input:='N';
       wock:=upcase(input[1]);
       wock2:=valu(input);
       if wock2>0 then begin
        if wock2<=numbuls then begin
         curbul:=wock2;
         readnum (curbul);
        end;
       end else
        wock:=upcase(wock);
        case wock of
        'F':If not forwardbackthread(b.title,true) then WriteLn(^M^G^S'No Forward thread found!')
            else
              Begin
               getbrec;
               readnum(curbul);
              end;
        'B':If not forwardbackthread(b.title,false) then WriteLn(^M^G^S'No backward thread found!')
            else
              Begin
                GetBrec;
                ReadNum(CurBul);
              End;
         '?':begin
              writeln;
              writeln (^S'                 -Newscan Help-'^R^M);
              writeln ('[N]: Next Message          [#]: Read that Message #');
              writeln ('[A]: Read Message Again    [R]: Reply to Message');
              writeln ('[D]: Delete Message        [P]: Post a Message');
              writeln ('[S]: Next Sub-board        [/]: Toggle Auto-Scan');
              writeln ('[B]: Backwards Thread      [F]: Forward thread');
              if (match(unam,b.leftby)) or (issysop) or (sponsoron)
              then write ('[E]: Edit Message          ');
              writeln ('[Q]: Quit Newscan');
              writeln;
             end;
				 'A':readcurbul;
				 'P':postbul;
         'D':begin
              reading:=true;
              killbul;
              curbul:=curbul-1;
              reading:=false;
             end;
         'R':begin
              if ulvl<configset.postleve then begin
                reqlevel(configset.postleve);
                exit
              end;
              okfortitle:=false;
              q:=b.leftby;
              if b.anon then q:=configset.anonymousst;
              lameo:=q;
              okfortitle:=false;
              l:=editor(m,false,true,q,b.title);
              okfortitle:=true;
              if l>=0 then
                begin
                  inc(urec.nbu);
                  writeurec;
                  b.anon:=m.anon;
                  repnumber:=getnumnum(b.title);
                  inc(repnumber);
                  b.title:=gettitle(b.title,repnumber);
                  b.when:=now;
                  b.leftto:=lameo;
                  b.leftby:=unam;
                  b.status:='[ ha ]';
                  b.line:=l;
                  b.recieved:=false;
                  b.RealName:=Urec.RealName;
                  B.Cnet:=False;
                  b.Version:=NetMailVer;
                  B.FidoNet:=False;
                  B.Flag3:=False;
                  B.Flag4:=False;
                  B.Flag5:=False;
                  B.Flag6:=False;
                  B.Flag7:=False;
                  B.Flag8:=False;
                  b.where:=Configset.Origin1;
                  B.Where2:=Configset.origin2;
                  b.plevel:=ulvl;
                  addbul (b);
                  inc(newposts);
                  inc(gnup);
                   with curboard do
                    if autodel<=numbuls then begin
                      autodelete;
                      if curbul>5 then curbul:=curbul-5 else curbul:=1;
                      end;
                end
             end;
         'E':begin
              if checkcurbul then begin
              if (not match(b.leftby,unam)) and (not issysop) and (not sponsoron)
                then begin
                  writeln ('You didn''t post that!');
                end
              else begin
              reloadtext (b.line,me);
              me.title:=b.title;
              me.anon:=b.anon;
              if reedit (me,true) then begin
                writelog (4,6,b.title);
                deletetext (b.line);
                b.line:=maketext (me);
                if b.line<0 then begin
                  writestr (^M'Deleting bulletin...');
                  delbul (curbul,false)
                end else begin
                  seekbfile (curbul);
                  write (bfile,b)
                 end
                end
               end;
              end;
             end;
         'S':exit;
         '/':togglecscan;
         'Q':begin
              quitmasterinc:=true;
              exit;
             end;
       end;
      until wock in ['N'];
      inc(curbul);
     if aborted then exit;
    end;
    if (postprompts in urec.config) and newmsgs and (ulvl>=configset.postleve)
      then begin
        okfortitle:=true;
        writestr (^M^P'Post on ['^S+curboard.boardname+^P'] '^F'(y/n)'^P'? *');
        writeln;
        if yes then postbul
      end
  end;

  procedure newscanall;
  var cb:integer;
  begin
    beenaborted:=false;
    writehdr ('New-Scanning Messages.  [X] will abort.');
    if aborted then exit;
    for cb:=0 to filesize(bdfile)-1 do begin
      if aborted then exit;
      if haveaccess(cb) and (not (cb in urec.newscanconfig)) then begin
        curboardname:=curboard.shortname;
        openbfile;
				if aborted then exit;
				clearscr;
				writeln (^R'Scanning ['^S,curboard.boardname,^R']...'^M);
        if aborted then exit;
        newscanboard;
        if quitmasterinc then begin
         quitmasterinc:=false;
	 writeln (^B^M'Newscan aborted!'^G);
	 setfirstboard;
         exit;
        end
      end
    end;
    writeln (^B^M'Newscan complete!'^G);
    setfirstboard
  end;

  procedure noboards;
  begin
    writeln ('No sub-boards exist!');
    if not issysop then exit;
    writestr ('Create the first sub-board now [y/n]? *');
    if not yes then exit;
    writestr ('Enter its access name/number:');
    if not validbname(input) then writeln (^B'Invalid board name!') else begin
      curboardname:=input;
      makeboard
    end
  end;

  procedure togglenewscan;
  begin
    write ('Newscan this board: ');
    if curboardnum in urec.newscanconfig
      then
        begin
          writeln ('Yes');
          urec.newscanconfig:=urec.newscanconfig-[curboardnum]
        end
      else
        begin
          writeln ('No');
          urec.newscanconfig:=urec.newscanconfig+[curboardnum]
        end
  end;

  procedure nextsubboard;
  var cb:integer;
      obn:sstr;
  begin
    obn:=curboardname;
    cb:=curboardnum;
    while cb<filesize(bdfile)-1 do begin
      inc(cb);
      if haveaccess (cb) then begin
        seek (bifile,cb);
        read (bifile,obn);
        setactive (obn);
        exit
      end
    end;
    writestr ('This is the last sub-board!');
    setactive (obn)
  end;

  procedure listusersaxis;

      procedure listacc (all:boolean);
      var cnt:integer;
          a:accesstype;
          u:userrec;

      begin
        seek (ufile,1);
        for cnt:=1 to numusers do begin
          read (ufile,u);
          If Curboard.Conference=0 then Begin
          a:=getuseraccflag (u,curboardnum);
          case a of
            letin:writeln (^S,u.handle,^R);
            bylevel:if u.level>=curboard.level then writeln (^S,u.handle,^R);
          end;
          end else if U.ConfSet[CurBoard.Conference]>0 then WriteLn(^S,u.Handle,^R);
          if break then exit
        end
      end;

    begin
     writehdr ('List Users with Board Access');
     writeln;
     writeln (^R'Users with access to ['^S+curboard.boardname+^R']:');
     writeln;
     listacc (true);
    end;


  procedure readsboard(msgfrm,msgto:integer);

    function getnumnum(title:lstr):integer;
var reprep      :byte;
    startpoint  :byte;
    endpoint    :byte;
    a           :string[1];
begin
   reprep    :=79;
   startpoint:=0;
   endpoint  :=0;
   getnumnum :=0;
  repeat
   a:=copy (title,reprep,1);
   if a='#' then
     begin;
       startpoint:=reprep;
         repeat
           if valu(copy(title,reprep,1))>0 then endpoint:=reprep;
           inc(reprep);
         until (reprep>=79);
     end;
   if (startpoint>0) and (endpoint>0) then
      begin
        dec(endpoint,startpoint);
        getnumnum:=valu(copy(title,startpoint+1,endpoint));
        exit;
      end;
    dec(reprep);
  until reprep<=0
end;

function gettitle(title:lstr;reply:word):lstr;
var search   :boolean;
    srcstr   :sstr;
    cursrc   :word;
    tit      :lstr;
begin

   srcstr  :=' [Reply #';
   search  :=false;
   tit     :='';
   cursrc  :=0;

   repeat
    if copy(title,cursrc,length(srcstr))=srcstr then
      begin;
        tit:=copy(title,1,cursrc-1);
        gettitle:=tit+' [Reply #'+strr(reply)+']';
        exit;
      end;

    if cursrc=79 then
      begin
        gettitle:=title+' [Reply #'+strr(reply)+']';
        exit;
      end;
    inc(cursrc);
   until cursrc=80;
end;

  var newmsgs,oldb:boolean;
      wacko:word;
      q:anystr;
      wock:char;
      wock2:word;
      m,me:message;
      l,lsdrule,stonerslive,swash:integer;
      t:sstr;
      fcpiskool:mstr;
      repnumber:word;
      lameo    :string;
  begin
  curbul:=msgfrm;
  wacko:=urec.lastread[curboardnum+(50*(CurrentConference-1))];
  for lsdrule:=msgfrm to msgto do begin
    beenaborted:=false;
    newmsgs:=false;
    while curbul<=numbuls do begin
      getbrec;
        readnum (curbul);
        newmsgs:=true;
      repeat
       wock:='N';
       If (TimeLeft<1) and Not Local then
        Begin
         PrintFile(ConfigSet.TextFileDi+'TimesUp');
         ForceHangup:=True;
         Exit;
        End;
       WriteStr(^R'['^S'Message Reading - '^F+curboard.boardname+^R'] - ['^A'?/Help'^R']'^P' :*');
       if length(input)<1 then input:='N';
       wock:=upcase(input[1]);
       wock2:=valu(input);
       if wock2>0 then begin
        if wock2<=numbuls then begin
         curbul:=wock2;
         readnum (curbul);
        end;
       end else
        wock:=upcase(wock);
        case wock of
         'B':if not forwardbackthread(b.title,false) then WriteLn(^M^G^S'No backwards thread found!')
             else Begin
             getbrec;
             readnum(curbul);
             end;
         'F':If not forwardbackthread(b.title,true) then writeln(^M^G^S'No Forward thread found!')
             Else Begin
             GetBrec;
             ReadNum(Curbul);
             End;
         '?':begin
              writeln;
              writeln (^S'             ώ Message Read Help ώ'^R^M);
              writeln ('[N] Next Message          [#] Read that Message #');
              writeln ('[A] Read Message Again    [R] Reply to Message');
              writeln ('[D] Delete Message        [P] Post a Message');
              writeln ('[B] Backwards Thread      [F] Forwards Thread');
              writeln ('[S] Next Sub-board        [/] Toggle Auto-Scan');
              if (match(unam,b.leftby)) or (issysop) or (sponsoron)
              then write ('[E]: Edit Message          ');
              writeln ('[Q]: Quit Newscan');
              writeln;
             end;
				 'A':ReadCurBul;
				 'P':begin
              postbul;
             end;
         'D':begin
              reading:=true;
              killbul;
              curbul:=curbul-1;
              reading:=false;
             end;
         'R':begin
              if ulvl<configset.postleve then begin
                reqlevel(configset.postleve);
                exit
              end;
              q:=b.leftby;
              if b.anon then q:=configset.anonymousst;
              lameo:=q;
              okfortitle:=False;
              l:=editor(m,false,true,q,b.title);
              if l>=0 then
                begin
                  inc(urec.nbu);
                  writeurec;
                  b.anon:=m.anon;
                  repnumber:=getnumnum(b.title);
                  inc(repnumber);
                  b.title:=gettitle(b.title,repnumber);
                  b.when:=now;
                  b.leftto:=lameo;
                  b.leftby:=unam;
                  b.status:='[ ha ]';
                  b.line:=l;
                  b.recieved:=false;
                  b.plevel:=ulvl;
                  b.RealName:=Urec.RealName;
                  B.where:=Configset.Origin1;
                  B.Where2:=Configset.Origin2;
                  b.Cnet:=False;
                  B.FidoNet:=False;
                  B.Flag3:=False;
                  B.Flag4:=False;
                  b.Flag5:=False;
                  B.Flag6:=False;
                  B.Flag7:=False;
                  B.Flag8:=False;
                  B.Version:=NetMailVer;
                  addbul (b);
                  inc(newposts);
                  inc(gnup);
                   with curboard do
                    if autodel<=numbuls then begin
                      autodelete;
                      if curbul>5 then curbul:=curbul-5 else curbul:=1;
                      end;
                end
             end;
         'E':begin
              if checkcurbul then begin
              if (not match(b.leftby,unam)) and (not issysop) and (not sponsoron)
                then begin
                  writeln ('You didn''t post that!');
                end
              else begin
              reloadtext (b.line,me);
              me.title:=b.title;
              me.anon:=b.anon;
              if reedit (me,true) then begin
                writelog (4,6,b.title);
                deletetext (b.line);
                b.line:=maketext (me);
                if b.line<0 then begin
                  writestr (^M'Deleting bulletin...');
                  delbul (curbul,false)
                end else begin
                  seekbfile (curbul);
                  write (bfile,b)
                 end
                end
               end;
              end;
             end;
         'S':begin
             If Urec.LastRead[CurBoardNum+(50*(CurrentConference-1))]<=Wacko then
             urec.lastread[curboardnum+(50*(CurrentConference-1))]:=wacko;
             exit;
             end;
         '/':togglecscan;
         'Q':begin
            If Urec.LastRead[CurboardNum+(50*(CurrentConference-1))]<=Wacko then
             urec.lastread[curboardnum+(50*(CurrentConference-1))]:=wacko;
             exit;
             end;
       end;
      until wock in ['N'];
      inc(curbul);
      if (curbul>msgto) or aborted then begin
        If Urec.LastRead[Curboardnum+(50*(CurrentConference-1))]<=Wacko then
        urec.lastread[curboardnum+(50*(CurrentConference-1))]:=wacko;
        exit;
        end;
    end;
      end;
      If Urec.LastRead[CurboardNum+(50*(CurrentConference-1))]<=Wacko then
      urec.lastread[curboardnum+(50*(CurrentConference-1))]:=wacko;
  end;

procedure readfromtext;
var fname,lt:lstr;
    tit,tu:mstr;
    lne:integer;
    fnt:text;
    m:message;
    b:bulrec;
begin
writestr(^M'Enter the filename to read text from : *');
       if input='' then exit;
       fname:=input;
       if not exist(fname) then begin
          writeln(^M^G'Sorry, that file does not exist!');
          exit;
       end;
       writestr('Enter the subject [Return Aborts this]: *');
       if input='' then exit;
       tit:=input;
       writestr('Send to [CR/All]: *');
       if input='' then input:='All';
       tu:=input;
       writeln(^M'Reading text..');
       assign(fnt,fname);
       reset(fnt); lne:=0;
       while (not eof(fnt) and (lne<99)) do begin
         readln(fnt,lt);
         inc(lne);
         m.text[lne]:=lt;
       end;
       writeln(^M'Writing text...');
       m.numlines:=lne;
       m.anon:=false;
       m.title:=tit;
       m.sendto:=tu;
       b.Cnet:=False;
       b.FidoNet:=False;
       b.Flag3:=False;
       b.Flag4:=False;
       b.Flag5:=False;
       b.Flag6:=False;
       b.Flag7:=False;
       b.Flag8:=False;
       b.Where:=Configset.Origin1;
       B.Where2:=Configset.Origin2;
       b.Version:=NetMailVer;
       b.Realname:=urec.RealName;
       m.note:=urec.usernote;
       lne:=maketext(m);
       b.anon:=false;
       b.title:=tit;
       b.when:=now;
       b.leftby:=unam;
       b.status:='[ ha ]';
       b.recieved:=false;
       b.leftto:=tu;
       b.line:=lne;
       b.plevel:=ulvl;
       addbul(b);
       inc(newposts);
       inc(gnup);
       with curboard do if autodel<=numbuls then autodelete;
end;

	Procedure yourudstatus;
	var newmessages:longint;
		Begin
			mens:=true;
			nobreak:=false;
			dontstop:=true;
			Ansicolor(Urec.StatusBoxColor);
			Boxit(5,40,29,9);
			FuckXy(6,41,^S'     Post/Call Ratio  '^M);
			FuckXy(7,42,^P'Posts    : '^S+Strr(Urec.Nbu)+^M);
			FuckXy(8,42,^P'Calls    : '^S+Strr(Urec.NumOn)+^M);
			FuckXy(9,42,^P'Ratio    : '^S+Strr(Ratio(Urec.Nbu,Urec.NumOn))+^M);
			FuckXy(10,42,^P'Minimum  : '^S+Strr(Urec.PCRatio)+^M);
			FuckXy(11,42,^P'Status   : '^S);
			If Ulvl>ConfigSet.ExemptPc then WriteLn('Exempt')
				else if ratio(urec.nbu,urec.numon)<urec.pcratio then WriteLn('Bad!') else WriteLn('Passed');
			FuckXy(12,42,^P'New Msgs : '^S);
			newmessages:=gnup-conpostsa;
			if newmessages>0 then writeln(newmessages) else writeln('None');
				clearbreak;
			end;

var boo:boolean;
    msgfrom,msgto:integer;
label exit;
begin
  cursection:=bulletinsysop;
  reading:=false;
  quitmasterinc:=false;
  cscan:=false;
  openbdfile;
  if filesize(bdfile)=0 then begin
    noboards;
    if filesize(bdfile)=0 then begin
      closebdfile;
      goto exit
    end
  end;
  if not haveaccess(0)
    then
      begin
        writeln (^B'You do not have access to the first sub-board!');
        closebdfile;
        goto exit
      end;
      clearscr;
       topten(1);
       setfirstboard;
       If (urec.msgheader<1) or (urec.msgheader>2) Then GetYaHeader;
  if configset.shownewprompts then begin
  WriteStr(^M^M^P'Scan for new messages? '^F'['^A'N'^F']'^P':');
  If Yes then NewScanAll;
  end;
  PrintXy(15,0,'');
  okfortitle:=true;
  repeat
    boo:=checkcurbul;
    with curboard do
      writeln (^M^R,boardname,' ['^S,shortname,^R'] '^S,curbul,^R' of '^S,numbuls,^R);
(*    if sponsoron or issysop
      then writeln (^R'['^S'%'^R']:Board Sponsor Commands'); *)
      q:=menu (^R'('^S+curboard.shortname+^R') Message','BULLET','PRDFUKT*MQ#_%LNBAVCHES+WG/!');
    case q of
      1:Begin okfortitle:=true; postbul; end;
      2:begin
        thereare(numbuls,'Messages','msgs');
        parserange(numbuls,msgfrom,msgto);
        readsboard(msgfrom,msgto);
      end;
      4,22:sendmailto (curboard.sponsor,false);
      5:uploadfile;
      3,6:killbul;
      8,16,17:activeboard;
      7:listbuls;
      9:sendbreply;
      12:if not hungupon then readnextbul;
      13:boardsponsor;
      14:ListUsersAxis;
      15:newscanall;
      18:newscanboard;
      19:togglenewscan;
      20:help ('Message.hlp');
      21:editbul;
      23:nextsubboard;
      24:readnum (lastreadnum+1);
      25:offtheforum;
      26:togglecscan;
      27:getyaheader
     else if q<0 then readnum (-q)
    end
  until (q=10) or hungupon or (filesize(bdfile)=0);
  okfortitle:=true;
  exit:
  close (bfile);
  closebdfile
end;

begin
end.
