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

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

/* Comparefunktion til sortering af areas */
int Compareareas(struct Areamem **a,struct Areamem **b)
{
  return(stricmp((*a)->area.name,(*b)->area.name));
}

/* Lad brugeren vælge et nyt område */
void Area(void)
{
struct Areamem *currentarea;
struct Areamem **list;
int i;
int oldareanum;
int toparea;
int cursorline;
int cursorside;
static char tempstr[80];
char key[4];
BOOL refreshtop=TRUE;
BOOL refreshbottom=TRUE;
BOOL done=FALSE;;

  msg("\xc");
  PurgeFiles(activearea);
  if(list=AllocVec(numareas*sizeof(struct Areamem *),MEMF_ANY))
  {
    /* Find samtlige areas og sorter dem */
    currentarea=firstarea;
    for(i=0;i<numareas;i++)
    {
      list[i]=currentarea;
      currentarea=currentarea->next;
    }
    qsort(list,numareas,sizeof(struct Areamem *),Compareareas);
    /* Find ud af at placere cursor oveni gamle area */
    for(i=0;i<numareas;i++)
    {
      if(list[i]==activearea) oldareanum=i;
    }
    toparea=oldareanum/(visiblelines*2)*visiblelines*2;
    if(oldareanum>=toparea+visiblelines)
    {
      cursorside=1;
    }
    else
    {
      cursorside=0;
    }
    cursorline=oldareanum-cursorside*visiblelines-toparea;
    while(!done)
    {
      if(hetwittedus) break;
      if(refreshtop)
      {
        ClearMenuWindow("Area menu");
        msg("\n"RI KNAP"     (Q)"MENU" Quit back to area "FG3);
        msg(activearea->area.name);
        msg("\n");
        msg(KNAP RI"<RETURN>"MENU" Goto area under cursor\n");
        msg(KNAP RI"     (P)"MENU" Previous page\n");
        msg(KNAP RI"     (N)"MENU" Next page\n");
        refreshtop=FALSE;
      }
      if(refreshbottom)
      {
        ClearBottomWindow();
        if(toparea)
          msgc("(MORE AREAS ABOVE)",FG1,FG7);
        else
          msgc("",FG1,FG7);
        msg(FG3);
        for(i=toparea;i<toparea+visiblelines && i<numareas;i++)
        {
          msg("\n"RI" ");
          msg(list[i]->area.name);
        }
        MoveCrsr(1,TOPLINE);
        for(;i<toparea+visiblelines*2 && i<numareas;i++)
        {
          sprintf(tempstr,ESC"[40C%s\n",list[i]->area.name);
          msg(tempstr);
        }
        MoveCrsr(1,TOPLINE+visiblelines);
        if(i<numareas)
          msgc("(MORE AREAS BELOW)",FG1,FG7);
        else
          msgc("",FG1,FG7);
        refreshbottom=FALSE;
      }
      PutCursorXY(cursorside?40:2,cursorline);
      hotkey("",key);
      if(key[0]=='\x1b')
      {
        hotkey("",key);
        if(key[0]=='[')
        hotkey("",key);
        while(key[0]>='0' && key[0]<='9')
        {
          hotkey("",key);
          if(hetwittedus) break;
        }
      }
      switch(key[0])
      {

        /* Return */
        case '\xd':
        activearea=list[cursorline+toparea+cursorside*visiblelines];
        done=TRUE;
        break;

        /* Quit talbage til samme area */
        case 'Q':
        case 'q':
        done=TRUE;
        break;
        
        /* Info om område under cursor */
        case 'I':
        case 'i':
        hotkey("\xc""400 char long desc of area yet to be implemented..",tempstr);
        refreshbottom=refreshtop=TRUE;
        break;

        /* crsr venstre */
        case 'D':
        case '4':
        ZapCursorXY(cursorside?40:2,cursorline);
        cursorside=0;
        break;

        /* crsr højre */
        case 'C':
        case '6':
        ZapCursorXY(cursorside?40:2,cursorline);
        if(numareas>toparea+visiblelines)
        {
          cursorside=1;
          if(cursorline+visiblelines+toparea>=numareas)
            cursorline=numareas-toparea-visiblelines-1;
        }
        break;

        /* crsr op */
        case 'A':
        case '8':
        ZapCursorXY(cursorside?40:2,cursorline);
        if(cursorline==0)
        { /* Side op */
          if(toparea!=0)
          {
            toparea-=visiblelines*2;
            cursorline=visiblelines-1;
            refreshbottom=TRUE;
          }
        }
        else
        { /* Crsr en op */
          cursorline--;
          msg(ESC"[1A");
        }
        break;

        /* side op */
        case 'P':
        case 'p':
        case '9':
        ZapCursorXY(cursorside?40:2,cursorline);
        if(toparea!=0)
        {
          toparea-=visiblelines*2;
          cursorline=visiblelines-1;
          refreshbottom=TRUE;
        }
        break;

        /* crsr ned */
        case 'B':
        case '2':
        ZapCursorXY(cursorside?40:2,cursorline);
        if(cursorline==visiblelines-1)
        { /* Side ned */
          if(toparea+visiblelines*2<numareas)
          {
            toparea+=visiblelines*2;
            if(visiblelines+toparea>=numareas) cursorside=0;
            cursorline=0;
            refreshbottom=TRUE;
          }
        }
        else
        { /* Crsr en ned */
          if(toparea+cursorside*visiblelines+cursorline+1<numareas)
          {
            cursorline++;
            msg(ESC"[1B");
          }
        }
        break;

        /* side ned */
        case 'N':
        case 'n':
        case '3':
        ZapCursorXY(cursorside?40:2,cursorline);
        if(toparea+visiblelines*2<numareas)
        {
          toparea+=visiblelines*2;
          if(visiblelines+toparea>=numareas) cursorside=0;
          cursorline=0;
          refreshbottom=TRUE;
        }
        break;

        /* Refresh */
        case ' ':
        refreshbottom=refreshtop=TRUE;
        break;

        /* En tast vi ikke kan bruge til noget */
        default:
        break;
      }
    }
    FreeVec(list);
    msg("\xc");
    FindFiles(activearea);
  }
}