PROGRAM XSearch;

{$incl "exec.lib"}
{$incl "intuition.lib","intuition/gadgetclass.h"}
{$incl "graphics.lib"}
{$incl "gadtools.lib"}
{$incl "diskfont.lib"}
{$incl "dos.lib"}
{$incl "utility.lib"}
{$incl "asl.lib"}
{$incl "wb.lib"}
{$incl "iffparse.lib"}

CONST   LF = chr($A);
        Reverse = chr($7F);
        CM_OPTIONS = FALSE;
        CM_FILER = TRUE;
{IFF}   ID_CHRS = $43485253;
        ID_FTXT = $46545854;

TYPE    DateTimeFormat = RECORD
                DH,MM,YS:integer
        END;
        p_Prefs = ^Prefs;
        Prefs = RECORD
                Bigger,Smaller:long
                Bits:string[9];
                Date1,Time1,Date2,Time2:string[11];
                DateFormat:integer
                Pattern,Comment,Typ,FileIn:string[257];
                Bool:long;
                BoolComment,BoolFileIn:short
        end;
        p_OptimizedPrefs = ^OptimizedPrefs;
        OptimizedPrefs = RECORD
                Bigger,Smaller:long
                DoLength:boolean
                Bits,BitsMask:long
                Date1,Date2:DateStamp
                DoDate:boolean
                PreName,PreComment,PreIn:string[769];
                PreIFF:string[257];
                Switches:long;
                CaseComment,CaseFileIn:boolean
                NumIFF:integer
        end;
        p_XSearchPrefs = ^XSearchPrefs;
        XSearchPrefs = RECORD
                FilerStart:boolean;
                StartDir,ProjektDir:String[256]
                Recursion,Sensitivity,Coloured:boolean
                DateFormat:integer
                Currency:boolean
                DirLength,DirIFF,DirFile,DirOther:boolean
        END;
        FileString = String[112];
        DirString = String[256];
        DirNameString = String[364];
        ExchangeString = String[11];
        p_StringNode = ^StringNode;
        StringNode = RECORD
                stn_Node: Node
                stn_String: FileString
        END;
        p_SearchNode = ^SearchNode;
        SearchNode = RECORD
                sen_Node: Node
                sen_String: FileString
                sen_Path: DirString
        END;
        p_AnchorNode = ^AnchorNode;
        AnchorNode = RECORD
                ano_Node: Node
                ano_Anchor: p_AnchorPath
                ano_Lock: BPTR
        END;

VAR     myop    :                               Prefs;
        EndExit :                               integer;
        scr     :                               p_screen;
        VI      :                               ptr;
        DI      :                               p_DrawInfo;
        tattr   :                               TextAttr;
        tfont   :                               p_TextFont;
        PrefsStandard,PCA:                      Prefs;
        PCA_Optimized:                          OptimizedPrefs;
        VariableString:                         string[364];
        VariableStr:                            str;
        FileInfo:                               p_FileInfoBlock;
        ProjektName:                            string[108];
        ProjektDir:                             string[257];
        Projekt :                               string[364];
        ProjektXSearch:                         string[120];
        SearchList:                             p_List;
        SearchNodeV,SearchNodeBack:             p_SearchNode;
        TextNode,TextNodeBack:                  p_StringNode;
        TextList:                               p_List;
        MyPattern,CurrentDirectory,VS,CS:       DirString;
        MyLock  :                               BPTR;
        LockBack:                               BPTR;
        LockFirst:                              BPTR;
        DB      :                               p_DosLibrary;
        CurrentMode:                            Boolean;
        saved   :                               Boolean;
        start   :                               Boolean;
        inSearch:                               Boolean;
        UsedXSP :                               XSearchPrefs;
        BeginString:                            String;
        IDidTheMarking:                         boolean;


PROCEDURE PrepareNode(VAR TestNode:ptr,Text:Str);
VAR     TextNode:                               p_StringNode;
BEGIN
        TextNode:=TestNode;
        TextNode^.stn_Node.ln_Succ:=NIL;
        TextNode^.stn_Node.ln_Pred:=NIL;
        TextNode^.stn_Node.ln_Type:=NT_UNKNOWN;
        TextNode^.stn_String:=Text;
        TextNode^.stn_Node.ln_Name:=TextNode^.stn_String;
END;

FUNCTION UpperString(upstr:str):FileString;
VAR     i       :                               integer;
        VariableString:                         FileString;
BEGIN
        VariableString:=upstr;
        for i:=1 to length(VariableString) do
                VariableString[i]:=upcase(VariableString[i]);
        UpperString:=VariableString
END;

PROCEDURE SortInDirList(VAR TextList:p_List,TextNode:p_node,offset:integer);
LABEL   ExitOut;
VAR     before  :                               Node;
        VariableString,V2:                      FileString;
BEGIN
        VariableString:=copy(TextNode^.ln_Name,offset,length(TextNode^.ln_Name)-offset+1);
        VariableString:=UpperString(VariableString);
        if TextList^.lh_head=Ptr(Long(TextList)+4) then begin AddHead(TextList,TextNode); goto ExitOut end;
        before:=TextList^.lh_Head^;
        if TextNode^.ln_Pri=1 then begin
                V2:=copy(before.ln_Name,offset,length(before.ln_Name)-offset+1);
                V2:=UpperString(V2);
                if VariableString<=V2 then begin AddHead(TextList,TextNode); goto ExitOut end
        end else begin
                while NOT ((before.ln_Pri=0) or (before.ln_succ=TextList^.lh_Tail)) do
                        before:=before.ln_Succ^;
                V2:=copy(before.ln_Name,offset,length(before.ln_Name)-offset+1);
                V2:=UpperString(V2);
                if VariableString<=V2 then begin
                        if TextNode^.ln_Pred=TextList^.lh_Head then AddHead(TextList,TextNode) else Insert(TextList,TextNode,before.ln_pred);
                        goto ExitOut
                end
        end;
        while NOT (((TextNode^.ln_Pri=1) and (before.ln_Pri=0)) or (before.ln_succ=TextList^.lh_Tail) or (VariableString<=V2)) do begin
                before:=before.ln_Succ^;
                V2:=copy(before.ln_Name,offset,length(before.ln_Name)-offset+1);
                V2:=UpperString(V2)
        end;
        Insert(TextList,TextNode,before.ln_pred);
        ExitOut:
END;

PROCEDURE InitList(TestList:p_List);
BEGIN
        WITH TestList^ DO BEGIN
                lh_tail:=NIL;
                lh_TailPred:=Ptr(TestList);
                lh_head:=Ptr(Long(TestList)+4)
        END
END;

FUNCTION CreatePort(name:Str,pri:Byte):p_MsgPort;
VAR     port    :                               p_MsgPort;
        sigbit  :                               Byte;
BEGIN
        port:=ptr(Alloc_Mem(SizeOf(MsgPort),MEMF_CLEAR or MEMF_PUBLIC));
        sigbit:=AllocSignal(-1);
        with port^, mp_Node do begin
                ln_Name:=name;
                ln_Pri:=pri;
                ln_Type:=NT_MSGPORT;
                mp_Flags:=PA_SIGNAL;
                mp_SigBit:=sigbit;
                mp_SigTask:=FindTask(NIL);
                AddPort(port)
        end;
        CreatePort:=port
END;

PROCEDURE DeletePort(port:p_MsgPort);
BEGIN
        RemPort (port);
        FreeSignal(port^.mp_SigBit);
        Free_Mem (Long(port), SizeOf (port^) )
END;


PROCEDURE DrawBevelLine(win:p_window,x,y,t:integer,orientation,bevelling:boolean,
        DI:p_DrawInfo);
BEGIN
        if bevelling=TRUE then
                SetAPen(win^.RPort,DI^.dri_Pens^[SHINEPEN])
        else
                SetAPen(win^.RPort,DI^.dri_Pens^[SHADOWPEN]);
        if orientation=TRUE then
                Rectfill(win^.RPort,x,y,x+1,y+t)
        else begin
                Move(win^.RPort,x,y);
                Draw(win^.RPort,x+t,y)
        end;
        if bevelling=FALSE then
                SetAPen(win^.RPort,DI^.dri_Pens^[SHINEPEN])
        else
                SetAPen(win^.RPort,DI^.dri_Pens^[SHADOWPEN]);
        if orientation=TRUE then
                Rectfill(win^.RPort,x+2,y,x+3,y+t)
        else begin
                Move(win^.RPort,x,y+1);
                Draw(win^.RPort,x+t,y+1)
        end;
END;


FUNCTION GiveQuestion(Title,Introducer,Possibilities:DirNameString,win:p_window):Long;
VAR     ES      :                               EasyStruct;
BEGIN
        VariableString:=Introducer;
        ES:=EasyStruct(sizeof(EasyStruct),0,Title,VariableString,Possibilities);
        GiveQuestion:=EasyRequestArgs(win,^es,NIL,NIL)
END;

PROCEDURE GiveError(Title,Introducer:DirNameString,win:p_window);
VAR     ES      :                               EasyStruct;
        Dummy   :                               long;
BEGIN
        VariableString:=Introducer;
        ES:=EasyStruct(sizeof(EasyStruct),0,Title,VariableString,"OK");
        Dummy:=EasyRequestArgs(win,^es,NIL,NIL)
END;


PROCEDURE NormalPointer(win:p_window);
BEGIN
        ClearPointer (win)
END;

PROCEDURE WaitPointer(win:p_window);
TYPE    PointerArray = Array [1..36] of word;
VAR     InsidePointer:                          ^PointerArray;
BEGIN
        InsidePointer:=Ptr(Alloc_mem(SizeOf(PointerArray),MEMF_CHIP));
        InsidePointer^:=PointerArray(
                $0   ,$0   ,
                $0400,$07C0,
                $0000,$07C0,
                $0100,$0380,
                $0000,$07E0,
                $07C0,$1FF8,
                $1FF0,$3FEC,
                $3FF8,$7FDE,
                $3FF8,$7FBE,
                $7FFC,$FF7F,
                $7EFC,$FFFF,
                $7FFC,$FFFF,
                $3FF8,$7FFE,
                $3FF8,$7FFE,
                $1FF0,$3FFC,
                $07C0,$1FF8,
                $0000,$07E0,
                $0   ,$0
        );
        SetPointer(win,InsidePointer,16,16,-6,0);
END;


PROCEDURE AboutXSearch;
VAR     winAbout:                               p_window;
        CG      :                               p_gadget;
        NewGadgetFields:                        newgadget;
        GadgetOK:                               p_gadget;
        TagsCHANGES:                            array [1..10] of TagItem;
        SIGNAL  :                               long;
        amsg    :                               p_intuimessage;
        dummy   :                               p_gadget;
BEGIN
        GadgetOK:=CreateContext(^CG);

        NewGadgetFields:=NewGadget(316,122,76,12,"Continue",^tattr,20,
                PLACETEXT_IN,VI,NIL);
        GadgetOK:=CreateGadgetA(BUTTON_KIND,CG,^NewGadgetFields,NIL);

        if (CurrentMode=CM_OPTIONS) or (inSearch=TRUE) then
                TagsCHANGES[1]:=TagItem(WA_Top,50)
        else
                TagsCHANGES[1]:=TagItem(WA_Top,100);
        TagsCHANGES[2]:=TagItem(WA_Left,100);
        TagsCHANGES[3]:=TagItem(WA_InnerHeight,139);
        TagsCHANGES[4]:=TagItem(WA_InnerWidth,400);
        TagsCHANGES[5].ti_Tag:=WA_Title;
        TagsCHANGES[5].ti_Data:="XSearch 1.0";
        TagsCHANGES[6]:=TagItem(WA_Flags,WFLG_CLOSEGADGET OR WFLG_GIMMEZEROZERO OR
                WFLG_RMBTRAP OR WFLG_ACTIVATE OR WFLG_DRAGBAR OR WFLG_SMART_REFRESH OR
                WFLG_DEPTHGADGET);
        TagsCHANGES[7]:=TagItem(WA_IDCMP,IDCMP_CLOSEWINDOW or
                IDCMP_GADGETUP or IDCMP_VANILLAKEY);
        TagsCHANGES[8]:=TagItem(WA_CustomScreen,long(scr));
        TagsCHANGES[9].ti_Tag:=WA_Gadgets;
        TagsCHANGES[9].ti_Data:=CG^;
        TagsCHANGES[10].ti_Tag:=TAG_END;
        winAbout:=OpenWindowTagList(NIL,^TagsCHANGES);
        SIGNAL:=SetFont(winAbout^.RPort,tfont);

        GT_RefreshWindow(winAbout,NIL);

        SetAPen(winAbout^.rport,DI^.dri_Pens^[SHADOWPEN]);
        RectFill(winAbout^.rport,0,2,63,12);
        SetAPen(winAbout^.rport,DI^.dri_Pens^[HIGHLIGHTTEXTPEN]);
        SetDrMd(winAbout^.rport,JAM1);
        Move(winAbout^.rport,52,10); SIGNAL:=_Text(winAbout^.rport,"X",1);
        SetAPen(winAbout^.rport,DI^.dri_Pens^[TEXTPEN]);
        Move(winAbout^.rport,67,10); SIGNAL:=_Text(winAbout^.rport,"Search 1.0",10);
        Move(winAbout^.rport,67,22); SIGNAL:=_Text(winAbout^.rport,"©/Program 1992 SP/PeekerBits",28);
        Move(winAbout^.rport,67,34); SIGNAL:=_Text(winAbout^.rport,"Author:",7);
        Move(winAbout^.rport,67,43); SIGNAL:=_Text(winAbout^.rport,"Stefan Plöchinger",17);
        Move(winAbout^.rport,67,52); SIGNAL:=_Text(winAbout^.rport,"Kleiststraße 27",15);
        Move(winAbout^.rport,35,61); SIGNAL:=_Text(winAbout^.rport,"DW- 8012 Ottobrunn",18);
        Move(winAbout^.rport,67,73); SIGNAL:=_Text(winAbout^.rport,"programmed in KICKPascal (MAXON GmbH)",37);
        Move(winAbout^.rport,67,78); Draw(winAbout^.rport,167,78);
        Move(winAbout^.rport,67,88); SIGNAL:=_Text(winAbout^.rport,"XSearch 1.0 is FreeWare. All rights",35);
        Move(winAbout^.rport,67,97); SIGNAL:=_Text(winAbout^.rport,"reserved. XSearch may only be distri-",37);
        Move(winAbout^.rport,67,106); SIGNAL:=_Text(winAbout^.rport,"buted for non-commercial purposes.",34);

        amsg:=Wait_Port(winAbout^.userport);
        amsg:=GT_GetIMsg(winAbout^.userport);
        GT_ReplyIMsg(amsg);

        CloseWindow(winAbout);
        FreeGadgets(CG);
END;


FUNCTION WhatToImport(VAR DejaSelected:long,DateAsk:boolean):long;
VAR     winImport:                              p_window;
        CG      :                               p_gadget;
        CurrentGadget:                          p_gadget;
        NewGadgetFields:                        newgadget;
        GadgetListView:                         p_gadget;
        TextNode,TextNodeBack:                  p_Node;
        TextList:                               List;
        ListContents:                           array[0..6] of string[19];
        GadgetOK:                               p_gadget;
        GadgetZurück:                           p_gadget;
        GadgetCheck:                            p_gadget;
        GadgetHow:                              p_gadget;
        HowContents:                            array[1..3] of str;
        GadgetHow2:                             p_gadget;
        HowContents2:                           array[1..3] of str;
        TagsCHANGES:                            array[1..10] of TagItem;
        DidIt   :                               boolean;
        imsg    :                               p_intuimessage;
        I       :                               integer;
        How     :                               boolean;
        How2    :                               boolean;
        dummy   :                               long;
        Much    :                               integer;
BEGIN
        GadgetListView:=CreateContext(^CG);

        InitList(^TextList);
        ListContents[0]:="  Name pattern";
        ListContents[1]:="  Length control";
        ListContents[2]:="  Attribute ctrl.";
        ListContents[3]:="  Time specific.";
        ListContents[4]:="  Comment pattern";
        ListContents[5]:="  IFF pattern";
        ListContents[6]:="  File-internals";
        if DateAsk=TRUE then Much:=4 else Much:=6;
        if (DateAsk=TRUE) and (DejaSelected=1) then begin Much:=5; DejaSelected:=0 end;
        FOR i:=0 TO Much DO BEGIN
                New(TextNode);
                if (DejaSelected and (long(1) SHL i))<>0 then
                        ListContents[i,1]:="·";
                TextNode^.ln_Succ:=NIL;
                TextNode^.ln_Pred:=NIL;
                TextNode^.ln_Type:=NT_UNKNOWN;
                TextNode^.ln_Pri:=0;
                TextNode^.ln_Name:=ListContents[i];
                AddTail(^TextList,TextNode)
        END;
        TagsCHANGES[1]:=TagItem(GTLV_ScrollWidth,16);
        TagsCHANGES[2].ti_Tag:=GTLV_Labels;
        TagsCHANGES[2].ti_Data:=long(^TextList);
        TagsCHANGES[3]:=TagItem(LAYOUTA_Spacing,1);
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,16,174,70,"Take over:",^tattr,1,
                PLACETEXT_ABOVE,VI,NIL);
        GadgetListView:=CreateGadgetA(LISTVIEW_KIND,CG,^NewGadgetFields,
                ^TagsCHANGES);

        NewGadgetFields:=NewGadget(200,71,75,12,"OK",^tattr,2,PLACETEXT_IN,
                VI,NIL);
        GadgetOK:=CreateGadgetA(BUTTON_KIND,GadgetListView,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(285,71,75,12,"Cancel",^tattr,3,PLACETEXT_IN,
                VI,NIL);
        GadgetZurück:=CreateGadgetA(BUTTON_KIND,GadgetOK,^NewGadgetFields,NIL);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(200,57,0,0,"_active autom.",^tattr,4,
                PLACETEXT_RIGHT,VI,NIL);
        GadgetCheck:=CreateGadgetA(CHECKBOX_KIND,GadgetZurück,^NewGadgetFields,
                ^TagsCHANGES);

        if DateAsk=TRUE then begin
                HowContents[1]:="Length = _>=";
                HowContents[2]:="Length = _<=";
                HowContents[3]:=NIL;
                TagsCHANGES[1]:=TagItem(GT_UnderScore,long("_"));
                TagsCHANGES[2].ti_Tag:=GTMX_Labels;
                TagsCHANGES[2].ti_Data:=long(^HowContents);
                TagsCHANGES[3]:=TagItem(GTMX_Spacing,3);
                TagsCHANGES[4].ti_Tag:=TAG_END;
                NewGadgetFields:=NewGadget(200,11,0,0,NIL,^tattr,
                        5,PLACETEXT_RIGHT,VI,NIL);
                GadgetHow:=CreateGadgetA(MX_KIND,GadgetCheck,^NewGadgetFields,
                        ^TagsCHANGES);

                HowContents2[1]:="Time = _from-Time";
                HowContents2[2]:="Time = _to-Time";
                HowContents2[3]:=NIL;
                TagsCHANGES[1]:=TagItem(GT_UnderScore,long("_"));
                TagsCHANGES[2].ti_Tag:=GTMX_Labels;
                TagsCHANGES[2].ti_Data:=long(^HowContents2);
                TagsCHANGES[3]:=TagItem(GTMX_Spacing,3);
                TagsCHANGES[4].ti_Tag:=TAG_END;
                NewGadgetFields:=NewGadget(200,34,0,0,NIL,^tattr,
                        6,PLACETEXT_RIGHT,VI,NIL);
                GadgetHow2:=CreateGadgetA(MX_KIND,GadgetHow,^NewGadgetFields,
                        ^TagsCHANGES)
        end;

        TagsCHANGES[1]:=TagItem(WA_Top,50);
        TagsCHANGES[2]:=TagItem(WA_Left,100);
        TagsCHANGES[3]:=TagItem(WA_InnerHeight,101);
        TagsCHANGES[4]:=TagItem(WA_InnerWidth,375);
        TagsCHANGES[5].ti_Tag:=WA_Title;
        if DateAsk=FALSE then
                TagsCHANGES[5].ti_Data:="XSearch 1.0 - Take over values"
        else
                TagsCHANGES[5].ti_Data:="XSearch 1.0 - Values out of attr.";
        TagsCHANGES[6]:=TagItem(WA_Flags,WFLG_CLOSEGADGET OR WFLG_GIMMEZEROZERO OR
                WFLG_RMBTRAP OR WFLG_ACTIVATE OR WFLG_DRAGBAR OR WFLG_SMART_REFRESH OR
                WFLG_DEPTHGADGET);
        TagsCHANGES[7]:=TagItem(WA_IDCMP,IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or
                IDCMP_GADGETDOWN or IDCMP_MOUSEMOVE or IDCMP_MOUSEBUTTONS or
                IDCMP_INTUITICKS or IDCMP_VANILLAKEY);
        TagsCHANGES[8]:=TagItem(WA_CustomScreen,long(scr));
        TagsCHANGES[9].ti_Tag:=WA_Gadgets;
        TagsCHANGES[9].ti_Data:=CG^;
        TagsCHANGES[10].ti_Tag:=TAG_END;
        winImport:=OpenWindowTagList(NIL,^TagsCHANGES);
        dummy:=SetFont(winImport^.RPort,tfont);

        DrawBevelLine(winImport,0,87,375,FALSE,FALSE,DI);
        if length(ProjektName)>35 then VariableString:=copy(ProjektName,1,32)+"..." else VariableString:=ProjektName;
        VariableString:="out of: "+VariableString;
        SetAPen(winImport^.RPort,DI^.dri_Pens^[TEXTPEN]);
        Move(winImport^.RPort,10,97); DidIt:=boolean(_Text(winImport^.RPort,VariableString,length(VariableString)));

        GT_RefreshWindow(winImport,NIL);
        RefreshGadgets(winImport^.firstgadget,winImport,NIL);

        i:=-1;
        How:=TRUE;
        How2:=TRUE;

        REPEAT
                imsg:=Wait_Port(winImport^.UserPort);
                imsg:=GT_GetIMsg(winImport^.userport);
                GT_ReplyIMsg(imsg);
                case imsg^.class of
                        IDCMP_CLOSEWINDOW:
                                i:=0
                        IDCMP_VANILLAKEY: begin
                                if imsg^.code>96 then imsg^.code:=imsg^.code-32;
                                case imsg^.code of
                                        13:     i:=1
                                        27:     i:=0
                                        62:     begin
                                                TagsCHANGES[1]:=TagItem(GTMX_Active,0);
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                How:=TRUE;
                                                GT_SetGadgetAttrsA(GadgetHow,winImport,NIL,^TagsCHANGES)
                                        end
                                        60:     begin
                                                TagsCHANGES[1]:=TagItem(GTMX_Active,1);
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                How:=FALSE;
                                                GT_SetGadgetAttrsA(GadgetHow,winImport,NIL,^TagsCHANGES)
                                        end
                                        70:     begin
                                                TagsCHANGES[1]:=TagItem(GTMX_Active,0);
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                How2:=TRUE;
                                                GT_SetGadgetAttrsA(GadgetHow2,winImport,NIL,^TagsCHANGES)
                                        end
                                        84:     begin
                                                TagsCHANGES[1]:=TagItem(GTMX_Active,1);
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                How2:=FALSE;
                                                GT_SetGadgetAttrsA(GadgetHow2,winImport,NIL,^TagsCHANGES)
                                        end
                                        65:     begin
                                                TagsCHANGES[1].ti_Tag:=GTCB_Checked;
                                                if (GadgetCheck^.flags and GFLG_Selected)<>0 then TagsCHANGES[1].ti_Data:=long(FALSE) else TagsCHANGES[1].ti_Data:=long(TRUE);
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetCheck,winImport,NIL,^TagsCHANGES)
                                        end
                                        else
                                end
                        end
                        IDCMP_GADGETDOWN: begin
                                CurrentGadget:=imsg^.iaddress;
                                case CurrentGadget^.gadgetid of
                                        5:      if imsg^.code=0 then How:=TRUE else How:=FALSE
                                        6:      if imsg^.code=0 then How2:=TRUE else How2:=FALSE
                                        else
                                end
                        end
                        IDCMP_GADGETUP: begin
                                CurrentGadget:=imsg^.iaddress;
                                case CurrentGadget^.gadgetid of
                                        1:      begin
                                                if (imsg^.code=1) or (imsg^.code=2) or (imsg^.code=3) then begin
                                                        if ListContents[imsg^.code,1]="·" then ListContents[imsg^.code,1]:=" " else ListContents[imsg^.code,1]:="·" end
                                                else begin
                                                        case ListContents[imsg^.code,1] of
                                                                (" "):   ListContents[imsg^.code,1]:="·"
                                                                ("·"):   ListContents[imsg^.code,1]:="+"
                                                                ("+"):   ListContents[imsg^.code,1]:=" "
                                                        end
                                                end;
                                                GT_SetGadgetAttrsA(GadgetListView,winImport,NIL,NIL);
                                        end
                                        2:      i:=1
                                        3:      i:=0
                                        else
                                end
                        end
                        else
                end
        UNTIL i<>-1;

        CloseWindow(winImport);
        FreeGadgets(CG);
        TextNode:=p_Node(TextList.lh_Head);
        WHILE TextNode^.ln_Succ<>NIL DO BEGIN
                TextNodeBack:=p_Node(TextNode^.ln_Succ);
                Remove(TextNode);
                dispose(TextNode);
                TextNode:=TextNodeBack;
        END;
        dummy:=0;
        if i=0 then WhatToImport:=0 else begin
                for i:=0 to Much do
                        if (ListContents[i,1]="·") or (ListContents[i,1]="+") then dummy:=dummy or (long(1) SHL i);
                if ListContents[0,1]="+" then dummy:=dummy or (long(1) SHL 9);
                if ListContents[4,1]="+" then dummy:=dummy or (long(1) SHL 10);
                if ListContents[5,1]="+" then dummy:=dummy or (long(1) SHL 11);
                if ListContents[6,1]="+" then dummy:=dummy or (long(1) SHL 12);
                if (DateAsk=TRUE) and (How=TRUE) and (dummy<>0) then dummy:=dummy or (long(1) SHL 13);
                if (DateAsk=TRUE) and (How2=TRUE) and (dummy<>0) then dummy:=dummy or (long(1) SHL 14);
                if ((GadgetCheck^.flags and GFLG_Selected)<>0) and (dummy<>0) then dummy:=dummy or (long(1) SHL 15);
                WhatToImport:=dummy;
        end;
END;

FUNCTION PartPrefs (VAR MyPrefs,RealPrefs:Prefs,ofFile:boolean):boolean;
LABEL   ExitOut;
VAR     dummy   :                               long;
        seperator:                              string[2];
BEGIN
        dummy:=WhatToImport(MyPrefs.Bool,ofFile);
        if dummy=0 then begin PartPrefs:=FALSE; goto ExitOut end else PartPrefs:=TRUE;
        if (MyPrefs.Pattern<>"") and ((dummy and 1)<>0) then begin
                if RealPrefs.Pattern="" then seperator:="" else seperator:="|";
                if (dummy and (long(1) shl 9))=0 then RealPrefs.Pattern:=MyPrefs.Pattern else if length(RealPrefs.Pattern)+length(MyPrefs.Pattern)+1<257 then RealPrefs.Pattern:=RealPrefs.Pattern+seperator+MyPrefs.Pattern;
        end;
        if (dummy and (long(1) shl 1))<>0 then begin
                if ((dummy and (long(1) shl 13))<>0) or (ofFile=FALSE) then
                        RealPrefs.bigger:=MyPrefs.bigger;
                if ((dummy and (long(1) shl 13))=0) or (ofFile=FALSE) then
                        RealPrefs.smaller:=MyPrefs.smaller
        end;
        if (dummy and (long(1) shl 2))<>0 then RealPrefs.Bits:=MyPrefs.Bits;
        if (dummy and (long(1) shl 3))<>0 then begin
                if ((dummy and (long(1) shl 14))<>0) or (ofFile=FALSE) then begin
                        RealPrefs.Date1:=MyPrefs.Date1;
                        RealPrefs.Time1:=MyPrefs.Time1
                end;
                if ((dummy and (long(1) shl 14))=0) or (ofFile=FALSE) then begin
                        RealPrefs.Date2:=MyPrefs.Date2;
                        RealPrefs.Time2:=MyPrefs.Time2
                end
        end;
        if (MyPrefs.Comment<>"") and ((dummy and (long(1) shl 4))<>0) then begin
                if RealPrefs.Comment="" then seperator:="" else seperator:="|";
                if (dummy and (long(1) shl 10))=0 then RealPrefs.Comment:=MyPrefs.Comment else if length(RealPrefs.Comment)+length(MyPrefs.Comment)+1<257 then RealPrefs.Comment:=RealPrefs.Comment+seperator+MyPrefs.Comment;
        end;
        if (MyPrefs.Typ<>"") and ((dummy and (long(1) shl 5))<>0) then begin
                if RealPrefs.Typ="" then seperator:="" else seperator:="|";
                if (dummy and (long(1) shl 11))=0 then RealPrefs.Typ:=MyPrefs.Typ else if length(RealPrefs.Typ)+length(MyPrefs.Typ)+1<255 then RealPrefs.Typ:=RealPrefs.Typ+seperator+MyPrefs.Typ;
        end;
        if (MyPrefs.FileIn<>"") and ((dummy and (long(1) shl 6))<>0) then begin
                if RealPrefs.FileIn="" then seperator:="" else seperator:="|";
                if (dummy and (long(1) shl 12))=0 then RealPrefs.Typ:=MyPrefs.FileIn else if length(RealPrefs.FileIn)+length(MyPrefs.FileIn)+1<257 then RealPrefs.FileIn:=RealPrefs.FileIn+seperator+MyPrefs.FileIn;
        end;
        if (dummy and (long(1) shl 15))<>0 then begin
                if (dummy and 1)<>0 then RealPrefs.Bool:=RealPrefs.Bool and 1;
                if (dummy and (long(1) shl 1))<>0 then RealPrefs.Bool:=RealPrefs.Bool or (long(1) shl 1);
                if (dummy and (long(1) shl 2))<>0 then RealPrefs.Bool:=RealPrefs.Bool or (long(1) shl 2);
                if (dummy and (long(1) shl 3))<>0 then RealPrefs.Bool:=RealPrefs.Bool or (long(1) shl 3);
                if (dummy and (long(1) shl 5))<>0 then RealPrefs.Bool:=RealPrefs.Bool or (long(1) shl 4);
                if (dummy and (long(1) shl 4))<>0 then
                        if MyPrefs.BoolComment=0 then RealPrefs.BoolComment:=long(UsedXSP.Sensitivity)+1 else RealPrefs.BoolComment:=MyPrefs.BoolComment;
                if (dummy and (long(1) shl 6))<>0 then
                        if MyPrefs.BoolFileIn=0 then RealPrefs.BoolFileIn:=long(UsedXSP.Sensitivity)+1 else RealPrefs.BoolFileIn:=MyPrefs.BoolFileIn;
        end;
        ExitOut:
END;

FUNCTION NameProjekt(Name:boolean):boolean;
LABEL   ExitOut;
VAR     Dummy   :                               boolean;
        DidIt   :                               long;
BEGIN
        if Name=TRUE then ProjektName:="Unnamed";
        Projekt:=ProjektDir;
        NameProjekt:=AddPart(Projekt,ProjektName,364);
        ProjektXSearch:="XSearch 1.0 ["+ProjektName+"]";
        ExitOut:
END;

PROCEDURE RestoreProjektNameDir;
BEGIN
        ProjektName:=FilePart(Projekt);
        ProjektDir:=copy(Projekt,1,length(Projekt)-length(PathPart(ProjektName)));
        if ProjektDir[length(ProjektDir)]="/" then ProjektDir:=copy(ProjektDir,1,length(ProjektDir)-1)
END;

FUNCTION FileProjekt(Typ:integer,win:p_Window):boolean;
VAR     Filer   :                               p_FileRequester;
        TagsCHANGES:                            array[1..14] of TagItem;
        Dummy   :                               Boolean;
BEGIN
        TagsCHANGES[1].ti_Tag:=ASL_Hail;
        case Typ of
                0:      TagsCHANGES[1].ti_Data:="XSearch 1.0 - Open project";
                1:      TagsCHANGES[1].ti_Data:="XSearch 1.0 - Save project"
                2:      TagsCHANGES[1].ti_Data:="XSearch 1.0 - Take over values";
                3:      TagsCHANGES[1].ti_Data:="XSearch 1.0 - Values out of attr.";
                4:      TagsCHANGES[1].ti_Data:="XSearch 1.0 - Save results";
                5:      TagsCHANGES[1].ti_Data:="XSearch 1.0 - Choose directory"
                else
        end;
        TagsCHANGES[2].ti_Tag:=ASL_File;
        TagsCHANGES[2].ti_Data:=ProjektName;
        TagsCHANGES[3].ti_Tag:=ASL_Dir;
        TagsCHANGES[3].ti_Data:=ProjektDir;
        TagsCHANGES[4]:=TagItem(ASL_FuncFlags,FILF_PATGAD);
        if (Typ=1) or (Typ=4) then TagsCHANGES[4].ti_Data:=TagsCHANGES[4].ti_Data or FILF_SAVE;
        TagsCHANGES[5].ti_Tag:=ASL_Pattern;
        TagsCHANGES[5].ti_Data:="~(#?.info)";
        TagsCHANGES[6].ti_Tag:=ASL_OKText;
        case Typ of
                0:      TagsCHANGES[6].ti_Data:="Open";
                1:      TagsCHANGES[6].ti_Data:="Save"
                2:      TagsCHANGES[6].ti_Data:="Import"
                3:      TagsCHANGES[6].ti_Data:="Import"
                4:      TagsCHANGES[6].ti_Data:="Save"
                else    TagsCHANGES[6].ti_Data:="OK"
        end;
        TagsCHANGES[7].ti_Tag:=ASL_CancelText;
        TagsCHANGES[7].ti_Data:="Cancel";
        TagsCHANGES[8].ti_Tag:=ASL_Window;
        TagsCHANGES[8].ti_Data:=long(win);
        TagsCHANGES[9]:=TagItem(ASL_LeftEdge,50);
        TagsCHANGES[10]:=TagItem(ASL_TopEdge,28);
        TagsCHANGES[11]:=TagItem(ASL_Height,210);
        TagsCHANGES[12]:=TagItem(ASL_Width,340);
        if Typ<>5 then TagsCHANGES[13].ti_Tag:=TAG_DONE
        else begin
                TagsCHANGES[13]:=TagItem(ASL_ExtFlags1,FIL1F_NOFILES);
                TagsCHANGES[14].ti_Tag:=TAG_DONE
        end;

        Filer:=AllocAslRequest(ASL_FileRequest,^TagsCHANGES);
        Dummy:=AslRequest(Filer,NIL);
        if Dummy=TRUE then begin
                FileProjekt:=TRUE;
                ProjektDir:=Filer^.rf_Dir;
                ProjektName:=Filer^.rf_File;
        end else
                FileProjekt:=FALSE;
        FreeAslRequest(Filer);
END;

PROCEDURE ConvertDate(VAR Source:ExchangeString,sourcekind,destinationkind:integer) FORWARD;
FUNCTION AlienizeTimeDate(DateTimeString:str,Time:boolean):string FORWARD;
FUNCTION ConvertCurrentDateTime(Input:p_DateStamp,Time:boolean):string FORWARD;

FUNCTION ReadPrefs(FileName:string,VAR RealPrefs:Prefs,win:p_window,ImportAsk:boolean,
        VAR MyList:p_List,doIt:Boolean):boolean;
VAR     ReadFile:                               Text;
        Dummy   :                               long;
        Identifier:                             string[13];
        MyPrefs :                               Prefs;
LABEL   ExitOut;
BEGIN
        ReSet(ReadFile,FileName);
        Dummy:=IOResult;
        if Dummy<>0 then begin
                Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                if (win<>NIL) and (ImportAsk=FALSE) then GiveError("XSearch 1.0 ["+ProjektName+"] - Open project","Error while opening."+LF+"("+VariableString+")",win);
                if (win<>NIL) and (ImportAsk=TRUE) then GiveError("XSearch 1.0 ["+ProjektName+"] - Take over values","The values couldn't have been"+LF+"taken over."+LF+"("+VariableString+")",win);
                ReadPrefs:=FALSE;
                goto ExitOut
        end;
        readln (ReadFile,Identifier);
        if (Identifier<>"XSEARCH FILE") and (ImportAsk=FALSE) then begin GiveError("XSearch 1.0 ["+ProjektName+"] - Open project","The file is no XSearch project.",win); ReadPrefs:=FALSE; goto ExitOut end;
        if (Identifier<>"XSEARCH FILE") and (ImportAsk=TRUE) then begin GiveError("XSearch 1.0 ["+ProjektName+"] - Take over values","The file is no XSearch project.",win); ReadPrefs:=FALSE; goto ExitOut end;
        with MyPrefs do begin
                readln (ReadFile,Bool);
                readln (ReadFile,BoolComment);
                readln (ReadFile,BoolFileIn);
                readln (ReadFile,Pattern);
                readln (ReadFile,Bigger);
                readln (ReadFile,Smaller);
                readln (ReadFile,Bits);
                readln (ReadFile,Date1);
                readln (ReadFile,Time1);
                readln (ReadFile,Date2);
                readln (ReadFile,Time2);
                readln (ReadFile,DateFormat);
                readln (ReadFile,Comment);
                readln (ReadFile,Typ);
                readln (ReadFile,FileIn)
        end;
        Dummy:=IOResult;
        if Dummy<>0 then begin
                Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                if (win<>NIL) and (ImportAsk=FALSE) then GiveError("XSearch 1.0 ["+ProjektName+"] - Open project","Error while opening."+LF+"("+VariableString+")",win);
                if (win<>NIL) and (ImportAsk=TRUE) then GiveError("XSearch 1.0 ["+ProjektName+"] - Take over values","The values couldn't have been"+LF+"taken over."+LF+"("+VariableString+")",win);
                ReadPrefs:=FALSE;
                Close(ReadFile);
                goto ExitOut
        end;
        if doIt=TRUE then begin
                SearchNodeV:=p_SearchNode(MyList^.lh_Head);
                WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                        SearchNodeBack:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                        Remove(p_Node(^SearchNodeV^.sen_Node));
                        dispose(SearchNodeV);
                        SearchNodeV:=SearchNodeBack;
                END;
                while EOF(ReadFile)=FALSE do begin
                        New(SearchNodeV);
                        readln(ReadFile,SearchNodeV^.sen_Node.ln_Pri);
                        readln(ReadFile,SearchNodeV^.sen_Path);
                        VariableString:=SearchNodeV^.sen_Path;
                        if VariableString[length(VariableString)]<>":" then VariableString:=FilePart(VariableString);
                        if SearchNodeV^.sen_Node.ln_Pri=0 then VariableString:="  "+VariableString else VariableString:="  D "+VariableString;
                        PrepareNode(SearchNodeV,VariableString);
                        SortInDirList(MyList,^SearchNodeV^.sen_Node,3);
                end
        end;
        Close(ReadFile);
        if Dummy<>0 then begin
                Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                if (win<>NIL) and (ImportAsk=FALSE) then GiveError("XSearch 1.0 ["+ProjektName+"] - Open project","Error while opening."+LF+"("+VariableString+")",win);
                if (win<>NIL) and (ImportAsk=TRUE) then GiveError("XSearch 1.0 ["+ProjektName+"] - Take over values","The values couldn't have been"+LF+"taken over."+LF+"("+VariableString+")",win);
                ReadPrefs:=FALSE;
                goto ExitOut
        end;
        ConvertDate(MyPrefs.Date1,MyPrefs.DateFormat,UsedXSP.DateFormat);
        ConvertDate(MyPrefs.Date2,MyPrefs.DateFormat,UsedXSP.DateFormat);
        if ImportAsk=TRUE then begin
                if (MyPrefs.Bool and (long(1) shl 4))<>0 then MyPrefs.Bool:=(MyPrefs.Bool or (long(1) shl 5)) xor (long(1) shl 4);
                if MyPrefs.BoolComment<>0 then MyPrefs.Bool:=MyPrefs.Bool or (long(1) shl 4);
                if MyPrefs.BoolFileIn<>0 then MyPrefs.Bool:=MyPrefs.Bool or (long(1) shl 6);
                ReadPrefs:=PartPrefs(MyPrefs,RealPrefs,FALSE)
        end else
                RealPrefs:=MyPrefs;
        ReadPrefs:=TRUE;
        ExitOut:
END;

FUNCTION WritePrefs(FileName:string,RealPrefs:Prefs,win:p_window,MyList:p_List):boolean;
VAR     WriteFile:                              Text;
        Dummy   :                               integer;
LABEL   ExitOut;
BEGIN
        ReWrite(WriteFile,FileName);
        Dummy:=IOResult;
        if Dummy<>0 then begin
                Dummy:=integer(Fault(Dummy,NIL,VariableString,364));
                if win<>NIL then GiveError("XSearch 1.0 ["+ProjektName+"] - Save project","Error while saving."+LF+"("+VariableString+")",win);
                WritePrefs:=FALSE;
                goto ExitOut
        end;
        writeln (WriteFile,"XSEARCH FILE");
        with RealPrefs do begin
                writeln (WriteFile,Bool);
                writeln (WriteFile,BoolComment);
                writeln (WriteFile,BoolFileIn);
                writeln (WriteFile,Pattern);
                writeln (WriteFile,Bigger);
                writeln (WriteFile,Smaller);
                writeln (WriteFile,Bits);
                writeln (WriteFile,Date1);
                writeln (WriteFile,Time1);
                writeln (WriteFile,Date2);
                writeln (WriteFile,Time2);
                writeln (WriteFile,DateFormat);
                writeln (WriteFile,Comment);
                writeln (WriteFile,Typ);
                writeln (WriteFile,FileIn)
        end;
        Dummy:=IOResult;
        if Dummy<>0 then begin
                Dummy:=integer(Fault(Dummy,NIL,VariableString,364));
                if win<>NIL then GiveError("XSearch 1.0 ["+ProjektName+"] - Save project","Error while saving."+LF+"("+VariableString+")",win);
                WritePrefs:=FALSE;
                Close(WriteFile);
                goto ExitOut
        end;
        SearchNodeV:=p_SearchNode(MyList^.lh_Head);
        WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                writeln (WriteFile,SearchNodeV^.sen_Node.ln_Pri);
                writeln (WriteFile,SearchNodeV^.sen_Path);
                SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)
        END;
        Close(WriteFile);
        if Dummy<>0 then begin
                Dummy:=integer(Fault(Dummy,NIL,VariableString,364));
                if win<>NIL then GiveError("XSearch 1.0 ["+ProjektName+"] - Save project","Error while saving."+LF+"("+VariableString+")",win);
                WritePrefs:=FALSE;
                goto ExitOut
        end;
        WritePrefs:=TRUE;
        ExitOut:
END;

FUNCTION ReadPrefsOutOfFile(FileName:string,VAR RealPrefs:Prefs,win:p_window):boolean;
VAR     ReadFile:                               BPTR;
        forTyp  :                               Text;
        Dummy   :                               long;
        ReadFileInfo:                           p_FileInfoBlock;
        MyPrefs :                               Prefs;
        dummy2  :                               string[5];
        i       :                               integer;
LABEL   ExitOut;
BEGIN
        ReadFile:=Lock(FileName,SHARED_LOCK);
        Reset(forTyp,FileName);
        Dummy:=IOResult;
        MyPrefs.Bool:=0;
        if (Dummy=0) and (filesize(forTyp)>11) then begin
                for i:=1 to 4 do read(forTyp,dummy2[i]);
                dummy2[5]:=chr(0);
                if dummy2="FORM" then begin
                        MyPrefs.Bool:=1;
                        for i:=1 to 4 do read(forTyp,dummy2[i]);
                        for i:=1 to 4 do read(forTyp,dummy2[i]);
                end;
                Close(forTyp);
                Dummy:=IOResult;
        end;
        if Dummy<>0 then begin
                Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                GiveError("XSearch 1.0 ["+ProjektName+"] - Values out of attr.","Error while reading."+LF+"("+VariableString+")",win);
                ReadPrefsOutOfFile:=FALSE;
                goto ExitOut
        end;
        new(ReadFileInfo);
        Dummy:=Examine(ReadFile,ReadFileInfo);
        if Dummy=0 then begin
                GiveError("XSearch 1.0 ["+ProjektName+"] - Values out of attr.","Error while reading.",win);
                ReadPrefsOutOfFile:=FALSE;
                goto ExitOut
        end;
        UnLock(ReadFile);
        MyPrefs.Typ:=copy(dummy2,1,4);
        MyPrefs.Pattern:=ReadFileInfo^.fib_FileName;
        MyPrefs.Bigger:=ReadFileInfo^.fib_Size;
        MyPrefs.Smaller:=ReadFileInfo^.fib_Size;
        MyPrefs.Comment:=ReadFileInfo^.fib_Comment;
        if (ReadFileInfo^.fib_Protection and FIBB_HIDDEN)<>0 then MyPrefs.Bits[1]:="H" else MyPrefs.Bits[1]:="-";
        if (ReadFileInfo^.fib_Protection and FIBB_SCRIPT)<>0 then MyPrefs.Bits[2]:="S" else MyPrefs.Bits[2]:="-";
        if (ReadFileInfo^.fib_Protection and FIBB_PURE)<>0 then MyPrefs.Bits[3]:="P" else MyPrefs.Bits[3]:="-";
        if (ReadFileInfo^.fib_Protection and FIBB_ARCHIVE)<>0 then MyPrefs.Bits[4]:="A" else MyPrefs.Bits[4]:="-";
        if (ReadFileInfo^.fib_Protection and FIBB_READ)=0 then MyPrefs.Bits[5]:="R" else MyPrefs.Bits[5]:="-";
        if (ReadFileInfo^.fib_Protection and FIBB_WRITE)=0 then MyPrefs.Bits[6]:="W" else MyPrefs.Bits[6]:="-";
        if (ReadFileInfo^.fib_Protection and FIBB_EXECUTE)=0 then MyPrefs.Bits[7]:="E" else MyPrefs.Bits[7]:="-";
        if (ReadFileInfo^.fib_Protection and FIBB_DELETE)=0 then MyPrefs.Bits[8]:="D" else MyPrefs.Bits[8]:="-";
        VariableString:=ConvertCurrentDateTime(^ReadFileInfo^.fib_Date,FALSE); VariableStr:=VariableString;
        VariableString:=AlienizeTimeDate(VariableStr,FALSE);
        MyPrefs.Date1:=VariableString; MyPrefs.Date2:=VariableString;
        VariableString:=ConvertCurrentDateTime(^ReadFileInfo^.fib_Date,TRUE); VariableStr:=VariableString;
        VariableString:=AlienizeTimeDate(VariableStr,TRUE);
        MyPrefs.Time1:=VariableString; MyPrefs.Time2:=VariableString;
        dispose(ReadFileInfo);
        ReadPrefsOutOfFile:=PartPrefs(MyPrefs,RealPrefs,TRUE);
        ExitOut:
END;


PROCEDURE GiveMessageOptions(Introducer:string,win:p_window,DI:p_DrawInfo) FORWARD;

FUNCTION VerifyLength(Length:long,win:p_window,DI:p_DrawInfo):boolean;
BEGIN
        if Length<0 then begin VerifyLength:=FALSE; GiveMessageOptions("Length: The value mustn't be smaller than 0.",win,DI) end else VerifyLength:=TRUE
END;

FUNCTION VerifyPattern(PatternString:str,Title:string,win:p_window,
        DI:p_DrawInfo):boolean;
VAR     DST     :                               string[769];
BEGIN
        if ParsePattern(PatternString,DST,769)=-1 then begin VerifyPattern:=FALSE; GiveMessageOptions(Title+"The pattern is wrong.",win,DI) end else VerifyPattern:=TRUE
END;

FUNCTION AlienizeIFF(IFFString:str):string;
VAR     alienized:                              string[256];
        i,k     :                               integer;
BEGIN
        alienized:=IFFString;
        for i:=1 to length(alienized) do
                for k:=1 to 40 do begin
                        alienized[i]:=upcase(alienized[i]);
                        if (alienized[i]=",") or (alienized[i]=";") or (alienized[i]=" ") then alienized[i]:="|"
                end;
        if copy(alienized,length(alienized),1)="|" then alienized:=copy(alienized,1,length(alienized)-1);
        AlienizeIFF:=alienized
END;

FUNCTION VerifyIFF(IFFString:str,win:p_window,DI:p_DrawInfo):boolean;
LABEL   HereOut,Out2;
VAR     dummy   :                               string[256];
        i,k     :                               integer;
        dummy2  :                               boolean;
        Chars   :                               string[40];
BEGIN
        Chars:="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 ";
        dummy2:=TRUE;
        dummy:=IFFString;
        if ((length(dummy)+1) mod 5<>0) and (length(dummy)<>0) then begin dummy2:=FALSE; GiveMessageOptions("IFF: No acceptable input.",win,DI); goto Out2 end;
        for i:=1 to length(dummy) do begin
                if i mod 5=0 then begin
                        if not (dummy[i]="|") then begin dummy2:=FALSE; dummy:="Char at position "+intstr(i)+" is wrong."; GiveMessageOptions("IFF: "+dummy,win,DI); goto Out2 end
                end else begin
                        for k:=1 to 37 do begin
                                if dummy[i]=Chars[k] then goto HereOut else
                                if (dummy[i]<>Chars[k]) and (k=37) then begin dummy2:=FALSE; dummy:="Char at position "+intstr(i)+" is wrong."; GiveMessageOptions("IFF: "+dummy,win,DI); goto Out2 end
                        end
                end;
                HereOut:
        end;
        Out2:
        VerifyIFF:=dummy2
END;

PROCEDURE ConvertDate;
VAR     dummy   :                               string[3];
BEGIN
        if sourcekind<>destinationkind then begin
                if (sourcekind>0) and (destinationkind=0) then begin Source[3]:="."; Source[6]:="." end;
                if (sourcekind=0) and (destinationkind>0) then begin Source[3]:="-"; Source[6]:="-" end;
                if ((sourcekind=2) and (destinationkind<2)) or ((sourcekind<2) and (destinationkind=2)) then begin
                        dummy:=copy(Source,1,2);
                        Source:=copy(Source,4,2)+Source[3]+dummy+copy(Source,6,3)
                end
        end
END;

FUNCTION AlienizeRawTimeDate(DateTimeString:str,Time:boolean):string;
VAR     alienized:                              string[11];
BEGIN
        alienized:=DateTimeString;
        while pos(" ",alienized)<>0 do
                alienized:=copy(alienized,1,pos(" ",alienized)-1)+copy(alienized,pos(" ",alienized)+1,length(alienized)-pos(" ",alienized));
        if alienized="" then alienized:=ConvertCurrentDateTime(NIL,Time);
        AlienizeRawTimeDate:=alienized
END;

FUNCTION AlienizeTimeDate;
VAR     alienized,dummy:                        string[11];
        whatThing:                              char;
BEGIN
        if Time=FALSE then begin if UsedXSP.DateFormat=0 then whatThing:="." else whatThing:="-" end else whatThing:=":";
        alienized:=DateTimeString;
        if pos(whatThing,alienized)=2 then alienized:="0"+alienized;
        dummy:=copy(alienized,4,length(alienized)-3);
        if pos(whatThing,dummy)=2 then alienized:=copy(alienized,1,3)+"0"+copy(alienized,4,length(alienized)-3);
        if Time=TRUE then begin
                if length(alienized)-6=1 then alienized:=copy(alienized,1,6)+"0"+copy(alienized,7,1)
        end;
        AlienizeTimeDate:=alienized
END;

FUNCTION VerifyRawTimeDate(DateTimeString:str,win:p_window,Time:boolean,
        DI:p_DrawInfo):boolean;
LABEL   ExitHere;
VAR     alienized,dummy:                        string[11];
        Nums    :                               string[12];
        Introducer:                             string;
        i,k     :                               integer;
        OneRight,Dummy2:                        boolean;
        whatThing:                              char;
        hangMan :                               array [0..3] of String;
BEGIN
        alienized:=DateTimeString;
        if Time=FALSE then begin
                if UsedXSP.DateFormat=0 then begin
                        Nums:="0123456789.";
                        whatThing:=".";
                        HangMan[1]:="day";
                        HangMan[2]:="month"
                end else begin
                        Nums:="0123456789-";
                        whatThing:="-";
                        HangMan[1]:="month";
                        HangMan[2]:="day"
                end;
                HangMan[0]:="Date: "; HangMan[3]:="year"
        end else begin
                Nums:="0123456789:";
                whatThing:=":";
                HangMan[0]:="Time: "; HangMan[1]:="hours"; HangMan[2]:="minutes"; HangMan[3]:="seconds"
        end;
        VerifyRawTimeDate:=TRUE;
        Dummy2:=TRUE;
        for i:=length(alienized) downto 1 do begin
                OneRight:=FALSE;
                for k:=1 to 12 do
                        if alienized[i]=Nums[k] then OneRight:=TRUE;
                if OneRight=FALSE then begin Dummy2:=FALSE; Introducer:="Input at position "+intstr(i)+" is wrong." end
        end;
        if Dummy2=FALSE then goto ExitHere;
        if (pos(whatThing,alienized)>3) or (pos(whatThing,alienized)<2) then begin Dummy2:=FALSE; Introducer:="Wrong specification of "+HangMan[1]+"." end else begin
                dummy:=copy(alienized,pos(whatThing,alienized)+1,length(alienized)-(pos(whatThing,alienized)));
                if (pos(whatThing,dummy)>3) or (pos(whatThing,dummy)<2) then begin Dummy2:=FALSE; Introducer:="Wrong specification of "+HangMan[2]+"." end else begin
                        dummy:=copy(dummy,pos(whatThing,dummy)+1,length(dummy)-(pos(whatThing,dummy)));
                        if Time=FALSE then begin
                                if length(dummy)<>2 then begin Dummy2:=FALSE; Introducer:="Wrong specification of "+HangMan[3]+"." end end
                        else begin
                                if length(dummy)<>2 then begin Dummy2:=FALSE; Introducer:="Wrong specification of "+HangMan[3]+"." end
                        end
                end
        end;
        ExitHere:
        if Dummy2=FALSE then begin
                VerifyRawTimeDate:=FALSE;
                GiveMessageOptions(hangMan[0]+Introducer,win,DI)
        end;
END;

PROCEDURE ConvertTimeDate(DateTimeString:str,Time:boolean,VAR BACK:DateTimeFormat);
VAR     alienized:                              string[11];
        Dummy   :                               integer;
BEGIN
        alienized:=DateTimeString;
        val(copy(alienized,1,2),BACK.DH,Dummy);
        val(copy(alienized,4,2),BACK.MM,Dummy);
        val(copy(alienized,7,2),BACK.YS,Dummy);
        if (TIME=FALSE) and (UsedXSP.DateFormat=2) then begin
                dummy:=BACK.MM;
                BACK.MM:=BACK.DH;
                BACK.DH:=dummy
        end
END;

FUNCTION ConvertCurrentDateTime;
VAR     qc      :                               long;
        ds      :                               Datestamp;
        cd      :                               ClockData;
BEGIN
        if Input=NIL then DOSDateStamp(^ds) else ds:=Input^;
        qc:=ds.ds_days*24*60*60;
        qc:=ds.ds_minute*60+qc;
        qc:=round(ds.ds_tick/50)+qc;
        Amiga2Date(qc,^cd);
        if Time=FALSE then begin
                case UsedXSP.DateFormat of
                        0:      ConvertCurrentDateTime:=intstr(cd.mday)+"."+intstr(cd.month)+"."+copy(intstr(cd.year),3,2)
                        1:      ConvertCurrentDateTime:=intstr(cd.mday)+"-"+intstr(cd.month)+"-"+copy(intstr(cd.year),3,2)
                        2:      ConvertCurrentDateTime:=intstr(cd.month)+"-"+intstr(cd.mday)+"-"+copy(intstr(cd.year),3,2)
                        else
                end
        end else
                ConvertCurrentDateTime:=intstr(cd.hour)+":"+intstr(cd.min)+":"+intstr(cd.sec);
END;

FUNCTION VerifyDate(DaysNights:DateTimeformat,win:p_window,DI:p_DrawInfo):boolean;
VAR     MonthSet:                               array [1..12] of integer;
        SchaltCount,Dummy:                      integer;
        Dummy2  :                               boolean;
        Introducer:                             string;
BEGIN
        VerifyDate:=TRUE;
        Dummy2:=TRUE;
        MonthSet[1]:=31; MonthSet[2]:=28; MonthSet[3]:=31; MonthSet[4]:=30; MonthSet[5]:=31; MonthSet[6]:=30; MonthSet[7]:=31; MonthSet[8]:=31; MonthSet[9]:=30; MonthSet[10]:=31; MonthSet[11]:=30; MonthSet[12]:=31;
        val(copy(intstr(DaysNights.YS),3,2),SchaltCount,Dummy);
        if (SchaltCount=0) then val(copy(intstr(DaysNights.YS),1,2),SchaltCount,Dummy);
        if SchaltCount mod 4=0 then MonthSet[2]:=MonthSet[2]+1;
        if (DaysNights.MM>12) or (DaysNights.MM<1) then begin Dummy2:=FALSE; Introducer:="Wrong specification of month." end else
                if (DaysNights.DH<1) or (DaysNights.DH>MonthSet[DaysNights.MM]) then begin Dummy2:=FALSE; Introducer:="Wrong specification of day." end else
                        if DaysNights.YS<78 then begin Dummy2:=FALSE; Introducer:="Wrong specification of year." end;
        if Dummy2=FALSE then begin
                VerifyDate:=FALSE;
                GiveMessageOptions("Date: "+Introducer,win,DI)
        end;
END;

FUNCTION VerifyTime(DaysNights:DateTimeformat,win:p_window,DI:p_DrawInfo):boolean;
VAR     Dummy   :                               integer;
        Dummy2  :                               boolean;
        Introducer:                             string;
BEGIN
        VerifyTime:=TRUE;
        Dummy2:=TRUE;
        if (DaysNights.DH<0) or (DaysNights.DH>23) then begin Dummy2:=FALSE; Introducer:="Wrong specification of hours." end else
                if (DaysNights.MM<0) or (DaysNights.MM>59) then begin Dummy2:=FALSE; Introducer:="Wrong specification of minutes." end else
                        if (DaysNights.YS<0) or (DaysNights.YS>59) then begin Dummy2:=FALSE; Introducer:="Wrong specification of seconds." end;
        if Dummy2=FALSE then begin
                VerifyTime:=FALSE;
                GiveMessageOptions("Time: "+Introducer,win,DI)
        end;
END;

FUNCTION AlienizeBits(BitString:str):string;
VAR     i       :                               integer;
        alienized,Bits:                         string[9];
BEGIN
        Bits:="hsparwed";
        alienized:=BitString;
        for i:=1 to 8 do begin
                if copy(alienized,i,1)=" " then alienized[i]:="*";
                if copy(alienized,i,1)=copy(Bits,i,1) then begin
                        alienized[i]:=upcase(Bits[i]);
                        end;
                end;
        AlienizeBits:=Alienized;
END;

FUNCTION VerifyBits(BitString:string,win:p_window,DI:p_DrawInfo):boolean;
CONST   Bits = "HSPARWED";
VAR     i       :                               integer;
        introducer:                             string[9];
        Backup  :                               string[2];
BEGIN
        VerifyBits:=TRUE;
        introducer:=BitString;
        Backup:="0";
        for i:=1 to 8 do begin
                if Introducer[i]<>copy(Bits,i,1) then
                        if Introducer[i]<>"-" then
                                if Introducer[i]<>"*" then Backup:=copy(Bits,i,1)
        end;
        if Backup<>"0" then begin
                VariableString:="Wrong specific. of the "+Backup+" attribute.";
                GiveMessageOptions("Attributes: "+VariableString,win,DI);
                VerifyBits:=FALSE end
END;

PROCEDURE BackupOptions(VAR RealPrefs:Prefs,GadgetName,GadgetPattern,GadgetLength,
        Gadgetbigger,Gadgetsmaller,GadgetBits,GadgetBS,GadgetDate,
        Gadgetvom1,Gadgetvom2,Gadgetbis1,Gadgetbis2,GadgetSTRING,
        GadgetIFF,GadgetTyp,GadgetIN:p_gadget,BoolComment,BoolFileIn:short);
VAR     SI      :                               p_StringInfo;
BEGIN
        SI:=GadgetPattern^.SpecialInfo; RealPrefs.Pattern:=SI^.Buffer;
        SI:=Gadgetbigger^.SpecialInfo; RealPrefs.Bigger:=SI^.LongInt;
        SI:=Gadgetsmaller^.SpecialInfo; RealPrefs.Smaller:=SI^.LongInt;
        SI:=GadgetBS^.SpecialInfo; RealPrefs.Bits:=SI^.Buffer;
        SI:=Gadgetvom1^.SpecialInfo; RealPrefs.Date1:=SI^.Buffer;
        SI:=Gadgetvom2^.SpecialInfo; RealPrefs.Time1:=SI^.Buffer;
        SI:=Gadgetbis1^.SpecialInfo; RealPrefs.Date2:=SI^.Buffer;
        SI:=Gadgetbis2^.SpecialInfo; RealPrefs.Time2:=SI^.Buffer;
        SI:=GadgetSTRING^.SpecialInfo; RealPrefs.Comment:=SI^.Buffer;
        SI:=GadgetTyp^.SpecialInfo; RealPrefs.Typ:=SI^.Buffer;
        SI:=GadgetIN^.SpecialInfo; RealPrefs.FileIn:=SI^.Buffer;
        RealPrefs.Bool:=0;
        RealPrefs.BoolComment:=BoolComment;
        RealPrefs.BoolFileIn:=BoolFileIn;
        if (GadgetName^.flags and GFLG_Selected<>0) then RealPrefs.Bool:=1;
        if (GadgetLength^.flags and GFLG_Selected<>0) then RealPrefs.Bool:=RealPrefs.Bool or (long(1) SHL 1);
        if (GadgetBits^.flags and GFLG_Selected<>0) then RealPrefs.Bool:=RealPrefs.Bool or (long(1) SHL 2);
        if (GadgetDate^.flags and GFLG_Selected<>0) then RealPrefs.Bool:=RealPrefs.Bool or (long(1) SHL 3);
        if (GadgetIFF^.flags and GFLG_Selected<>0) then RealPrefs.Bool:=RealPrefs.Bool or (long(1) SHL 4);
        RealPrefs.DateFormat:=UsedXSP.DateFormat
END;

PROCEDURE RestoreOptions(RealPrefs:Prefs,VAR GadgetName,GadgetPattern,GadgetLength,
        Gadgetbigger,Gadgetsmaller,GadgetBits,GadgetBS,GadgetDate,
        Gadgetvom1,Gadgetvom2,Gadgetbis1,Gadgetbis2,GadgetComment,
        GadgetSTRING,GadgetIFF,GadgetTyp,GadgetFile,GadgetIN:p_gadget,
        win:p_window);
VAR     TagsCHANGES:                            array [1..2] of TagItem;
BEGIN
        TagsCHANGES[1]:=TagItem(GTCB_Checked,long((RealPrefs.Bool and 1)=1));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetName,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=RealPrefs.Pattern;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetPattern,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTCB_Checked,long((RealPrefs.Bool and (long(1) SHL 1))<>0));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetLength,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTIN_Number,RealPrefs.Bigger);
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(Gadgetbigger,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTIN_Number,RealPrefs.Smaller);
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(Gadgetsmaller,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTCB_Checked,long((RealPrefs.Bool and (long(1) SHL 2))<>0));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetBits,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=RealPrefs.Bits;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetBS,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTCB_Checked,long((RealPrefs.Bool and (long(1) SHL 3))<>0));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetDate,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=RealPrefs.Date1;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(Gadgetvom1,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=RealPrefs.Time1;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(Gadgetvom2,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=RealPrefs.Date2;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(Gadgetbis1,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=RealPrefs.Time2;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(Gadgetbis2,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTCY_Active,long(RealPrefs.BoolComment));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetComment,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=RealPrefs.Comment;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetSTRING,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTCB_Checked,long((RealPrefs.Bool and (long(1) SHL 4))<>0));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetIFF,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=RealPrefs.Typ;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetTyp,win,NIL,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTCY_Active,long(RealPrefs.BoolFileIn));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetFile,win,NIL,^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=RealPrefs.FileIn;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        GT_SetGadgetAttrsA(GadgetIN,win,NIL,^TagsCHANGES)
END;

PROCEDURE GetRidOfForOptions(VAR win:p_window);
BEGIN
        win^.flags:=win^.flags or WFLG_RMBTRAP;
        win^.IDCMPFlags:=0;
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=NIL
END;

PROCEDURE GetBackForOptions(VAR win:p_window,GadgetCycle:p_gadget);
BEGIN
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=GadgetCycle;
        win^.IDCMPFlags:=CYCLEIDCMP or CHECKBOXIDCMP or STRINGIDCMP or INTEGERIDCMP or BUTTONIDCMP or IDCMP_CLOSEWINDOW or IDCMP_VANILLAKEY or IDCMP_MENUPICK;
        win^.flags:=win^.flags xor WFLG_RMBTRAP;
        RefreshGadgets(win^.FirstGadget,win,NIL);
        GT_RefreshWindow(win,NIL);
        DrawBevelLine(win,0,172,416,FALSE,FALSE,DI);
END;

PROCEDURE GiveMessageOptions;
VAR     DidIt   :                               integer;
BEGIN
        VariableString:=Introducer;
        for DidIt:=length(VariableString)+1 to 50 do
                VariableString:=VariableString+" ";
        SetAPen(win^.RPort,DI^.dri_Pens^[TEXTPEN]);
        Move(win^.RPort,10,182); DidIt:=integer(_Text(win^.RPort,VariableString,50));
END;

PROCEDURE PreferencesXSearch FORWARD;

PROCEDURE Options;
LABEL   BACK,RepeatHereDate,RepeatHereTime,RepeatHereLength,SimplyOut;
VAR     win     :                               p_window;
        winBit  :                               long;
        ZOM     :                               array [1..4] of word;
        imsg    :                               p_intuimessage;
        CG      :                               p_gadget;
        CurrentGadget:                          p_gadget;
        NewMenuFields:                          array[1..17] of NewMenu;
        MenuFields:                             p_Menu;
        NItem   :                               p_menuitem;
        NewGadgetFields:                        newgadget;
        GadgetCycle:                            p_gadget;
        ContentsCycle:                          array [1..3] of str;
        GadgetName:                             p_gadget;
        GadgetPattern:                          p_gadget;
        GadgetLength:                           p_gadget;
        Gadgetsmaller:                          p_gadget;
        Gadgetbigger:                           p_gadget;
        GadgetBits:                             p_gadget;
        GadgetBS:                               p_gadget;
        GadgetDate:                             p_gadget;
        Gadgetvom1:                             p_gadget;
        Gadgetvom2:                             p_gadget;
        Gadgetbis1:                             p_gadget;
        Gadgetbis2:                             p_gadget;
        ContentsCommentFile:                    array [1..4] of str;
        GadgetComment:                          p_gadget;
        GadgetSTRING:                           p_gadget;
        GadgetIFF:                              p_gadget;
        GadgetTyp:                              p_gadget;
        GadgetFile:                             p_gadget;
        GadgetIN:                               p_gadget;
        GadgetOK:                               p_gadget;
        GadgetEND:                              p_gadget;
        BoolComment,BoolFileIn:                 short;
        TagsCHANGES:                            array [1..13] of TagItem;
        SI      :                               p_StringInfo;
        CDT     :                               DateTimeFormat;
        SIGNAL  :                               long;
        dummy   :                               boolean;
        safety  :                               integer;
        ChosenMenu:                             long;
        MenuContinue:                           boolean;
        ChangeASG,BackASG:                      array [0..1] of Byte;
        ApplicationPort:                        p_MsgPort;
        AppBit  :                               long;
        ApplicationMessage:                     p_AppMessage;
        ApplicationWindow:                      p_AppWindow;
        ApplicationCounter:                     integer;
BEGIN
        GadgetCycle:=CreateContext(^CG);
        ChangeASG[0]:=DI^.dri_Pens^[SHADOWPEN];
        ChangeASG[1]:=DI^.dri_Pens^[SHINEPEN];
        if ChangeASG[0]=ChangeASG[1] then
                ChangeASG[0]:=DI^.dri_Pens^[FILLTEXTPEN];
        BoolComment:=PCA.BoolComment;
        BoolFileIn:=PCA.BoolFileIn;

        ContentsCycle[1]:="Options";
        ContentsCycle[2]:="Places";
        ContentsCycle[3]:=NIL;
        TagsCHANGES[1].ti_Tag:=GTCY_Labels;
        TagsCHANGES[1].ti_Data:=ContentsCycle;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(137,5,150,12,NIL,^tattr,1,0,VI,NIL);
        GadgetCycle:=CreateGadgetA(CYCLE_KIND,CG,^NewGadgetFields,
                ^TagsCHANGES);

        if (PCA.Bool and 1)<>0 then dummy:=TRUE else dummy:=FALSE;
        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTCB_Checked,long(dummy));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,22,0,0,"_Name:",^tattr,2,PLACETEXT_RIGHT,
                VI,NIL);
        GadgetName:=CreateGadgetA(CHECKBOX_KIND,GadgetCycle,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTST_MaxChars,256);
        TagsCHANGES[3].ti_Tag:=GTST_String; TagsCHANGES[3].ti_Data:=PCA.Pattern;
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(160,22,244,12,"_Pattern",^tattr,3,PLACETEXT_LEFT,
                VI,NIL);
        GadgetPattern:=CreateGadgetA(STRING_KIND,GadgetName,^NewGadgetFields,
                ^TagsCHANGES);

        if (PCA.Bool and (long(1) SHL 1))<>0 then dummy:=TRUE else dummy:=FALSE;
        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTCB_Checked,long(dummy));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,36,0,0,"_Length:",^tattr,4,PLACETEXT_RIGHT,
                VI,NIL);
        GadgetLength:=CreateGadgetA(CHECKBOX_KIND,GadgetPattern,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTIN_Number,PCA.Bigger);
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(160,36,100,12,"_>=",^tattr,5,PLACETEXT_LEFT,
                VI,NIL);
        Gadgetbigger:=CreateGadgetA(INTEGER_KIND,GadgetLength,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTIN_Number,PCA.Smaller);
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(295,36,100,12,"_<=",^tattr,6,PLACETEXT_LEFT,
                VI,NIL);
        Gadgetsmaller:=CreateGadgetA(INTEGER_KIND,Gadgetbigger,^NewGadgetFields,
                ^TagsCHANGES);

        if (PCA.Bool and (long(1) SHL 2))<>0 then dummy:=TRUE else dummy:=FALSE;
        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTCB_Checked,long(dummy));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,50,0,0,"_Attributes:",^tattr,7,PLACETEXT_RIGHT,
                VI,NIL);
        GadgetBits:=CreateGadgetA(CHECKBOX_KIND,Gadgetsmaller,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTST_MaxChars,8);
        TagsCHANGES[3].ti_Tag:=GTST_String; TagsCHANGES[3].ti_Data:=PCA.Bits;
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(182,50,84,12,"_Bits",^tattr,8,PLACETEXT_LEFT,VI,NIL);
        GadgetBS:=CreateGadgetA(STRING_KIND,GadgetBits,^NewGadgetFields,^TagsCHANGES);
        SI:=GadgetBS^.SpecialInfo;
        SI^.Extension^.InitialModes:=SI^.Extension^.InitialModes or SGM_REPLACE or SGM_FIXEDFIELD;

        if (PCA.Bool and (long(1) SHL 3))<>0 then dummy:=TRUE else dummy:=FALSE;
        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTCB_Checked,long(dummy));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,64,0,0,"_Time:",^tattr,9,PLACETEXT_RIGHT,
                VI,NIL);
        GadgetDate:=CreateGadgetA(CHECKBOX_KIND,GadgetBS,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTST_MaxChars,8);
        TagsCHANGES[3].ti_Tag:=GTST_String; TagsCHANGES[3].ti_Data:=PCA.Date1;
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(160,64,84,12,"_from",^tattr,10,0,VI,NIL);
        Gadgetvom1:=CreateGadgetA(STRING_KIND,Gadgetdate,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTST_MaxChars,8);
        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=PCA.Time1;
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(246,64,84,12,NIL,^tattr,11,0,VI,NIL);
        Gadgetvom2:=CreateGadgetA(STRING_KIND,Gadgetvom1,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTST_MaxChars,8);
        TagsCHANGES[3].ti_Tag:=GTST_String; TagsCHANGES[3].ti_Data:=PCA.Date2;
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(160,78,84,12,"t_o",^tattr,12,0,VI,NIL);
        Gadgetbis1:=CreateGadgetA(STRING_KIND,Gadgetvom2,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTST_MaxChars,8);
        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=PCA.Time2;
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(246,78,84,12,NIL,^tattr,13,0,VI,NIL);
        Gadgetbis2:=CreateGadgetA(STRING_KIND,Gadgetbis1,^NewGadgetFields,
                ^TagsCHANGES);

        ContentsCommentFile[1]:="-";
        ContentsCommentFile[2]:="G=k";
        ContentsCommentFile[3]:="G÷k";
        ContentsCommentFile[4]:=NIL;
        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2].ti_Tag:=GTCY_Labels;
        TagsCHANGES[2].ti_Data:=ContentsCommentFile;
        TagsCHANGES[3]:=TagItem(GTCY_Active,long(BoolComment));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,92,60,12,"_Comment:",^tattr,14,PLACETEXT_RIGHT,
                VI,NIL);
        GadgetComment:=CreateGadgetA(CYCLE_KIND,Gadgetbis2,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTST_MaxChars,256);
        TagsCHANGES[3].ti_Tag:=GTST_String; TagsCHANGES[3].ti_Data:=PCA.Comment;
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(216,92,188,12,"_String",^tattr,15,PLACETEXT_LEFT,
                VI,NIL);
        GadgetSTRING:=CreateGadgetA(STRING_KIND,GadgetComment,^NewGadgetFields,
                ^TagsCHANGES);

        if (PCA.Bool and (long(1) SHL 4))<>0 then dummy:=TRUE else dummy:=FALSE;
        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTCB_Checked,long(dummy));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,106,0,0,"_IFF:",^tattr,16,PLACETEXT_RIGHT,
                VI,NIL);
        GadgetIFF:=CreateGadgetA(CHECKBOX_KIND,GadgetSTRING,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTST_MaxChars,254);
        TagsCHANGES[3].ti_Tag:=GTST_String; TagsCHANGES[3].ti_Data:=PCA.Typ;
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(160,106,244,12,"T_ype",^tattr,17,PLACETEXT_LEFT,
                VI,NIL);
        GadgetTyp:=CreateGadgetA(STRING_KIND,GadgetIFF,^NewGadgetFields,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2].ti_Tag:=GTCY_Labels;
        TagsCHANGES[2].ti_Data:=ContentsCommentFile;
        TagsCHANGES[3]:=TagItem(GTCY_Active,long(BoolFileIn));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,120,60,12,"file-inte_rnal search for:",^tattr,
                18,PLACETEXT_RIGHT,VI,NIL);
        GadgetFile:=CreateGadgetA(CYCLE_KIND,GadgetTyp,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTST_MaxChars,256);
        TagsCHANGES[3].ti_Tag:=GTST_String; TagsCHANGES[3].ti_Data:=PCA.FileIn;
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(160,134,244,12,"Cont_ents:",^tattr,19,PLACETEXT_LEFT,
                VI,NIL);
        GadgetIN:=CreateGadgetA(STRING_KIND,GadgetFile,^NewGadgetFields,^TagsCHANGES);

        NewGadgetFields:=NewGadget(10,154,100,12,"Search...",^tattr,20,
                PLACETEXT_IN,VI,NIL);
        GadgetOK:=CreateGadgetA(BUTTON_KIND,GadgetIN,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(344,154,60,12,"Quit",^tattr,21,
                PLACETEXT_IN,VI,NIL);
        GadgetEND:=CreateGadgetA(BUTTON_KIND,GadgetOK,^NewGadgetFields,NIL);

        if (ChangeASG[0]<>ChangeASG[1]) and (UsedXSP.Coloured=TRUE) then begin
                SI:=GadgetPattern^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=Gadgetbigger^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=Gadgetsmaller^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetBS^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=Gadgetvom1^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=Gadgetvom2^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=Gadgetbis1^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=Gadgetbis2^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetSTRING^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetTyp^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetIN^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
        end;

        NewMenuFields[1]:=NewMenu(NM_TITLE,0,"Project",NIL,0,0,NIL);
        NewMenuFields[2]:=NewMenu(NM_ITEM,0,"New","N",0,0,NIL);
        NewMenuFields[3]:=NewMenu(NM_ITEM,0,"Open...","O",0,0,NIL);
        NewMenuFields[4]:=NewMenu(NM_ITEM,0,str(NM_BARLABEL),NIL,0,0,NIL);
        NewMenuFields[5]:=NewMenu(NM_ITEM,0,"Save","S",0,0,NIL);
        NewMenuFields[6]:=NewMenu(NM_ITEM,0,"Save as...","A",0,0,NIL);
        NewMenuFields[7]:=NewMenu(NM_ITEM,0,str(NM_BARLABEL),NIL,0,0,NIL);
        NewMenuFields[8]:=NewMenu(NM_ITEM,0,"Preferences...",NIL,0,0,NIL);
        NewMenuFields[9]:=NewMenu(NM_ITEM,0,"About...",NIL,0,0,NIL);
        NewMenuFields[10]:=NewMenu(NM_ITEM,0,"Quit","Q",0,0,NIL);
        NewMenuFields[11]:=NewMenu(NM_TITLE,0,"Options",NIL,0,0,NIL);
        NewMenuFields[12]:=NewMenu(NM_ITEM,0,"Standard values",NIL,0,0,NIL);
        NewMenuFields[13]:=NewMenu(NM_ITEM,0,"out of Project...",NIL,0,0,NIL);
        NewMenuFields[14]:=NewMenu(NM_ITEM,0,"out of File attributes...",NIL,0,0,NIL);
        NewMenuFields[15]:=NewMenu(NM_ITEM,0,str(NM_BARLABEL),NIL,0,0,NIL);
        NewMenuFields[16]:=NewMenu(NM_ITEM,0,"Save as Standard values",NIL,0,0,NIL);
        NewMenuFields[17].nm_Type:=NM_END;
        MenuFields:=CreateMenusA(^NewMenuFields,NIL);
        TagsCHANGES[1].ti_Tag:=GTMN_TextAttr;
        TagsCHANGES[1].ti_Data:=^tattr;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        dummy:=LayoutMenusA(MenuFields,VI,^TagsCHANGES);

        ZOM[1]:=20;
        ZOM[2]:=10;
        ZOM[3]:=350;
        ZOM[4]:=scr^.font^.ta_Ysize+6;
        TagsCHANGES[1]:=TagItem(WA_Top,10);
        TagsCHANGES[2]:=TagItem(WA_Left,20);
        TagsCHANGES[3]:=TagItem(WA_InnerHeight,186);
        TagsCHANGES[4]:=TagItem(WA_InnerWidth,416);
        TagsCHANGES[5]:=TagItem(WA_MouseQueue,0);
        TagsCHANGES[6]:=TagItem(WA_RptQueue,0);
        TagsCHANGES[7].ti_Tag:=WA_Title;
        TagsCHANGES[7].ti_Data:=ProjektXSearch;
        TagsCHANGES[8]:=TagItem(WA_Flags,WFLG_CLOSEGADGET OR WFLG_DRAGBAR
                or WFLG_DEPTHGADGET or WFLG_GIMMEZEROZERO
                or WFLG_SMART_REFRESH or WFLG_ACTIVATE or WFLG_HASZOOM);
        TagsCHANGES[9]:=TagItem(WA_IDCMP,IDCMP_GADGETUP or IDCMP_GADGETDOWN or
                IDCMP_NEWSIZE or IDCMP_CLOSEWINDOW or IDCMP_VANILLAKEY or
                IDCMP_MENUPICK);
        TagsCHANGES[10].ti_Tag:=WA_Gadgets;
        TagsCHANGES[10].ti_Data:=CG^;
        TagsCHANGES[11]:=TagItem(WA_CustomScreen,long(scr));
        TagsCHANGES[12].ti_Tag:=WA_Zoom;
        TagsCHANGES[12].ti_Data:=ZOM;
        TagsCHANGES[13].ti_Tag:=TAG_END;
        Win:=OpenWindowTagList(NIL,^TagsCHANGES);
        winBit:=long(1) shl Win^.userport^.mp_SigBit;
        SIGNAL:=SetFont(win^.RPort,tfont);

        DrawBevelLine(win,0,172,416,FALSE,FALSE,DI);
        dummy:=SetMenuStrip(win,MenuFields);
        GT_RefreshWindow(win,NIL);
        ApplicationPort:=CreatePort("XSearch AppPort",0);
        AppBit:=long(1) shl ApplicationPort^.mp_SigBit;
        ApplicationWindow:=AddAppWindowA(1,0,win,ApplicationPort,NIL);

        imsg:=NIL;
        MenuContinue:=FALSE;
        ApplicationCounter:=0;

        if BeginString<>"" then begin GiveMessageOptions(BeginString,win,DI); BeginString:="" end;

        BACK:
        EndExit:=-1;
        SIGNAL:=0;

        repeat
                if (MenuContinue=FALSE) and (ApplicationCounter=0) then begin
                        imsg:=GT_GetIMsg(win^.userport);
                        GT_ReplyIMsg(imsg);
                        if imsg=NIL then begin
                                SIGNAL:=_wait(AppBit or winBit);
                                if SIGNAL=winBit then begin
                                        imsg:=GT_GetIMsg(win^.userport);
                                        GT_ReplyIMsg(imsg)
                                end
                        end else
                                SIGNAL:=winBit;
                end;
                if MenuContinue=TRUE then begin
                        case ChosenMenu and $1f of
                                0:      begin
                                        case (ChosenMenu and $7e0) div 32 of
                                                0:      EndExit:=50
                                                1:      EndExit:=51
                                                3:      EndExit:=52
                                                4:      EndExit:=53
                                                6:      begin
                                                        WaitPointer(win);
                                                        GetRidOfForOptions(win);
                                                        PreferencesXSearch;
                                                        GetBackForOptions(win,CG);
                                                        if (ChangeASG[0]<>ChangeASG[1]) and (UsedXSP.Coloured=TRUE) then BackASG:=ChangeASG else begin SI:=GadgetPattern^.SpecialInfo; BackASG:=SI^.Extension^.Pens end;
                                                        SI:=GadgetPattern^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        SI:=Gadgetbigger^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        SI:=Gadgetsmaller^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        SI:=GadgetBS^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        SI:=Gadgetvom1^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        SI:=Gadgetvom2^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        SI:=Gadgetbis1^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        SI:=Gadgetbis2^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        SI:=GadgetSTRING^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        SI:=GadgetTyp^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        SI:=GadgetIN^.SpecialInfo;
                                                        SI^.Extension^.ActivePens:=BackASG;
                                                        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=PCA.Date1;
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(Gadgetvom1,win,NIL,^TagsCHANGES);
                                                        TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=PCA.Date2;
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(Gadgetbis1,win,NIL,^TagsCHANGES);

                                                        NormalPointer(win);
                                                end
                                                7:      begin
                                                        WaitPointer(win);
                                                        GetRidOfForOptions(win);
                                                        AboutXSearch;
                                                        GetBackForOptions(win,CG);
                                                        NormalPointer(win);
                                                end
                                                8:      EndExit:=0
                                                else
                                        end
                                end
                                1:      begin
                                        case (ChosenMenu and $7e0) div 32 of
                                                0:      EndExit:=-50
                                                1:      EndExit:=54
                                                2:      EndExit:=55
                                                4:      EndExit:=-52
                                                else
                                        end
                                end
                                else
                        end;
                        NItem:=ItemAddress(MenuFields,ChosenMenu);
                        ChosenMenu:=NItem^.nextselect;
                        if (ChosenMenu=MENUNULL) or (ChosenMenu=$F8) then MenuContinue:=FALSE;
                end;
                if (SIGNAL=long(1) SHL win^.userport^.mp_sigBit) then begin
                        case imsg^.class of
                                IDCMP_CLOSEWINDOW:
                                        EndExit:=0
                                IDCMP_NEWSIZE: begin
                                        DrawBevelLine(win,0,172,416,FALSE,FALSE,DI);
                                        GT_RefreshWindow(win,NIL)
                                end
                                IDCMP_VANILLAKEY: begin
                                        if imsg^.code=99 then begin
                                                case BoolComment of
                                                                0:      BoolComment:=1
                                                                1:      BoolComment:=2
                                                                else    BoolComment:=0
                                                end;
                                                TagsCHANGES[1]:=TagItem(GTCY_Active,BoolComment);
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetComment,win,NIL,^TagsCHANGES);
                                                goto BACK
                                        end;
                                        if imsg^.code=114 then begin
                                                case BoolFileIn of
                                                                0:      BoolFileIn:=1
                                                                1:      BoolFileIn:=2
                                                                else    BoolFileIn:=0
                                                end;
                                                TagsCHANGES[1]:=TagItem(GTCY_Active,BoolFileIn);
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetFile,win,NIL,^TagsCHANGES);
                                                goto BACK
                                        end;
                                        if imsg^.code>96 then imsg^.code:=imsg^.code-32;
                                        case imsg^.code of
                                                32:     EndExit:=2
                                                13:     EndExit:=1
                                                27:     EndExit:=0
                                                80:     dummy:=activategadget(GadgetPattern,win,nil)
                                                62:     dummy:=activategadget(Gadgetbigger,win,nil)
                                                60:     dummy:=activategadget(Gadgetsmaller,win,nil)
                                                66:     dummy:=activategadget(GadgetBS,win,nil)
                                                70:     dummy:=activategadget(Gadgetvom1,win,nil)
                                                79:     dummy:=activategadget(Gadgetbis1,win,nil)
                                                83:     dummy:=activategadget(GadgetSTRING,win,nil)
                                                89:     dummy:=activategadget(GadgetTyp,win,nil)
                                                69:     dummy:=activategadget(GadgetIN,win,nil)
                                                78:     begin TagsCHANGES[1]:=TagItem(GTCB_Checked,long(NOT(GadgetName^.flags and GFLG_Selected<>0))); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetName,win,NIL,^TagsCHANGES) end;
                                                76:     begin TagsCHANGES[1]:=TagItem(GTCB_Checked,long(NOT(GadgetLength^.flags and GFLG_Selected<>0))); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetLength,win,NIL,^TagsCHANGES) end;
                                                65:     begin TagsCHANGES[1]:=TagItem(GTCB_Checked,long(NOT(GadgetBITS^.flags and GFLG_Selected<>0))); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetBITS,win,NIL,^TagsCHANGES) end;
                                                84:     begin TagsCHANGES[1]:=TagItem(GTCB_Checked,long(NOT(GadgetDate^.flags and GFLG_Selected<>0))); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetDate,win,NIL,^TagsCHANGES) end;
                                                67:     begin case BoolComment of
                                                                0:      BoolComment:=2
                                                                1:      BoolComment:=0
                                                                else    BoolComment:=1
                                                        end;
                                                        TagsCHANGES[1]:=TagItem(GTCY_Active,BoolComment);
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetComment,win,NIL,^TagsCHANGES)
                                                end;
                                                73:     begin TagsCHANGES[1]:=TagItem(GTCB_Checked,long(NOT(GadgetIFF^.flags and GFLG_Selected<>0))); TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetIFF,win,NIL,^TagsCHANGES) end;
                                                82:     begin case BoolFileIn of
                                                                0:      BoolFileIn:=2
                                                                1:      BoolFileIn:=0
                                                                else    BoolFileIn:=1
                                                        end;
                                                        TagsCHANGES[1]:=TagItem(GTCY_Active,BoolFileIn);
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetFile,win,NIL,^TagsCHANGES)
                                                end;
                                                otherwise;
                                        end;
                                        if NOT ((imsg^.code=32) or (imsg^.code=27) or (imsg^.code=13)) then saved:=FALSE
                                end;
                                IDCMP_GADGETUP: begin
                                        CurrentGadget:=imsg^.iaddress;
                                        case CurrentGadget^.gadgetid of
                                                14:     BoolComment:=imsg^.code
                                                18:     BoolFileIn:=imsg^.code
                                                1:      EndExit:=2
                                                3:      EndExit:=3
                                                5:      EndExit:=5
                                                6:      EndExit:=6
                                                8:      EndExit:=8
                                                10:     EndExit:=10
                                                11:     EndExit:=11
                                                12:     EndExit:=12
                                                13:     EndExit:=13
                                                15:     EndExit:=15
                                                17:     EndExit:=17
                                                19:     EndExit:=19
                                                20:     EndExit:=1
                                                21:     EndExit:=0
                                                otherwise
                                        end;
                                        if NOT ((CurrentGadget^.gadgetid=21) or (CurrentGadget^.gadgetid=20) or (CurrentGadget^.gadgetid=1)) then saved:=FALSE
                                end;
                                IDCMP_MENUPICK: begin ChosenMenu:=imsg^.code; MenuContinue:=TRUE; SIGNAL:=-1 end
                                else
                        end
                end;
                if (SIGNAL=AppBit) or (ApplicationCounter>0) then begin
                        if ApplicationCounter=0 then begin
                                ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                                if ApplicationMessage^.am_Type<>MTYPE_APPWINDOW then goto SimplyOut;
                                if ApplicationMessage^.am_NumArgs<1 then goto SimplyOut;
                                ApplicationCounter:=1
                        end;
                        if ApplicationMessage^.am_ArgList^[ApplicationCounter].wa_Name="" then begin
                                SIGNAL:=NameFromLock(ApplicationMessage^.am_ArgList^[ApplicationCounter].wa_Lock,VariableString,257);
                                if VariableString[length(VariableString)]<>":" then VariableString:=FilePart(VariableString);
                                GiveError("IconDrop - ["+VariableString+"]","You can't drag 'n drop directory icons"+LF+"in this window.",win);
                                goto SimplyOut
                        end;
                        if ApplicationMessage^.am_ArgList^[ApplicationCounter].wa_Lock=0 then begin
                                GiveError("IconDrop - ["+ApplicationMessage^.am_ArgList^[ApplicationCounter].wa_Name+"]","The icon couldn't have been read.",win);
                                goto SimplyOut
                        end;
                        SIGNAL:=NameFromLock(ApplicationMessage^.am_ArgList^[ApplicationCounter].wa_Lock,VariableString,257);
                        Dummy:=AddPart(VariableString,ApplicationMessage^.am_ArgList^[ApplicationCounter].wa_Name,364);
                        ProjektName:=ApplicationMessage^.am_ArgList^[ApplicationCounter].wa_Name;
                        EndExit:=-55;
                        SimplyOut:
                        if ApplicationCounter=ApplicationMessage^.am_NumArgs then begin
                                ApplicationCounter:=0;
                                ReplyMsg(p_Message(ApplicationMessage))
                        end else
                                ApplicationCounter:=ApplicationCounter+1
                end
        until EndExit<>-1;

        safety:=EndExit;

        if (EndExit=54) or (abs(EndExit)=55) or (abs(EndExit)=50) or
                (EndExit=51) or (abs(EndExit)=52) or (EndExit=0) or
                (EndExit=1) or (EndExit=2) or (EndExit=53) then
                BackupOptions(PCA,GadgetName,GadgetPattern,GadgetLength,
                        Gadgetbigger,Gadgetsmaller,GadgetBits,GadgetBS,GadgetDate,
                        Gadgetvom1,Gadgetvom2,Gadgetbis1,Gadgetbis2,GadgetSTRING,
                        GadgetIFF,GadgetTyp,GadgetIN,BoolComment,BoolFileIn);

        if (EndExit=54) or (abs(EndExit)=55) then begin
                WaitPointer(win);
                GetRidOfForOptions(win);
                if EndExit=54 then Dummy:=FileProjekt(2,win);
                if EndExit=55 then Dummy:=FileProjekt(3,win);
                if Dummy=TRUE then begin
                        case EndExit of
                                54:     if ProjektDir[length(ProjektDir)]=":" then
                                                Dummy:=ReadPrefs(ProjektDir+ProjektName,PCA,win,TRUE,SearchList,TRUE)
                                        else
                                                Dummy:=ReadPrefs(ProjektDir+"/"+ProjektName,PCA,win,TRUE,SearchList,TRUE)
                                55:     if ProjektDir[length(ProjektDir)]=":" then
                                                Dummy:=ReadPrefsOutOfFile(ProjektDir+ProjektName,PCA,win)
                                        else
                                                Dummy:=ReadPrefsOutOfFile(ProjektDir+"/"+ProjektName,PCA,win)
                                (-55):  Dummy:=ReadPrefsOutOfFile(VariableString,PCA,win)
                                else
                        end;
                        GetBackForOptions(win,CG);
                        if Dummy=TRUE then begin
                                RestoreOptions(PCA,GadgetName,GadgetPattern,GadgetLength,
                                        Gadgetbigger,Gadgetsmaller,GadgetBits,GadgetBS,GadgetDate,
                                        Gadgetvom1,Gadgetvom2,Gadgetbis1,Gadgetbis2,GadgetComment,
                                        GadgetSTRING,GadgetIFF,GadgetTyp,GadgetFile,GadgetIN,win);
                                saved:=FALSE;
                        end;
                        RestoreProjektNameDir;
                end else GetBackForOptions(win,CG);
                NormalPointer(win);
                goto BACK
        end;

        if EndExit<-49 then EndExit:=abs(EndExit);

        WaitPointer(win);

        if ((EndExit>-1) and (EndExit<3)) or (EndExit>49) or (EndExit=3) then begin
                SI:=GadgetPattern^.SpecialInfo;
                VariableStr:=SI^.Buffer;
                if VerifyPattern(VariableStr,"Name: ",win,DI)=FALSE then begin
                        EndExit:=integer(activategadget(GadgetPattern,win,nil));
                        EndExit:=-2
                end;
        end;

        if ((EndExit>-1) and (EndExit<3)) or (EndExit>49) or (EndExit=5) or (EndExit=6) then begin
                if (EndExit>-1) and (EndExit<3) then EndExit:=-5;
                RepeatHereLength:
                if abs(EndExit)=5 then SI:=Gadgetbigger^.SpecialInfo else SI:=Gadgetsmaller^.SpecialInfo;
                SIGNAL:=SI^.LongInt;
                if VerifyLength(SIGNAL,win,DI)=FALSE then begin
                        if abs(EndExit)=5 then
                                EndExit:=integer(activategadget(Gadgetbigger,win,nil))
                        else
                                EndExit:=integer(activategadget(Gadgetsmaller,win,nil));
                        EndExit:=-2
                end;
        end;

        if ((EndExit>-1) and (EndExit<3)) or (EndExit>49) or (EndExit=15) then begin
                SI:=GadgetSTRING^.SpecialInfo;
                VariableStr:=SI^.Buffer;
                if VerifyPattern(VariableStr,"Comment: ",win,DI)=FALSE then begin
                        EndExit:=integer(activategadget(GadgetSTRING,win,nil));
                        EndExit:=-2
                end;
        end;

        if ((EndExit>-1) and (EndExit<3)) or (EndExit>49) or (EndExit=19) then begin
                SI:=GadgetIN^.SpecialInfo;
                VariableStr:=SI^.Buffer;
                if VerifyPattern(VariableStr,"File-internals: ",win,DI)=FALSE then begin
                        EndExit:=integer(activategadget(GadgetIN,win,nil));
                        EndExit:=-2
                end;
        end;

        if ((EndExit>-1) and (EndExit<3)) or (EndExit>49) or (EndExit=8) then begin
                SI:=GadgetBS^.SpecialInfo;
                VariableStr:=SI^.Buffer;
                VariableString:=AlienizeBits(VariableStr);
                if VerifyBits(VariableString,win,DI)=FALSE then begin
                        Dummy:=activategadget(GadgetBS,win,nil);
                        EndExit:=-2
                end else begin
                        VariableStr:=VariableString;
                        TagsCHANGES[1]:=TagItem(GTST_String,long(VariableStr));
                        TagsCHANGES[2].ti_Tag:=TAG_END;
                        GT_SetGadgetAttrsA(GadgetBS,win,NIL,^TagsCHANGES);
                end;
        end;

        if ((EndExit>-1) and (EndExit<3)) or (EndExit>49) or (EndExit=17) then begin
                SI:=GadgetTyp^.SpecialInfo;
                VariableStr:=SI^.Buffer;
                VariableString:=AlienizeIFF(VariableStr); VariableStr:=VariableString;
                TagsCHANGES[1]:=TagItem(GTST_String,long(VariableStr));
                TagsCHANGES[2].ti_Tag:=TAG_END;
                GT_SetGadgetAttrsA(GadgetTyp,win,NIL,^TagsCHANGES);
                if VerifyIFF(VariableStr,win,DI)=FALSE then begin
                        Dummy:=activategadget(GadgetTyp,win,nil);
                        EndExit:=-2
                end;
        end;

        if ((EndExit>-1) and (EndExit<3)) or (EndExit>49) or (EndExit=10) or (EndExit=12) then begin
                if ((EndExit>-1) and (EndExit<3)) or (EndExit>49) then EndExit:=-10;
                RepeatHereDate:
                if abs(EndExit)=10 then SI:=Gadgetvom1^.SpecialInfo else SI:=Gadgetbis1^.SpecialInfo;
                VariableStr:=SI^.Buffer;
                VariableString:=AlienizeRawTimeDate(VariableStr,FALSE); VariableStr:=VariableString;
                TagsCHANGES[1]:=TagItem(GTST_String,long(VariableStr));
                TagsCHANGES[2].ti_Tag:=TAG_END;
                if abs(EndExit)=10 then
                        GT_SetGadgetAttrsA(Gadgetvom1,win,NIL,^TagsCHANGES)
                else
                        GT_SetGadgetAttrsA(Gadgetbis1,win,NIL,^TagsCHANGES);
                if VerifyRawTimeDate(VariableStr,win,FALSE,DI)=FALSE then begin
                        if abs(EndExit)=10 then
                                Dummy:=activategadget(Gadgetvom1,win,nil)
                        else
                                Dummy:=activategadget(Gadgetbis1,win,nil);
                        EndExit:=-2
                end else begin
                        VariableString:=AlienizeTimeDate(VariableStr,FALSE); VariableStr:=VariableString;
                        ConvertTimeDate(VariableStr,FALSE,CDT);
                        if VerifyDate(CDT,win,DI)=FALSE then begin
                                if abs(EndExit)=10 then
                                        Dummy:=activategadget(Gadgetvom1,win,nil)
                                else
                                        Dummy:=activategadget(Gadgetbis1,win,nil);
                                EndExit:=-2
                        end else begin
                                TagsCHANGES[1]:=TagItem(GTST_String,long(VariableStr));
                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                if abs(EndExit)=10 then
                                        GT_SetGadgetAttrsA(Gadgetvom1,win,NIL,^TagsCHANGES)
                                else
                                        GT_SetGadgetAttrsA(Gadgetbis1,win,NIL,^TagsCHANGES)
                        end;
                end;
        end;

        if ((EndExit>-1) and (EndExit<3)) or (EndExit>49) or (EndExit=11) or (EndExit=13) then begin
                if ((EndExit>-1) and (EndExit<3)) or (EndExit>49) then EndExit:=-11;
                RepeatHereTime:
                if abs(EndExit)=11 then SI:=Gadgetvom2^.SpecialInfo else SI:=Gadgetbis2^.SpecialInfo;
                VariableStr:=SI^.Buffer;
                VariableString:=AlienizeRawTimeDate(VariableStr,TRUE); VariableStr:=VariableString;
                TagsCHANGES[1]:=TagItem(GTST_String,long(VariableStr));
                TagsCHANGES[2].ti_Tag:=TAG_END;
                if abs(EndExit)=11 then
                        GT_SetGadgetAttrsA(Gadgetvom2,win,NIL,^TagsCHANGES)
                else
                        GT_SetGadgetAttrsA(Gadgetbis2,win,NIL,^TagsCHANGES);
                if VerifyRawTimeDate(VariableStr,win,TRUE,DI)=FALSE then begin
                        if abs(EndExit)=11 then
                                Dummy:=activategadget(Gadgetvom2,win,nil)
                        else
                                Dummy:=activategadget(Gadgetbis2,win,nil);
                        EndExit:=-2
                end else begin
                        VariableString:=AlienizeTimeDate(VariableStr,TRUE);
                        VariableStr:=VariableString;
                        ConvertTimeDate(VariableStr,TRUE,CDT);
                        if VerifyTime(CDT,win,DI)=FALSE then begin
                                if abs(EndExit)=11 then
                                        Dummy:=activategadget(Gadgetvom2,win,nil)
                                else
                                        Dummy:=activategadget(Gadgetbis2,win,nil);
                                EndExit:=-2
                        end else begin
                                TagsCHANGES[1]:=TagItem(GTST_String,long(VariableStr));
                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                if abs(EndExit)=11 then
                                        GT_SetGadgetAttrsA(Gadgetvom2,win,NIL,^TagsCHANGES)
                                else
                                        GT_SetGadgetAttrsA(Gadgetbis2,win,NIL,^TagsCHANGES)
                        end;
                end;
        end;

        if (EndExit>2) and (EndExit<50) then begin GiveMessageOptions("",win,DI); EndExit:=-2 end;

        if (EndExit=-2) and (safety=1) then begin
                TagsCHANGES[1].ti_Tag:=GTCY_Active;
                TagsCHANGES[1].ti_Data:=0;
                TagsCHANGES[2].ti_Tag:=TAG_END;
                GT_SetGadgetAttrsA(GadgetCycle,win,NIL,^TagsCHANGES);
        end;

        if EndExit=-2 then begin NormalPointer(win); goto BACK end;
        if EndExit=-5 then begin EndExit:=safety; goto RepeatHereLength end;
        if EndExit=-10 then begin EndExit:=safety; goto RepeatHereDate end;
        if EndExit=-11 then begin EndExit:=safety; goto RepeatHereTime end;

        if (abs(EndExit)=50) or (EndExit=51) then begin
                if saved=FALSE then begin
                        case EndExit of
                                50:     SIGNAL:=GiveQuestion(ProjektXSearch+" - New","The old project has been changed. Do you"+LF+"really want to start a new one?",
                                                "New project|Save, then new project|Cancel",win)
                                (-50):  SIGNAL:=GiveQuestion(ProjektXSearch+" - Standard values","The old project has been changed. Do you"+LF+"really want to set the Standard values?",
                                                "Standard values|Save, then Standard values|Cancel",win)
                                51:     SIGNAL:=GiveQuestion(ProjektXSearch+" - Open project","The old project has been changed. Do you"+LF+"really want to open another?",
                                                "Open project|Save, then open project|Cancel",win)
                                otherwise
                        end;
                        if SIGNAL=2 then
                                if WritePrefs(Projekt,PCA,win,SearchList)=FALSE then begin NormalPointer(win); goto BACK end else saved:=TRUE
                end else SIGNAL:=1;
                if SIGNAL<>0 then begin
                        if abs(EndExit)=50 then begin
                                PCA:=PrefsStandard;
                                if UsedXSP.Currency=TRUE then begin
                                        VariableString:=ConvertCurrentDateTime(NIL,FALSE); VariableStr:=VariableString;
                                        VariableString:=AlienizeTimeDate(VariableStr,FALSE);
                                        PCA.Date1:=VariableString; PCA.Date2:=VariableString;
                                        VariableString:=ConvertCurrentDateTime(NIL,TRUE); VariableStr:=VariableString;
                                        VariableString:=AlienizeTimeDate(VariableStr,TRUE);
                                        PCA.Time1:=VariableString; PCA.Time2:=VariableString;
                                end;
                                RestoreOptions(PCA,GadgetName,GadgetPattern,GadgetLength,
                                        Gadgetbigger,Gadgetsmaller,GadgetBits,GadgetBS,GadgetDate,
                                        Gadgetvom1,Gadgetvom2,Gadgetbis1,Gadgetbis2,GadgetComment,
                                        GadgetSTRING,GadgetIFF,GadgetTyp,GadgetFile,GadgetIN,win);
                                if EndExit=50 then begin dummy:=NameProjekt(TRUE); SetWindowTitles(win,ProjektXSearch,str(-1)) end;
                                saved:=TRUE;
                                SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                        SearchNodeBack:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                        Remove(p_Node(^SearchNodeV^.sen_Node));
                                        dispose(SearchNodeV);
                                        SearchNodeV:=SearchNodeBack;
                                END;
                        end;
                        if EndExit=51 then begin
                                GetRidOfForOptions(win);
                                Dummy:=FileProjekt(0,win);
                                GetBackForOptions(win,CG);
                                if Dummy=TRUE then begin
                                        if ProjektDir[length(ProjektDir)]=":" then
                                                Dummy:=ReadPrefs(ProjektDir+ProjektName,PCA,win,FALSE,SearchList,TRUE)
                                        else
                                                Dummy:=ReadPrefs(ProjektDir+"/"+ProjektName,PCA,win,FALSE,SearchList,TRUE);
                                        if Dummy=TRUE then begin
                                                dummy:=NameProjekt(FALSE);
                                                RestoreOptions(PCA,GadgetName,GadgetPattern,GadgetLength,
                                                        Gadgetbigger,Gadgetsmaller,GadgetBits,GadgetBS,GadgetDate,
                                                        Gadgetvom1,Gadgetvom2,Gadgetbis1,Gadgetbis2,GadgetComment,
                                                        GadgetSTRING,GadgetIFF,GadgetTyp,GadgetFile,GadgetIN,win);
                                                SetWindowTitles(win,ProjektXSearch,str(-1));
                                                saved:=TRUE;
                                        end else RestoreProjektNameDir
                                end;
                        end;
                end
        end;

        if abs(EndExit)=52 then begin
                if EndExit=52 then
                        Dummy:=WritePrefs(Projekt,PCA,win,SearchList)
                else
                        Dummy:=WritePrefs("ENVARC:XSearch.Std",PCA,win,NIL);
                if Dummy=TRUE then begin
                        saved:=TRUE;
                        if EndExit=-52 then PrefsStandard:=PCA
                end
        end;

        if EndExit=53 then begin
                GetRidOfForOptions(win);
                Dummy:=FileProjekt(1,win);
                GetBackForOptions(win,CG);
                if Dummy=TRUE then begin
                        if ProjektDir[length(ProjektDir)]=":" then
                                Dummy:=WritePrefs(ProjektDir+ProjektName,PCA,win,SearchList)
                        else
                                Dummy:=WritePrefs(ProjektDir+"/"+ProjektName,PCA,win,SearchList);
                        if Dummy=TRUE then begin Dummy:=NameProjekt(FALSE); SetWindowTitles(win,ProjektXSearch,str(-1)); saved:=TRUE end
                end else RestoreProjektNameDir
        end;

        if abs(EndExit)>49 then begin
                NormalPointer(win);
                goto BACK
        end;

        if saved=FALSE then begin
                if EndExit=0 then begin
                        SIGNAL:=GiveQuestion(ProjektXSearch+" - Quit","The old project has been changed."+LF+"Do you really want to quit?",
                                "Quit|Save, then quit|Cancel",win);
                        if SIGNAL=2 then
                                if WritePrefs(Projekt,PCA,win,SearchList)=FALSE then begin NormalPointer(win); goto BACK end else saved:=TRUE;
                        if SIGNAL=0 then begin NormalPointer(win); goto BACK end
                end else
                        saved:=FALSE;
        end;

        Dummy:=RemoveAppWindow(ApplicationWindow);
        DeletePort(ApplicationPort);
        CloseWindow(win);
        FreeMenus(MenuFields);
        FreeGadgets(CG);
END;


FUNCTION GetFileOutOfList(TextList:p_List,howlong:integer):DirString;
VAR     before  :                               Node;
        VS      :                               DirString;
        i       :                               integer;
BEGIN
        before:=TextList^.lh_Head^;
        for i:=0 to howlong-1 do
                before:=before.ln_Succ^;
        VS:=before.ln_Name;
        GetFileOutOfList:=VS
END;

FUNCTION GetTypeOutOfList(TextList:p_List,howlong:integer):byte;
VAR     before  :                               Node;
        i       :                               integer;
BEGIN
        before:=TextList^.lh_Head^;
        for i:=0 to howlong-1 do
                before:=before.ln_Succ^;
        GetTypeOutOfList:=before.ln_Pri;
END;

PROCEDURE GetRidOfForFiler(VAR win:p_window);
BEGIN
        win^.flags:=win^.flags or WFLG_RMBTRAP;
        win^.IDCMPFlags:=0;
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=NIL
END;

PROCEDURE GetBackForFiler(VAR win:p_window,GadgetCycle:p_gadget);
BEGIN
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=GadgetCycle;
        win^.IDCMPFlags:=IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or IDCMP_GADGETDOWN or IDCMP_MOUSEMOVE or IDCMP_MOUSEBUTTONS or IDCMP_INTUITICKS or IDCMP_VANILLAKEY or IDCMP_NEWSIZE or IDCMP_MENUPICK;
        if (CurrentDirectory="") or (CS="") then win^.IDCMPFlags:=win^.IDCMPFlags or IDCMP_DISKINSERTED or IDCMP_DISKREMOVED;
        win^.flags:=win^.flags xor WFLG_RMBTRAP;
        RefreshGadgets(win^.FirstGadget,win,NIL);
        GT_RefreshWindow(win,NIL);
        DrawBevelLine(win,0,189,504,FALSE,FALSE,DI)
END;

PROCEDURE GiveMessageFiler(Introducer:DirString,win:p_window,DI:p_DrawInfo);
VAR     DidIt   :                               integer;
BEGIN
        VariableString:=Introducer;
        if length(VariableString)>60 then
                VariableString:=copy(VariableString,1,57)+"..."
        else
                for DidIt:=length(VariableString)+1 to 60 do
                        VariableString:=VariableString+" ";
        SetAPen(win^.RPort,DI^.dri_Pens^[TEXTPEN]);
        Move(win^.RPort,10,199); DidIt:=integer(_Text(win^.RPort,VariableString,60));
END;

PROCEDURE Filer;
LABEL   BACK,OverJump,DontDo,SimplyOut,OutQuick;
VAR     win     :                               p_window;
        winBit  :                               long;
        ZOM     :                               array[1..4] of word;
        TagsCHANGES:                            array[1..13] of TagItem;
        CG      :                               p_gadget;
        CurrentGadget:                          p_gadget;
        NewMenuFields:                          array[1..11] of NewMenu;
        MenuFields:                             p_Menu;
        NewGadgetFields:                        newgadget;
        ContentsCycle:                          array[1..3] of str;
        GadgetCycle:                            p_gadget;
        GadgetDirList:                          p_gadget;
        GadgetDevs:                             p_gadget;
        GadgetParent:                           p_gadget;
        GadgetRoot:                             p_gadget;
        GadgetDir:                              p_gadget;
        GadgetPattern:                          p_gadget;
        GadgetMark:                             p_gadget;
        GadgetAll:                              p_gadget;
        GadgetReverse:                          p_gadget;
        GadgetPlus:                             p_gadget;
        GadgetSearchList:                       p_gadget;
        GadgetMinus:                            p_gadget;
        GadgetAllS:                             p_gadget;
        GadgetReverseS:                         p_gadget;
        GadgetInEx:                             p_gadget;
        GadgetOK:                               p_gadget;
        GadgetEND:                              p_gadget;
        SI      :                               p_StringInfo;
        DidIt   :                               boolean;
        imsg    :                               p_intuimessage;
        SIGNAL  :                               long;
        dummy   :                               long;
        MyAnchor:                               p_anchorpath;
        MyString:                               DirString;
        ChangeASG:                              array[0..1] of Byte;
        RN      :                               p_RootNode;
        Inf     :                               p_DosInfo;
        Lst     :                               p_DevInfo;
        i       :                               integer;
        s1,m1,s2,m2,preSelected:                long;
        ChosenMenu:                             long;
        MenuContinue:                           boolean;
        NItem   :                               p_menuitem;
        ShowingMessage:                         boolean;
        ApplicationPort:                        p_MsgPort;
        AppBit  :                               long;
        ApplicationMessage:                     p_AppMessage;
        ApplicationWindow:                      p_AppWindow;
BEGIN
        GadgetCycle:=CreateContext(^CG);
        ChangeASG[0]:=DI^.dri_Pens^[SHADOWPEN];
        ChangeASG[1]:=DI^.dri_Pens^[SHINEPEN];
        if ChangeASG[0]=ChangeASG[1] then
                ChangeASG[0]:=DI^.dri_Pens^[FILLTEXTPEN];

        new(MyAnchor);

        ContentsCycle[1]:="Places";
        ContentsCycle[2]:="Options";
        ContentsCycle[3]:=NIL;
        TagsCHANGES[1].ti_Tag:=GTCY_Labels;
        TagsCHANGES[1].ti_Data:=ContentsCycle;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(181,5,150,12,NIL,^tattr,1,0,VI,NIL);
        GadgetCycle:=CreateGadgetA(CYCLE_KIND,CG,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
        TagsCHANGES[1].ti_Data:=long(TextList);
        TagsCHANGES[2]:=TagItem(GTLV_ScrollWidth,16);
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,24,228,100,NIL,^tattr,2,
                PLACETEXT_ABOVE,VI,NIL);
        GadgetDirList:=CreateGadgetA(LISTVIEW_KIND,GadgetCycle,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(66,126,128,12,"D_evices",^tattr,3,PLACETEXT_IN,
                VI,NIL);
        GadgetDevs:=CreateGadgetA(BUTTON_KIND,GadgetDirList,^NewGadgetFields,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(194,126,22,12,"_:",^tattr,4,PLACETEXT_IN,
                VI,NIL);
        GadgetRoot:=CreateGadgetA(BUTTON_KIND,GadgetDevs,^NewGadgetFields,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(216,126,22,12,"_/",^tattr,5,PLACETEXT_IN,
                VI,NIL);
        GadgetParent:=CreateGadgetA(BUTTON_KIND,GadgetRoot,^NewGadgetFields,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTST_MaxChars,256);
        TagsCHANGES[3].ti_Tag:=GTST_String; TagsCHANGES[3].ti_Data:=CurrentDirectory;
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(66,138,172,12,"_Dir",^tattr,6,PLACETEXT_LEFT,
                VI,NIL);
        GadgetDir:=CreateGadgetA(STRING_KIND,GadgetParent,^NewGadgetFields,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTST_MaxChars,256);
        TagsCHANGES[3].ti_Tag:=GTST_String; TagsCHANGES[3].ti_Data:=MyPattern;
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(66,152,172,12,"_Ptt.",^tattr,7,PLACETEXT_LEFT,
                VI,NIL);
        GadgetPattern:=CreateGadgetA(STRING_KIND,GadgetDir,^NewGadgetFields,^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTCB_Checked,long(IDidTheMarking));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(238,68,0,0,NIL,^tattr,8,PLACETEXT_ABOVE,
                VI,NIL);
        GadgetMark:=CreateGadgetA(CHECKBOX_KIND,GadgetPattern,^NewGadgetFields,
                ^TagsCHANGES);

        NewGadgetFields:=NewGadget(238,81,20,11,"·",^tattr,9,PLACETEXT_IN,
                VI,NIL);
        GadgetAll:=CreateGadgetA(BUTTON_KIND,GadgetMark,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(238,92,20,11,Reverse,^tattr,10,PLACETEXT_IN,
                VI,NIL);
        GadgetReverse:=CreateGadgetA(BUTTON_KIND,GadgetAll,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(238,105,20,11,"+",^tattr,11,PLACETEXT_IN,
                VI,NIL);
        GadgetPlus:=CreateGadgetA(BUTTON_KIND,GadgetReverse,^NewGadgetFields,NIL);

        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
        TagsCHANGES[1].ti_Data:=long(SearchList);
        TagsCHANGES[2]:=TagItem(GTLV_ScrollWidth,16);
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(264,24,228,140,NIL,^tattr,12,
                PLACETEXT_ABOVE,VI,NIL);
        GadgetSearchList:=CreateGadgetA(LISTVIEW_KIND,GadgetPlus,^NewGadgetFields,
                ^TagsCHANGES);

        NewGadgetFields:=NewGadget(244,118,20,11,"-",^tattr,13,PLACETEXT_IN,
                VI,NIL);
        GadgetMinus:=CreateGadgetA(BUTTON_KIND,GadgetSearchList,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(244,129,20,11,"±",^tattr,14,PLACETEXT_IN,
                VI,NIL);
        GadgetInEx:=CreateGadgetA(BUTTON_KIND,GadgetMinus,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(244,142,20,11,"·",^tattr,15,PLACETEXT_IN,
                VI,NIL);
        GadgetAllS:=CreateGadgetA(BUTTON_KIND,GadgetInEx,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(244,153,20,11,Reverse,^tattr,16,PLACETEXT_IN,
                VI,NIL);
        GadgetReverseS:=CreateGadgetA(BUTTON_KIND,GadgetAllS,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(10,171,100,12,"Search...",^tattr,17,
                PLACETEXT_IN,VI,NIL);
        GadgetOK:=CreateGadgetA(BUTTON_KIND,GadgetReverseS,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(432,171,60,12,"Quit",^tattr,18,
                PLACETEXT_IN,VI,NIL);
        GadgetEND:=CreateGadgetA(BUTTON_KIND,GadgetOK,^NewGadgetFields,NIL);

        if (ChangeASG[0]<>ChangeASG[1]) and (UsedXSP.Coloured=TRUE) then begin
                SI:=GadgetDir^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetPattern^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
        end;

        NewMenuFields[1]:=NewMenu(NM_TITLE,0,"Project",NIL,0,0,NIL);
        NewMenuFields[2]:=NewMenu(NM_ITEM,0,"New","N",0,0,NIL);
        NewMenuFields[3]:=NewMenu(NM_ITEM,0,"Open...","O",0,0,NIL);
        NewMenuFields[4]:=NewMenu(NM_ITEM,0,str(NM_BARLABEL),NIL,0,0,NIL);
        NewMenuFields[5]:=NewMenu(NM_ITEM,0,"Save","S",0,0,NIL);
        NewMenuFields[6]:=NewMenu(NM_ITEM,0,"Save as...","A",0,0,NIL);
        NewMenuFields[7]:=NewMenu(NM_ITEM,0,str(NM_BARLABEL),NIL,0,0,NIL);
        NewMenuFields[8]:=NewMenu(NM_ITEM,0,"Preferences...",NIL,0,0,NIL);
        NewMenuFields[9]:=NewMenu(NM_ITEM,0,"About...",NIL,0,0,NIL);
        NewMenuFields[10]:=NewMenu(NM_ITEM,0,"Quit","Q",0,0,NIL);
        NewMenuFields[11].nm_Type:=NM_END;
        MenuFields:=CreateMenusA(^NewMenuFields,NIL);
        TagsCHANGES[1].ti_Tag:=GTMN_TextAttr;
        TagsCHANGES[1].ti_Data:=^tattr;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        DidIt:=LayoutMenusA(MenuFields,VI,^TagsCHANGES);

        ZOM[1]:=20;
        ZOM[2]:=10;
        ZOM[3]:=350;
        ZOM[4]:=scr^.font^.ta_Ysize+6;
        TagsCHANGES[1]:=TagItem(WA_Top,10);
        TagsCHANGES[2]:=TagItem(WA_Left,20);
        TagsCHANGES[3]:=TagItem(WA_InnerHeight,203);
        TagsCHANGES[4]:=TagItem(WA_InnerWidth,504);
        TagsCHANGES[5].ti_Tag:=WA_Title;
        TagsCHANGES[5].ti_Data:=ProjektXSearch;
        TagsCHANGES[6]:=TagItem(WA_Flags,WFLG_CLOSEGADGET or WFLG_GIMMEZEROZERO or
                WFLG_ACTIVATE or WFLG_DRAGBAR or WFLG_SMART_REFRESH or
                WFLG_DEPTHGADGET);
        TagsCHANGES[7]:=TagItem(WA_IDCMP,IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or
                IDCMP_GADGETDOWN or IDCMP_MOUSEMOVE or IDCMP_MOUSEBUTTONS or
                IDCMP_INTUITICKS or IDCMP_VANILLAKEY or IDCMP_NEWSIZE or
                IDCMP_MENUPICK);
        TagsCHANGES[8]:=TagItem(WA_CustomScreen,long(scr));
        TagsCHANGES[9].ti_Tag:=WA_Gadgets;
        TagsCHANGES[9].ti_Data:=CG^;
        TagsCHANGES[10]:=TagItem(WA_MouseQueue,0);
        TagsCHANGES[11]:=TagItem(WA_RptQueue,0);
        TagsCHANGES[12].ti_Tag:=WA_Zoom;
        TagsCHANGES[12].ti_Data:=ZOM;
        TagsCHANGES[13].ti_Tag:=TAG_END;
        win:=OpenWindowTagList(NIL,^TagsCHANGES);
        winBit:=long(1) shl win^.userport^.mp_sigbit;
        SIGNAL:=SetFont(win^.RPort,tfont);

        DrawBevelLine(win,0,189,504,FALSE,FALSE,DI);
        DidIt:=SetMenuStrip(win,MenuFields);
        GT_RefreshWindow(win,NIL);
        RefreshGadgets(win^.firstgadget,win,NIL);
        ApplicationPort:=CreatePort("XSearch AppPort",0);
        AppBit:=long(1) shl ApplicationPort^.mp_SigBit;
        ApplicationWindow:=AddAppWindowA(1,0,win,ApplicationPort,NIL);

        s1:=-1; m1:=-1;
        MenuContinue:=FALSE;
        if CurrentDirectory="" then win^.IDCMPFlags:=win^.IDCMPFlags or
                IDCMP_DISKREMOVED or IDCMP_DISKINSERTED;
        if BeginString<>"" then begin
                GiveMessageFiler(BeginString,win,DI);
                BeginString:="";
                ShowingMessage:=TRUE;
        end;
        if start=TRUE then begin
                EndExit:=35;
                start:=FALSE;
                goto OverJump
        end;

        BACK:
        EndExit:=-1;
        ShowingMessage:=FALSE;

        while EndExit=-1 do begin
                if MenuContinue=FALSE then begin
                        imsg:=GT_GetIMsg(win^.userport);
                        GT_ReplyIMsg(imsg);
                        if imsg=NIL then
                                if GetMsg(ApplicationPort)<>NIL then
                                        SIGNAL:=AppBit
                                else begin
                                        SIGNAL:=_wait(winBit or AppBit);
                                        if SIGNAL=winBit then begin
                                                imsg:=GT_GetIMsg(win^.userport);
                                                GT_ReplyIMsg(imsg);
                                        end
                                end
                        else
                                SIGNAL:=winBit
                end;
                if MenuContinue=TRUE then begin
                        case ChosenMenu and $1f of
                                0:      begin
                                        case (ChosenMenu and $7e0) div 32 of
                                                0:      EndExit:=50
                                                1:      EndExit:=51
                                                3:      EndExit:=52
                                                4:      EndExit:=53
                                                6:      begin
                                                        WaitPointer(win);
                                                        GetRidOfForFiler(win);
                                                        PreferencesXSearch;
                                                        GetBackForFiler(win,CG);
                                                        if (ChangeASG[0]<>ChangeASG[1]) and (UsedXSP.Coloured=TRUE) then begin
                                                                SI:=GadgetDir^.SpecialInfo;
                                                                SI^.Extension^.ActivePens:=ChangeASG;
                                                                SI:=GadgetPattern^.SpecialInfo;
                                                                SI^.Extension^.ActivePens:=ChangeASG;
                                                        end;
                                                        if UsedXSP.Coloured=FALSE then begin
                                                                SI:=GadgetDir^.SpecialInfo;
                                                                SI^.Extension^.ActivePens:=SI^.Extension^.Pens;
                                                                SI:=GadgetPattern^.SpecialInfo;
                                                                SI^.Extension^.ActivePens:=SI^.Extension^.Pens;
                                                        end;
                                                        NormalPointer(win);
                                                end
                                                7:      begin
                                                        WaitPointer(win);
                                                        GetRidOfForFiler(win);
                                                        AboutXSearch;
                                                        GetBackForFiler(win,CG);
                                                        NormalPointer(win);
                                                end
                                                8:      EndExit:=0
                                                else
                                        end
                                end
                                else
                        end;
                        NItem:=ItemAddress(MenuFields,ChosenMenu);
                        ChosenMenu:=NItem^.nextselect;
                        if (ChosenMenu=MENUNULL) or (ChosenMenu=$F8) then MenuContinue:=FALSE;
                end;
                if SIGNAL=winBit then begin
                        case imsg^.class of
                                IDCMP_CLOSEWINDOW:
                                        EndExit:=0
                                IDCMP_NEWSIZE: begin
                                        GT_RefreshWindow(win,NIL);
                                        DrawBevelLine(win,0,189,504,FALSE,FALSE,DI);
                                end
                                IDCMP_VANILLAKEY: begin
                                        if imsg^.code>96 then imsg^.code:=imsg^.code-32;
                                        case imsg^.code of
                                                69:     begin
                                                        CurrentDirectory:="";
                                                        CS:="";
                                                        EndExit:=35
                                                end
                                                46:     EndExit:=4
                                                58:     EndExit:=4
                                                47:     EndExit:=5
                                                55:     EndExit:=5
                                                68:     DidIt:=activategadget(GadgetDir,win,nil)
                                                80:     if CurrentDirectory<>"" then DidIt:=activategadget(GadgetPattern,win,nil)
                                                32:     EndExit:=2
                                                13:     EndExit:=1
                                                27:     EndExit:=0
                                                else
                                        end
                                end
                                IDCMP_DISKINSERTED: EndExit:=35
                                IDCMP_DISKREMOVED: EndExit:=35
                                IDCMP_GADGETUP: begin
                                        CurrentGadget:=imsg^.iaddress;
                                        case CurrentGadget^.gadgetid of
                                                1:      EndExit:=2
                                                2:      if (GadgetMark^.flags and GFLG_Selected)<>0 then begin
                                                                TextNode:=p_StringNode(TextList^.lh_Head);
                                                                FOR i:=1 to imsg^.code do
                                                                        TextNode:=p_StringNode(TextNode^.stn_Node.ln_Succ);
                                                                if TextNode^.stn_String[1]=" " then TextNode^.stn_String[1]:="·" else TextNode^.stn_String[1]:=" ";
                                                                GT_SetGadgetAttrsA(GadgetDirList,win,NIL,NIL)
                                                        end else begin
                                                                if GetTypeOutOfList(TextList,imsg^.code)=1 then begin
                                                                        CS:=CurrentDirectory;
                                                                        VS:=GetFileOutOfList(TextList,imsg^.code);
                                                                        VS:=copy(VS,5,length(VS)-4);
                                                                        if AddPart(CurrentDirectory,VS,256)=FALSE then goto BACK;
                                                                        EndExit:=35
                                                                end
                                                        end
                                                3:      begin
                                                        CurrentDirectory:="";
                                                        CS:="";
                                                        EndExit:=35
                                                end
                                                4:      EndExit:=4
                                                5:      EndExit:=5
                                                6:      begin
                                                        CS:=CurrentDirectory;
                                                        SI:=GadgetDir^.SpecialInfo;
                                                        CurrentDirectory:=SI^.Buffer;
                                                        EndExit:=35
                                                end
                                                7:      begin
                                                        SI:=GadgetPattern^.SpecialInfo;
                                                        MyPattern:=SI^.Buffer;
                                                        EndExit:=35
                                                end
                                                8:      EndExit:=8
                                                9:      if (GadgetMark^.flags and GFLG_Selected)<>0 then EndExit:=9 else begin TagsCHANGES[1]:=TagItem(GTCB_Checked,long(TRUE)); GT_SetGadgetAttrsA(GadgetMark,win,NIL,^TagsCHANGES); EndExit:=-9 end
                                                10:     if (GadgetMark^.flags and GFLG_Selected)<>0 then EndExit:=10 else begin TagsCHANGES[1]:=TagItem(GTCB_Checked,long(TRUE)); GT_SetGadgetAttrsA(GadgetMark,win,NIL,^TagsCHANGES); EndExit:=-9 end
                                                11:     if (GadgetMark^.flags and GFLG_Selected)<>0 then begin
                                                                WaitPointer(win);
                                                                GetRidOfForFiler(win);
                                                                TextNode:=p_StringNode(TextList^.lh_Head);
                                                                WHILE p_StringNode(TextNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                                                                        if TextNode^.stn_String[1]="·" then begin
                                                                                New(SearchNodeBack);
                                                                                if TextNode^.stn_Node.ln_Pri=1 then begin
                                                                                        MyString:=CurrentDirectory;
                                                                                        VS:=copy(TextNode^.stn_String,5,length(TextNode^.stn_String)-4);
                                                                                        if AddPart(MyString,VS,256)=FALSE then goto BACK;
                                                                                        SearchNodeBack^.sen_Path:=MyString;
                                                                                        if UsedXSP.Recursion=TRUE then MyString:="  D "+VS else MyString:="  d "+VS;
                                                                                        SearchNodeBack^.sen_Node.ln_Pri:=1
                                                                                end else begin
                                                                                        MyString:=CurrentDirectory;
                                                                                        VS:=copy(TextNode^.stn_String,3,length(TextNode^.stn_String)-2);
                                                                                        if AddPart(MyString,VS,256)=FALSE then goto BACK;
                                                                                        SearchNodeBack^.sen_Path:=MyString;
                                                                                        MyString:="  "+VS;
                                                                                        SearchNodeBack^.sen_Node.ln_Pri:=0
                                                                                end;
                                                                                SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                                                                WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                                                                        if SearchNodeV^.sen_Path=SearchNodeBack^.sen_Path then begin dispose(SearchNodeBack); goto DontDo end;
                                                                                        SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)
                                                                                END;
                                                                                PrepareNode(SearchNodeBack,MyString);
                                                                                SortInDirList(SearchList,^SearchNodeBack^.sen_Node,3);
                                                                                saved:=FALSE
                                                                        end;
                                                                        DontDo:
                                                                        TextNode:=p_StringNode(TextNode^.stn_Node.ln_Succ);
                                                                END;
                                                                GetBackForFiler(win,CG);
                                                                NormalPointer(win);
                                                                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                                                TagsCHANGES[1].ti_Data:=long(SearchList);
                                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                                GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,^TagsCHANGES);
                                                        end else
                                                                if CurrentDirectory="" then begin
                                                                        TagsCHANGES[1]:=TagItem(GTCB_Checked,long(TRUE)); GT_SetGadgetAttrsA(GadgetMark,win,NIL,^TagsCHANGES);
                                                                        EndExit:=-9
                                                                end else begin
                                                                        New(SearchNodeBack);
                                                                        SearchNodeBack^.sen_Path:=CurrentDirectory;
                                                                        if CurrentDirectory[length(CurrentDirectory)]=":" then MyString:=CurrentDirectory else MyString:=FilePart(CurrentDirectory);
                                                                        if UsedXSP.Recursion=TRUE then MyString:="  D "+MyString else MyString:="  d "+MyString;
                                                                        SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                                                        WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                                                                if SearchNodeV^.sen_Path=SearchNodeBack^.sen_Path then begin dispose(SearchNodeBack); goto BACK end;
                                                                                SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)
                                                                        END;
                                                                        SearchNodeBack^.sen_Node.ln_Pri:=1;
                                                                        PrepareNode(SearchNodeBack,MyString);
                                                                        SortInDirList(SearchList,^SearchNodeBack^.sen_Node,3);
                                                                        saved:=FALSE;
                                                                        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                                                        TagsCHANGES[1].ti_Data:=long(SearchList);
                                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                                        GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,^TagsCHANGES);
                                                                end
                                                12:     begin
                                                        s2:=s1; m2:=m1;
                                                        s1:=imsg^.Seconds; m1:=imsg^.Micros;
                                                        if (DoubleClick(s2,m2,s1,m1)=TRUE) and (imsg^.code=preSelected) then begin
                                                                s1:=-1; m1:=-1;
                                                                SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                                                FOR i:=1 to preSelected do
                                                                        SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                                case SearchNodeV^.sen_Node.ln_pri of
                                                                        0:      CurrentDirectory:=copy(SearchNodeV^.sen_Path,1,length(SearchNodeV^.sen_Path)-length(PathPart(SearchNodeV^.sen_Path)))
                                                                        1:      CurrentDirectory:=SearchNodeV^.sen_Path
                                                                end;
                                                                if SearchNodeV^.sen_String[1]=" " then SearchNodeV^.sen_String[1]:="·" else SearchNodeV^.sen_String[1]:=" ";
                                                                GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,NIL);
                                                                EndExit:=35
                                                        end else begin
                                                                SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                                                FOR i:=1 to imsg^.code do
                                                                        SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                                VariableString:="Pfad: "+SearchNodeV^.sen_Path;
                                                                GiveMessageFiler(VariableString,win,DI);
                                                                ShowingMessage:=TRUE;
                                                                if SearchNodeV^.sen_String[1]=" " then SearchNodeV^.sen_String[1]:="·" else SearchNodeV^.sen_String[1]:=" ";
                                                                GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,NIL);
                                                                preSelected:=imsg^.code
                                                        end
                                                end
                                                13:     begin
                                                        SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                                        WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                                                SearchNodeBack:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                                if SearchNodeV^.sen_String[1]="·" then begin
                                                                        Remove(p_Node(^SearchNodeV^.sen_Node));
                                                                        dispose(SearchNodeV);
                                                                        saved:=FALSE
                                                                end;
                                                                SearchNodeV:=SearchNodeBack;
                                                        END;
                                                        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                                        TagsCHANGES[1].ti_Data:=long(SearchList);
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,^TagsCHANGES)
                                                end
                                                14:     begin
                                                        SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                                        WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                                                if (SearchNodeV^.sen_String[1]="·") and (SearchNodeV^.sen_Node.ln_Pri=1) then begin
                                                                        if SearchNodeV^.sen_String[3]="D" then SearchNodeV^.sen_String[3]:="d" else SearchNodeV^.sen_String[3]:="D";
                                                                        saved:=FALSE
                                                                end;
                                                                SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                        END;
                                                        GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,NIL)
                                                end
                                                15:     begin
                                                        SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                                        WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                                                SearchNodeV^.sen_String[1]:="·";
                                                                SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                        END;
                                                        GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,NIL)
                                                end
                                                16:     begin
                                                        SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                                        WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                                                if SearchNodeV^.sen_String[1]="·" then SearchNodeV^.sen_String[1]:=" " else SearchNodeV^.sen_String[1]:="·";
                                                                SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                        END;
                                                        GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,NIL)
                                                end
                                                17:     EndExit:=1
                                                18:     EndExit:=0
                                                else
                                        end
                                end
                                IDCMP_MENUPICK: begin ChosenMenu:=imsg^.code; MenuContinue:=TRUE; SIGNAL:=-1 end
                                else
                        end
                end;
                if SIGNAL=AppBit then begin
                        ApplicationMessage:=p_AppMessage(GetMsg(ApplicationPort));
                        if (ApplicationMessage^.am_Type<>MTYPE_APPWINDOW) or (ApplicationMessage^.am_NumArgs<1) then goto SimplyOut;
                        WaitPointer(win); GetRidOfForFiler(win);
                        if NOT ((ApplicationMessage^.am_MouseX-win^.BorderLeft>=10) and (ApplicationMessage^.am_MouseY-win^.BorderTop>=24) and (ApplicationMessage^.am_MouseX-win^.BorderLeft<=238) and (ApplicationMessage^.am_MouseY-win^.BorderTop<=123))
                                then begin
                                for i:=1 to ApplicationMessage^.am_NumArgs do begin
                                        if ApplicationMessage^.am_ArgList^[i].wa_Lock=0 then begin
                                                GiveError("IconDrop - ["+ApplicationMessage^.am_ArgList^[i].wa_Name+"]","The icon couldn't have been read.",win);
                                                goto OutQuick
                                        end;
                                        dummy:=NameFromLock(ApplicationMessage^.am_ArgList^[i].wa_Lock,VariableString,256);
                                        if dummy=0 then begin GiveError ("IconDrop - ["+ApplicationMessage^.am_ArgList^[i].wa_Name+"]","Couldn't have identified the icon.",win); goto OutQuick end;
                                        if ApplicationMessage^.am_ArgList^[i].wa_Name<>"" then DidIt:=AddPart(VariableString,ApplicationMessage^.am_ArgList^[i].wa_Name,256) else dummy:=long(TRUE);
                                        if Dummy<>0 then begin
                                                SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                                WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                                        if SearchNodeV^.sen_Path=VariableString then goto OutQuick;
                                                        SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)
                                                END;
                                                New(SearchNodeV);
                                                SearchNodeV^.sen_Path:=VariableString;
                                                if VariableString[length(VariableString)]=":" then MyString:=VariableString else MyString:=FilePart(VariableString);
                                                if ApplicationMessage^.am_ArgList^[i].wa_Name="" then begin
                                                        MyString:="  D "+MyString;
                                                        SearchNodeV^.sen_Node.ln_Pri:=1
                                                end else begin
                                                        MyString:="  "+MyString;
                                                        SearchNodeV^.sen_Node.ln_Pri:=0
                                                end;
                                                PrepareNode(SearchNodeV,MyString);
                                                SortInDirList(SearchList,^SearchNodeV^.sen_Node,3)
                                        end else begin
                                                GiveError ("IconDrop - ["+ApplicationMessage^.am_ArgList^[i].wa_Name+"]","The name of the icon's path is too long.",win);
                                        end;
                                        OutQuick:
                                end;
                                GetBackForFiler(win,CG);
                                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                TagsCHANGES[1].ti_Data:=long(SearchList);
                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,^TagsCHANGES);
                        end else begin
                                if ApplicationMessage^.am_ArgList^[1].wa_Lock=0 then begin
                                        GiveError("IconDrop - ["+ApplicationMessage^.am_ArgList^[1].wa_Name+"]","The icon couldn't have been read.",win);
                                        goto SimplyOut
                                end;
                                dummy:=NameFromLock(ApplicationMessage^.am_ArgList^[1].wa_Lock,VariableString,256);
                                if dummy=0 then begin GiveError ("IconDrop - ["+ApplicationMessage^.am_ArgList^[1].wa_Name+"]","Couldn't have identified the icon.",win); goto SimplyOut end;
                                CS:=CurrentDirectory;
                                CurrentDirectory:=VariableString;
                                EndExit:=35;
                                GetBackForFiler(win,CG)
                        end;
                        SimplyOut:
                        NormalPointer(win)
                end
        end;

        if (EndExit=4) and (CurrentDirectory<>"") then begin
                if CurrentDirectory[length(CurrentDirectory)]<>":" then begin
                        repeat
                                CurrentDirectory:=copy(CurrentDirectory,1,length(CurrentDirectory)-length(PathPart(CurrentDirectory)))
                        until CurrentDirectory[length(CurrentDirectory)]=":";
                        EndExit:=35
                end else begin
                        CurrentDirectory:="";
                        CS:="";
                        EndExit:=35
                end
        end;

        if (EndExit=5) and (CurrentDirectory<>"") then begin
                if CurrentDirectory[length(CurrentDirectory)]<>":" then begin
                        CurrentDirectory:=copy(CurrentDirectory,1,length(CurrentDirectory)-length(PathPart(CurrentDirectory)));
                        EndExit:=35
                end else begin
                        CurrentDirectory:="";
                        CS:="";
                        EndExit:=35
                end
        end;

        if (EndExit=8) or (EndExit=-9) then
                if ((GadgetMark^.flags and GFLG_Selected)<>0) or (EndExit=-9) then begin
                        TextNode:=p_StringNode(TextList^.lh_Head);
                        WHILE p_StringNode(TextNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                                if TextNode^.stn_Node.ln_Pri=1 then begin
                                        TextNode^.stn_String[3]:=TextNode^.stn_String[1];
                                        TextNode^.stn_String[2]:=" ";
                                        TextNode^.stn_String[1]:=" ";
                                end else
                                        TextNode^.stn_String:="  "+TextNode^.stn_String;
                                TextNode:=p_StringNode(TextNode^.stn_Node.ln_Succ)
                        END;
                        if EndExit=-9 then EndExit:=9 else GT_SetGadgetAttrsA(GadgetDirList,win,NIL,NIL);
                end else begin
                        TextNode:=p_StringNode(TextList^.lh_Head);
                        WHILE p_StringNode(TextNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                                if TextNode^.stn_Node.ln_Pri=1 then begin
                                        if CurrentDirectory="" then
                                                case TextNode^.stn_String[3] of
                                                        ("D"):  TextNode^.stn_String:="DEV "+copy(TextNode^.stn_String,5,length(TextNode^.stn_String)-4)
                                                        ("V"):  TextNode^.stn_String:="VOL "+copy(TextNode^.stn_String,5,length(TextNode^.stn_String)-4)
                                                        ("A"):  TextNode^.stn_String:="ASN "+copy(TextNode^.stn_String,5,length(TextNode^.stn_String)-4)
                                                end
                                        else
                                                TextNode^.stn_String:="DIR "+copy(TextNode^.stn_String,5,length(TextNode^.stn_String)-4)
                                end else
                                        TextNode^.stn_String:=copy(TextNode^.stn_String,3,length(TextNode^.stn_String)-2);
                                TextNode:=p_StringNode(TextNode^.stn_Node.ln_Succ)
                        END;
                        GT_SetGadgetAttrsA(GadgetDirList,win,NIL,NIL);
                end;

        if EndExit=9 then begin
                TextNode:=p_StringNode(TextList^.lh_Head);
                WHILE p_StringNode(TextNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                        TextNode^.stn_String[1]:="·";
                        TextNode:=p_StringNode(TextNode^.stn_Node.ln_Succ)
                END;
                GT_SetGadgetAttrsA(GadgetDirList,win,NIL,NIL)
        end;

        if EndExit=10 then begin
                TextNode:=p_StringNode(TextList^.lh_Head);
                WHILE p_StringNode(TextNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                        if TextNode^.stn_String[1]=" " then TextNode^.stn_String[1]:="·" else TextNode^.stn_String[1]:=" ";
                        TextNode:=p_StringNode(TextNode^.stn_Node.ln_Succ)
                END;
                GT_SetGadgetAttrsA(GadgetDirList,win,NIL,NIL)
        end;

        OverJump:

        WaitPointer(win);

        if EndExit=35 then begin
                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                TagsCHANGES[1].ti_Data:=long(NIL);
                TagsCHANGES[2].ti_Tag:=TAG_END;
                GT_SetGadgetAttrsA(GadgetDirList,win,NIL,^TagsCHANGES);
                GetRidOfForFiler(win);
                if CurrentDirectory="" then begin
                        TextNode:=p_StringNode(TextList^.lh_Head);
                        WHILE p_StringNode(TextNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                                TextNodeBack:=p_StringNode(TextNode^.stn_Node.ln_Succ);
                                Remove(p_Node(^TextNode^.stn_Node));
                                dispose(TextNode);
                                TextNode:=TextNodeBack;
                        END;
                        forbid;
                        RN:=DB^.dl_Root;
                        Inf:=p_DosInfo(long(RN^.rn_Info)*4);
                        Lst:=p_DevInfo(long(Inf^.di_DevInfo)*4);
                        while ptr(long(Lst)*4)<>NIL do begin
                                if Lst^.dvi_GlobVec=0 then begin
                                        New(TextNode);
                                        if (GadgetMark^.flags and GFLG_Selected)<>0 then
                                                case Lst^.dvi_Type of
                                                        0:      MyString:="  D "+str(Lst^.dvi_Name*4+1)+":"
                                                        1:      MyString:="  A "+str(Lst^.dvi_Name*4+1)+":"
                                                        2:      MyString:="  V "+str(Lst^.dvi_Name*4+1)+":"
                                                end
                                        else
                                                case Lst^.dvi_Type of
                                                        0:      MyString:="DEV "+str(Lst^.dvi_Name*4+1)+":"
                                                        1:      MyString:="ASN "+str(Lst^.dvi_Name*4+1)+":"
                                                        2:      MyString:="VOL "+str(Lst^.dvi_Name*4+1)+":"
                                                end;
                                        TextNode^.stn_Node.ln_Pri:=1;
                                        PrepareNode(TextNode,MyString);
                                        if (GadgetMark^.flags and GFLG_Selected)<>0 then SortInDirList(TextList,^TextNode^.stn_Node,3) else SortInDirList(TextList,^TextNode^.stn_Node,1);
                                end;
                                Lst:=p_DevInfo(long(Lst^.dvi_Next)*4);
                        end;
                        permit;
                        GetBackForFiler(win,CG);
                end else begin
                        MyLock:=Lock(CurrentDirectory,SHARED_LOCK);
                        dummy:=IOErr;
                        if (MyLock<>0) and (dummy=0) then begin
                                LockBack:=CurrentDir(MyLock);
                                TextNode:=p_StringNode(TextList^.lh_Head);
                                WHILE p_StringNode(TextNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                                        TextNodeBack:=p_StringNode(TextNode^.stn_Node.ln_Succ);
                                        Remove(p_Node(^TextNode^.stn_Node));
                                        dispose(TextNode);
                                        TextNode:=TextNodeBack;
                                END;
                                dummy:=MatchFirst(MyPattern,MyAnchor);
                                while dummy=0 do begin
                                        New(TextNode);
                                        if MyAnchor^.ap_Info.fib_DirEntryType>0 then begin
                                                if (GadgetMark^.flags and GFLG_Selected)<>0 then
                                                        MyString:="  D "+MyAnchor^.ap_Info.fib_FileName
                                                else
                                                        MyString:="DIR "+MyAnchor^.ap_Info.fib_FileName;
                                                TextNode^.stn_Node.ln_Pri:=1
                                        end else begin
                                                if (GadgetMark^.flags and GFLG_Selected)<>0 then MyString:="  "+MyAnchor^.ap_Info.fib_FileName else MyString:=MyAnchor^.ap_Info.fib_FileName;
                                                TextNode^.stn_Node.ln_Pri:=0
                                        end;
                                        PrepareNode(TextNode,MyString);
                                        if (GadgetMark^.flags and GFLG_Selected)<>0 then SortInDirList(TextList,^TextNode^.stn_Node,3) else SortInDirList(TextList,^TextNode^.stn_Node,1);
                                        dummy:=MatchNext(MyAnchor);
                                end;
                                MatchEnd(MyAnchor);
                                UnLock(MyLock);
                                GetBackForFiler(win,CG);
                                if CS="" then begin
                                        TagsCHANGES[1].ti_Tag:=GA_Disabled;
                                        TagsCHANGES[1].ti_Data:=long(FALSE);
                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                        GT_SetGadgetAttrsA(GadgetRoot,win,NIL,^TagsCHANGES);
                                        TagsCHANGES[1].ti_Tag:=GA_Disabled;
                                        TagsCHANGES[1].ti_Data:=long(FALSE);
                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                        GT_SetGadgetAttrsA(GadgetParent,win,NIL,^TagsCHANGES);
                                        TagsCHANGES[1].ti_Tag:=GA_Disabled;
                                        TagsCHANGES[1].ti_Data:=long(FALSE);
                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                        GT_SetGadgetAttrsA(GadgetPattern,win,NIL,^TagsCHANGES);
                                        win^.IDCMPFlags:=win^.IDCMPFlags - IDCMP_DISKINSERTED - IDCMP_DISKREMOVED;
                                end
                        end else begin
                                GetBackForFiler(win,CG);
                                CurrentDirectory:=CS;
                                DidIt:=Fault(Dummy,NIL,VariableString,260);
                                VariableString:="Error while raeding directory."+LF+"("+VariableString+")";
                                GiveMessageFiler(VariableString,win,DI);
                                ShowingMessage:=TRUE
                        end
                end;
                TagsCHANGES[1].ti_Tag:=GTST_String; TagsCHANGES[1].ti_Data:=CurrentDirectory;
                TagsCHANGES[2].ti_Tag:=TAG_END;
                SI:=GadgetDir^.SpecialInfo;
                SI^.BufferPos:=length(CurrentDirectory);
                GT_SetGadgetAttrsA(GadgetDir,win,NIL,^TagsCHANGES);
                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                TagsCHANGES[1].ti_Data:=long(TextList);
                TagsCHANGES[2].ti_Tag:=TAG_END;
                GT_SetGadgetAttrsA(GadgetDirList,win,NIL,^TagsCHANGES);
                if CurrentDirectory="" then begin
                        TagsCHANGES[1].ti_Tag:=GA_Disabled;
                        TagsCHANGES[1].ti_Data:=long(TRUE);
                        TagsCHANGES[2].ti_Tag:=TAG_END;
                        GT_SetGadgetAttrsA(GadgetRoot,win,NIL,^TagsCHANGES);
                        TagsCHANGES[1].ti_Tag:=GA_Disabled;
                        TagsCHANGES[1].ti_Data:=long(TRUE);
                        TagsCHANGES[2].ti_Tag:=TAG_END;
                        GT_SetGadgetAttrsA(GadgetParent,win,NIL,^TagsCHANGES);
                        TagsCHANGES[1].ti_Tag:=GA_Disabled;
                        TagsCHANGES[1].ti_Data:=long(TRUE);
                        TagsCHANGES[2].ti_Tag:=TAG_END;
                        GT_SetGadgetAttrsA(GadgetPattern,win,NIL,^TagsCHANGES);
                        win^.IDCMPFlags:=win^.IDCMPFlags or IDCMP_DISKREMOVED or IDCMP_DISKINSERTED;
                end;
        end;

        if (EndExit>2) and (EndExit<50) then begin if ShowingMessage=FALSE then GiveMessageFiler("",win,DI); NormalPointer(win); goto BACK end;

        if (EndExit=50) or (EndExit=51) then begin
                if saved=FALSE then begin
                        case EndExit of
                                50:     SIGNAL:=GiveQuestion(ProjektXSearch+" - New","The old project has been changed. Do you"+LF+"really want to start a new one?",
                                                "New project|Save, then new project|Cancel",win)
                                51:     SIGNAL:=GiveQuestion(ProjektXSearch+" - Open project","The old project has been changed. Do you"+LF+"really want to open another?",
                                                "Open project|Save, then open project|Cancel",win)
                        end;
                        if SIGNAL=2 then
                                if WritePrefs(Projekt,PCA,win,SearchList)=FALSE then begin NormalPointer(win); goto BACK end else saved:=TRUE
                end else SIGNAL:=1;
                if SIGNAL<>0 then begin
                        if EndExit=50 then begin
                                PCA:=PrefsStandard;
                                if UsedXSP.Currency=TRUE then begin
                                        VariableString:=ConvertCurrentDateTime(NIL,FALSE); VariableStr:=VariableString;
                                        VariableString:=AlienizeTimeDate(VariableStr,FALSE);
                                        PCA.Date1:=VariableString; PCA.Date2:=VariableString;
                                        VariableString:=ConvertCurrentDateTime(NIL,TRUE); VariableStr:=VariableString;
                                        VariableString:=AlienizeTimeDate(VariableStr,TRUE);
                                        PCA.Time1:=VariableString; PCA.Time2:=VariableString;
                                end;
                                didit:=NameProjekt(TRUE); SetWindowTitles(win,ProjektXSearch,str(-1));
                                saved:=TRUE;
                                SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
                                WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                        SearchNodeBack:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                        Remove(p_Node(^SearchNodeV^.sen_Node));
                                        dispose(SearchNodeV);
                                        SearchNodeV:=SearchNodeBack;
                                END;
                                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                TagsCHANGES[1].ti_Data:=long(SearchList);
                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,^TagsCHANGES);
                        end else begin
                                GetRidOfForFiler(win);
                                DidIt:=FileProjekt(0,win);
                                GetBackForFiler(win,CG);
                                if DidIt=TRUE then begin
                                        if ProjektDir[length(ProjektDir)]=":" then
                                                DidIt:=ReadPrefs(ProjektDir+ProjektName,PCA,win,FALSE,SearchList,TRUE)
                                        else
                                                DidIt:=ReadPrefs(ProjektDir+"/"+ProjektName,PCA,win,FALSE,SearchList,TRUE);
                                        if DidIt=TRUE then begin
                                                DidIt:=NameProjekt(FALSE);
                                                SetWindowTitles(win,ProjektXSearch,str(-1));
                                                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                                TagsCHANGES[1].ti_Data:=long(SearchList);
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetSearchList,win,NIL,^TagsCHANGES);
                                                saved:=TRUE;
                                        end else RestoreProjektNameDir
                                end;
                        end
                end;
        end;

        if EndExit=52 then
                saved:=WritePrefs(Projekt,PCA,win,SearchList);

        if EndExit=53 then begin
                GetRidOfForFiler(win);
                DidIt:=FileProjekt(1,win);
                GetBackForFiler(win,CG);
                if DidIt=TRUE then begin
                        if ProjektDir[length(ProjektDir)]=":" then
                                DidIt:=WritePrefs(ProjektDir+ProjektName,PCA,win,SearchList)
                        else
                                DidIt:=WritePrefs(ProjektDir+"/"+ProjektName,PCA,win,SearchList);
                        if DidIt=TRUE then begin DidIt:=NameProjekt(FALSE); SetWindowTitles(win,ProjektXSearch,str(-1)); saved:=TRUE end
                end else RestoreProjektNameDir
        end;

        if abs(EndExit)>49 then begin
                NormalPointer(win);
                goto BACK
        end;

        if saved=FALSE then begin
                if EndExit=0 then begin
                        SIGNAL:=GiveQuestion(ProjektXSearch+" - Ende","The old project has been changed."+LF+"Do you really want to quit?",
                                "Quit|Save, then quit|Cancel",win);
                        if SIGNAL=2 then
                                if WritePrefs(Projekt,PCA,win,SearchList)=FALSE then begin NormalPointer(win); goto BACK end else saved:=TRUE;
                        if SIGNAL=0 then begin NormalPointer(win); goto BACK end
                end else
                        saved:=FALSE;
        end;

        IDidTheMarking:=(GadgetMark^.flags and GFLG_Selected)<>0;

        CloseWindow(win);
        FreeMenus(MenuFields);
        FreeGadgets(CG);
        dispose(MyAnchor);
        DidIt:=RemoveAppWindow(ApplicationWindow);
        DeletePort(ApplicationPort);
END;


FUNCTION LaterEntry(Date1,Date2:p_DateStamp):Boolean;
BEGIN
        if Date1^.ds_Days<>Date2^.ds_Days then LaterEntry:=Date1^.ds_Days>Date2^.ds_Days else
                if Date1^.ds_Minute<>Date2^.ds_Minute then LaterEntry:=Date1^.ds_Minute>Date2^.ds_Minute else
                        LaterEntry:=Date1^.ds_Tick>Date2^.ds_Tick
END;

FUNCTION EarlierEntry(Date1,Date2:p_DateStamp):Boolean;
BEGIN
        if Date1^.ds_Days<>Date2^.ds_Days then EarlierEntry:=Date1^.ds_Days<Date2^.ds_Days else
                if Date1^.ds_Minute<>Date2^.ds_Minute then EarlierEntry:=Date1^.ds_Minute<Date2^.ds_Minute else
                        EarlierEntry:=Date1^.ds_Tick<Date2^.ds_Tick
END;

PROCEDURE OptimizePrefs;
VAR     DidIt   :                               long;
        RST     :                               string[11];
        i       :                               integer;
        DT      :                               DateTime;
BEGIN
        with PCA_Optimized do begin
                Bigger:=PCA.Bigger;
                Smaller:=PCA.Smaller;
                DoLength:=Bigger>Smaller;
                Bits:=0; BitsMask:=0;
                for i:=1 to 8 do
                        if PCA.Bits[i]="*" then BitsMask:=BitsMask or (long(1) SHL (8-i)) else begin
                                if i<5 then begin
                                        if PCA.Bits[i]<>"-" then Bits:=Bits or (long(1) SHL (8-i))
                                end else
                                        if PCA.Bits[i]="-" then Bits:=Bits or (long(1) SHL (8-i))
                        end;
                DT.dat_Format:=FORMAT_CDN;
                for i:=1 to 8 do
                        if PCA.Date1[i]="." then RST[i]:="-" else RST[i]:=PCA.Date1[i];
                DT.dat_StrDate:=RST;
                DT.dat_StrTime:=PCA.Time1;
                DidIt:=StrToDate(^DT);
                Date1:=DT.dat_Stamp;
                for i:=1 to 8 do
                        if PCA.Date2[i]="." then RST[i]:="-" else RST[i]:=PCA.Date2[i];
                DT.dat_StrDate:=RST;
                DT.dat_StrTime:=PCA.Time2;
                DidIt:=StrToDate(^DT);
                Date2:=DT.dat_Stamp;
                DoDate:=LaterEntry(^Date1,^Date2);
                DidIt:=ParsePatternNoCase(PCA.Pattern,PreName,769);
                case PCA.BoolComment of
                        1:      DidIt:=ParsePatternNoCase(PCA.Comment,PreComment,769)
                        2:      DidIt:=ParsePattern(PCA.Comment,PreComment,769)
                        else
                end;
                case PCA.BoolFileIn of
                        1:      DidIt:=ParsePatternNoCase(PCA.FileIn,PreIn,769)
                        2:      DidIt:=ParsePattern(PCA.FileIn,PreIn,769)
                        else
                end;
                PreIFF:=PCA.Typ;
                if PreIFF<>"" then begin
                        NumIFF:=1;
                        for i:=1 to length(PreIFF) do
                                if PreIFF[i]="|" then NumIFF:=NumIFF+1
                end;
                Switches:=0;
                if (PCA.Bool and 1)<>0 then Switches:=1;
                if (PCA.Bool and (long(1) SHL 1))<>0 then Switches:=Switches or (long(1) SHL 1);
                if (PCA.Bool and (long(1) SHL 2))<>0 then Switches:=Switches or (long(1) SHL 2);
                if (PCA.Bool and (long(1) SHL 3))<>0 then Switches:=Switches or (long(1) SHL 3);
                if PCA.BoolComment<>0 then Switches:=Switches or (long(1) SHL 4);
                if (PCA.Bool and (long(1) SHL 4))<>0 then Switches:=Switches or (long(1) SHL 5);
                if PCA.BoolFileIn<>0 then Switches:=Switches or (long(1) SHL 6);
                CaseComment:=boolean(PCA.BoolComment-1);
                CaseFileIn:=boolean(PCA.BoolFileIn-1);
        end;
END;

FUNCTION CheckEntry(FIB:p_FileInfoBlock,Pfad:DirString,win:p_window,
        add:boolean):Boolean;
LABEL   UndTschuess,RausAusDerSchleife,RausAusDerWhile;
VAR     i       :                               integer;
        Dummy   :                               long;
        forIFFIn:                               Text;
        response:                               string[18];
BEGIN
        CheckEntry:=FALSE;
        with PCA_Optimized do begin
                if (Switches and 1)<>0 then
                        if MatchPatternNoCase(PreName,FIB^.fib_FileName)=FALSE then goto UndTschuess;
                if (Switches and (long(1) SHL 1))<>0 then begin
                        if FIB^.fib_DirEntryType>0 then begin
                                if UsedXSP.DirLength=TRUE then goto UndTschuess
                        end else begin
                                if DoLength=FALSE then begin
                                        if (FIB^.fib_Size<Bigger) or (FIB^.fib_size>Smaller) then goto UndTschuess
                                end else
                                        if (FIB^.fib_Size<Bigger) and (FIB^.fib_size>Smaller) then goto UndTschuess
                        end
                end;
                if (Switches and (long(1) SHL 2))<>0 then
                        for i:=0 to 7 do
                                if (BitsMask and (long(1) SHL i))=0 then
                                        if (Bits and (long(1) SHL i))<>(FIB^.fib_Protection and (long(1) SHL i)) then goto UndTschuess;
                if (Switches and (long(1) SHL 3))<>0 then begin
                        FIB^.fib_Date.ds_Tick:=(FIB^.fib_Date.ds_Tick div 50)*50;
                        if DoDate=FALSE then begin
                                if (LaterEntry(^Date1,^FIB^.fib_Date)=TRUE) or (EarlierEntry(^Date2,^FIB^.fib_Date)=TRUE) then goto UndTschuess
                        end else
                                if (LaterEntry(^Date1,^FIB^.fib_Date)=TRUE) and (EarlierEntry(^Date2,^FIB^.fib_Date)=TRUE) then goto UndTschuess
                end;
                if (Switches and (long(1) SHL 4))<>0 then begin
                        if CaseComment=FALSE then begin
                                if MatchPatternNoCase(PreComment,FIB^.fib_Comment)=FALSE then goto UndTschuess
                        end else
                                if MatchPattern(PreComment,FIB^.fib_Comment)=FALSE then goto UndTschuess
                end;
                if ((Switches and (long(1) SHL 5))<>0) or ((Switches and (long(1) SHL 6))<>0) then begin
                        if FIB^.fib_DirEntryType>0 then begin
                                if ((Switches and (long(1) SHL 5))<>0) and (UsedXSP.DirIFF=TRUE) then goto UndTschuess;
                                if ((Switches and (long(1) SHL 6))<>0) and (UsedXSP.DirFile=TRUE) then goto UndTschuess
                        end else begin
                                if add=TRUE then response:="OK" else response:="Suchort verlassen";
                                VariableString:=Pfad;
                                if add=TRUE then Dummy:=long(AddPart(VariableString,FIB^.fib_FileName,364));
                                Reset(forIFFIn,VariableString);
                                Dummy:=IOResult;
                                if Dummy<>0 then begin
                                        Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                                        if Switches and (long(1) SHL 5)<>0 then
                                                Dummy:=GiveQuestion("XSearch 1.0 ["+ProjektName+"] - IFF control",FIB^.fib_FileName+LF+"couldn't have been read."+LF+"("+VariableString+")",Response,win)
                                        else
                                                Dummy:=GiveQuestion("XSearch 1.0 ["+ProjektName+"] - file-internal search",FIB^.fib_FileName+LF+"couldn't have been read."+LF+"("+VariableString+")",Response,win);
                                        goto UndTschuess
                                end;
                                if Switches and (long(1) SHL 5)<>0 then begin
                                        for i:=1 to 4 do read(forIFFIn,VariableString[i]);
                                        VariableString[5]:=chr(0);
                                        if VariableString="FORM" then begin
                                                for i:=1 to 4 do read(forIFFIn,VariableString[i]);
                                                for i:=1 to 4 do read(forIFFIn,VariableString[i]);
                                                Dummy:=IOResult;
                                                if Dummy<>0 then begin
                                                        Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                                                        Dummy:=GiveQuestion("XSearch 1.0 ["+ProjektName+"] - IFF control",FIB^.fib_FileName+LF+"couldn't have been read."+LF+"("+VariableString+")",Response,win);
                                                        close(forIFFIn);
                                                        goto UndTschuess
                                                end;
                                                for i:=1 to NumIFF do
                                                        if copy(PreIFF,(i-1)*5+1,4)=VariableString then goto RausAusDerSchleife;
                                                close(forIFFIn);
                                                goto UndTschuess;
                                                RausAusDerSchleife:
                                        end else begin
                                                if UsedXSP.DirOther=TRUE then goto UndTschuess
                                        end
                                end;
                                if Switches and (long(1) SHL 6)<>0 then begin
                                        Buffer(forIFFIn,10000);
                                        while EOF(forIFFIn)=FALSE do begin
                                                readln(forIFFIn,VariableString);
                                                if Dummy<>0 then begin
                                                        Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                                                        Dummy:=GiveQuestion("XSearch 1.0 ["+ProjektName+"] - file-internal search",FIB^.fib_FileName+LF+"couldn't have been read."+LF+"("+VariableString+")",Response,win);
                                                        close(forIFFIn);
                                                        goto UndTschuess
                                                end;
                                                if CaseFileIn=FALSE then begin
                                                        if MatchPatternNoCase(PreIn,VariableString)=TRUE then goto RausAusDerWhile
                                                end else
                                                        if MatchPattern(PreIn,VariableString)=TRUE then goto RausAusDerWhile;
                                        end;
                                        close(forIFFIn);
                                        goto UndTschuess;
                                        RausAusDerWhile:
                                end;
                                close(forIFFIn)
                        end
                end
        end;
        CheckEntry:=TRUE;
        UndTschuess:
END;

PROCEDURE GetRidOfForLookUp(VAR win:p_window);
BEGIN
        win^.flags:=win^.flags or WFLG_RMBTRAP;
        win^.IDCMPFlags:=0;
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=NIL
END;

PROCEDURE GetBackForLookUp(VAR win:p_window,GadgetCycle:p_gadget);
BEGIN
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=GadgetCycle;
        win^.IDCMPFlags:=IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or IDCMP_GADGETDOWN or IDCMP_VANILLAKEY or IDCMP_NEWSIZE or IDCMP_MOUSEMOVE or IDCMP_MOUSEBUTTONS or IDCMP_INTUITICKS or IDCMP_MENUPICK;
        win^.flags:=win^.flags xor WFLG_RMBTRAP;
        RefreshGadgets(win^.FirstGadget,win,NIL);
        GT_RefreshWindow(win,NIL);
        DrawBevelLine(win,346,121,144,FALSE,FALSE,DI);
END;

PROCEDURE LookUp;
LABEL   BACK,Overjump,Stick,Stick2,FoundAnError,CureAnError,AskWhat,OutOfClipboard,
        Asking1,Asking2,Asking3,LookWhatExitSearch,BeforeLookWhatExitSearch,CopyJump;
VAR     LookedList:                             p_List;
        PathNode,PathNodeBack:                  p_StringNode;
        PathList:                               p_List;
        AnchorList:                             p_List;
        AnchorNodeV:                            p_AnchorNode;
        Through :                               p_SearchNode;
        win     :                               p_window;
        winBit  :                               long;
        ZOM     :                               array[1..4] of word;
        TagsCHANGES:                            array[1..13] of TagItem;
        CG      :                               p_gadget;
        CurrentGadget:                          p_gadget;
        NewMenuFields:                          array[1..8] of NewMenu;
        MenuFields:                             p_Menu;
        NItem   :                               p_menuitem;
        NewGadgetFields:                        newgadget;
        ContentsWhere:                          array[1..3] of str;
        ContentsDoing:                          array[1..3] of str;
        GadgetLookedList:                       p_gadget;
        GadgetPathList:                         p_gadget;
        GadgetPlus:                             p_gadget;
        GadgetReverse:                          p_gadget;
        GadgetWhere:                            p_gadget;
        GadgetCopy:                             p_gadget;
        GadgetNew:                              p_gadget;
        GadgetStop:                             p_gadget;
        GadgetDoing:                            p_gadget;
        GadgetBack:                             p_gadget;
        GadgetEnd:                              p_gadget;
        BoolWhere:                              long;
        imsg    :                               p_intuimessage;
        SIGNAL  :                               long;
        MyString:                               DirString;
        CurrentDirectory:                       DirString;
        i       :                               integer;
        recursive:                              boolean;
        layer   :                               integer;
        MyAnchor:                               p_AnchorPath;
        CurrentLock:                            BPTR;
        OldLock:                                BPTR;
        dummy   :                               long;
        ExitSearching:                          integer;
        Pause   :                               boolean;
        WhereIStopped:                          integer;
        ChosenMenu:                             long;
        MenuContinue:                           boolean;
        IFF     :                               p_IFFHandle;
        DidIt   :                               long;
        DejaDemande:                            boolean;
        ResultFile:                             Text;
        SearchFileInfo:                         p_FileInfoBlock;
BEGIN
        GadgetLookedList:=CreateContext(^CG);

        New(PathList);
        InitList(PathList);
        New(LookedList);
        InitList(LookedList);
        new(AnchorList);
        InitList(AnchorList);

        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
        TagsCHANGES[1].ti_Data:=long(LookedList);
        TagsCHANGES[2]:=TagItem(GTLV_ScrollWidth,16);
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,5,228,100,NIL,^tattr,1,0,VI,NIL);
        GadgetLookedList:=CreateGadgetA(LISTVIEW_KIND,CG,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
        TagsCHANGES[1].ti_Data:=long(PathList);
        TagsCHANGES[2]:=TagItem(GTLV_ScrollWidth,16);
        TagsCHANGES[3]:=TagItem(GTLV_ReadOnly,long(TRUE));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(264,21,228,86,"Path",^tattr,2,
                PLACETEXT_ABOVE,VI,NIL);
        GadgetPathList:=CreateGadgetA(LISTVIEW_KIND,GadgetLookedList,^NewGadgetFields,
                ^TagsCHANGES);

        NewGadgetFields:=NewGadget(238,83,20,11,"·",^tattr,3,PLACETEXT_IN,
                VI,NIL);
        GadgetPlus:=CreateGadgetA(BUTTON_KIND,GadgetPathList,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(238,94,20,11,Reverse,^tattr,4,PLACETEXT_IN,
                VI,NIL);
        GadgetReverse:=CreateGadgetA(BUTTON_KIND,GadgetPlus,^NewGadgetFields,NIL);

        ContentsWhere[1]:="Clipboard";
        ContentsWhere[2]:="File";
        ContentsWhere[3]:=NIL;
        TagsCHANGES[1].ti_Tag:=GTCY_Labels;
        TagsCHANGES[1].ti_Data:=ContentsWhere;
        TagsCHANGES[2]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(118,107,120,12,"_in",^tattr,5,PLACETEXT_LEFT,
                VI,NIL);
        GadgetWhere:=CreateGadgetA(CYCLE_KIND,GadgetReverse,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(118,121,120,12,"_copy",^tattr,6,PLACETEXT_IN,
                VI,NIL);
        GadgetCopy:=CreateGadgetA(BUTTON_KIND,GadgetWhere,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(294,107,50,12,"_New",^tattr,7,PLACETEXT_IN,
                VI,NIL);
        GadgetNew:=CreateGadgetA(BUTTON_KIND,GadgetCopy,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GA_Disabled,long(TRUE));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(348,107,60,12,"_Stop",^tattr,8,PLACETEXT_IN,
                VI,NIL);
        GadgetStop:=CreateGadgetA(BUTTON_KIND,GadgetNew,^NewGadgetFields,
                ^TagsCHANGES);

        NewGadgetFields:=NewGadget(466,107,0,0,"Pause",^tattr,9,PLACETEXT_LEFT,
                VI,NIL);
        GadgetDoing:=CreateGadgetA(CHECKBOX_KIND,GadgetStop,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(366,125,60,12,"Back",^tattr,10,PLACETEXT_IN,
                VI,NIL);
        GadgetBack:=CreateGadgetA(BUTTON_KIND,GadgetDoing,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(432,125,60,12,"Quit",^tattr,11,PLACETEXT_IN,
                VI,NIL);
        GadgetEnd:=CreateGadgetA(BUTTON_KIND,GadgetBack,^NewGadgetFields,NIL);

        NewMenuFields[1]:=NewMenu(NM_TITLE,0,"Project",NIL,0,0,NIL);
        NewMenuFields[2]:=NewMenu(NM_ITEM,0,"Save","S",0,0,NIL);
        NewMenuFields[3]:=NewMenu(NM_ITEM,0,"Save as...","A",0,0,NIL);
        NewMenuFields[4]:=NewMenu(NM_ITEM,0,str(NM_BARLABEL),NIL,0,0,NIL);
        NewMenuFields[5]:=NewMenu(NM_ITEM,0,"Preferences...",NIL,0,0,NIL);
        NewMenuFields[6]:=NewMenu(NM_ITEM,0,"About...",NIL,0,0,NIL);
        NewMenuFields[7]:=NewMenu(NM_ITEM,0,"Quit","Q",0,0,NIL);
        NewMenuFields[8].nm_Type:=NM_END;
        MenuFields:=CreateMenusA(^NewMenuFields,NIL);
        TagsCHANGES[1].ti_Tag:=GTMN_TextAttr;
        TagsCHANGES[1].ti_Data:=^tattr;
        TagsCHANGES[2].ti_Tag:=TAG_END;
        dummy:=long(LayoutMenusA(MenuFields,VI,^TagsCHANGES));

        ZOM[1]:=20;
        ZOM[2]:=10;
        ZOM[3]:=350;
        ZOM[4]:=scr^.font^.ta_Ysize+6;
        TagsCHANGES[1]:=TagItem(WA_Top,10);
        TagsCHANGES[2]:=TagItem(WA_Left,20);
        TagsCHANGES[3]:=TagItem(WA_InnerHeight,143);
        TagsCHANGES[4]:=TagItem(WA_InnerWidth,504);
        TagsCHANGES[5].ti_Tag:=WA_Title;
        TagsCHANGES[5].ti_Data:=ProjektXSearch;
        TagsCHANGES[6]:=TagItem(WA_Flags,WFLG_CLOSEGADGET or WFLG_GIMMEZEROZERO or
                WFLG_ACTIVATE or WFLG_DRAGBAR or WFLG_SMART_REFRESH or
                WFLG_DEPTHGADGET);
        TagsCHANGES[7]:=TagItem(WA_IDCMP,IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or
                IDCMP_GADGETDOWN or IDCMP_VANILLAKEY or IDCMP_NEWSIZE or
                IDCMP_MOUSEMOVE or IDCMP_MOUSEBUTTONS or IDCMP_INTUITICKS or
                IDCMP_MENUPICK);
        TagsCHANGES[8]:=TagItem(WA_CustomScreen,long(scr));
        TagsCHANGES[9].ti_Tag:=WA_Gadgets;
        TagsCHANGES[9].ti_Data:=CG^;
        TagsCHANGES[10]:=TagItem(WA_MouseQueue,0);
        TagsCHANGES[11]:=TagItem(WA_RptQueue,0);
        TagsCHANGES[12].ti_Tag:=WA_Zoom;
        TagsCHANGES[12].ti_Data:=ZOM;
        TagsCHANGES[13].ti_Tag:=TAG_END;
        win:=OpenWindowTagList(NIL,^TagsCHANGES);
        winBit:=long(1) shl win^.userport^.mp_sigbit;
        SIGNAL:=SetFont(win^.RPort,tfont);

        dummy:=long(SetMenuStrip(win,MenuFields));
        DrawBevelLine(win,346,121,144,FALSE,FALSE,DI);
        GT_RefreshWindow(win,NIL);
        RefreshGadgets(win^.firstgadget,win,NIL);

        DejaDemande:=FALSE;
        MenuContinue:=FALSE;
        Pause:=FALSE;
        BoolWhere:=0;
        WhereIStopped:=0;
        EndExit:=35;
        goto Overjump;

        BACK:
        EndExit:=-1;

        while (EndExit=-1) or ((EndExit=35) and (WhereIStopped<>0)) do begin
                if (MenuContinue=FALSE) and (WhereIStopped<>0) then begin
                        EndExit:=35;
                        case WhereIStopped of
                                1:      begin WhereIStopped:=0; goto Asking1 end
                                2:      begin WhereIStopped:=0; goto Asking2 end
                                3:      begin WhereIStopped:=0; goto Asking3 end
                                else
                        end
                end;
                if (MenuContinue=FALSE) and (WhereIStopped=0) then begin
                        imsg:=Wait_Port(win^.userport);
                        imsg:=GT_GetIMsg(win^.userport);
                        GT_ReplyIMsg(imsg);
                        AskWhat:
                        case imsg^.class of
                                IDCMP_CLOSEWINDOW:
                                        if WhereIStopped<>0 then begin if saved=FALSE then EndExit:=0 else ExitSearching:=4 end else EndExit:=0
                                IDCMP_NEWSIZE: begin
                                        DrawBevelLine(win,346,121,144,FALSE,FALSE,DI);
                                        GT_RefreshWindow(win,NIL);
                                end
                                IDCMP_VANILLAKEY: begin
                                        if imsg^.code>96 then imsg^.code:=imsg^.code-32;
                                        case imsg^.code of
                                                78:     if WhereIStopped<>0 then ExitSearching:=3 else EndExit:=35
                                                83:     if WhereIStopped<>0 then ExitSearching:=2
                                                73:     begin
                                                        if BoolWhere=0 then BoolWhere:=1 else BoolWhere:=0;
                                                        TagsCHANGES[1]:=TagItem(GTCY_Active,BoolWhere);
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetWhere,win,NIL,^TagsCHANGES)
                                                end
                                                32:     begin
                                                        TagsCHANGES[1].ti_Tag:=GTCB_Checked; TagsCHANGES[1].ti_Data:=long((GadgetDoing^.flags and GFLG_Selected)=0);
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetDoing,win,NIL,^TagsCHANGES);
                                                        Pause:=boolean(TagsCHANGES[1].ti_Data)
                                                end;
                                                67:     goto CopyJump
                                                13:     if WhereIStopped<>0 then ExitSearching:=5 else EndExit:=1
                                                27:     if WhereIStopped<>0 then begin if saved=FALSE then EndExit:=0 else ExitSearching:=4 end else EndExit:=0
                                                else
                                        end
                                end
                                IDCMP_GADGETUP: begin
                                        CurrentGadget:=imsg^.iaddress;
                                        case CurrentGadget^.gadgetid of
                                                1:      begin
                                                        SearchNodeV:=p_SearchNode(LookedList^.lh_Head);
                                                        FOR i:=1 to imsg^.code do
                                                                SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                        if SearchNodeV^.sen_String[1]=" " then SearchNodeV^.sen_String[1]:="·" else SearchNodeV^.sen_String[1]:=" ";
                                                        GT_SetGadgetAttrsA(GadgetLookedList,win,NIL,NIL);
                                                        if WhereIStopped=0 then begin
                                                                PathNode:=p_StringNode(PathList^.lh_Head);
                                                                WHILE p_StringNode(PathNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                                                                        PathNodeBack:=p_StringNode(PathNode^.stn_Node.ln_Succ);
                                                                        Remove(p_Node(^PathNode^.stn_Node));
                                                                        dispose(PathNode);
                                                                        PathNode:=PathNodeBack;
                                                                END;
                                                                VariableString:=SearchNodeV^.sen_Path;
                                                                while VariableString[length(VariableString)]<>":" do begin
                                                                        New(PathNode);
                                                                        MyString:=FilePart(VariableString);
                                                                        PathNode^.stn_Node.ln_pri:=0;
                                                                        PrepareNode(PathNode,MyString);
                                                                        AddHead(PathList,p_Node(PathNode));
                                                                        VariableString:=copy(VariableString,1,length(VariableString)-length(PathPart(VariableString)));
                                                                end;
                                                                New(PathNode);
                                                                MyString:=VariableString;
                                                                PathNode^.stn_Node.ln_pri:=0;
                                                                PrepareNode(PathNode,MyString);
                                                                AddHead(PathList,p_Node(PathNode));
                                                                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                                                TagsCHANGES[1].ti_Data:=long(PathList);
                                                                GT_SetGadgetAttrsA(GadgetPathList,win,NIL,^TagsCHANGES)
                                                        end
                                                end
                                                3:      begin
                                                        SearchNodeV:=p_SearchNode(LookedList^.lh_Head);
                                                        WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                                                SearchNodeV^.sen_String[1]:="·";
                                                                SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                        END;
                                                        GT_SetGadgetAttrsA(GadgetLookedList,win,NIL,NIL)
                                                end
                                                4:      begin
                                                        SearchNodeV:=p_SearchNode(LookedList^.lh_Head);
                                                        WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                                                                if SearchNodeV^.sen_String[1]="·" then SearchNodeV^.sen_String[1]:=" " else SearchNodeV^.sen_String[1]:="·";
                                                                SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                        END;
                                                        GT_SetGadgetAttrsA(GadgetLookedList,win,NIL,NIL)
                                                end
                                                5:      BoolWhere:=imsg^.code
                                                6:      begin
                                                        CopyJump:
                                                        if BoolWhere=0 then begin
                                                                IFF:=AllocIFF;
                                                                IFF^.iff_Stream:=long(OpenClipboard(PRIMARY_CLIP));
                                                                if IFF^.IFF_Stream<>long(NIL) then begin
                                                                        InitIFFasClip(IFF);
                                                                        if OpenIFF(IFF,IFFF_WRITE)=0 then begin
                                                                                DidIt:=PushChunk(IFF,ID_FTXT,ID_FORM,IFFSIZE_UNKNOWN);
                                                                                DidIt:=PushChunk(IFF,0,ID_CHRS,IFFSIZE_UNKNOWN);
                                                                                SearchNodeV:=p_SearchNode(LookedList^.lh_Head);
                                                                                while p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL do begin
                                                                                        if SearchNodeV^.sen_String[1]="·" then begin
                                                                                                VariableString:=SearchNodeV^.sen_Path+LF;
                                                                                                VariableStr:=VariableString;
                                                                                                if (WriteChunkBytes(IFF,ptr(VariableStr),length(VariableStr)))<>length(VariableStr) then begin
                                                                                                        GiveError("XSearch 1.0 - Clipboard","Error while copying.",win);
                                                                                                        goto OutOfClipboard
                                                                                                end
                                                                                        end;
                                                                                        SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                                                end;
                                                                                OutOfClipboard:
                                                                                DidIt:=PopChunk(IFF);
                                                                                DidIt:=PopChunk(IFF);
                                                                                CloseIFF(IFF)
                                                                        end else
                                                                                GiveError("XSearch 1.0 - Clipboard","Data exchange with Clipboard not possible.",win);
                                                                        CloseClipboard(p_ClipboardHandle(IFF^.iff_Stream))
                                                                end else
                                                                        GiveError("XSearch 1.0 - Clipboard","I'm not able to open the Clipboard.",win);
                                                                FreeIFF(IFF)
                                                        end else begin
                                                                if FileProjekt(4,win)=FALSE then goto BACK;
                                                                if ProjektDir[length(ProjektDir)]=":" then VariableString:=ProjektDir+ProjektName else VariableString:=ProjektDir+"/"+ProjektName;
                                                                VariableStr:=VariableString;
                                                                ReWrite(ResultFile,VariableStr);
                                                                Dummy:=IOResult;
                                                                if Dummy<>0 then begin
                                                                        Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                                                                        GiveError("XSearch 1.0 ["+ProjektName+"] - Save results","Error while saving."+LF+"("+VariableString+")",win);
                                                                        goto BACK
                                                                end;
                                                                Buffer(ResultFile,10000);
                                                                WaitPointer(win);
                                                                GetRidOfForLookUp(win);
                                                                SearchNodeV:=p_SearchNode(LookedList^.lh_Head);
                                                                while p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL do begin
                                                                        if SearchNodeV^.sen_String[1]="·" then begin
                                                                                writeln (ResultFile,SearchNodeV^.sen_Path);
                                                                                Dummy:=IOResult;
                                                                                if Dummy<>0 then begin
                                                                                        Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                                                                                        GiveError("XSearch 1.0 ["+ProjektName+"] - Save results","Error while saving."+LF+"("+VariableString+")",win);
                                                                                        close(ResultFile);
                                                                                        GetBackForLookUp(win,CG);
                                                                                        NormalPointer(win);
                                                                                        RestoreProjektNameDir;
                                                                                        goto BACK
                                                                                end;
                                                                        end;
                                                                        SearchNodeV:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                                                                end;
                                                                GetBackForLookUp(win,CG);
                                                                NormalPointer(win);
                                                                RestoreProjektNameDir;
                                                                close(ResultFile)
                                                        end
                                                end
                                                7:      if WhereIStopped<>0 then ExitSearching:=3 else EndExit:=35
                                                8:      ExitSearching:=2
                                                9:      Pause:=(GadgetDoing^.flags and GFLG_Selected)<>0
                                                10:     if WhereIStopped<>0 then ExitSearching:=5 else EndExit:=1
                                                11:     if WhereIStopped<>0 then begin if saved=FALSE then EndExit:=0 else ExitSearching:=4 end else EndExit:=0
                                                else
                                        end
                                end
                                IDCMP_MENUPICK: begin
                                        ChosenMenu:=imsg^.code;
                                        MenuContinue:=TRUE
                                end
                                else
                        end;
                end else begin
                        case ChosenMenu and $1f of
                                0:      case (ChosenMenu and $7e0) div 32 of
                                                0:      EndExit:=52
                                                1:      EndExit:=53
                                                3:      begin
                                                        WaitPointer(win);
                                                        GetRidOfForLookUp(win);
                                                        PreferencesXSearch;
                                                        GetBackForLookUp(win,CG);
                                                        NormalPointer(win);
                                                end
                                                4:      begin
                                                        WaitPointer(win);
                                                        GetRidOfForLookUp(win);
                                                        AboutXSearch;
                                                        GetBackForLookUp(win,CG);
                                                        NormalPointer(win);
                                                end
                                                5:      if WhereIStopped<>0 then begin if saved=FALSE then EndExit:=0 else ExitSearching:=4 end else EndExit:=0
                                                else
                                        end
                                else
                        end;
                        NItem:=ItemAddress(MenuFields,ChosenMenu);
                        ChosenMenu:=NItem^.nextselect;
                        if (ChosenMenu=MENUNULL) or (ChosenMenu=$F8) then MenuContinue:=FALSE
                end;
        end;

        OverJump:

        if EndExit=35 then begin
                SearchNodeV:=p_SearchNode(LookedList^.lh_Head);
                WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                        SearchNodeBack:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                        Remove(p_Node(^SearchNodeV^.sen_Node));
                        dispose(SearchNodeV);
                        SearchNodeV:=SearchNodeBack;
                END;
                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                TagsCHANGES[1].ti_Data:=long(LookedList);
                TagsCHANGES[2].ti_Tag:=TAG_END;
                GT_SetGadgetAttrsA(GadgetLookedList,win,NIL,^TagsCHANGES);
                TagsCHANGES[1]:=TagItem(GA_Disabled,long(FALSE));
                TagsCHANGES[2].ti_Tag:=TAG_END;
                GT_SetGadgetAttrsA(GadgetStop,win,NIL,^TagsCHANGES);
                Through:=p_SearchNode(SearchList^.lh_Head);
                while p_SearchNode(Through^.sen_Node.ln_Succ)<>NIL do BEGIN
                        ExitSearching:=0;
                        Asking1:
                        imsg:=GT_GetIMsg(win^.userport);
                        GT_ReplyIMsg(imsg);
                        if (imsg<>NIL) and (imsg^.class<>IDCMP_INTUITICKS) then begin WhereIStopped:=1; goto AskWhat end;
                        if ExitSearching>0 then goto LookWhatExitSearch;
                        if Pause=TRUE then begin imsg:=Wait_Port(win^.UserPort); goto Asking1 end;
                        New(PathNode);
                        if Through^.sen_Path[length(Through^.sen_Path)]=":" then MyString:=Through^.sen_Path else MyString:=FilePart(Through^.sen_Path);
                        PathNode^.stn_Node.ln_pri:=0;
                        PrepareNode(PathNode,MyString);
                        AddHead(PathList,p_Node(PathNode));
                        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                        TagsCHANGES[1].ti_Data:=long(PathList);
                        TagsCHANGES[2].ti_Tag:=TAG_END;
                        GT_SetGadgetAttrsA(GadgetPathList,win,NIL,^TagsCHANGES);
                        if Through^.sen_Node.ln_pri=0 then begin
                                ExitSearching:=0;
                                CurrentLock:=Lock(Through^.sen_Path,SHARED_LOCK);
                                dummy:=IOErr;
                                if dummy<>0 then begin
                                        if Through^.sen_Path[length(Through^.sen_Path)]=":" then MyString:=Through^.sen_Path else MyString:=FilePart(Through^.sen_Path);
                                        Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                                        dummy:=GiveQuestion("XSearch 1.0 - Searching process","Error while reading "+MyString+" -"+LF+VariableString,"Leave searching place",win);
                                        ExitSearching:=1;
                                        goto BeforeLookWhatExitSearch
                                end;
                                new(SearchFileInfo);
                                Dummy:=Examine(CurrentLock,SearchFileInfo);
                                if dummy=0 then begin
                                        if Through^.sen_Path[length(Through^.sen_Path)]=":" then MyString:=Through^.sen_Path else MyString:=FilePart(Through^.sen_Path);
                                        dummy:=GiveQuestion("XSearch 1.0 - Searching process","Error while reading "+LF+MyString+".","Leave searching place",win);
                                        dispose(SearchFileInfo);
                                        Unlock(CurrentLock);
                                        ExitSearching:=1;
                                        goto BeforeLookWhatExitSearch
                                end;
                                if (CheckEntry(SearchFileInfo,Through^.sen_Path,win,FALSE)=TRUE) and (ExitSearching=0) then begin
                                        New(SearchNodeBack);
                                        SearchNodeBack^.sen_Path:=Through^.sen_Path;
                                        SearchNodeBack^.sen_Node.ln_Pri:=0;
                                        MyString:=Through^.sen_String;
                                        PrepareNode(SearchNodeBack,MyString);
                                        SortInDirList(LookedList,^SearchNodeBack^.sen_Node,3);
                                        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                        TagsCHANGES[1].ti_Data:=long(LookedList);
                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                        GT_SetGadgetAttrsA(GadgetLookedList,win,NIL,^TagsCHANGES);
                                end;
                                dispose(SearchFileInfo);
                                UnLock(CurrentLock)
                        end else begin
                                recursive:=Through^.sen_String[3]="D";
                                layer:=0;
                                Stick:
                                layer:=layer+1;
                                CurrentLock:=Lock(Through^.sen_Path,SHARED_LOCK);
                                dummy:=IOErr;
                                if dummy=0 then begin
                                        new(MyAnchor);
                                        OldLock:=CurrentDir(CurrentLock);
                                        dummy:=MatchFirst("#?",MyAnchor);
                                        if dummy<>0 then goto FoundAnError;
                                        repeat
                                                Asking2:
                                                imsg:=GT_GetIMsg(win^.userport);
                                                GT_ReplyIMsg(imsg);
                                                if (imsg<>NIL) and (imsg^.class<>IDCMP_INTUITICKS) then begin WhereIStopped:=2; goto AskWhat end;
                                                if ExitSearching>0 then goto CureAnError;
                                                if Pause=TRUE then begin imsg:=Wait_Port(win^.UserPort); goto Asking2 end;
                                                if CheckEntry(^MyAnchor^.ap_Info,Through^.sen_Path,win,TRUE)=TRUE then begin
                                                        New(SearchNodeBack);
                                                        SearchNodeBack^.sen_Path:=Through^.sen_Path;
                                                        dummy:=long(AddPart(SearchNodeBack^.sen_Path,MyAnchor^.ap_Info.fib_FileName,256));
                                                        if Dummy=0 then begin
                                                                dispose (SearchNodeBack);
                                                                dummy:=GiveQuestion("XSearch 1.0 - Searching process","Path of"+LF+MyAnchor^.ap_Info.fib_FileName+LF+"is too long.","Continue|Leave dir|Leave searching place",win);
                                                                if dummy=0 then begin ExitSearching:=1; goto CureAnError end;
                                                                if dummy=1 then goto Stick2;
                                                                if dummy=2 then goto CureAnError
                                                        end;
                                                        if MyAnchor^.ap_Info.fib_DirEntryType>0 then begin
                                                                SearchNodeBack^.sen_Node.ln_Pri:=1;
                                                                MyString:="  D "+MyAnchor^.ap_Info.fib_FileName
                                                        end else begin
                                                                SearchNodeBack^.sen_Node.ln_Pri:=0;
                                                                MyString:="  "+MyAnchor^.ap_Info.fib_FileName
                                                        end;
                                                        PrepareNode(SearchNodeBack,MyString);
                                                        SortInDirList(LookedList,^SearchNodeBack^.sen_Node,3);
                                                        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                                        TagsCHANGES[1].ti_Data:=long(LookedList);
                                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                                        GT_SetGadgetAttrsA(GadgetLookedList,win,NIL,^TagsCHANGES);
                                                end;
                                                if (MyAnchor^.ap_Info.fib_DirEntryType>0) and (recursive=TRUE) then begin
                                                        dummy:=long(AddPart(Through^.sen_Path,MyAnchor^.ap_Info.fib_FileName,256));
                                                        if Dummy=0 then begin
                                                                dummy:=GiveQuestion("XSearch 1.0 - Searching process","Path of"+LF+MyAnchor^.ap_Info.fib_FileName+LF+"is too long.","Continue|Leave dir|Leave searching place",win);
                                                                if dummy=0 then begin ExitSearching:=1; goto CureAnError end;
                                                                if dummy=1 then goto Stick2;
                                                                if dummy=2 then goto CureAnError
                                                        end;
                                                        New(AnchorNodeV);
                                                        AnchorNodeV^.ano_Node.ln_Type:=NT_UNKNOWN;
                                                        AnchorNodeV^.ano_Node.ln_Pri:=0;
                                                        AnchorNodeV^.ano_Node.ln_Name:=NIL;
                                                        AnchorNodeV^.ano_Anchor:=MyAnchor;
                                                        AnchorNodeV^.ano_Lock:=CurrentLock;
                                                        AddTail(AnchorList,p_Node(AnchorNodeV));
                                                        New(PathNode);
                                                        if Through^.sen_Path[length(Through^.sen_Path)]=":" then MyString:=Through^.sen_Path else MyString:=FilePart(Through^.sen_Path);
                                                        PathNode^.stn_Node.ln_pri:=0;
                                                        PrepareNode(PathNode,MyString);
                                                        AddTail(PathList,p_Node(PathNode));
                                                        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                                        TagsCHANGES[1].ti_Data:=long(PathList);
                                                        if layer<10 then
                                                                TagsCHANGES[2].ti_Tag:=TAG_END
                                                        else begin
                                                                TagsCHANGES[2].ti_Tag:=GTLV_Top;
                                                                TagsCHANGES[2].ti_Data:=layer-8;
                                                                TagsCHANGES[3].ti_Tag:=TAG_END
                                                        end;
                                                        GT_SetGadgetAttrsA(GadgetPathList,win,NIL,^TagsCHANGES);
                                                        goto Stick
                                                end;
                                                Stick2:
                                                dummy:=MatchNext(MyAnchor);
                                                if dummy<>0 then begin
                                                        if dummy=ERROR_NO_MORE_ENTRIES then goto CureAnError else ExitSearching:=999;
                                                        FoundAnError:
                                                        if ExitSearching<>999 then begin MyAnchor:=NIL; ExitSearching:=0 end;
                                                        if dummy<>ERROR_NO_MORE_ENTRIES then begin
                                                                if Through^.sen_Path[length(Through^.sen_Path)]=":" then MyString:=Through^.sen_Path else MyString:=FilePart(Through^.sen_Path);
                                                                Dummy:=long(Fault(Dummy,NIL,VariableString,364));
                                                                if layer<>1 then
                                                                        dummy:=GiveQuestion("XSearch 1.0 - Searching process","Error while reading "+MyString+" -"+LF+VariableString,"Continue|Leave searching place",win)
                                                                else begin
                                                                        dummy:=NOT(GiveQuestion("XSearch 1.0 - Searching process","Error while reading "+MyString+" -"+LF+VariableString,"Leave searching place",win));
                                                                end;
                                                                if dummy=0 then ExitSearching:=1
                                                        end;
                                                        CureAnError:
                                                        layer:=layer-1;
                                                        if MyAnchor<>NIL then begin
                                                                MatchEnd(MyAnchor);
                                                                dispose(MyAnchor);
                                                        end;
                                                        UnLock(CurrentLock);
                                                        if layer<>0 then begin
                                                                AnchorNodeV:=p_AnchorNode(AnchorList^.lh_TailPred);
                                                                MyAnchor:=AnchorNodeV^.ano_Anchor;
                                                                CurrentLock:=AnchorNodeV^.ano_Lock;
                                                                RemTail(AnchorList);
                                                                dispose(AnchorNodeV);
                                                                Through^.sen_Path:=copy(Through^.sen_Path,1,length(Through^.sen_Path)-length(PathPart(Through^.sen_Path)));
                                                                PathNode:=p_StringNode(PathList^.lh_TailPred);
                                                                dispose(PathNode);
                                                                RemTail(PathList);
                                                                TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                                                                TagsCHANGES[1].ti_Data:=long(PathList);
                                                                if layer<10 then
                                                                        TagsCHANGES[2].ti_Tag:=TAG_END
                                                                else begin
                                                                        TagsCHANGES[2].ti_Tag:=GTLV_Top;
                                                                        TagsCHANGES[2].ti_Data:=layer-9;
                                                                        TagsCHANGES[3].ti_Tag:=TAG_END
                                                                end;
                                                                GT_SetGadgetAttrsA(GadgetPathList,win,NIL,^TagsCHANGES);
                                                        end;
                                                        if (ExitSearching>0) and (layer<>0) then goto CureAnError;
                                                        if layer<>0 then goto Stick2
                                                end;
                                        until layer=0
                                end else begin
                                        Asking3:
                                        imsg:=GT_GetIMsg(win^.userport);
                                        GT_ReplyIMsg(imsg);
                                        if (imsg<>NIL) and (imsg^.class<>IDCMP_INTUITICKS) then begin WhereIStopped:=3; goto AskWhat end;
                                        if ExitSearching>0 then goto CureAnError;
                                        if Pause=TRUE then begin imsg:=Wait_Port(win^.UserPort); goto Asking3 end;
                                        goto FoundAnError
                                end
                        end;
                        BeforeLookWhatExitSearch:
                        PathNode:=p_StringNode(PathList^.lh_Head);
                        dispose(PathNode);
                        RemHead(PathList);
                        TagsCHANGES[1].ti_Tag:=GTLV_Labels;
                        TagsCHANGES[1].ti_Data:=long(PathList);
                        TagsCHANGES[2].ti_Tag:=TAG_END;
                        GT_SetGadgetAttrsA(GadgetPathList,win,NIL,^TagsCHANGES);
                        LookWhatExitSearch:
                        case ExitSearching of
                                2:      begin end
                                3:      begin
                                        ExitSearching:=0;
                                        goto Overjump
                                end
                                4:      EndExit:=0
                                5:      EndExit:=1
                                else    Through:=p_SearchNode(Through^.sen_Node.ln_Succ)
                        end;
                        if ExitSearching>1 then Through:=p_SearchNode(SearchList^.lh_Tail)
                END;
                TagsCHANGES[1]:=TagItem(GA_Disabled,long(TRUE));
                TagsCHANGES[2].ti_Tag:=TAG_END;
                GT_SetGadgetAttrsA(GadgetStop,win,NIL,^TagsCHANGES);
                ExitSearching:=0
        end;

        if (EndExit>2) and (EndExit<50) then goto BACK;

        WaitPointer(win);

        if EndExit=52 then
                saved:=WritePrefs(Projekt,PCA,win,SearchList);

        if EndExit=53 then begin
                GetRidOfForLookUp(win);
                Dummy:=long(FileProjekt(1,win));
                GetBackForLookUp(win,CG);
                if Dummy=long(TRUE) then begin
                        if ProjektDir[length(ProjektDir)]=":" then
                                Dummy:=long(WritePrefs(ProjektDir+ProjektName,PCA,win,SearchList))
                        else
                                Dummy:=long(WritePrefs(ProjektDir+"/"+ProjektName,PCA,win,SearchList));
                        if Dummy=long(TRUE) then begin Dummy:=long(NameProjekt(FALSE)); SetWindowTitles(win,ProjektXSearch,str(-1)); saved:=TRUE end
                end else RestoreProjektNameDir
        end;

        if (EndExit>2) or (EndExit<0) then begin NormalPointer(win); goto BACK end;

        if saved=FALSE then begin
                if (EndExit=0) and (dejaDemande=FALSE) then begin
                        dejaDemande:=TRUE;
                        SIGNAL:=GiveQuestion(ProjektXSearch+" - Quit","The old project has been changed."+LF+"Do you really want to quit?",
                                "Quit|Save, then quit|Cancel",win);
                        if SIGNAL=2 then begin
                                if WritePrefs(Projekt,PCA,win,SearchList)=FALSE then begin NormalPointer(win); goto BACK end else saved:=TRUE;
                        end;
                        if SIGNAL=0 then begin DejaDemande:=FALSE; NormalPointer(win); goto BACK end;
                        if WhereIStopped<>0 then begin ExitSearching:=4; goto BACK end
                end
        end;

        CloseWindow(win);
        FreeMenus(MenuFields);
        FreeGadgets(CG);
        SearchNodeV:=p_SearchNode(LookedList^.lh_Head);
        WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                SearchNodeBack:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                Remove(p_Node(^SearchNodeV^.sen_Node));
                dispose(SearchNodeV);
                SearchNodeV:=SearchNodeBack;
        END;
        dispose(LookedList);
        PathNode:=p_StringNode(PathList^.lh_Head);
        WHILE p_StringNode(PathNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                PathNodeBack:=p_StringNode(PathNode^.stn_Node.ln_Succ);
                Remove(p_Node(^PathNode^.stn_Node));
                dispose(PathNode);
                PathNode:=PathNodeBack;
        END;
        dispose(PathList);
        dispose(AnchorList);
END;


FUNCTION ReadXSearchPrefs(FileName:DirNameString,VAR RealPrefs:XSearchPrefs):boolean;
VAR     ReadFile:                               Text;
        Dummy   :                               long;
        Identifier:                             string[14];
LABEL   ExitOut;
BEGIN
        ReSet(ReadFile,FileName);
        Dummy:=IOResult;
        if Dummy<>0 then begin
                ReadXSearchPrefs:=FALSE;
                goto ExitOut
        end;
        readln (ReadFile,Identifier);
        if Identifier<>"XSEARCH PREFS" then begin ReadXSearchPrefs:=FALSE; goto ExitOut end;
        with RealPrefs do begin
                readln(ReadFile,Dummy);
                FilerStart:=boolean(Dummy);
                readln(ReadFile,StartDir);
                readln(ReadFile,ProjektDir);
                readln(ReadFile,Dummy);
                Recursion:=boolean(Dummy);
                readln(ReadFile,Dummy);
                Sensitivity:=boolean(Dummy);
                readln(ReadFile,Dummy);
                Coloured:=boolean(Dummy);
                readln(ReadFile,DateFormat);
                readln(ReadFile,Dummy);
                Currency:=boolean(Dummy);
                readln(ReadFile,Dummy);
                DirLength:=boolean(Dummy);
                readln(ReadFile,Dummy);
                DirIFF:=boolean(Dummy);
                readln(ReadFile,Dummy);
                DirFile:=boolean(Dummy);
                readln(ReadFile,Dummy);
                DirOther:=boolean(Dummy)
        end;
        Dummy:=IOResult;
        Close(ReadFile);
        if Dummy<>0 then begin
                ReadXSearchPrefs:=FALSE;
                goto ExitOut
        end;
        ReadXSearchPrefs:=TRUE;
        ExitOut:
END;

FUNCTION WriteXSearchPrefs(FileName:DirNameString,RealPrefs:XSearchPrefs,win:p_window):boolean;
VAR     WriteFile:                              Text;
        Dummy   :                               integer;
LABEL   ExitOut;
BEGIN
        ReWrite(WriteFile,FileName);
        Dummy:=IOResult;
        if Dummy<>0 then begin
                Dummy:=integer(Fault(Dummy,NIL,VariableString,364));
                GiveError("XSearch 1.0 ["+ProjektName+"] - Save settings","Error while saving."+LF+"("+VariableString+")",win);
                WriteXSearchPrefs:=FALSE;
                goto ExitOut
        end;
        writeln (WriteFile,"XSEARCH PREFS");
        with RealPrefs do begin
                writeln(WriteFile,long(FilerStart));
                writeln(WriteFile,StartDir);
                writeln(WriteFile,ProjektDir);
                writeln(WriteFile,long(Recursion));
                writeln(WriteFile,long(Sensitivity));
                writeln(WriteFile,long(Coloured));
                writeln(WriteFile,DateFormat);
                writeln(WriteFile,long(Currency));
                writeln(WriteFile,long(DirLength));
                writeln(WriteFile,long(DirIFF));
                writeln(WriteFile,long(DirFile));
                writeln(WriteFile,long(DirOther))
        end;
        Close(WriteFile);
        Dummy:=IOResult;
        if Dummy<>0 then begin
                Dummy:=integer(Fault(Dummy,NIL,VariableString,364));
                GiveError("XSearch 1.0 ["+ProjektName+"] - Save settings","Error while saving."+LF+"("+VariableString+")",win);
                WriteXSearchPrefs:=FALSE;
                goto ExitOut
        end;
        WriteXSearchPrefs:=TRUE;
        ExitOut:
END;


PROCEDURE GetRidOfForPreferences(VAR win:p_window);
BEGIN
        win^.flags:=win^.flags or WFLG_RMBTRAP;
        win^.IDCMPFlags:=0;
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=NIL
END;

PROCEDURE GetBackForPreferences(VAR win:p_window,GadgetCycle:p_gadget);
BEGIN
        win^.firstgadget^.nextgadget^.nextgadget^.nextgadget^.nextgadget:=GadgetCycle;
        win^.IDCMPFlags:=IDCMP_CLOSEWINDOW or IDCMP_VANILLAKEY or IDCMP_GADGETUP;
        win^.flags:=win^.flags xor WFLG_RMBTRAP;
        RefreshGadgets(win^.FirstGadget,win,NIL);
        GT_RefreshWindow(win,NIL);
END;

PROCEDURE PreferencesXSearch;
LABEL   BACK;
VAR     win     :                               p_window;
        CG      :                               p_gadget;
        CurrentGadget:                          p_gadget;
        NewGadgetFields:                        newgadget;
        GadgetStartWith:                        p_gadget;
        GadgetStartWhere:                       p_gadget;
        GadgetStartFiler:                       p_gadget;
        GadgetProjects:                         p_gadget;
        GadgetProjectFiler:                     p_gadget;
        GadgetRecursive:                        p_gadget;
        GadgetCase:                             p_gadget;
        GadgetColoured:                         p_gadget;
        GadgetDate:                             p_gadget;
        GadgetCurrency:                         p_gadget;
        GadgetDirLength:                        p_gadget;
        GadgetDirIFF:                           p_gadget;
        GadgetDirFile:                          p_gadget;
        GadgetDirother:                         p_gadget;
        GadgetSave:                             p_gadget;
        GadgetUse:                              p_gadget;
        GadgetCancel:                           p_gadget;
        ContentsStartWith:                      array[1..3] of str;
        ContentsCase:                           array[1..3] of str;
        ContentsDate:                           array[1..4] of str;
        ContentsSearch:                         array[1..3] of str;
        DidIt   :                               boolean;
        imsg    :                               p_intuimessage;
        MyEnd   :                               integer;
        MyXSP   :                               XSearchPrefs;
        ChangeASG:                              array [0..1] of Byte;
        SI      :                               p_StringInfo;
        TagsCHANGES:                            array[1..13] of TagItem;
        ZOM     :                               array[1..4] of word;
BEGIN
        GadgetStartWith:=CreateContext(^CG);
        ChangeASG[0]:=DI^.dri_Pens^[SHADOWPEN];
        ChangeASG[1]:=DI^.dri_Pens^[SHINEPEN];
        if ChangeASG[0]=ChangeASG[1] then
                ChangeASG[0]:=DI^.dri_Pens^[FILLTEXTPEN];

        MyXSP:=UsedXSP;
        ContentsStartWith[1]:="Options";
        ContentsStartWith[2]:="Places";
        ContentsStartWith[3]:=NIL;
        TagsCHANGES[1].ti_Tag:=GTCY_Labels;
        TagsCHANGES[1].ti_Data:=ContentsStartWith;
        TagsCHANGES[2]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[3]:=TagItem(GTCY_Active,long(MyXSP.FilerStart));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(110,5,120,12,"_Start with",^tattr,1,
                PLACETEXT_LEFT,VI,NIL);
        GadgetStartWith:=CreateGadgetA(CYCLE_KIND,CG,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GTST_MaxChars,256);
        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=MyXSP.StartDir;
        TagsCHANGES[3]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(110,18,188,12,"in _dir.",^tattr,2,
                PLACETEXT_LEFT,VI,NIL);
        GadgetStartWhere:=CreateGadgetA(STRING_KIND,GadgetStartWith,
                ^NewGadgetFields,^TagsCHANGES);

        NewGadgetFields:=NewGadget(298,18,70,12,"Get...",^tattr,3,
                PLACETEXT_IN,VI,NIL);
        GadgetStartFiler:=CreateGadgetA(BUTTON_KIND,GadgetStartWhere,
                ^NewGadgetFields,NIL);

        TagsCHANGES[1]:=TagItem(GTST_MaxChars,256);
        TagsCHANGES[2].ti_Tag:=GTST_String; TagsCHANGES[2].ti_Data:=MyXSP.ProjektDir;
        TagsCHANGES[3]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(110,31,188,12,"_Projects in",^tattr,4,
                PLACETEXT_LEFT,VI,NIL);
        GadgetProjects:=CreateGadgetA(STRING_KIND,GadgetStartFiler,
                ^NewGadgetFields,^TagsCHANGES);

        NewGadgetFields:=NewGadget(298,31,70,12,"Get...",^tattr,5,
                PLACETEXT_IN,VI,NIL);
        GadgetProjectFiler:=CreateGadgetA(BUTTON_KIND,GadgetProjects,
                ^NewGadgetFields,NIL);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTCB_Checked,long(MyXSP.Recursion));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,48,0,0,"Di_r. with Subdirs",^tattr,6,
                PLACETEXT_RIGHT,VI,NIL);
        GadgetRecursive:=CreateGadgetA(CHECKBOX_KIND,GadgetProjectFiler,
                ^NewGadgetFields,^TagsCHANGES);

        ContentsCase[1]:="G=k";
        ContentsCase[2]:="G÷k";
        ContentsCase[3]:=NIL;
        TagsCHANGES[1].ti_Tag:=GTCY_Labels;
        TagsCHANGES[1].ti_Data:=ContentsCase;
        TagsCHANGES[2]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[3]:=TagItem(GTCY_Active,long(MyXSP.Sensitivity));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(330,48,60,12,"Cas_e sens.",^tattr,7,
                PLACETEXT_LEFT,VI,NIL);
        GadgetCase:=CreateGadgetA(CYCLE_KIND,GadgetRecursive,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTCB_Checked,long(MyXSP.Coloured));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,61,0,0,"Textgadg. _coloured",^tattr,8,
                PLACETEXT_RIGHT,VI,NIL);
        GadgetColoured:=CreateGadgetA(CHECKBOX_KIND,GadgetCase,^NewGadgetFields,
                ^TagsCHANGES);

        ContentsDate[1]:="DD.MM.YY";
        ContentsDate[2]:="DD-MM-YY";
        ContentsDate[3]:="MM-DD-YY";
        ContentsDate[4]:=NIL;
        TagsCHANGES[1].ti_Tag:=GTCY_Labels;
        TagsCHANGES[1].ti_Data:=ContentsDate;
        TagsCHANGES[2]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[3]:=TagItem(GTCY_Active,MyXSP.DateFormat);
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(280,61,110,12,"Da_te",^tattr,9,
                PLACETEXT_LEFT,VI,NIL);
        GadgetDate:=CreateGadgetA(CYCLE_KIND,GadgetColoured,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[2]:=TagItem(GTCB_Checked,long(MyXSP.Currency));
        TagsCHANGES[3].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(10,74,0,0,"current D_ate when new values",^tattr,10,
                PLACETEXT_RIGHT,VI,NIL);
        GadgetCurrency:=CreateGadgetA(CHECKBOX_KIND,GadgetDate,^NewGadgetFields,
                ^TagsCHANGES);

        ContentsSearch[1]:="pass";
        ContentsSearch[2]:="exclude";
        ContentsSearch[3]:=NIL;

        TagsCHANGES[1].ti_Tag:=GTCY_Labels;
        TagsCHANGES[1].ti_Data:=ContentsSearch;
        TagsCHANGES[2]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[3]:=TagItem(GTCY_Active,long(MyXSP.DirLength));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(250,91,140,12,"Dir. at _length control",
                ^tattr,11,PLACETEXT_LEFT,VI,NIL);
        GadgetDirLength:=CreateGadgetA(CYCLE_KIND,GadgetCurrency,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTCY_Labels;
        TagsCHANGES[1].ti_Data:=ContentsSearch;
        TagsCHANGES[2]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[3]:=TagItem(GTCY_Active,long(MyXSP.DirIFF));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(250,104,140,12,"_IFF control",
                ^tattr,12,PLACETEXT_LEFT,VI,NIL);
        GadgetDirIFF:=CreateGadgetA(CYCLE_KIND,GadgetDirLength,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTCY_Labels;
        TagsCHANGES[1].ti_Data:=ContentsSearch;
        TagsCHANGES[2]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[3]:=TagItem(GTCY_Active,long(MyXSP.DirFile));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(250,117,140,12,"_file-internal search",
                ^tattr,13,PLACETEXT_LEFT,VI,NIL);
        GadgetDirFile:=CreateGadgetA(CYCLE_KIND,GadgetDirIFF,^NewGadgetFields,
                ^TagsCHANGES);

        TagsCHANGES[1].ti_Tag:=GTCY_Labels;
        TagsCHANGES[1].ti_Data:=ContentsSearch;
        TagsCHANGES[2]:=TagItem(GT_Underscore,long("_"));
        TagsCHANGES[3]:=TagItem(GTCY_Active,long(MyXSP.DirOther));
        TagsCHANGES[4].ti_Tag:=TAG_END;
        NewGadgetFields:=NewGadget(250,130,140,12,"_other files at IFF",
                ^tattr,14,PLACETEXT_LEFT,VI,NIL);
        GadgetDirother:=CreateGadgetA(CYCLE_KIND,GadgetDirFile,^NewGadgetFields,
                ^TagsCHANGES);

        NewGadgetFields:=NewGadget(10,150,80,12,"Save",^tattr,15,
                PLACETEXT_IN,VI,NIL);
        GadgetSave:=CreateGadgetA(BUTTON_KIND,GadgetDirother,^NewGadgetFields,
                NIL);

        NewGadgetFields:=NewGadget(160,150,80,12,"Use",^tattr,16,
                PLACETEXT_IN,VI,NIL);
        GadgetUse:=CreateGadgetA(BUTTON_KIND,GadgetSave,^NewGadgetFields,NIL);

        NewGadgetFields:=NewGadget(310,150,80,12,"Cancel",^tattr,17,
                PLACETEXT_IN,VI,NIL);
        GadgetCancel:=CreateGadgetA(BUTTON_KIND,GadgetUse,^NewGadgetFields,NIL);

        if (ChangeASG[0]<>ChangeASG[1]) and (UsedXSP.Coloured=TRUE) then begin
                SI:=GadgetStartWhere^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
                SI:=GadgetProjects^.SpecialInfo;
                SI^.Extension^.ActivePens:=ChangeASG;
        end;

        ZOM[1]:=100;
        ZOM[2]:=60;
        ZOM[3]:=350;
        ZOM[4]:=scr^.font^.ta_Ysize+6;
        TagsCHANGES[1]:=TagItem(WA_Top,60);
        TagsCHANGES[2]:=TagItem(WA_Left,100);
        TagsCHANGES[3]:=TagItem(WA_InnerHeight,167);
        TagsCHANGES[4]:=TagItem(WA_InnerWidth,400);
        TagsCHANGES[5].ti_Tag:=WA_Title;
        TagsCHANGES[5].ti_Data:="XSearch 1.0 - Preferences";
        TagsCHANGES[6]:=TagItem(WA_Flags,WFLG_CLOSEGADGET OR WFLG_GIMMEZEROZERO OR
                WFLG_RMBTRAP OR WFLG_ACTIVATE OR WFLG_DRAGBAR OR WFLG_SMART_REFRESH OR
                WFLG_DEPTHGADGET or WFLG_HASZOOM);
        TagsCHANGES[7]:=TagItem(WA_IDCMP,IDCMP_CLOSEWINDOW or IDCMP_GADGETUP or
                IDCMP_VANILLAKEY);
        TagsCHANGES[8]:=TagItem(WA_CustomScreen,long(scr));
        TagsCHANGES[9].ti_Tag:=WA_Gadgets;
        TagsCHANGES[9].ti_Data:=CG^;
        TagsCHANGES[10]:=TagItem(WA_MouseQueue,0);
        TagsCHANGES[11]:=TagItem(WA_RptQueue,0);
        TagsCHANGES[12].ti_Tag:=WA_Zoom;
        TagsCHANGES[12].ti_Data:=ZOM;
        TagsCHANGES[13].ti_Tag:=TAG_END;
        win:=OpenWindowTagList(NIL,^TagsCHANGES);

        GT_RefreshWindow(win,NIL);

        BACK:
        MyEnd:=-1;

        REPEAT
                imsg:=Wait_Port(win^.UserPort);
                imsg:=GT_GetIMsg(win^.userport);
                GT_ReplyIMsg(imsg);
                case imsg^.class of
                        IDCMP_CLOSEWINDOW:
                                MyEnd:=0
                        IDCMP_VANILLAKEY: begin
                                if (imsg^.code=68) or (imsg^.code=80) then begin
                                        if imsg^.code=86 then SI:=GadgetStartWhere^.SpecialInfo else SI:=GadgetProjects^.SpecialInfo;
                                        ProjektDir:=SI^.Buffer;
                                        WaitPointer(win);
                                        GetRidOfForPreferences(win);
                                        DidIt:=FileProjekt(5,win);
                                        GetBackForPreferences(win,CG);
                                        NormalPointer(win);
                                        if DidIt=FALSE then begin RestoreProjektNameDir; goto BACK end;
                                        VariableStr:=ProjektDir;
                                        TagsCHANGES[1]:=TagItem(GTST_String,long(VariableStr));
                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                        if imsg^.code=86 then GT_SetGadgetAttrsA(GadgetStartWhere,win,NIL,^TagsCHANGES) else GT_SetGadgetAttrsA(GadgetProjects,win,NIL,^TagsCHANGES);
                                        RestoreProjektNameDir;
                                        goto BACK
                                end;
                                if imsg^.code=84 then begin
                                        case MyXSP.DateFormat of
                                                0:      MyXSP.DateFormat:=2
                                                1:      MyXSP.DateFormat:=0
                                                2:      MyXSP.DateFormat:=1
                                        end;
                                        TagsCHANGES[1]:=TagItem(GTCY_Active,MyXSP.DateFormat);
                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                        GT_SetGadgetAttrsA(GadgetDate,win,NIL,^TagsCHANGES);
                                        goto BACK
                                end;
                                if imsg^.code>96 then imsg^.code:=imsg^.code-32;
                                case imsg^.code of
                                        13:     MyEnd:=1
                                        27:     MyEnd:=0
                                        32:     MyEnd:=2
                                        83:     begin
                                                MyXSP.FilerStart:=NOT(MyXSP.FilerStart);
                                                TagsCHANGES[1]:=TagItem(GTCY_Active,long(MyXSP.FilerStart));
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetStartWith,win,NIL,^TagsCHANGES);
                                        end
                                        82:     begin
                                                MyXSP.Recursion:=NOT(MyXSP.Recursion);
                                                TagsCHANGES[1]:=TagItem(GTCB_Checked,long(MyXSP.Recursion));
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetRecursive,win,NIL,^TagsCHANGES);
                                        end
                                        69:     begin
                                                MyXSP.Sensitivity:=NOT(MyXSP.Sensitivity);
                                                TagsCHANGES[1]:=TagItem(GTCY_Active,long(MyXSP.Sensitivity));
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetCase,win,NIL,^TagsCHANGES);
                                        end
                                        67:     begin
                                                MyXSP.Coloured:=NOT(MyXSP.Coloured);
                                                TagsCHANGES[1]:=TagItem(GTCB_Checked,long(MyXSP.Coloured));
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetColoured,win,NIL,^TagsCHANGES);
                                        end
                                        65:     begin
                                                MyXSP.Currency:=NOT(MyXSP.Currency);
                                                TagsCHANGES[1]:=TagItem(GTCB_Checked,long(MyXSP.Currency));
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetCurrency,win,NIL,^TagsCHANGES);
                                        end
                                        76:     begin
                                                MyXSP.DirLength:=NOT(MyXSP.DirLength);
                                                TagsCHANGES[1]:=TagItem(GTCY_Active,long(MyXSP.DirLength));
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetDirLength,win,NIL,^TagsCHANGES);
                                        end
                                        73:     begin
                                                MyXSP.DirIFF:=NOT(MyXSP.DirIFF);
                                                TagsCHANGES[1]:=TagItem(GTCY_Active,long(MyXSP.DirIFF));
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetDirIFF,win,NIL,^TagsCHANGES);
                                        end
                                        70:     begin
                                                MyXSP.DirFile:=NOT(MyXSP.DirFile);
                                                TagsCHANGES[1]:=TagItem(GTCY_Active,long(MyXSP.DirFile));
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetDirFile,win,NIL,^TagsCHANGES);
                                        end
                                        79:     begin
                                                MyXSP.DirOther:=NOT(MyXSP.DirOther);
                                                TagsCHANGES[1]:=TagItem(GTCY_Active,long(MyXSP.DirOther));
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetDirOther,win,NIL,^TagsCHANGES);
                                        end
                                        84:     begin
                                                case MyXSP.DateFormat of
                                                        0:      MyXSP.DateFormat:=1
                                                        1:      MyXSP.DateFormat:=2
                                                        2:      MyXSP.DateFormat:=0
                                                end;
                                                TagsCHANGES[1]:=TagItem(GTCY_Active,MyXSP.DateFormat);
                                                TagsCHANGES[2].ti_Tag:=TAG_END;
                                                GT_SetGadgetAttrsA(GadgetDate,win,NIL,^TagsCHANGES);
                                        end
                                        68:     DidIt:=activategadget(GadgetStartWhere,win,nil)
                                        80:     DidIt:=activategadget(GadgetProjects,win,nil)
                                        else
                                end
                        end
                        IDCMP_GADGETUP: begin
                                CurrentGadget:=imsg^.iaddress;
                                if (CurrentGadget^.gadgetid=3) or (CurrentGadget^.gadgetid=5) then begin
                                        if CurrentGadget^.gadgetid=3 then SI:=GadgetStartWhere^.SpecialInfo else SI:=GadgetProjects^.SpecialInfo;
                                        ProjektDir:=SI^.Buffer;
                                        WaitPointer(win);
                                        GetRidOfForPreferences(win);
                                        DidIt:=FileProjekt(5,win);
                                        GetBackForPreferences(win,CG);
                                        NormalPointer(win);
                                        if DidIt=FALSE then begin RestoreProjektNameDir; goto BACK end;
                                        VariableStr:=ProjektDir;
                                        TagsCHANGES[1]:=TagItem(GTST_String,long(VariableStr));
                                        TagsCHANGES[2].ti_Tag:=TAG_END;
                                        if CurrentGadget^.gadgetid=3 then GT_SetGadgetAttrsA(GadgetStartWhere,win,NIL,^TagsCHANGES) else GT_SetGadgetAttrsA(GadgetProjects,win,NIL,^TagsCHANGES);
                                        RestoreProjektNameDir;
                                        goto BACK
                                end;
                                case CurrentGadget^.gadgetid of
                                        1:      MyXSP.FilerStart:=boolean(imsg^.code)
                                        6:      MyXSP.Recursion:=GadgetRecursive^.flags and GFLG_Selected<>0
                                        7:      MyXSP.Sensitivity:=boolean(imsg^.code)
                                        8:      MyXSP.Coloured:=GadgetColoured^.flags and GFLG_Selected<>0
                                        9:      MyXSP.DateFormat:=imsg^.code
                                        10:     MyXSP.Currency:=GadgetCurrency^.flags and GFLG_Selected<>0
                                        11:     MyXSP.DirLength:=boolean(imsg^.code)
                                        12:     MyXSP.DirIFF:=boolean(imsg^.code)
                                        13:     MyXSP.DirFile:=boolean(imsg^.code)
                                        14:     MyXSP.DirOther:=boolean(imsg^.code)
                                        15:     MyEnd:=2
                                        16:     MyEnd:=1
                                        17:     MyEnd:=0
                                        else
                                end
                        end
                        else
                end
        UNTIL MyEnd<>-1;

        SI:=GadgetStartWhere^.SpecialInfo;
        MyXSP.StartDir:=SI^.Buffer;
        SI:=GadgetProjects^.SpecialInfo;
        MyXSP.ProjektDir:=SI^.Buffer;

        if MyEnd=2 then
                if WriteXSearchPrefs("ENVARC:XSearch.Config",MyXSP,win)=FALSE then goto BACK;
        if MyEnd<>0 then begin
                ConvertDate(PCA.Date1,UsedXSP.DateFormat,MyXSP.DateFormat);
                ConvertDate(PCA.Date2,UsedXSP.DateFormat,MyXSP.DateFormat);
                UsedXSP:=MyXSP;
        end;

        CloseWindow(win);
        FreeGadgets(CG);
END;


BEGIN
        OpenLib(DosBase,"dos.library",36);
        OpenLib(SysBase,"exec.library",36);
        OpenLib(IntuitionBase,"intuition.library",36);
        OpenLib(GadToolsBase,"gadtools.library",36);
        OpenLib(GfxBase,"graphics.library",36);
        OpenLib(DiskFontBase,"diskfont.library",36);
        OpenLib(WorkbenchBase,"workbench.library",36);
        OpenLib(AslBase,"asl.library",36);
        OpenLib(UtilityBase,"utility.library",36);
        OpenLib(IFFParse,"iffparse.library",36);
        DB:=DosBase;

        tattr:=TextAttr("topaz.font",8,0,0);
        tfont:=OpenFont(^tattr);
        scr:=LockPubScreen(NIL);
        UnLockPubScreen(NIL,scr);
        VI:=GetVisualInfoA(scr,NIL);
        DI:=GetScreenDrawInfo(scr);
        FreeScreenDrawInfo(scr,DI);
        New(SearchList);
        InitList(SearchList);
        New(TextList);
        InitList(TextList);
        VariableString:="";
        VariableStr:=VariableString;

        saved:=TRUE;
        start:=TRUE;
        IDidTheMarking:=FALSE;
        MyPattern:="~(#?.info)";

        LockBack:=Lock("RAM:",SHARED_LOCK);
        if IOErr<>0 then
                LockFirst:=0
        else begin
                LockFirst:=CurrentDir(LockBack);
                UnLock(LockBack);
                LockBack:=CurrentDir(LockFirst)
        end;

        BeginString:="";
        if ReadXSearchPrefs("ENVARC:XSearch.Config",UsedXSP)=FALSE then begin
                BeginString:="Error while loading settings.";
                UsedXSP:=XSearchPrefs(FALSE,"","RAM:",TRUE,FALSE,FALSE,1,TRUE,TRUE,TRUE,TRUE,FALSE);
        end;

        MyLock:=Lock(UsedXSP.StartDir,SHARED_LOCK);
        CS:="";
        if IOErr<>0 then CurrentDirectory:="" else begin CurrentDirectory:=UsedXSP.StartDir; Unlock(MyLock) end;

        MyLock:=Lock(UsedXSP.ProjektDir,SHARED_LOCK);
        if IOErr<>0 then ProjektDir:="RAM:" else begin ProjektDir:=UsedXSP.ProjektDir; Unlock(MyLock) end;

        if NameProjekt(TRUE)=FALSE then begin
                ProjektName:="OhneNamen";
                ProjektDir:="RAM:";
                Projekt:="RAM:OhneNamen";
                ProjektXSearch:="XSearch 1.0 - [OhneNamen]"
        end;

        EndExit:=0;
        if ReadPrefs("ENVARC:XSearch.Std",PrefsStandard,NIL,FALSE,SearchList,FALSE)=FALSE then begin
                if BeginString<>"" then BeginString:="Error while loading settings/values." else BeginString:="Error while loading Standard values.";
                PrefsStandard:=Prefs(0,0,"********","","","","",1,"#?","#?","","#?",1,0,0);
                EndExit:=1
        end;
        if (EndExit=1) or (UsedXSP.Currency=TRUE) then begin
                VariableString:=ConvertCurrentDateTime(NIL,FALSE); VariableStr:=VariableString;
                VariableString:=AlienizeTimeDate(VariableStr,FALSE);
                PrefsStandard.Date1:=VariableString; PrefsStandard.Date2:=VariableString;
                VariableString:=ConvertCurrentDateTime(NIL,TRUE); VariableStr:=VariableString;
                VariableString:=AlienizeTimeDate(VariableStr,TRUE);
                PrefsStandard.Time1:=VariableString; PrefsStandard.Time2:=VariableString;
                EndExit:=0
        end;
        PCA:=PrefsStandard;

        CurrentMode:=UsedXSP.FilerStart;

        repeat
                case CurrentMode of
                        CM_OPTIONS: Options
                        CM_FILER: Filer
                end;
                if EndExit=2 then CurrentMode:=NOT(CurrentMode);
                if EndExit=1 then begin
                        OptimizePrefs;
                        InSearch:=TRUE; LookUp; InSearch:=FALSE
                end
        until EndExit=0;

        SearchNodeV:=p_SearchNode(SearchList^.lh_Head);
        WHILE p_SearchNode(SearchNodeV^.sen_Node.ln_Succ)<>NIL DO BEGIN
                SearchNodeBack:=p_SearchNode(SearchNodeV^.sen_Node.ln_Succ);
                Remove(p_Node(^SearchNodeV^.sen_Node));
                dispose(SearchNodeV);
                SearchNodeV:=SearchNodeBack;
        END;
        TextNode:=p_StringNode(TextList^.lh_Head);
        WHILE p_StringNode(TextNode^.stn_Node.ln_Succ)<>NIL DO BEGIN
                TextNodeBack:=p_StringNode(TextNode^.stn_Node.ln_Succ);
                Remove(p_Node(^TextNode^.stn_Node));
                dispose(TextNode);
                TextNode:=TextNodeBack;
        END;
        dispose(TextList);
        LockBack:=CurrentDir(LockFirst);
        dispose(SearchList);
        FreeVisualInfo(VI);
        if LockFirst<>0 then LockBack:=CurrentDir(LockFirst);
END.





