#include <stdio.h>
#include <exec/types.h>
#include "user.h"

FILE *file;
extern int waitcall, current, dcurrent, ansitoggle;
extern char boardnames[50][25], names[50][25];
 
menuproc(menuname)
char *menuname;
{
int index=0, index2=0, result, abort, showmenu, forceit, locked;
int err=0, expert, node, passme,lastchecked;
char menu[50][80];
char timestring[50],temp[45], addmenu[35], name2[50], ch;
char input,name[50], graphicname[30], gname[30], prompt[100];


sprintf(addmenu,"MENU:%s",menuname);
if((file=fopen(addmenu,"r"))==NULL)       /* open the disk file */
   { fclose(file);  sendstring("\n Menu Open Error"); return; }

readdiskline(gname);
sprintf(graphicname,"MENU:%s",gname);
readdiskline(prompt);
do
   {
   if(waitcall==FALSE) if(check_carrier()==0) return;  /* user hung up? */
   result=readdiskline(menu[index]);
   index++;
   if(index==50)result=FALSE;
   } while(result!=FALSE);
fclose(file);
strcpy(menu[index],NULL);

showmenu=TRUE;
input = NULL;

for(;;)
   {
   if(((showmenu==TRUE)&&(user.expert==FALSE))||(forceit==TRUE))
          {
          showmenu=FALSE; forceit=FALSE;
          if(ansitoggle==1) sprintf(gname,"%s.ansi",graphicname);
          else sprintf(gname,"%s.ascii",graphicname);
          input=sendfile(gname);
          err=FALSE;
          } 
   if(err==FALSE)
        {
        sendstring("\n");
        sendstring(prompt);
        } 
   else err=FALSE;
   

begining:
   if(input==NULL) input=' ';   
   while((input==' ')||(input==8)) 
     {
     input=readchar(1,0);
     if((input!=8)&&(input!=' '))sendchar(input,1); 
     if(waitcall==FALSE) if(check_carrier()==0) return; 
     } /* user hung up? */
     getcharacter();  /* so we can check for closewindow in case of lock */

   /* check to see if this is a valid keypress */

   index=0; abort=FALSE;
   upperstring(&input);   upperstring(&menu[index][0]);
   while(((input)!=(menu[index][0]))&&(!abort))  /* 0xDF  is */
        {                                      /* a mask for uppercase */
        index++;
        upperstring(&menu[index][0]);
        if(index==50){abort=TRUE; input = ' ';};
        if(menu[index][0]==NULL){abort=TRUE; input = ' ';}
        if(input==0){ input=32; menu[index-1][0]=32; } /* fix space */
        }
   if(abort==FALSE) { input=' '; }
   else { sendchar(8,1); goto begining;  }
   /* check to see if the user is ALLOWED to do this function */   

   index2=0; abort=FALSE; locked=TRUE;
   while(((menu[index][2]&0xDF)!=(user.lockedfuncs[index2]&0xDF))&&(!abort))
        {
        index2++;
        if((index2==37)||(user.lockedfuncs[index2]==NULL)) 
              { 
              abort=TRUE; 
              locked=FALSE;
              }
        }
    if(locked==TRUE)
     sendstring("\nAccess Denied, privilege not set for this function.\n");
    else
     {
     sendchar(input&0xDF,1);
     sendchar('\n',1);
     input=' ';
     switch(menu[index][2]) 
       {
       case '0':          /* menu functions */
              getname(name,menu[index]);
              if( (name[0]=='q') || (name[0]=='Q') )
                 {
                 quickhang(); /* hang, no logoff message */
                 return(3);
                 }
              else if( (name[0]=='e') || (name[0]=='E') )
                 {
                 return(TRUE);           /* exit this menu */
                 }
              else if(name[0]=='?')               /* show help file */
                 {
                 showmenu=TRUE;     /* show menu */
                 forceit=TRUE;      /* force it to show even if XPERT */
                 }
              else if( (name[0]=='h') || (name[0]=='H') ) /* hang up from system */
                 {
                 hangup();   /* hang up from any menu */
                 return(3);
                 }
              else
                 {
                 sendstring("\n\n Unknown Command :0 ");
                 sendstring(name);
                 }
              break;
        case '1':
              getname(name,menu[index]);        /* Goto a new menu */
              getsecondname(name2,menu[index]);          
              ch=name[0];

              index2=0; abort=FALSE; locked=TRUE;
              while((ch!=(user.lockedfuncs[index2]))&&(!abort))
                 {
                 index2++;
                 if((index2==37)||(user.lockedfuncs[index2]==NULL)) 
                     {   
                     abort=TRUE; 
                     locked=FALSE;
                     }
                 }
              if(locked==TRUE)
                 sendstring("\nAccess Denied, privilege not set for this menu.\n");
                  
              else
               switch(ch)
                 {
                 case '!':       /* all of these will start a new menu. */
                 case '@':       /* used to allow access levels on different */
                 case '#':       /* menu's.  have a SYSOP menu for example, */
                 case '$':       /* or a "PIRATES" menu... ect..         */
                 case '%':
                 case '^':
                 case '&':
                 case '*':       /* Does this actually Check The Locked */
                 case '(':       /* access string anywhere? HUH? HUH?   */
                 case ')':
                       showmenu=TRUE;
                       menuproc(name2);
                       break;               
                 default:
                       sendstring("\n\n Unknown Command :1 ");
                       sendstring(name);
                       break;
                 }
                 break;
       case '2':          /* type a file */
              getname(name,menu[index]);
              sendfile(name); 
              Delay(30L);   /* let disk drive finish */
              showmenu=TRUE; err=FALSE;
              break; 
       case '3':
              page_sysop();
              break; 
       case '4':                    /* execute external dos function */
            /*  getname(name,menu[index]);  */ /* the command line */
              getlongname(name,menu[index]);   
              Execute(name,0,0);
              break; 
       case '5':
              getname(name,menu[index]);
              getsecondname(name2,menu[index]);
              if( (name[0]=='a') || (name[0]=='A') )
                 {
                 sendchar(12,1);   /* clear the screen first */
                 sendstring("\033[35mUser ID:                        City/State:               Computer:\n");     
                 sendstring("\033[33m---------------------------------------------------------------------------");
                 sendstring("\033[0m");
                 sendfile("USERS:user-list");
                 sendstring("\033[33m---------------------------------------------------------------------------\n");
                 sendstring("\033[33mPress any key to continue\033[0m ");
                 endtext();
                 showmenu=TRUE;              
                 }

              else if( (name[0]=='s') || (name[0]=='S') ) userlistsearch(name2);
              else
                 {
                 sendstring("\n\n Unknown Command :5 ");
                 sendstring(name);
                 }
              break; 
       case '6':            /* daily user log */
              Get_Date(timestring);
              sprintf(temp,"TEXT:%scaller.log",timestring);
              sendchar(12,1);
              sendstring("\n\033[35mCalls since Midnight:\n");
              sendstring("\033[33m------------------------------------------\033[0m");
              sendfile(temp);
              sendstring("\033[33m------------------------------------------\n");
              sendstring("Press any key to continue\033[0m ");
              endtext();
              showmenu=TRUE;
              break; 
       case '7':       /* change your stats */
              if(user.expert==TRUE) expert=TRUE;
              else expert=FALSE;
              change_stats();
              if(expert==TRUE) user.expert=TRUE;
              else user.expert=FALSE;
              Delay(30L);
              showmenu=TRUE;
              break; 
       case '8':
              Full_Time(timestring);
              sprintf(name,"\n\n Current time: %s\n",timestring);
              sendstring(name);
              showmenu=TRUE;
              name[0]=NULL;
              break; 
       case '9':      /* Special Execute External Dos Function */
              getlongname(name,menu[index]);   
              specex(name);
              break;              
       case 'A':      /* expert menu toggle */
       case 'a':
              user.expert=!user.expert;     /* toggle expert mode */
              if(user.expert==TRUE) sendstring("\n\nXPERT mode ON\n");
              else sendstring("\n\nXPERT mode OFF\n");
              break;
       case 'B':    /* toggle ansi filters */
       case 'b':
              ansitog();
              break;
       case 'c':
       case 'C':
              break;
       case 'D':      /* show bbs listing */
       case 'd':
             getname(name,menu[index]);
             if( (name[0]=='a') || (name[0]=='A') )
                {
                sendchar(13,0);
                addbbs();
                }
             else if( (name[0]=='s') || (name[0]=='S') )
                {
                sendstring("\n\n\033[35mBBS Name:                      Number:          Supporting:          Hours:\n");     
                sendstring("\033[33m---------------------------------------------------------------------------");
                sendstring("\033[0m");
                sendfile("TEXT:bbs-list");
                sendstring("\033[33m---------------------------------------------------------------------------\n");
                sendstring("Press any key to continue\033[0m ");
                endtext();
                showmenu=TRUE;              
                }
             else if( (name[0]=='r') || (name[0]=='R') ) break;
             else
                 {
                 sendstring("\n\n Unknown Command :D ");
                 sendstring(name);
                 }
             break;
       case 'E':
       case 'e':
              break;
       case 'F':    
       case 'f':
             break;
       case 'G':    /* do a search for zipcodes. need zip.dat */
       case 'g':
             zipsearch();
             break;
       case 'H':     /* dont use this.. its still buggy */
       case 'h':
             getname(name,menu[index]);
             if( (name[0]=='a') || (name[0]=='A') )
                {
                sendstring("\nView ARC file name: ");
                name[0]=NULL;
                readstring(name,50,0);
                if(name[0]==NULL) break;
                sendstring("One moment please...\n");
                sprintf(temp,"ARC >FILE:arclist l FILE:%s",name);
                err=Execute(temp,0,0);
                if(err!=0)
                  {
                  sendfile("FILE:arclist");
                  DeleteFile("FILE:arclist");
                  }
                else sendstring("\nARC view failed, file not found\n");
                err=0;
                }
             else if( (name[0]=='z') || (name[0]=='Z') )
                {
                sendstring("\nView ZOO file name: ");
                name[0]=NULL;
                readstring(name,50,0);
                if(name[0]==NULL) break;
                sendstring("One moment please...\n");
                sprintf(temp,"ZOO >FILE:zoolist -l FILE:%s",name);
                err=Execute(temp,0,0);
                if(err!=0)
                   {
                   sendfile("FILE:zoolist");
                   DeleteFile("FILE:zoolist");
                   }
                else sendstring("\nZOO view failed, file not found\n");
                err=0;
                }
             else
                {
                sendstring("\n\n Unknown Command :H ");
                sendstring(name);
                }
             break;

       case 'I':
       case 'i':
              getname(name,menu[index]);
              passme=atol(name);
              changedboard(passme);   /* Change Dloads Dcurrent */
              break;
       case 'J':
       case 'j':
              getname(name,menu[index]);
              getsecondname(name2,menu[index]);
              globalscan(name,name2);    /* Global QuickScan */
              break;
       case 'K':
       case 'k':
              getname(name,menu[index]);
              passme=atol(name);
              changeboard(passme);   /* Change Boards */
              break;
       case 'L':
       case 'l':
              getname(name,menu[index]);
              passme=atol(name);
              listboards(passme);    /* List Boards */
              break;
       case 'M':
       case 'm':
              getname(name,menu[index]);
              getsecondname(name2,menu[index]);
              if( (name[0]=='s') || (name[0]=='S') ) sendmail(name2);       /* Send Mail */
              else if( (name[0]=='r') || (name[0]=='R') ) readyourmail(name2);  /* Read Mail */
              else if( (name[0]=='m') || (name[0]=='M') ) multimail();    /* Muti-Mail */
              break;
       case 'N':
       case 'n':
              getname(name,menu[index]);
              if(name[0]=='0')
                 {
                 sendstring("\nHunt for Keyword: ");  /* hut the file catalog */
                 readstring(name,50,0);               /* for a match */
                 }
              sendstring("Searching...\n");
              hunt(name);
              break;
       case 'O':
       case 'o':
              getname(name,menu[index]);
              passme=atol(name);
              listdboards(passme);    /* List Boards */
              break;
       case 'P':
       case 'p':
              getname(name,menu[index]);
              getname(name2,menu[index]);
              passme=atol(name2);
              if( (name[0]=='p') || (name[0]=='P') ) postf(passme);        /* Post A Message */
              else if( (name[0]=='r') || (name[0]=='R') ) readf(passme);    /* Read Messages */
              else if( (name[0]=='s') || (name[0]=='S') ) scanfunc(passme); /* Scan Messages */
              else
                 {
                 sendstring("\n\n Unknown Command :P ");
                 sendstring(name);
                 }
              break;
       case 'Q':
       case 'q':
              editmacros();          /* Edit Macros */
              break;
       case 'R':
       case 'r':
              maskeditor();  /* Edit Users' Mask */
              break;
       case 'S':
       case 's':
              getname(name,menu[index]);     /* send/receieve Nets */
              getname(name2,menu[index]);    /* Manually Prompts */
              node=atol(name2);
              if( (name[0]=='s') || (name[0]=='S') ) { createnetfile(node); transmitnet(node); }
              else if( (name[0]=='r') || (name[0]=='R') ) receivenet(node);
              break;
       case 'T':
       case 't':
              getname(name,menu[index]);
              getsecondname(name2,menu[index]);
              download(name,name2);  /* xmodem downlaod */
              break;
       case 'U':
       case 'u':
              getname(name,menu[index]);
              getsecondname(name2,menu[index]);
              upload(name,name2);    /* xmodem upload */
              break; 
       case 'V':
       case 'v':
              votingbooth();    /* Voting Booths */
              break;
       case 'W':      /* boards editor */
       case 'w':   
              break;
       case 'X':      /* user editor */
       case 'x':
              /* getname(name,menu[index]); */
              /* if(name[0]=='0') strcpy(name,user.name); */
             /* updateuserdata(); */
              strcpy(temp,user.name);
              syseduser();
              strcpy(user.name,temp);
              convertname(temp);
              loaduser(temp);
              break;
       case 'Y':      /* system editor */      
       case 'y':
              change_system();
              break;
       case 'Z':      /* bulletin editor */
       case 'z':
              bulleditor();
              break;       
       default:
              err=TRUE;
              break; 
 
       }
     if(user.msgs>lastchecked)
         updatestats(user);  /* re-display the sysops stat window */
     input=' ';
     }
   input=' ';
   }

}


readdiskline(string)

register char string[];
{
char letter;
while((letter=getc(file))!=10)        /** WHILE NOT AT THE DELIMITER **/
      {
      *string=letter; 
      string++;
      }
*string='\0';    /** END OF THIS STRING, SO NULL IT **/
if((letter=getc(file))==EOF) 
      return(FALSE);
else 
      {
      ungetc(letter,file);          /** PUT THE LOOK AHEAD CHAR BACK **/
      return(TRUE);                 /** INTO THE CHARACTER STREAM.   **/
      }
}


getname(string,source)
char *string;
char *source;
{
int index=0;
while( (source[index+4]!=NULL) && (source[index+4]!=' ') )
   {
   string[index]=source[index+4];
   index++;
   }
string[index]=NULL;
}

getsecondname(string,source)
char *string;
char *source;
{

char tempchar;
int index=0, counter, position;

for(counter=5;counter<=strlen(source);counter++)
   {
   if(source[counter]==' ') break;
   }
if(counter>=strlen(source)) return(FALSE);
index=0;
counter++;
while( (source[counter]!=NULL) && (source[counter]!=' ') )
   {
   string[index]=source[counter];
   index++;
   counter++;
   }
string[index]=NULL;
}

getlongname(string,source)
char *string;
char *source;
{
int index=0;
while(source[index+4]!=NULL)
   {
   string[index]=source[index+4];
   index++;
   }
string[index]=NULL;
}


convertprompt(string)
char string[200];

   {

   }

userlistsearch(search)

char search[30];

{
char ch, string[200];
int what, result;

/* Search for Special Users */
/* If search = request prompt for search string */

if(search[0]=='0')
   {
   sendstring("\n\n Enter Search String: ");
   readstring(search,35,0);
   }

if(search[0]==NULL) return;

if( (file=fopen("USERS:user-list","r"))==NULL)
   { fclose(file); sendstring("\n\n User File Error"); return; }

sendstring("\n\033[35mUser ID:                        City/State:               Computer:\n");     
sendstring("\033[33m---------------------------------------------------------------------------\n");
sendstring("\033[0m");
do
   {
   if(waitcall==FALSE) if(check_carrier()==0) return;  /* user hung up? */
   result=readdiskline(string);
   if( (wordsearch(string,search)) != -1)
      {
      sendstring(string);
      sendstring("\n");
      }
   } while(result!=FALSE);
sendstring("\033[33m---------------------------------------------------------------------------\n");
sendstring("Press any key to continue\033[0m ");
endtext();
fclose(file);
}

ansitog()
{

if(ansitoggle==1)
   {
   ansitoggle=0;
   sendstring("\033[0m\n\n  Ansi Color Graphics Turned Off.");
   }
else
   {
   ansitoggle=1;
   sendstring("\033[0m\n\n  Ansi Color Graphics Turned On!");
   }
}
