#include <exec/types.h>
#include <intuition/intuition.h>
#include <libraries/gadtools.h>

#include <stdlib.h>
#include "amigan.h"

#define FORMS         89

#define CD             1
#define OBSOLETE       2
#define PRIVATE        4
#define PROPOSAL       8
#define RESERVED      16
#define RKM           32
#define STANDARD      64
#define UNREGISTERED 128

MODULE void iffquery(void);

// from rp1.c
IMPORT SBYTE             page;
IMPORT struct NewGadget* Gadget;
IMPORT struct Gadget    *BU99_Right,
                        *PrevGadPtr;
IMPORT struct Window*    MainWindowPtr;

MODULE struct Gadget  *TE61_Contributor        = NULL,
                      *CB61_CD                 = NULL,
                      *CB61_Obsolete           = NULL,
                      *TE61_FORM               = NULL,
                      *ST61_FORMID             = NULL,
                      *CB61_Private            = NULL,
                      *CB61_Proposal           = NULL,
                      *CB61_Reserved           = NULL,
                      *CB61_RKM                = NULL,
                      *CB61_Standard           = NULL,
                      *CB61_Unregistered       = NULL;
MODULE TEXT  queryform[5] = "";
MODULE UWORD selectedform = 0;
MODULE struct
{   ABOOL cd, rkm, obsolete, private, proposal, reserved, standard, unregistered;
} iff;
MODULE struct
{   UBYTE flags;
    TEXT  name[5],
          desc[52 + 1],
          contributor[23 + 1];
} form[FORMS + 1] =
{   STANDARD | RKM | CD,      "8SVX", "EA IFF 85 8-bit sound sample form",                    "EA/CBM",
    RKM | CD,                 "AIFF", "Audio 1-32 bit samples",                               "Apple",
    RKM | CD,                 "ACBM", "Amiga Contiguous Bitmap",                              "CBM",
    UNREGISTERED,             "AHAM", "?",                                                    "?",
    RKM | CD,                 "ANBM", "Animated BitMap form",                                 "EA",
    RKM | CD,                 "ANIM", "CEL ANIMation form",                                   "Sparta/Aegis",
    PROPOSAL,                 "ARC ", "ARChive format",                                       "?",
    UNREGISTERED,             "ARES", "?",                                                    "?",
    RESERVED,                 "ATXT", "Temporarily reserved",                                 "?",
    PRIVATE,                  "AVCF", "AmigaVision Flow",                                     "CBM",
    NULL,                     "BANK", "Soundquest Editor/Librarian MIDI Sysex dump",          "?",
    NULL,                     "BBSD", "BBS Database",                                         "Phalanx Software",
    PRIVATE,                  "C100", "?",                                                    "Cloanto",
    STANDARD,                 "CAT ", "EA IFF 85 group identifier",                           "EA/CBM",
    PROPOSAL,                 "CELP", "Compressed ZyXEL voice data",                          "?",
    RESERVED,                 "CHBM", "Chunky bitmap",                                        "Eric Lavitsky",
    NULL,                     "CLIP", "CAT CLIP to hold various formats in clipboard",        "CBM",
    PROPOSAL | CD,            "CMUS", "Common MUsical Score",                                 "Talin (David Joiner)",
    NULL,                     "CPFM", "Cloanto Personal FontMaker",                           "Cloanto",
    NULL,                     "DCCL", "DCTV paint clip",                                      "?",
    NULL,                     "DCPA", "DCTV paint palette",                                   "?",
    NULL,                     "DCTV", "DCTV raw picture file",                                "?",
    PRIVATE,                  "DECK", "Inovatronics CanDo",                                   "Innovatronics",
    CD,                       "DEEP", "Chunky pixel image files (used in TV Paint)",          "Amiga Centre Scotland",
    RKM | CD,                 "DR2D", "2D object standard format",                            "Ross Cunniff & John Orr",
    RESERVED,                 "DRAW", "?",                                                    "Jim Bayless",
    CD,                       "DTYP", "DataTYPes identification",                             "Amiga, Inc.",
    PROPOSAL | CD,            "EXEC", "Executable (loadseg-able) code",                       "Chris Ludwig",
    RKM | CD,                 "FANT", "Fantavision movie format",                             "Broderbund",
    OBSOLETE | PRIVATE,       "FAX3", "Facsimile image",                                      "GPSoftware",
    CD,                       "FAXX", "Facsimile image",                                      "Atlantis Design Group",
    RESERVED,                 "FIGR", "Deluxe Video",                                         "EA",
    NULL,                     "FILM", "LIST FILM - stores ILBMs with interleaved 8SVX audio", "?",
    RESERVED,                 "FNTR", "Raster font",                                          "EA",
    RESERVED,                 "FNTV", "Vector font",                                          "EA",
    STANDARD,                 "FORM", "Group identifier",                                     "EA/CBM",
    STANDARD | RKM,           "FTXT", "Formatted TeXT",                                       "EA/CBM",
    PROPOSAL | PRIVATE,       "GRYP", "Byteplane storage",                                    "?",
    RESERVED,                 "GSCR", "General music SCoRe",                                  "EA",
    PROPOSAL | PRIVATE,       "GUI ", "User interface storage",                               "?",
    RKM | CD,                 "HEAD", "Flow idea processor",                                  "New Horizons Software",
    STANDARD | RKM | CD,      "ILBM", "EA IFF 85 raster bitmap form",                         "EA/CBM",
    RESERVED,                 "IOBJ", "?",                                                    "Seven Seas Software",
    RESERVED,                 "IODK", "?",                                                    "Merging Technologies",
    RESERVED,                 "ITRF", "?",                                                    "?",
    RESERVED,                 "JMOV", "?",                                                    "Merging Technologies",
    STANDARD,                 "LIST", "EA IFF 85 group identifier",                           "EA/CBM",
    RESERVED,                 "MFAX", "Facsimile?",                                           "TKR GmbH & Co.",
    NULL,                     "MIDI", "MIDI?",                                                "Circum Design",
    PRIVATE,                  "MOVI", "LIST MOVIe?",                                          "?",
    PRIVATE,                  "MSCX", "Music-X format",                                       "?",
    RESERVED,                 "MSMP", "Temporarily reserved",                                 "?",
    RKM | CD,                 "MTRX", "Numerical data storage (MathVision)",                  "Seven Seas Software",
    NULL,                     "NSEQ", "Numerical sequence",                                   "Stockhausen GmbH",
    PROPOSAL | CD,            "OB3D", "Standard 3D object",                                   "?",
    RKM | CD,                 "PGTB", "ProGram TraceBack",                                    "SAS Institute",
    RESERVED,                 "PICS", "Macintosh picture",                                    "EA",
    RESERVED | OBSOLETE,      "PLBM", "?",                                                    "EA",
    RESERVED | PROPOSAL | CD, "PMBC", "24-bit accurate images",                               "Black Belt Systems",
    RESERVED | PRIVATE,       "PREF", "User preferences data",                                "CBM",
    STANDARD,                 "PROP", "Group identifier",                                     "EA/CBM",
    RKM | CD,                 "PRSP", "DPaint IV perspective move form",                      "EA",
    NULL,                     "PTCH", "Patch file",                                           "SAS Institute",
    RESERVED,                 "PTXT", "Temporarily reserved",                                 "?",
    NULL,                     "RGB4", "4-bit RGB",                                            "?",
    RKM | CD,                 "RGB8", "RGB image (Turbo Silver)",                             "Impulse",
    RKM | CD,                 "RGBN", "RGB image (Turbo Silver)",                             "Impulse",
    RESERVED,                 "RGBX", "Temporarily reserved",                                 "?",
    PRIVATE,                  "ROXN", "Animation",                                            "?",
    RKM | CD,                 "SAMP", "Sampled sound",                                        "Jim Fiore & Jeff Glatt",
    PRIVATE,                  "SC3D", "SCene format (Sculpt-3D)",                             "?",
    PRIVATE,                  "SHAK", "SHAKespeare format",                                   "?",
    RESERVED | PRIVATE,       "SHO1", "?",                                                    "Gary Bonham",
    RESERVED | PRIVATE,       "SHOW", "?",                                                    "Gary Bonham",
    STANDARD | RKM,           "SMUS", "Simple MUsic Score",                                   "EA/CBM",
    CD,                       "SPLT", "File SPLiTting system",                                "ASDG",
    RESERVED,                 "SSRE", "?",                                                    "Merging Technologies",
    UNREGISTERED,             "SWRT", "?",                                                    "?",
    NULL,                     "SYTH", "SoundQuest Master Librarian MIDI System driver",       "?",
    RESERVED,                 "TCDE", "?",                                                    "Merging Technologies",
    RKM | CD,                 "TDDD", "3D rendering data (Turbo Silver)",                     "Impulse",
    UNREGISTERED,             "TERM", "?",                                                    "?",
    CD,                       "TMUI", "ToolMaker User Interface",                             "Michael Erwin",
    CD,                       "TREE", "Arbitrary data structures as trees (or nested lists)", "Stefan Reisner",
    CD | PROPOSAL,            "TRKR", "TRacKeR style music module",                           "Full Tilt Entertainment",
    RESERVED,                 "USCR", "Uhuru SCoRe",                                          "EA",
    RESERVED,                 "UVOX", "Uhuru Macintosh VOiXe",                                "EA",
    PRIVATE,                  "VDEO", "Deluxe ViDEO",                                         "EA",
    RKM | CD,                 "WORD", "ProWrite document",                                    "New Horizons Software",
    CD,                       "YUVN", "For storage of Y:U:V image data",                      "MacroSystem"
};

AGLOBAL void iff1(void)
{   navigate();

    /* FORM ID */
    setgadget(130, 28, 48, 12, "_FORM ID:", NULL);
    ST61_FORMID = PrevGadPtr = (struct Gadget *) CreateGadget
    (   STRING_KIND,
        PrevGadPtr,
        &Gadget,
        GTST_String, &queryform,
        GTST_MaxChars, 4,
        STRINGA_ReplaceMode, TRUE,
        GA_TabCycle, TRUE,
        GT_Underscore, '_',
        TAG_DONE
    );

    /* FORM description */
    setgadget(130, 42, 440, 12, "Description:", NULL);
    TE61_FORM = PrevGadPtr = (struct Gadget *) CreateGadget
    (   TEXT_KIND,
        PrevGadPtr,
        &Gadget,
        GTTX_Text, "-",
        GTTX_Border, TRUE,
        TAG_DONE
    );
    /* contributor name */
    setgadget(130, 56, 440, 12, "Contributor:", NULL);
    TE61_Contributor = PrevGadPtr = (struct Gadget *) CreateGadget
    (   TEXT_KIND,
        PrevGadPtr,
        &Gadget,
        GTTX_Text, "-",
        GTTX_Border, TRUE,
        TAG_DONE
    );

    /* flags */

    setgadget(546, 70, 0, 0, "CD-ROM:", NULL);
    CB61_CD = PrevGadPtr = (struct Gadget *) CreateGadget
    (   CHECKBOX_KIND,
        PrevGadPtr,
        &Gadget,
        GA_Disabled, TRUE,
        GTCB_Checked, iff.cd,
        TAG_DONE
    );
    setgadget(546, 84, 0, 0, "RKM:", NULL);
    CB61_RKM = PrevGadPtr = (struct Gadget *) CreateGadget
    (   CHECKBOX_KIND,
        PrevGadPtr,
        &Gadget,
        GA_Disabled, TRUE,
        GTCB_Checked, iff.rkm,
        TAG_DONE
    );

    setgadget(130, 70, 0, 0, "Obsolete:", NULL);
    CB61_Obsolete = PrevGadPtr = (struct Gadget *) CreateGadget
    (   CHECKBOX_KIND,
        PrevGadPtr,
        &Gadget,
        GA_Disabled, TRUE,
        GTCB_Checked, iff.obsolete,
        TAG_DONE
    );
    setgadget(130, 84, 0, 0, "Private:", NULL);
    CB61_Private = PrevGadPtr = (struct Gadget *) CreateGadget
    (   CHECKBOX_KIND,
        PrevGadPtr,
        &Gadget,
        GA_Disabled, TRUE,
        GTCB_Checked, iff.private,
        TAG_DONE
    );
    setgadget(130, 98, 0, 0, "Proposal:", NULL);
    CB61_Proposal = PrevGadPtr = (struct Gadget *) CreateGadget
    (   CHECKBOX_KIND,
        PrevGadPtr,
        &Gadget,
        GA_Disabled, TRUE,
        GTCB_Checked, iff.proposal,
        TAG_DONE
    );
    setgadget(130, 112, 0, 0, "Reserved:", NULL);
    CB61_Reserved = PrevGadPtr = (struct Gadget *) CreateGadget
    (   CHECKBOX_KIND,
        PrevGadPtr,
        &Gadget,
        GA_Disabled, TRUE,
        GTCB_Checked, iff.reserved,
        TAG_DONE
    );
    setgadget(130, 126, 0, 0, "Standard:", NULL);
    CB61_Standard = PrevGadPtr = (struct Gadget *) CreateGadget
    (   CHECKBOX_KIND,
        PrevGadPtr,
        &Gadget,
        GA_Disabled, TRUE,
        GTCB_Checked, iff.standard,
        TAG_DONE
    );
    setgadget(130, 140, 0, 0, "Unregistered:", NULL);
    CB61_Unregistered = PrevGadPtr = (struct Gadget *) CreateGadget
    (   CHECKBOX_KIND,
        PrevGadPtr,
        &Gadget,
        GA_Disabled, TRUE,
        GTCB_Checked, iff.unregistered,
        TAG_DONE
    );

    newwindow
    (   640, IFF1HEIGHT,
        "Report+: IFF Registry",
        BUTTONIDCMP | STRINGIDCMP
    );
    ActivateGadget(ST61_FORMID, MainWindowPtr, NULL);
    loop();
    closewindow();
}

AGLOBAL void iff_loop(ULONG class, struct Gadget* addr, UWORD code)
{   if (class == IDCMP_VANILLAKEY)
    {   code = toupper(code);
        if (code == ESCAPE)
            page = 0;
        elif (code == 'F')
            iffquery();
    } elif (class == IDCMP_GADGETUP)
    {   /* IDCMP_GADGETUP is sent by the string gadget
        when the user presses RETURN, ENTER, Help, Tab
        or Shift-Tab inside the string gadget. */
        
        if (addr == BU99_Right)
            page = 0;
        elif (addr == ST61_FORMID)
            iffquery();
}   }

MODULE void iffquery(void)
{   ULONG i;

    strcpy
    (   queryform,
        ((struct StringInfo *) ST61_FORMID->SpecialInfo)->Buffer
    );
    /* Make any corrections to input now, to make it
    easier to search the database. */
    for (i = 0; i <= 3; i++)
        if (queryform[i] >= 97 && queryform[i] <= 122)
            queryform[i] -= 32;
        elif (queryform[i] == 0)
            queryform[i] = ' ';
    queryform[4] = 0;
    GT_SetGadgetAttrs
    (   ST61_FORMID,
        MainWindowPtr,
        NULL,
        GTST_String, &queryform,
        TAG_DONE
    );
    selectedform = (UWORD) -1;
    for (i = 0; i <= FORMS; i++)
    if (queryform[0] == form[i].name[0] &&
        queryform[1] == form[i].name[1] &&
        queryform[2] == form[i].name[2] &&
        queryform[3] == form[i].name[3])
    {   selectedform = i;
        break;
    }
    if (selectedform == (UWORD) -1)
    {   iff.cd           =
        iff.rkm          =
        iff.private      =
        iff.proposal     =
        iff.obsolete     =
        iff.reserved     =
        iff.standard     =
        iff.unregistered = FALSE;
        GT_SetGadgetAttrs
        (   TE61_FORM,
            MainWindowPtr,
            NULL,
            GTTX_Text, "-",
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   TE61_Contributor,
            MainWindowPtr,
            NULL,
            GTTX_Text, "-",
            TAG_DONE
        );
    } else
    {   iff.cd           = form[selectedform].flags & CD;
        iff.rkm          = form[selectedform].flags & RKM;
        iff.private      = form[selectedform].flags & PRIVATE;
        iff.proposal     = form[selectedform].flags & PROPOSAL;
        iff.obsolete     = form[selectedform].flags & OBSOLETE;
        iff.reserved     = form[selectedform].flags & RESERVED;
        iff.standard     = form[selectedform].flags & STANDARD;
        iff.unregistered = form[selectedform].flags & UNREGISTERED;
        GT_SetGadgetAttrs
        (   TE61_FORM,
            MainWindowPtr,
            NULL,
            GTTX_Text, form[selectedform].desc,
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   TE61_Contributor,
            MainWindowPtr,
            NULL,
            GTTX_Text, form[selectedform].contributor,
            TAG_DONE
        );
    }
    GT_SetGadgetAttrs
    (   CB61_CD,
        MainWindowPtr,
        NULL,
        GTCB_Checked, iff.cd,
        TAG_DONE
    );
    GT_SetGadgetAttrs
    (   CB61_RKM,
        MainWindowPtr,
        NULL,
        GTCB_Checked, iff.rkm,
        TAG_DONE
    );
    GT_SetGadgetAttrs
    (   CB61_Obsolete,
        MainWindowPtr,
        NULL,
        GTCB_Checked, iff.obsolete,
        TAG_DONE
    );
    GT_SetGadgetAttrs
    (   CB61_Private,
        MainWindowPtr,
        NULL,
        GTCB_Checked, iff.private,
        TAG_DONE
    );
    GT_SetGadgetAttrs
    (   CB61_Proposal,
        MainWindowPtr,
        NULL,
        GTCB_Checked, iff.proposal,
        TAG_DONE
    );
    GT_SetGadgetAttrs
    (   CB61_Reserved,
        MainWindowPtr,
        NULL,
        GTCB_Checked, iff.reserved,
        TAG_DONE
    );
    GT_SetGadgetAttrs
    (   CB61_Standard,
        MainWindowPtr,
        NULL,
        GTCB_Checked, iff.standard,
        TAG_DONE
    );
    GT_SetGadgetAttrs
    (   CB61_Unregistered,
        MainWindowPtr,
        NULL,
        GTCB_Checked, iff.unregistered,
        TAG_DONE
    );
    ActivateGadget(ST61_FORMID, MainWindowPtr, NULL);
}

