#include "filedoor_structs_defines.h"
#include "filedoor_protos.h"

#include <proto/exec.h>
#include <exec/memory.h>
#include <proto/dos.h>
#include <strings.h>
#include <stdio.h>

/* Sætter cursoren på en linie */
void PutCursor(int i)
{
  MoveCrsr(2,i+TOPLINE);
  msg(">"ESC"[D");
}

/* Sletter cursoren igen */
void ZapCursor(int i)
{
  MoveCrsr(2,i+TOPLINE);
  msg(" "ESC"[D");
}

/* Sætter cursoren på en x/y koord */
void PutCursorXY(int x,int y)
{
  MoveCrsr(x,y+TOPLINE);
  msg(">"ESC"[D");
}

/* Sletter cursoren på en x/y koord*/
void ZapCursorXY(int x,int y)
{
  MoveCrsr(x,y+TOPLINE);
  msg(" "ESC"[D");
}

/* Flyt cursor til pos på skærm */
void MoveCrsr(int x,int y)
{
static char t[25];

  sprintf(t,ESC"[%i;%iH",y,x);
  msg(t);
}

/* Skriv centreret med streger udenom i hvidt */
/* Ingen ANSI koder i teksten, så regner centreringen forkert */
void msgc(char *line,char *linecol,char *dashcol)
{
int i;
static char sep[]="ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ";
static char str[90]="";

  strcpy(str,ESC"[C");
  i=(78-strlen(line))/2;
  strcat(str,dashcol);
  strncat(str,sep,i);
  strcat(str,linecol);
  strcat(str,line);
  msg(str);
  strcpy(str,dashcol);
  strncat(str,sep,78-strlen(line)-i);
  msg(str);
}

/* Skriv centreret besked uden streger omkring */
void msgcenter(char *str,int line)
{
  MoveCrsr((80-strlen(str))/2,line);
  msg(str);
}

/* Slet de øverste linier i display (menu-vinduet)*/
void ClearMenuWindow(char *title)
{
  msg(FG7 ESC"[HÚ");
  MoveCrsr(80,1);
  msg("¿");
  MoveCrsr(1,2);
  msg(ESC"[K³");
  MoveCrsr(80,2);
  msg("³");
  MoveCrsr(1,3);
  msg(ESC"[K³");
  MoveCrsr(80,3);
  msg("³");
  MoveCrsr(1,4);
  msg(ESC"[K³");
  MoveCrsr(80,4);
  msg("³");
  MoveCrsr(1,5);
  msg(ESC"[K³");
  MoveCrsr(80,5);
  msg("³");
  MoveCrsr(1,6);
  msg("Ã");
  MoveCrsr(80,6);
  msg("´");
  MoveCrsr(1,1);
  msgc(title,FG4,FG7);
}

/* Tegn ramme udenom */
void ClearBottomWindow(void)
{
char t[20];
int i;

  sprintf(t,FG7 ESC"[%i;1H",TOPLINE);
  msg(t);
  for(i=0;i<visiblelines;i++)
  {
    MoveCrsr(1,i+TOPLINE);
    msg(ESC"[K³"ESC"[78C³");
  }
  MoveCrsr(1,TOPLINE+visiblelines);
  msg("À"ESC"[78CÙ"ESC"[H");
  sprintf(t,ESC"[%i;1H",TOPLINE-1);
  msg(t);
}


/* Bed bruger om at trykke på en tast */
void AnyKey(void)
{
char t[4];

  hotkey(FG7 BG4"\nPress any key to continue\n"FG7 BG0,t);
}

/* Vis menuen til filetagging */
void MenuFileTag(void)
{
  ClearMenuWindow("File tagging menu");
  msg("\n");
  msg(FG7"³"KNAP"<RETURN>"MENU" Tag/Untag  "KNAP"(D)"MENU" Download       ");
  if(stricmp(superarea,"hdfiles"))
    msg(      KNAP"   "MENU"                 "KNAP"(O)"MENU" Other area\n");
  else
    msg(      KNAP"(U)"MENU" Upload          "KNAP"(O)"MENU" Other area\n");
  msg(FG7"³"KNAP"(E)"MENU" Enter archive   "KNAP"(F)"MENU" Find file      ");
  msg(      KNAP"(R)"MENU" Reapeat find    "KNAP"(G)"MENU" Get filelist\n");
  msg(FG7"³"KNAP"(V)"MENU" View archive    "KNAP"(L)"MENU" View long desc ");
  msg(      KNAP"(S)"MENU" Togl short desc "KNAP"(M)"MENU" Quality mark\n");
  msg(FG7"³"KNAP"(Z)"MENU" Zap menu        "KNAP"(P)"MENU" Preferences    ");
  msg(      KNAP"(H)"MENU" Help            "KNAP"(Q)"MENU" Quit filedoor\n");
}

/* Skriv en talstørrelse som K eller M */
void itoaCompact(char *str,int i)
{
  if(i<1024)
  { /* Smaller than 1K */
    strcpy(str," <1K");
    return;
  }
  if(i<1024000)
  { /* Between 1K and 999K */
    sprintf(str,"%3iK",i/1024);
    return;
  }
  i/=1024*1024/10;
  if(i<100)
  { /* Between 999K and 9.9M */
    sprintf(str,"%c.%cM",i/10+'0',i%10+'0');
  }
  else
  { /* Between 9.9M and 999M */
    sprintf(str,"%3iM",i/10);
  }
}


/* Skriv en liste over nogle filer, sådan at brugeren kan få noget at tagge */
/* Returner antal filer faktisk i listen */
int PrintFiles(struct Areamem *area,struct Filemem *topfile)
{
int i=0;
int j;
static char tempstring[100];
struct DateTime dt;

  sprintf(tempstring,ESC"[%i;1H",TOPLINE-1);
  msg(tempstring);
  /* Initialiser date-stamp + datetime struktur til dato visning */
  dt.dat_Stamp.ds_Minute=0;
  dt.dat_Stamp.ds_Tick=0;
  dt.dat_Format=FORMAT_DOS;
  dt.dat_Flags=0;
  dt.dat_StrDay=NULL;
  dt.dat_StrDate=tempstring;
  dt.dat_StrTime=NULL;
  /* Placer cursor & slet skærm */
  if(topfile->n.mln_Pred->mln_Pred!=NULL)
    msgc("(MORE FILES ABOVE)",FG1,FG7);
  else
    msgc("",FG1,FG7);
  msg(FG2);
  /* Vis filer */
  while(topfile->n.mln_Succ!=NULL && i<visiblelines)
  {
    /* Marker om fil er tagged */
    msg(FG7"\n"ESC"[2C");
    if(CheckTag(area,topfile)) msg(FG3"*"FG7); else msg(" ");
    if(showshort)
    {
      /* Skriv filnavnet, siz, dl formatteret */
      sprintf(tempstring,"%-32.32s"FG5" %7i [%2i] ",topfile->f.name,topfile->f.siz,topfile->f.dl);
      msg(tempstring);
      /* Skriv dato formatteret */
      dt.dat_Stamp.ds_Days=topfile->f.date;
      DateToStr(&dt);
      msg(tempstring);
      /* Skriv kvalitetsvurdering */
      switch(topfile->f.qual)
      {
        case 0:
        msg(" [-----] ");
        break;
        case 1:
        msg(" [*----] ");
        break;
        case 2:
        msg(" [**---] ");
        break;
        case 3:
        msg(" [***--] ");
        break;
        case 4:
        msg(" [****-] ");
        break;
        case 5:
        msg(" [*****] ");
        break;
        default:
        msg(FG1" No mark "FG2);
        break;
      }
      msg("            ");
    }
    else
    {
      /* Skriv filnavnet formatteret */
      sprintf(tempstring,FG7"%-12.12s "FG5,topfile->f.name);
      msg(tempstring);
      /* Skriv størrelse formatteret */
      itoaCompact(tempstring,topfile->f.siz);
      msg(tempstring);
      /* Skriv short description */
      sprintf(tempstring," %-58.58s",topfile->f.shortdesc);
      msg(tempstring);
    }
    i++;
    topfile=(struct Filemem *)topfile->n.mln_Succ;
  }
  j=i;
  while(j<visiblelines)
  {
    msg("\n"ESC"[2C");
    msg("                                                                             ");
    j++;
  }
  MoveCrsr(1,TOPLINE+visiblelines);
  if(topfile->n.mln_Succ==NULL)
  /* He are in the list header, no more files */
  {
    msgc("",FG1,FG7);
  }
  else
  {
    msgc("(MORE FILES BELOW)",FG1,FG7);
  }
  msg("\n"ESC"[K"FG3);
  sprintf(tempstring,"You are looking at : %s",activearea->area.name);
  msgcenter(tempstring,TOPLINE+visiblelines+1);
  MoveCrsr(1,1);
  return(i);
}

void SearchHelp(void)
{
  msg(FG6"\xc""Sorry - no file or short file description matching the pattern\n");
  msg("you specified was found. This search function uses amiga wildcards\n");
  msg("(#? not *) and case insensitive search. Tech text on wildcards follows..\n\n");
  msg(FG3"?"FG7"         Matches any single character.\n");
  msg(FG3"(lha|lzx)"FG7);
  msg(" Matches one (only!) of the strings separated by the | character.\n");
  msg("          You can specify a % to allow the empty string. E.g. (tits|heels|%)\n");
  msg("          As you might have guessed any number of alternatives is ok.\n");
  msg(FG3"[abcdef]"FG7"  Matches one (only!) of the characters inside []\n");
  msg("          Notice that ranges can be specified with a dash. So the above\n");
  msg("          example could also have been written as [a-f] (Case sensitive)\n");
  msg("          Any number of characters and ranges is ok. (E.g. [123a-cA-C])\n");
  msg(FG3"~"FG7"         ");
  msg("Getting hardcore, are we?? The ~ negates the following expression.\n");
  msg("          Which means: If what follows the ~ doesn't match.. Everything is\n");
  msg("          considered OK. And matching of the rest of the pattern is performed.\n");
  msg(FG3"#"FG7"         Matches the following expression 0 or more times.\n");
  msg("          So #? matches any number of characters you don't know.\n");
  msg(FG3"\nNote to the above: An expression is a character, ?, (|) or [].\n");
  AnyKey();
}

void GeneralHelp(void)
{
  msg("\xc"TITLE"\n\n");
  msg("You can always page the sysop and get him to help you. This is just a few\n");
  msg("notes which address the experienced users to let them in on a few \"extra\"\n");
  msg("features in this cd-rom filedoor.\n\n");
  msg("In addition to the keys listed, the following keys can be used:\n");
  msg("8/2/4/6/3/9 (on numeric keypad) controls cursor movement in addition to\n");
  msg("the cursor keys. \n");
  msg("When viewing files/text <SPACE> pauses/restarts and S stops\n\n");
  msg("An unusual feature in this door is the ability to rate files that are online.\n");
  msg("You do this by pressing the M key and then give from 0 to 5 stars\n\n");
  msg("Another unusual feature is that you can enter an archive to download\n");
  msg("files from inside the archive. Thus you will not have to download a big\n");
  msg("archive just to get a single file from it. Remember that most archives\n");
  msg("come with the restriction that they are not to be redistributed if the\n");
  msg("archive is not complete. The function works on LHA and DMS files.\n\n");
  msg("The dates displayed are taken from the datestamps on the actual files.\n\n");
  AnyKey();
}

/* Kopierer en fil (med fuld path på) fra et sted til et andet */
BOOL CopyFile(char *src, char *dest)
{
BPTR handle,handle2;
LONG len;
BOOL success;
void *genericptr;
ULONG bufmem;

  success=TRUE;
  bufmem=AvailMem(MEMF_LARGEST)/2;
  if(genericptr=AllocVec(bufmem,MEMF_ANY))
  {
    if(handle=Open(src,MODE_OLDFILE))
    {
      if(handle2=Open(dest,MODE_NEWFILE))
      {
        while(len=Read(handle,genericptr,bufmem))
        {
          if(len<0)
          {
            success=FALSE;
            break;
          }
          else
          {
            len=Write(handle2,genericptr,len);
            if(len<0)
            {
              success=FALSE;;
              break;
            }
          }
        }
        Close(handle2);
      }
      else success=FALSE;
      Close(handle);
    }
    else success=FALSE;
    FreeVec(genericptr);
  }
  else success=FALSE;
  return(success);
}
