#include <ctype.h>
#include <functions.h>

#define GD_Wert   0
#define GD_Farbe  1
#define GD_OK     2
#define GD_Cancel 3

extern APTR   VisualInfo;
extern BYTE   PlayStack[][10];
extern struct Screen *Scr;
extern struct Window *Wnd;
extern struct TextAttr topaz8;

struct Window *SCWnd = NULL;
struct Gadget *SCGList = NULL;
struct Gadget *SCGadgets[4];

UBYTE *Wert0Labels[] = {
        (UBYTE *)"_Ass", (UBYTE *)"_2",    (UBYTE *)"_3",
        (UBYTE *)"_4",   (UBYTE *)"_5",    (UBYTE *)"_6",
        (UBYTE *)"_7",   (UBYTE *)"_8",    (UBYTE *)"_9",
        (UBYTE *)"_10",  (UBYTE *)"_Bube", (UBYTE *)"_Dame",
        (UBYTE *)"_König",
        NULL };

UBYTE *Farbe0Labels[] = {
        (UBYTE *)"Kar_o", (UBYTE *)"_Herz",
        (UBYTE *)"_Pik",  (UBYTE *)"K_reuz",
        NULL };

UBYTE *WertLabel[] = {
        (UBYTE *)"Ass", (UBYTE *)"2",    (UBYTE *)"3",
        (UBYTE *)"4",   (UBYTE *)"5",    (UBYTE *)"6",
        (UBYTE *)"7",   (UBYTE *)"8",    (UBYTE *)"9",
        (UBYTE *)"10",  (UBYTE *)"Bube", (UBYTE *)"Dame",
        (UBYTE *)"König",
        NULL };

UBYTE *FarbeLabel[] = {
        (UBYTE *)"Karo", (UBYTE *)"Herz",
        (UBYTE *)"Pik", (UBYTE *)"Kreuz",
        NULL };

UBYTE ShortCuts[] = {'A','2','3','4','5','6','7','8','9','1',
                     'B','D','K','O','H','P','R','S','N'};

void FehlerAus(long nr);

struct TagItem SCGTag1[] =
{
  {GTMX_Labels,},/*  {GTMX_Labels, *Wert0Labels},*/
  {GTMX_Spacing, 3},
  {GT_Underscore, '_'},
  {TAG_DONE,}
};

struct TagItem SCGTag2[] =
{
  {GTMX_Labels,},/*  {GTMX_Labels, *Farbe0Labels},*/
  {GTMX_Spacing, 3},
  {GT_Underscore, '_'},
  {TAG_DONE,}
};

struct TagItem SCGTag3[] =
{
  {GT_Underscore, '_'},
  {TAG_DONE,}
};

struct TagItem *SCGTags[] = {SCGTag1, SCGTag2, SCGTag3, SCGTag3};

struct IntuiText SCIText[] = {
        1, 0, JAM1,26, 30, &topaz8, (UBYTE *)"Wert der Karte :", &SCIText[1],
        1, 0, JAM1,185, 30, &topaz8, (UBYTE *)"Farbe der Karte :", NULL };

ULONG SCGTypes[] = {
        MX_KIND,
        MX_KIND,
        BUTTON_KIND,
        BUTTON_KIND
};

struct NewGadget SCNGad[] = {
         70,  60,  17,  9, NULL, &topaz8,  GD_Wert, PLACETEXT_RIGHT, NULL, NULL,
        225,  60,  17,  9, NULL, &topaz8, GD_Farbe, PLACETEXT_RIGHT, NULL, NULL,
        185, 110, 150, 47, (UBYTE *)"_Suchen",       &topaz8, GD_OK, PLACETEXT_IN, NULL, NULL,
        185, 160, 150, 47, (UBYTE *)"_nicht Suchen", &topaz8, GD_Cancel, PLACETEXT_IN, NULL, NULL
};

struct Gadget *gads[4];

struct EasyStruct SearchMess = {sizeof(struct EasyStruct), 0, NULL, NULL, "OK"};

void OpenSCWindow()
{
  long i;
  struct Gadget *gad;

  SCGTag1[0].ti_Data = (ULONG)Wert0Labels;
  SCGTag2[0].ti_Data = (ULONG)Farbe0Labels;

  gad = CreateContext(&SCGList);

  for(i=0;i<4;i++)
  {
    SCNGad[i].ng_VisualInfo = VisualInfo;
    gads[i] = gad = CreateGadgetA(SCGTypes[i], gad, &SCNGad[i], SCGTags[i]);
  }

  if(!gad)
  {
    FehlerAus(9);
    return;
  }

  if(!(SCWnd = OpenWindowTags(NULL,
                   WA_Left,      140,
                   WA_Top,       141,
                   WA_Width,     360,
                   WA_Height,    230,
                   WA_IDCMP,     MXIDCMP|BUTTONIDCMP|IDCMP_MOUSEBUTTONS|IDCMP_INACTIVEWINDOW|IDCMP_VANILLAKEY,
                   WA_Flags,     WFLG_DRAGBAR|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
                   WA_Gadgets,   SCGList,
                   WA_Title,     (UBYTE *)"Karte suchen...",
                   WA_PubScreen, Scr,
                   TAG_DONE )))
  {
    FehlerAus(7);
    return;
  }

  GT_RefreshWindow(SCWnd, NULL);

  DrawBevelBox(SCWnd->RPort, 26, 37, 150, 170, GT_VisualInfo, VisualInfo, TAG_DONE);
  DrawBevelBox(SCWnd->RPort, 185, 37, 150, 70, GT_VisualInfo, VisualInfo, TAG_DONE);
  PrintIText(SCWnd->RPort, SCIText, 10, 15);
}

void CloseSCWindow()
{
  if(SCWnd)
  {
    CloseWindow(SCWnd);
    SCWnd = NULL;
  }

  if(SCGList)
  {
    FreeGadgets(SCGList);
    SCGList = NULL;
  }
}

void SucheKarte()
{
  long i,j,class,code,Karte,Wert=0,Farbe=0;
  long posx1=0,posy1,posx2=0,posy2;
  BOOL suchen,ende = FALSE;
  struct IntuiMessage *message;
  struct MsgPort      *UserPort;
  struct Gadget       *gad;

  OpenSCWindow();
  UserPort = SCWnd->UserPort;
  while(!ende)
  {
    Wait(1L << UserPort->mp_SigBit);
    while(message = (struct IntuiMessage *) GT_GetIMsg(UserPort))
    {
      gad = (struct Gadget*)message->IAddress;
      class = message->Class;
      code  = message->Code;
      GT_ReplyIMsg(message);
      switch(class)
      {
        case IDCMP_INACTIVEWINDOW: ActivateWindow(SCWnd);
                                   break;
        case IDCMP_GADGETUP:       suchen = (gad->GadgetID == GD_OK);
                                   ende = TRUE;
                                   break;
        case IDCMP_GADGETDOWN:     if(gad->GadgetID == GD_Wert) Wert = code;
                                   else Farbe = code;
                                   break;
        case IDCMP_VANILLAKEY:
          code = toupper(code);
          if(code == 13) code = 'S';
          for(i=0;i<19;i++)
            if(code == ShortCuts[i]) break;
          if(i == 19) break;
          if(i<13) Wert = i;
          else if(i<17) Farbe = i - 13;
          if(i>16)
          {
            suchen = (i == 17);
            ende = TRUE;
          }
          GT_SetGadgetAttrs(gads[0], SCWnd, NULL, GTMX_Active, Wert, TAG_DONE);
          GT_SetGadgetAttrs(gads[1], SCWnd, NULL, GTMX_Active, Farbe, TAG_DONE);
      }
    }
  }
  CloseSCWindow();

  if(suchen)
  {
    Karte = Farbe*13+Wert+1;
    for(j=9;j>=0;j--)
      for(i=PlayStack[0][j];i>0;i--)
      {
        if(PlayStack[i][j]<0) break;
        if(PlayStack[i][j] == Karte)
        {
          posx2 = posx1;
          posy2 = posy1;
          posx1 = i;
          posy1 = j;
        }
      }
    SearchMess.es_TextFormat = "%s-%s ist nicht sichtbar!";
    if(posx1) SearchMess.es_TextFormat = "%s-%s ist in Reihe %ld und Spalte %ld";
    if(posx2) SearchMess.es_TextFormat = "%s-%s ist in Reihe %ld und Spalte %ld,\nsowie in Reihe %ld und Spalte %ld";
    EasyRequest(Wnd, &SearchMess, NULL, FarbeLabel[Farbe], WertLabel[Wert], posy1+1, posx1, posy2+1, posx2);
  }
}
