#include <AminetSearcher_lowlevel.h>

void Checkbox_Handle(BOOL);
void Checkbox_Handle_onoff(BOOL);

void Window1_CloseWindow_Event(void)
{
    if(Quitrequest1()) terminated = TRUE;
}

void Menu_Info_MenuPick_Event(void)
{
    Inforequest1();
}

void Menu_Quit_MenuPick_Event(void)
{
    if(Quitrequest1()) terminated = TRUE;
}

void Menu_Select_All_MenuPick_Event(void)
{
    Checkbox_Handle_onoff(TRUE);
}

void Menu_Select_None_MenuPick_Event(void)
{
    Checkbox_Handle_onoff(FALSE);
}

void Checkbox16_GadgetUp_Event(void)
{
    in_lha = stringtoint(Emperor_GetGadgetAttr(Checkbox16));
    Checkbox_Handle(!in_lha);
    Emperor_SetGadgetDisabledAttr(Checkbox17, in_lha || !all_or_one_cd);
}

void Checkbox17_GadgetUp_Event(void)
{
    single = stringtoint(Emperor_GetGadgetAttr(Checkbox17));
}

void Chooser1_GadgetUp_Event(void)
{
    all_or_one_cd = stringtoint(Emperor_GetGadgetAttr(Chooser1));
    if(all_or_one_cd) Checkbox_Handle(TRUE);
    else Checkbox_Handle(!in_lha);
    Emperor_SetGadgetDisabledAttr(Checkbox16, all_or_one_cd);
    Emperor_SetGadgetDisabledAttr(Checkbox17, !all_or_one_cd);
}

void Button1_GadgetUp_Event(void)
{
    char output[12] = "";
    char buffer1[11] = "";
    char dirbuffer[300][11];
    char filebuffer[21] = "";
    BOOL term = FALSE, checkboxbool = FALSE;
    BPTR file = NULL;
    WORD i = 0, j = 0, k = 0, l = 0;
    FLOAT calc = 0.00, calc1 = 0.00;
    FLOAT position1 = 0.00, position2 = 0.00, position3 = 0.00, position4 = 0.00;
    ULONG counter = 0;

    entryzahl = 0;
    Checkbox_Handle(TRUE);
    Emperor_SetGadgetDisabledAttr(String1, TRUE);
    Emperor_SetGadgetDisabledAttr(String2, TRUE);
    Emperor_SetGadgetDisabledAttr(String3, TRUE);
    Emperor_SetGadgetDisabledAttr(String4, TRUE);
    Emperor_SetGadgetDisabledAttr(String5, TRUE);
    Emperor_SetGadgetDisabledAttr(Checkbox16, TRUE);
    Emperor_SetGadgetDisabledAttr(Checkbox17, TRUE);
    Emperor_SetGadgetDisabledAttr(Chooser1, TRUE);
    Emperor_SetGadgetDisabledAttr(Button1, TRUE);
    Emperor_SetGadgetDisabledAttr(Button2, FALSE);

    if((pattern[0][0]) || (pattern[1][0]) || (pattern[2][0]) || (pattern[3][0]) || (pattern[4][0]))
    {
        if(!all_or_one_cd)
        {
            /* nur eine CD */
            if(in_lha)
            {
                /* suche in LhAs */
                for(j = 0;j < 14;j++)
                {
                    term = stringtoint(Emperor_GetGadgetAttr(Button2));
                    switch(j)
                    {
                      case 0: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox1)); break;
                      case 1: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox2)); break;
                      case 2: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox3)); break;
                      case 3: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox4)); break;
                      case 4: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox5)); break;
                      case 5: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox6)); break;
                      case 6: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox7)); break;
                      case 7: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox8)); break;
                      case 8: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox9)); break;
                      case 9: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox10)); break;
                      case 10: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox11)); break;
                      case 11: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox12)); break;
                      case 12: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox13)); break;
                      case 13: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox14)); break;
                      case 14: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox15)); break;
                    }
                    if(checkboxbool)
                    {
                        file = NULL;
                        switch(j)
                        {
                            case  0: file = Open("CD0:Aminet/biz/INDEX",  MODE_OLDFILE); break;
                            case  1: file = Open("CD0:Aminet/comm/INDEX", MODE_OLDFILE); break;
                            case  2: file = Open("CD0:Aminet/demo/INDEX", MODE_OLDFILE); break;
                            case  3: file = Open("CD0:Aminet/dev/INDEX",  MODE_OLDFILE); break;
                            case  4: file = Open("CD0:Aminet/disk/INDEX", MODE_OLDFILE); break;
                            case  5: file = Open("CD0:Aminet/docs/INDEX", MODE_OLDFILE); break;
                            case  6: file = Open("CD0:Aminet/game/INDEX", MODE_OLDFILE); break;
                            case  7: file = Open("CD0:Aminet/gfx/INDEX",  MODE_OLDFILE); break;
                            case  8: file = Open("CD0:Aminet/hard/INDEX", MODE_OLDFILE); break;
                            case  9: file = Open("CD0:Aminet/misc/INDEX", MODE_OLDFILE); break;
                            case 10: file = Open("CD0:Aminet/mods/INDEX", MODE_OLDFILE); break;
                            case 11: file = Open("CD0:Aminet/mus/INDEX",  MODE_OLDFILE); break;
                            case 12: file = Open("CD0:Aminet/pix/INDEX",  MODE_OLDFILE); break;
                            case 13: file = Open("CD0:Aminet/text/INDEX", MODE_OLDFILE); break;
                            case 14: file = Open("CD0:Aminet/util/INDEX", MODE_OLDFILE); break;
                        }
                        if(file)
                        {
                            Seek(file, 0, OFFSET_END);
                            position2 += Seek(file, 0, OFFSET_BEGINNING);
                            Close(file);
                        }
                    }
                    if(term) break;
                }
                for(j = 0;j < 14;j++)
                {
                    switch(j)
                    {
                      case 0: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox1)); break;
                      case 1: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox2)); break;
                      case 2: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox3)); break;
                      case 3: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox4)); break;
                      case 4: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox5)); break;
                      case 5: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox6)); break;
                      case 6: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox7)); break;
                      case 7: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox8)); break;
                      case 8: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox9)); break;
                      case 9: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox10)); break;
                      case 10: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox11)); break;
                      case 11: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox12)); break;
                      case 12: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox13)); break;
                      case 13: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox14)); break;
                      case 14: checkboxbool = stringtoint(Emperor_GetGadgetAttr(Checkbox15)); break;
                    }
                    if(checkboxbool)
                    {
                        file = NULL;
                        switch(j)
                        {
                            case  0: file = Open("CD0:Aminet/biz/INDEX",  MODE_OLDFILE); break;
                            case  1: file = Open("CD0:Aminet/comm/INDEX", MODE_OLDFILE); break;
                            case  2: file = Open("CD0:Aminet/demo/INDEX", MODE_OLDFILE); break;
                            case  3: file = Open("CD0:Aminet/dev/INDEX",  MODE_OLDFILE); break;
                            case  4: file = Open("CD0:Aminet/disk/INDEX", MODE_OLDFILE); break;
                            case  5: file = Open("CD0:Aminet/docs/INDEX", MODE_OLDFILE); break;
                            case  6: file = Open("CD0:Aminet/game/INDEX", MODE_OLDFILE); break;
                            case  7: file = Open("CD0:Aminet/gfx/INDEX",  MODE_OLDFILE); break;
                            case  8: file = Open("CD0:Aminet/hard/INDEX", MODE_OLDFILE); break;
                            case  9: file = Open("CD0:Aminet/misc/INDEX", MODE_OLDFILE); break;
                            case 10: file = Open("CD0:Aminet/mods/INDEX", MODE_OLDFILE); break;
                            case 11: file = Open("CD0:Aminet/mus/INDEX",  MODE_OLDFILE); break;
                            case 12: file = Open("CD0:Aminet/pix/INDEX",  MODE_OLDFILE); break;
                            case 13: file = Open("CD0:Aminet/text/INDEX", MODE_OLDFILE); break;
                            case 14: file = Open("CD0:Aminet/util/INDEX", MODE_OLDFILE); break;
                        }
                        if(file)
                        {
                            filezahl = 0;
                            Seek(file, 0, OFFSET_END);
                            position1 = Seek(file, 0, OFFSET_BEGINNING);
                            FGets(file, puffer, 100);
                            FGets(file, puffer, 100);
                            while((FGets(file, puffer, 100)) && (filezahl < 300))
                            {
                                stringcopywithoutspace(filebuffer, puffer);
                                for(l = 0;l < 10;l++) buffer1[l] = puffer[l + 19];
                                buffer1[10] = NULL;
                                stringcopywithoutspace(dirbuffer[filezahl], buffer1);
                                strcpy(executepuffer[filezahl], "Run >NIL: lha v CD0:Aminet/");
                                strcat(executepuffer[filezahl], dirbuffer[filezahl]);
                                strcat(executepuffer[filezahl], "/");
                                strcat(executepuffer[filezahl], filebuffer);
                                strcat(executepuffer[filezahl], " >RAM:T/AminetSearcher-LhA.output");
                                filezahl++;
                                term = stringtoint(Emperor_GetGadgetAttr(Button2));
                                if(term) break;
                            }
                            Close(file);
                            for(k = 0;k < filezahl;k++)
                            {
/*****************************************************************************/
/** This section isn't correct ! (and I don't know why !)                   **/
/** Now the packer LhA should be called, but after a calling like:          **/
/**                         SystemTags(executepuffer[k], TAG_DONE);         **/
/** or                                                                      **/
/**                         Execute(executepuffer[k], NULL, NULL);          **/
/** the program doesn't open the outputfile.                                **/
/*****************************************************************************/
/*****************************************************************************/
/** Dieser Abschnitt stimmt noch nicht ganz ! (und ich weiß nicht warum !)  **/
/** Irgendwie soll nun der Aufruf von LhA erfolgen, aber nach diesem Aufruf **/
/** in der Richtung wie:                                                    **/
/**                         SystemTags(executepuffer[k], TAG_DONE);         **/
/** oder                                                                    **/
/**                         Execute(executepuffer[k], NULL, NULL);          **/
/** kann man das Programm, aus welchem Grund auch immer, nicht mehr zum     **/
/** öffnen des Output-Files bewegen.                                        **/
/*****************************************************************************/
                                calc = (FLOAT) k / (FLOAT) filezahl * 100;
                                calc1 = ((calc / 100) * position1 + position3) / position2 * 100;
                                Emperor_SetGadgetAttr(Fuelgauge1, inttostring((LONG) calc));
                                Emperor_SetGadgetAttr(Fuelgauge2, inttostring((LONG) calc1));
                                Emperor_SetGadgetAttr(String6, dirbuffer[k]);
                                term = stringtoint(Emperor_GetGadgetAttr(Button2));
                                if(term) break;
                            }
                            position3 += position1;
                        }
                        else Errorrequest1();
                    }
                    if(term) break;
                }
            }
            else
            {
                /* suche im Index */
                file = Open("CD0:Aminet/INDEX", MODE_OLDFILE);
                if(file)
                {
                    Seek(file, 0, OFFSET_END);
                    position1 = Seek(file, 0, OFFSET_BEGINNING);
                    FGets(file, puffer, 100);
                    FGets(file, puffer, 100);
                    FGets(file, puffer, 100);
                    FGets(file, puffer, 100);
                    FGets(file, puffer, 100);
                    FGets(file, puffer, 100);
                    while((FGets(file, puffer, 100)) && (entryzahl < 1024))
                    {
                        makelower(convert, puffer);
                        make_entry();
                        counter++;
                        if(counter == 50)
                        {
                            counter = 0;
                            position2 = Seek(file, 0, OFFSET_CURRENT);
                            calc = position2 / position1 * 100;
                            for(i = 0;i < 11;i++) output[i] = puffer[19 + i];
                            output[11] = NULL;
                            Emperor_SetGadgetAttr(Fuelgauge1, inttostring((LONG) calc));
                            Emperor_SetGadgetAttr(Fuelgauge2, inttostring((LONG) calc1));
                            Emperor_SetGadgetAttr(String6, output);
                            term = stringtoint(Emperor_GetGadgetAttr(Button2));
                        }
                        if(term) break;
                    }
                    Close(file);
                }
                else Errorrequest1();
            }
        }
        else
        {
            /* alle CDs */
            if(single) file = Open("CD0:Lists/Single_Dir.doc", MODE_OLDFILE);
            else file = Open("CD0:Lists/Aminet_Dir.doc", MODE_OLDFILE);
            if(file)
            {
                Seek(file, 0, OFFSET_END);
                position1 = Seek(file, 0, OFFSET_BEGINNING);
                FGets(file, puffer, 100);
                FGets(file, puffer, 100);
                FGets(file, puffer, 100);
                FGets(file, puffer, 100);
                FGets(file, puffer, 100);
                FGets(file, puffer, 100);
                while((FGets(file, puffer, 100)) && (entryzahl < 1024))
                {
                    makelower(convert, puffer);
                    make_entry();
                    counter++;
                    if(counter == 200)
                    {
                        counter = 0;
                        position2 = Seek(file, 0, OFFSET_CURRENT);
                        calc = position2 / position1 * 100;
                        for(i = 0;i < 11;i++) output[i] = puffer[19 + i];
                        output[11] = NULL;
                        Emperor_SetGadgetAttr(Fuelgauge1, inttostring((LONG) calc));
                        Emperor_SetGadgetAttr(Fuelgauge2, inttostring((LONG) calc1));
                        Emperor_SetGadgetAttr(String6, output);
                        term = stringtoint(Emperor_GetGadgetAttr(Button2));
                    }
                    if(term) break;
                }
                Close(file);
            }
            else Errorrequest1();
        }
    }
    else Nopatternrequest1();
    Emperor_SetGadgetDisabledAttr(String1, FALSE);
    Emperor_SetGadgetDisabledAttr(String2, FALSE);
    Emperor_SetGadgetDisabledAttr(String3, FALSE);
    Emperor_SetGadgetDisabledAttr(String4, FALSE);
    Emperor_SetGadgetDisabledAttr(String5, FALSE);
    Emperor_SetGadgetDisabledAttr(Checkbox16, all_or_one_cd);
    Emperor_SetGadgetDisabledAttr(Checkbox17, !all_or_one_cd);
    Emperor_SetGadgetDisabledAttr(Chooser1, FALSE);
    Emperor_SetGadgetDisabledAttr(Button1, FALSE);
    Emperor_SetGadgetDisabledAttr(Button2, TRUE);
    Emperor_SetGadgetAttr(Fuelgauge1, inttostring(100));
    Emperor_SetGadgetAttr(Fuelgauge2, inttostring(100));
    Emperor_SetGadgetAttr(String6, "Status: ok");
    Checkbox_Handle(!in_lha || all_or_one_cd);
    if(term) Emperor_SetGadgetAttr(Button2, inttostring(FALSE));
}

void Listbrowser1_GadgetUp_Event(void)
{
    char buffer1[20];
    LONG entry;
    WORD choose, i = 0;

    IntuiMessage = GT_GetIMsg(Window1->UserPort);
    if(DoubleClick(Seconds, Micros, IntuiMessage->Seconds, IntuiMessage->Micros))
    {
        entry = stringtoint(Emperor_GetGadgetAttr(Listbrowser1));
        if(entry != -1)
        {
            choose = Extractrequest1();
            if(choose == 1)
            {
                strcpy(puffer, "SYS:Utilities/Multiview CD0:Aminet/");
                stringcopywithoutspace(buffer1, founded_files_list_col3_raw[entry]);
                strcat(puffer, buffer1);
                strcat(puffer, "/");
                stringcopywithoutspace(buffer1, founded_files_list_col2_raw[entry]);
                strcat(puffer, buffer1);
                while(puffer[i]) i++;
                puffer[i - 4] = NULL;
                strcat(puffer, ".readme");
                Execute(puffer, NULL, NULL);
                Emperor_SetGadgetAttr(String6, "Status: ok");
            }
            if(choose == 2)
            {
                strcpy(puffer, "Run >NIL: lha x CD0:Aminet/");
                stringcopywithoutspace(buffer1, founded_files_list_col3_raw[entry]);
                strcat(puffer, buffer1);
                strcat(puffer, "/");
                stringcopywithoutspace(buffer1, founded_files_list_col2_raw[entry]);
                strcat(puffer, buffer1);
                strcat(puffer, " RAM:");
                Execute(puffer, NULL, NULL);
                Emperor_SetGadgetAttr(String6, "Extracted to RAM:");
            }
            if(choose == 3)
            {
                Emperor_SetGadgetAttr(String6, "Status: ok");
            }
        }
    }
    Seconds = IntuiMessage->Seconds;
    Micros = IntuiMessage->Micros;
    GT_ReplyIMsg(IntuiMessage);
}

void Checkbox_Handle(BOOL disabled)
{
    Emperor_SetGadgetDisabledAttr(Checkbox1, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox2, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox3, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox4, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox5, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox6, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox7, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox8, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox9, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox10, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox11, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox12, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox13, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox14, disabled);
    Emperor_SetGadgetDisabledAttr(Checkbox15, disabled);
}

void Checkbox_Handle_onoff(BOOL onoff)
{
    Emperor_SetGadgetAttr(Checkbox1, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox2, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox3, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox4, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox5, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox6, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox7, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox8, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox9, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox10, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox11, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox12, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox13, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox14, inttostring(onoff));
    Emperor_SetGadgetAttr(Checkbox15, inttostring(onoff));
}

void String1_GadgetUp_Event(void)
{
    strcpy(pattern[0], Emperor_GetGadgetAttr(String1));
    makelower(patternlower[0], pattern[0]);
}

void String2_GadgetUp_Event(void)
{
    strcpy(pattern[1], Emperor_GetGadgetAttr(String2));
    makelower(patternlower[1], pattern[1]);
}

void String3_GadgetUp_Event(void)
{
    strcpy(pattern[2], Emperor_GetGadgetAttr(String3));
    makelower(patternlower[2], pattern[2]);
}

void String4_GadgetUp_Event(void)
{
    strcpy(pattern[3], Emperor_GetGadgetAttr(String4));
    makelower(patternlower[3], pattern[3]);
}

void String5_GadgetUp_Event(void)
{
    strcpy(pattern[4], Emperor_GetGadgetAttr(String5));
    makelower(patternlower[4], pattern[4]);
}

