#include <exec/types.h>
#include <clib/exec_protos.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <clib/intuition_protos.h>
#include <libraries/gadtools.h>
#include <clib/gadtools_protos.h>
#include <libraries/expansion.h>
#include <libraries/expansionbase.h>
#include <libraries/configvars.h>
#include <clib/expansion_protos.h>
#include <graphics/gfx.h>
#include <clib/graphics_protos.h>

#include <ctype.h>
#include <stdlib.h>
#include "rp.h"
#include "boards.h"

#define MANUFS 63

MODULE  ULONG                 querymanuf,
                              queryproduct;
MODULE  UBYTE                 boards;
MODULE  UBYTE                 whichboard;
MODULE  UWORD                 selectedmanuf   = 0,
                              selectedproduct = 0;
MODULE  struct ExpansionBase* ExpansionBase   = NULL;

// from rp.c
IMPORT SBYTE             page;
IMPORT ABOOL             fillwindows;
IMPORT struct NewGadget  Gadget;
IMPORT struct Gadget    *BU99_Right,
                        *PrevGadPtr;
IMPORT struct Window*    MainWindowPtr;
IMPORT struct Library*   BoardsBase;

MODULE struct
{   UWORD manuf;
    UBYTE product;
} board[32]; // how many boards can you physically have?

MODULE struct Gadget  *TE51_Desc,
                      *IN51_ManufID,
                      *TE51_ManufNames,
                      *BU51_NextBoard,
                      *BU51_PrevBoard,
                      *IN51_ProductID,
                      *TE51_ProductNames,
                      *BU51_Query;

MODULE struct
{   ULONG  number[3];
    STRPTR name;
} manuf[MANUFS + 1] =
{
 2010,  2113,    -1, "?",
 2117,    -1,    -1, "X-Pert",
 2022,    -1,    -1, "Xetec",
 2028,    -1,    -1, "Xebec",
 8215,    -1,    -1, "Vortex",
 2167,    -1,    -1, "VillageTronic",
 2128,    -1,    -1, "Triceratops",
 1056,    -1,    -1, "Supra",
 2150,    -1,    -1, "SRE",
 2034,  2035,    -1, "Spirit Technology",
32768,    -1,    -1, "SKI Peripherals",
 2055,    -1,    -1, "Serial Solutions (Checkpoint Technologies)",
 8704,    -1,    -1, "Sang/CT",
 1028,  4136,    -1, "Ronin/Imtronics",
43437,    -1,    -1, "Reis-Ware",
 8448,    -1,    -1, "ReadySoft",
 2148,    -1,    -1, "Protar",
  756,  2026,    -1, "Progressive Peripherals and Software",
 2101, 46504,    -1, "Phoenix",
 8512,    -1,    -1, "Phase 5",
  211,    -1,    -1, "Pacific Peripherals",
 2145,    -1,    -1, "Omega Datentechnik",
 2067,    -1,    -1, "NES, Incorporated",
 1010,    -1,    -1, "MicroBotics",
 1081,    -1,    -1, "Marc Michael Groth",
 2159,    -1,    -1, "Mainhattan-Data (A-Team)",
  256,  2203, 18260, "MacroSystems USA",
 1030,    -1,    -1, "Lowell University/Commodore Business Machines",
 2073,  4680,    -1, "Kupke/Golem",
 2052,    -1,    -1, "Jochheim",
 2112,    -1,    -1, "IVS",
 2078,    -1,    -1, "Interworks/Network",
 2104,    -1,    -1, "Impulse",
 2071,    -1,    -1, "ICD",
 2121,    -1,    -1, "Hydra Systems",
 2195,    -1,    -1, "Helfrich",
 2560,    -1,    -1, "Harms",
 2011,    -1,    -1, "Hacker",
 1761,  2017,  2193, "Great Valley Peripherals",
 2142,    -1,    -1, "GfxBase",
 1014,    -1,    -1, "Expansion Technologies (Pacific Cypress)",
 8290,    -1,    -1, "Expansion Systems",
 2064,    -1,    -1, "Edotronik",
 2129,    -1,    -1, "DMI",
 2012,    -1,    -1, "DKB",
 1058,    -1,    -1, "CSA",
 1006,    -1,    -1, "Comspec",
  513,   514,    -1, "Commodore Business Machines",
  515,    -1,    -1, "Combitech/MacroSystems USA",
26470, 49160,    -1, "Combitec",
 2021,    -1,    -1, "California Access (Synergy)",
 1004,  2050,    -1, "C. Ltd",
 2049,    -1,    -1, "BSC (Elaborate Bytes)",
 2092,    -1,    -1, "BSC",
 2146,    -1,    -1, "Atlantis",
 1005,    -1,    -1, "A-Squared",
 1023,    -1,    -1, "ASDG",
 2088,    -1,    -1, "Applied Engineering",
 1009,    -1,    -1, "Anakin Research",
 2176,    -1,    -1, "AmiTrix",
 1053,    -1,    -1, "Ameristar",
 2102,    -1,    -1, "Advanced Storage Systems",
 2149,    -1,    -1, "ACS",
 1012,    -1,    -1, "Access Associates"
};

#define PRODUCTS 174
struct
{   ULONG  manufid,
           number[2];
    STRPTR name;
    STRPTR desc;
} product[PRODUCTS + 1] =
{
 2026, 150,  -1, "Zeus 040",                            "68040 accelerator + 32-bit expansion memory + SCSI host adapter", 1056,  12,  -1, "WordSync HD Interface",               "SCSI host adapter",
 2203,  19,  -1, "Warp Engine",                         "68040 accelerator + 32-bit expansion memory",
  256,  19,  -1, "Warp Engine",                         "68040 accelerator + 32-bit expansion memory",
 1010,  68,  -1, "VXL RAM*32",                          "32-bit expansion memory",
 1010,  69,  -1, "VXL 30",                              "68030/6888x accelerator",
 2064,   8,  -1, "VME-Bus Controller",                  "VME-bus interface board",
18260,   4,  -1, "VLab Y/UV Digitizer",                 "Video digitizer board",
 2117,   2,  -1, "Visiona",                             "Graphics board (I/O area)",
 2117,   1,  -1, "Visiona",                             "Graphics board (memory area)",
 2113, 227,  -1, "Vektor I/O",                          "I/O board",
 2112, 243,  -1, "Vector",                              "68030/68882 accelerator + 32-bit expansion memory",
 2112,  48,  -1, "TrumpCard Classic",                   "SCSI host adapter",
 2112,  52,  -1, "TrumpCard Pro/Grand Slam",            "SCSI host adapter",
 1056,  10,  -1, "SupraRAM",                            "16-bit expansion memory",
 1056,   1,  -1, "SupraDrive 4x4 SCSI",                 "SCSI host adapter",
 1010,   2,  -1, "StarDrive",                           "SCSI host adapter",
 1010,   0,  -1, "StarBoard 2",                         "16-bit expansion memory",
46504,  33,  -1, "ST506 Autoboot",                      "MFM controller",
 2101,  33,  -1, "ST506 Autoboot",                      "MFM controller",
49160,  43,  -1, "SRAM Card",                           "Memory board",
 2034,   3,  -1, "SIN500",                              "16-bit expansion memory",
 2012,   9,  -1, "SecureKey",                           "Access control board",
32768, 128,  -1, "SCSI + Dual Serial",                  "SCSI host adapter/serial board",
46504,  34,  -1, "SCSI Autoboot",                       "SCSI host adapter",
 2101,  34,  -1, "SCSI Autoboot",                       "SCSI host adapter",
 2073,   2,  -1, "SCSI",                                "SCSI host adapter",
43437,  17,  -1, "Scan King",                           "Scanner",
  514,  96,  -1, "Romulator",                           "?",
18260,  16,  -1, "Retina Z3",                           "Graphics board",
18260,   6,  -1, "Retina",                              "Graphics board",
 2129,   1,  -1, "Resolver",                            "Graphics board",
 2088,  16,  -1, "RAM Works",                           "16-bit expansion memory",
 2052,   1,  -1, "RAM Board",                           "16-bit expansion memory",
 2022,   2,  -1, "RAM Board",                           "16-bit expansion memory",
 1023,   1,   2, "RAM Board",                           "16-bit expansion memory",
 2011,   2,  -1, "Quicknet QN2000",                     "Ethernet LAN board",
 2064,   6,  -1, "PIC Prototyping Board",               "Prototyping board",
 2195,  11,  -1, "Piccolo SD64",                        "Graphics board (I/O area)",
 2195,  10,  -1, "Piccolo SD64",                        "Graphics board (memory area)",
 2195,   6,  -1, "Piccolo",                             "Graphics board (I/O area)",
 2195,   5,  -1, "Piccolo",                             "Graphics board (memory area)",
 2167,  13,  -1, "Picasso ][",                          "Graphics board (segmented area)",
 2167,  12,  -1, "Picasso ][",                          "Graphics board (I/O area)",
 2167,  11,  -1, "Picasso ][",                          "Graphics board (memory area)",
 2112,  16,  -1, "OverDrive",                           "SCSI host adapter",
 4680,   1,  -1, "Omti HD Controller",                  "MFM controller",
 2073,   1,  -1, "Omti HD Controller",                  "MFM controller",
 2092,   5,  -1, "Oktagon",                             "SCSI host adapter",
 2034,   6,  -1, "OctaByte",                            "16-bit expansion memory",
 2102,   1,  -1, "Nexus",                               "SCSI host adapter",
 2128,   1,  -1, "Multiport I/O",                       "I/O board",
 2176,   1,  -1, "Multi-I/O",                           "I/O board",
 2092,  16,  17, "MultiFaceCard",                       "Serial/parallel board",
 2092,  18,  -1, "MultiFaceCard ]I[",                   "Serial/parallel board",
 2112,  64,  -1, "Meta-4",                              "16-bit expansion memory",
 2092,   8,  -1, "Memory Master",                       "16-bit expansion memory",
 2073,   3,  -1, "Memory Expansion",                    "16-bit expansion memory",
46504, 190,  -1, "Memory Board",                        "16-bit expansion memory",
 2101, 190,  -1, "Memory Board",                        "16-bit expansion memory",
 1010, 129, 193, "MBX 1200",                            "32-bit expansion memory",
 2021,   1,  -1, "Malibu SCSI",                         "SCSI host adapter",
 1058,  17,  -1, "Magnum 040",                          "68040 accelerator + 32-bit expansion memory",
 8704,   1,  -1, "Link-Interface",                      "Transputer link interface",
 1005,   1,  -1, "LIVE! A2000",                         "Video digitizer board",
 2050,   4,  -1, "Kronos 2000",                         "SCSI host adapter",
 1004,   4,  -1, "Kronos 2000",                         "SCSI host adapter",
 2092,  65,  -1, "ISDN-Master",                         "ISDN board",
 2034,   1,  -1, "Insider IN1000",                      "16-bit expansion memory",
 2034,   2,  -1, "Insider IN500",                       "16-bit expansion memory",
 2034,   8,  -1, "Inmate SCSI/FPU/RAM",                 "?",
 2017,  32,  -1, "Impact Vision 24",                    "Graphics board",
 2017,  11,  -1, "Impact Series ][ SCSI (DPRC)",        "SCSI host adapter (or I/O extender)",
 2017,   3,  -1, "Impact Series I SCSI 16K/3",          "SCSI host adapter",
 2017,   2,  -1, "Impact Series I SCSI 16K/2",          "SCSI host adapter",
 2017,   1,  -1, "Impact Series I SCSI 4K",             "SCSI host adapter",
 1761,   8,  -1, "Impact SCSI",                         "SCSI host adapter",
 2017,   8,  13, "Impact A3001 IDE HD",                 "68030/68882 accelerator + IDE controller",
 2064,   1,  -1, "IEEE-488 Controller",                 "IEEE-488 interface board",
 2159,   1,  -1, "IDE",                                 "IDE controller",
 2121,   1,  -1, "Hydra Ethernet",                      "Ethernet LAN board",
 4136,  57,  87, "Hurricane 2800",                      "68030/6888x accelerator + 32-bit expansion memory",
 1028,  57,  87, "Hurricane 2800",                      "68030/6888x accelerator + 32-bit expansion memory",
 2064,   3,  -1, "High-Speed Multiserial Interface",    "Serial board",
  211,  10,  -1, "HD Controller",                       "SCSI host adapter",
49160,  42,  -1, "HD Controller",                       "SCSI host adapter",
 2034,   4,  -1, "HDA-506",                             "MFM controller",
 1010, 150, 158, "HardFrame/2000",                      "SCSI host adapter",
 2112,   4,  -1, "GrandSlam",                           "SCSI/parallel/serial board",
 1023, 255,  -1, "GPIB or Dual Serial Board",           "IEEE-488 or Twin-X serial card",
 8215,   8,  -1, "GoldenGate 386SX RAM",                "80386SX bridgeboard/Amiga shared RAM",
 8215,   7,  -1, "GoldenGate 386SX",                    "80386SX bridgeboard",
 2150,   1,  -1, "GoldenGate ][",                       "Zorro ][-ISA bridgeboard",
 2017, 255,  -1, "G-Force 040 I/O ('040/2000)",         "Serial/parallel board",
 2142,   0,  -1, "GDA-1 VRAM",                          "Graphics board",
 2142,   1,  -1, "GDA-1",                               "Graphics board",
 2104,   0,  -1, "Firecracker",                         "Frame buffer",
 2092,  32,  -1, "Frame Buffer",                        "Graphics board",
 2022,   1,  -1, "FastTrak HD",                         "SCSI host adapter",
 8512,  10,  -1, "FastLane Z3",                         "SCSI host adapter + 32-bit expansion memory",
 2022,   3,  -1, "FastCard + HD Controller",            "?",
 2067,   0,  -1, "Expansion RAM",                       "16-bit expansion memory",
  756,   2,  -1, "EXP8000",                             "16-bit expansion memory",
 1053,   1,  -1, "Ethernet",                            "Ethernet LAN board",
 2193,   1,  -1, "EGS Spectrum",                        "Graphics board (I/O area)",
 2193,   2,  -1, "EGS Spectrum",                        "Graphics board (memory area)",
 1004,  14,  -1, "Escort",                              "SCSI host adapter",
 1023, 254,  -1, "EB-920 LanRover",                     "Ethernet LAN board",
 1009,   1,  -1, "Easyl",                               "Graphics tablet",
 2064,   9,  -1, "DSP96000 Real Time Data Acquisition", "Data acquisition board",
 2088,  16,  -1, "DL2000",                              "Modem",
 2055,   0,  -1, "Dual Port Serial",                    "Serial board",
 2129,   6,  -1, "Digital Broadcaster 32",              "Image processing board",
 8290,   1,  -1, "DataFlyer 500 SCSI",                  "SCSI host adapter",
 8512,  34,  -1, "CyberVision 64",                      "Graphics board",
 8512,  11,  -1, "CyberStorm",                          "68040 accelerator + 32-bit expansion memory",
 2176,   2,  -1, "CD-RAM",                              "16-bit expansion memory",
 2010,   0,  -1, "Byte Box A500",                       "?",
 8512,  24,  -1, "Blizzard A2060",                      "68060 accelerator + 32-bit expansion memory",
 8512,  17,  -1, "Blizzard 1230",                       "68030/68882 accelerator + 32-bit expansion memory",
 8512,   2,  -1, "Blizzard Turbo",                      "Accelerator board (I/O area)",
 8512,   1,  -1, "Blizzard Turbo",                      "Accelerator board (memory area)",
 2034,   5,  -1, "AX-S IBM Hardware I/O Board",         "I/O board",
 1006,   1,  -1, "AX2000",                              "16-bit expansion memory",
 8448,   1,  -1, "A-Max ][+/A-Max IV",                  "Macintosh emulation board",
 2049,   3,  -1, "ALF 3 SCSI",                          "SCSI host adapter",
 2049,   2,  -1, "ALF 2 SCSI",                          "SCSI host adapter",
 2049,   1,  -1, "ALF 2",                               "MFM controller",
 2071,   1,  -1, "Advantage 2000/AdSCSI",               "SCSI host adapter",
 2167, 201,  -1, "Adriadne",                            "Ethernet LAN + I/O board",
 2071,   4,  -1, "AdRAM 2080",                          "16-bit expansion memory",
 2071,   3,  -1, "AdIDE",                               "IDE controller",
  514,  84,  -1, "A4091",                               "SCSI host adapter",
 1053,  10,  -1, "A4066",                               "Ethernet LAN board",
  514,  97,  -1, "A3000 test fixture",                  "?",
  514,  81,  -1, "A2630",                               "68030/68882 accelerator + 32-bit expansion memory",
  514,  80,  -1, "A2620",                               "68020/68851/6888x accelerator + 32-bit expansion memory",
 1030,   0,  -1, "A2410",                               "Graphics board",
  513, 103,  -1, "A2386SX",                             "80386SX bridgeboard",
  513,   2,  -1, "A2286",                               "80286 bridgeboard",
  514,  70,  -1, "A2232",                               "Serial board",
  514,  69,  -1, "A2232 prototype",                     "Serial board",
  514,   3,  -1, "A2091",                               "SCSI host adapter",
  514,   4,  -1, "A2090B",                              "Autoboot card",
  515,   3,  -1, "A2090/A2090A",                        "MFM controller + SCSI host adapter with new driver",
  514,   1,  -1, "A2090/A2090A",                        "MFM controller + SCSI host adapter",
  513,   1,  -1, "A2088/A2286",                         "8088/80286 bridgeboard",
  514, 112,  -1, "A2065",                               "Ethernet LAN board",
 1053,   9,  -1, "A2060 Arcnet",                        "Arcnet LAN board",
  514,   9,  -1, "A2060",                               "Arcnet LAN board",
  514,  10,  -1, "A205x/A2091/A590",                    "16-bit expansion memory",
 2560, 208,  -1, "A2000 Turboboard 3500 Professional",  "68030/68882 accelerator + 32-bit expansion memory",
 1056,   3,  -1, "A2000 DMA HD Interface",              "SCSI host adapter",
 2017,  22,  -1, "A2000 060 Combo",                     "68060 accelerator + 32-bit expansion memory",
 1004,  12,  -1, "A1000/A2000 SCSI",                    "SCSI host adapter",
 2050,  12,  -1, "A1000 SCSI",                          "SCSI host adapter",
 1056,   2,  -1, "A1000 RAM Expansion",                 "16-bit expansion memory",
  514,   2,  -1, "A590",                                "SCSI host adapter/XT controller",
  514,  32,  -1, "A560",                                "16-bit expansion memory",
 1056,  13,  -1, "A500 ByteSync HD Interface",          "SCSI host adapter",
 1056,   8,  -1, "A500 Autoboot HD Interface",          "SCSI host adapter",
 2073,   5,  -1, "68030 (asynchronous)",                "68030/6888x accelerator",
 2073,   4,  -1, "68030 (synchronous)",                 "68030/6888x accelerator",
 2064,   2,  -1, "8032 Development Adapter",            "CBM-8032 board?",
 1056,  16,  -1, "2400zi+",                             "Modem",
 1056,  11,  -1, "2400zi",                              "Modem",
 1056,   9,  -1, "500/2000 RX",                         "16-bit expansion memory",
 1056,   5,  -1, "500 HD/RAM",                          "SCSI host adapter + 16-bit expansion memory",
 2026, 105,  -1, "040/A2000 Board",                     "68040 accelerator + 32-bit expansion memory",
 2064,   5,  -1, "32-Bit Parallel I/O Interface",       "Parallel board",
 2064,   4,  -1, "24-Bit Real Time Video Digitizer",    "Video digitizer board",
 2064,   7,  -1, "16-Channel ADC Interface",            "Analog to digital board",
 1058,  21,  -1, "12 Gauge",                            "68030/68882 accelerator + 32-bit expansion memory",
 1010,   4,  -1, "8-UP! (Z)",                           "16-bit expansion memory",
 1010,   3,  -1, "8-UP! (A)",                           "16-bit expansion memory"
};

AGLOBAL void runquery(ULONG querymanuf, ULONG queryproduct)
{   SWORD i, /* i must be signed and at least 16 bits wide */
          j;
    TEXT  manuf_buffer[49], product_buffer[49];

    /* This function takes a manufacturer and product ID and attempts
    to update the text gadgets with a relevant text description.

    If ~0 (-1) is passed for either the manufacturer or product ID,
    the function returns instantly without doing anything. */

    selectedmanuf   =
    selectedproduct = (UWORD) ~0;

    if (querymanuf == (ULONG) ~0 || queryproduct == (ULONG) ~0)
    {   return;
    }

    if (BoardsBase)
    {   if (GetBoardName(manuf_buffer, product_buffer, NULL, querymanuf, queryproduct))
        {   GT_SetGadgetAttrs
            (   TE51_ManufNames,
                MainWindowPtr,
                NULL,
                GTTX_Text, manuf_buffer,
                TAG_DONE
            );
            GT_SetGadgetAttrs
            (   TE51_ProductNames,
                MainWindowPtr,
                NULL,
                GTTX_Text, product_buffer,
                TAG_DONE
            );
            GT_SetGadgetAttrs
            (   TE51_Desc,
                MainWindowPtr,
                NULL,
                GTTX_Text, "-",
                TAG_DONE
            );
            return;
    }   }

    // can't find in boards.library
    for (i = 0; i <= MANUFS; i++) // go through each manufacturer
    {   for (j = 0; j <= 2; j++)  // each manufacturer has up to 3 IDs
        {   if (querymanuf == manuf[i].number[j])
            {   selectedmanuf = i;
                break;            // for speed
    }   }   }

    if (selectedmanuf == (UWORD) ~0)
    {   /* can't find manufacturer, let alone product */
        GT_SetGadgetAttrs
        (   TE51_ManufNames,
            MainWindowPtr,
            NULL,
            GTTX_Text, "-",
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   TE51_ProductNames,
            MainWindowPtr,
            NULL,
            GTTX_Text, "-",
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   TE51_Desc,
            MainWindowPtr,
            NULL,
            GTTX_Text, "-",
            TAG_DONE
        );
        return;
    }

    // found manufacturer
    GT_SetGadgetAttrs
    (   TE51_ManufNames,
        MainWindowPtr,
        NULL,
        GTTX_Text, manuf[selectedmanuf].name,
        TAG_DONE
    );

    // now look for product too
    for (i = 0; i <= PRODUCTS; i++)
    {   if (querymanuf == product[i].manufid)
        {   for (j = 0; j <= 1; j++)
            {   if (queryproduct == product[i].number[j])
                {    selectedproduct = i;
                     break; // for speed
    }   }   }   }

    if (selectedproduct == (UWORD) ~0)
    {   // can't find product

        GT_SetGadgetAttrs
        (   TE51_ProductNames,
            MainWindowPtr,
            NULL,
            GTTX_Text, "-",
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   TE51_Desc,
            MainWindowPtr,
            NULL,
            GTTX_Text, "-",
            TAG_DONE
        );
        return;
    }

    GT_SetGadgetAttrs
    (   TE51_ProductNames,
        MainWindowPtr,
        NULL,
        GTTX_Text, product[selectedproduct].name,
        TAG_DONE
    );
    GT_SetGadgetAttrs
    (   TE51_Desc,
        MainWindowPtr,
        NULL,
        GTTX_Text, product[selectedproduct].desc,
        TAG_DONE
    );
}

AGLOBAL void updatemanuf(void)
{   if (whichboard == 0)
        GT_SetGadgetAttrs
        (   BU51_PrevBoard,
            MainWindowPtr, NULL,
            GA_Disabled, TRUE,
            TAG_DONE
        );
    else
        GT_SetGadgetAttrs
        (   BU51_PrevBoard,
            MainWindowPtr, NULL,
            GA_Disabled, FALSE,
            TAG_DONE
        );

    if (whichboard < boards)
    {   GT_SetGadgetAttrs
        (   BU51_Query,
            MainWindowPtr, NULL,
            GA_Disabled, TRUE,
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   BU51_NextBoard,
            MainWindowPtr, NULL,
            GA_Disabled, FALSE,
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   IN51_ManufID,
            MainWindowPtr, NULL,
            GA_Disabled, TRUE,
            GTIN_Number, board[whichboard].manuf,
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   IN51_ProductID,
            MainWindowPtr, NULL,
            GA_Disabled, TRUE,
            GTIN_Number, board[whichboard].product,
            TAG_DONE
        );
    } else
    {   GT_SetGadgetAttrs
        (   BU51_Query,
            MainWindowPtr, NULL,
            GA_Disabled, FALSE,
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   BU51_NextBoard,
            MainWindowPtr, NULL,
            GA_Disabled, TRUE,
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   IN51_ManufID,
            MainWindowPtr, NULL,
            GA_Disabled, FALSE,
            GTIN_Number, querymanuf,
            TAG_DONE
        );
        GT_SetGadgetAttrs
        (   IN51_ProductID,
            MainWindowPtr, NULL,
            GA_Disabled, FALSE,
            GTIN_Number, queryproduct,
            TAG_DONE
        );
    }
    runquery(board[whichboard].manuf, board[whichboard].product);
}

AGLOBAL void manuf1(void)
{   struct ConfigDev* ThisConfigDev;
    
    if (ExpansionBase = (struct ExpansionBase *) OpenLibrary(EXPANSIONNAME, 0))
    {   /* Use FindConfigDev() to get info on the first expansion board on
        the list maintained by Exec. */

        if (ThisConfigDev = FindConfigDev(NULL, -1, -1))
        {   board[0].manuf = ThisConfigDev->cd_Rom.er_Manufacturer;
            board[0].product = ThisConfigDev->cd_Rom.er_Product;
            boards = 1;

            /* OK, there is at least one board, so loop and get the
            entire list. */
            while (ThisConfigDev = FindConfigDev(ThisConfigDev, -1, -1))
            {   board[boards].manuf = ThisConfigDev->cd_Rom.er_Manufacturer;
                board[boards++].product = ThisConfigDev->cd_Rom.er_Product;
        }   }
        else boards = 0;
        CloseLibrary((struct Library *) ExpansionBase);
    }

    verynewwindow
    (   MANUF1WIDTH, MANUF1HEIGHT,
        "Report+: ID Database",
        BUTTONIDCMP | STRINGIDCMP
    );
    if (fillwindows)
    {   SetAPen(MainWindowPtr->RPort, 0);
        RectFill(MainWindowPtr->RPort, 130, 28, 130 + 390, 28 + 12);
        RectFill(MainWindowPtr->RPort, 130, 42, 130 + 390, 42 + 12);
        RectFill(MainWindowPtr->RPort, 130, 56, 130 + 390, 56 + 12);
    }

    /* manufacturer name */
    setgadget(130, 28, 390, 12, "Manufacturer:", NULL);
    TE51_ManufNames = PrevGadPtr = (struct Gadget *) CreateGadget
    (   TEXT_KIND,
        PrevGadPtr,
        &Gadget,
        GTTX_Text, "-",
        GTTX_Border, TRUE,
        TAG_DONE
    );
    /* product name */
    setgadget(130, 42, 390, 12, "Product:", NULL);
    TE51_ProductNames = PrevGadPtr = (struct Gadget *) CreateGadget
    (   TEXT_KIND,
        PrevGadPtr,
        &Gadget,
        GTTX_Text, "-",
        GTTX_Border, TRUE,
        TAG_DONE
    );
    /* product description */
    setgadget(130, 56, 390, 12, "Description:", NULL);
    TE51_Desc = PrevGadPtr = (struct Gadget *) CreateGadget
    (   TEXT_KIND,
        PrevGadPtr,
        &Gadget,
        GTTX_Text, "-",
        GTTX_Border, TRUE,
        TAG_DONE
    );

    /* manufacturer ID */
    setgadget(560, 28, 64, 12, "_ID:", NULL);
    IN51_ManufID = PrevGadPtr = (struct Gadget *) CreateGadget
    (   INTEGER_KIND,
        PrevGadPtr,
        &Gadget,
        GTIN_Number, querymanuf,
        GA_TabCycle, TRUE,
        STRINGA_ReplaceMode, TRUE,
        STRINGA_Justification, GACT_STRINGRIGHT,
        GT_Underscore, '_',
        TAG_DONE
    );

    /* product ID */
    setgadget(560, 42, 64, 12, "I_D:", NULL);
    IN51_ProductID = PrevGadPtr = (struct Gadget *) CreateGadget
    (   INTEGER_KIND,
        PrevGadPtr,
        &Gadget,
        GTIN_Number, queryproduct,
        GA_TabCycle, TRUE,
        STRINGA_ReplaceMode, TRUE,
        STRINGA_Justification, GACT_STRINGRIGHT,
        GT_Underscore, '_',
        TAG_DONE
    );

    /* query */
    setgadget(560, 56, 64, 12, "_Query", NULL);
    BU51_Query = PrevGadPtr = (struct Gadget *) CreateGadget
    (   BUTTON_KIND,
        PrevGadPtr,
        &Gadget,
        GT_Underscore, '_',
        TAG_DONE
    );

    /* previous board */
    setgadget(130, 70, 195, 12, "_Previous Board", NULL);
    BU51_PrevBoard = PrevGadPtr = (struct Gadget *) CreateGadget
    (   BUTTON_KIND,
        PrevGadPtr,
        &Gadget,
        GT_Underscore, '_',
        TAG_DONE
    );
    /* next board */
    setgadget(325, 70, 195, 12, "_Next Board", NULL);
    BU51_NextBoard = PrevGadPtr = (struct Gadget *) CreateGadget
    (   BUTTON_KIND,
        PrevGadPtr,
        &Gadget,
        GT_Underscore, '_',
        TAG_DONE
    );

    /* boards is the actual number of boards found. 0 to (board - 1).
    We actually use the [board] index as our 'spare' 'queryable' index.

    In the old way of doing windows, we first called navigate(), then
    set up the gadgets, then called newwindow().
        In the new way, we first call verynewwindow() (which calls
    navigate() automatically), then set up the gadgets, then call
    drawgadgets(). */

    drawgadgets((UWORD) ~0);
    ActivateGadget(IN51_ManufID, MainWindowPtr, NULL);
    updatemanuf();
    loop();
    closewindow();
}

AGLOBAL void manuf_loop(ULONG class, struct Gadget* addr, UWORD code)
{   if (class == IDCMP_VANILLAKEY)
    {   code = toupper(code);
        if (code == 'Q')
        {   querymanuf = ((struct StringInfo *) IN51_ManufID->SpecialInfo)->LongInt;
            queryproduct = ((struct StringInfo *) IN51_ProductID->SpecialInfo)->LongInt;
            runquery(querymanuf, queryproduct);
        } elif (code == ESCAPE)
        {   page = 0;
        } elif (code == 'N')
        {   whichboard++;
            updatemanuf();
        } elif (code == 'P')
        {   whichboard--;
            updatemanuf();
        } elif (code == 'I')
        {   ActivateGadget(IN51_ManufID, MainWindowPtr, NULL);
        } elif (code == 'D')
        {   ActivateGadget(IN51_ProductID, MainWindowPtr, NULL);
    }   }
    elif (class == IDCMP_GADGETUP)
    {   if (addr == BU99_Right)
        {   page = 0;
        } elif (addr == BU51_Query)
        {   querymanuf = ((struct StringInfo *) IN51_ManufID->SpecialInfo)->LongInt;
            queryproduct = ((struct StringInfo *) IN51_ProductID->SpecialInfo)->LongInt;
            runquery(querymanuf, queryproduct);
        } elif (addr == BU51_NextBoard)
        {   whichboard++;
            updatemanuf();
        } elif (addr == BU51_PrevBoard)
        {   whichboard--;
            updatemanuf();
}   }   }
