
/*
   *
   * $Id: UrlEditWin.c,v 1.3 1998/06/03 14:01:55 Giambattista_Bloisi Exp $
   *
 */

#include "common/extern.h"
#include "common/subtasksupp.h"
#include "common/urltype.h"
#include "common/Grab_mcc.h"

#include <MUI/NListview_mcc.h>

#define MAXURLSIZE 1024*2

/// "String hooks"

/* This function is called whenever you press a key in the gadget.
   You can't run this function in the debugger.
   You're not allowed to call any dos function as printf() here.
   But you can do sprintf() and put a msg in the titelbar.
   This way you can check variables and what's wrong */

#include <intuition/sghooks.h>

const char hexd[] = "0123456789abcdef";

SAVEDS (ULONG) CONSTCALL
EndStrFunc (REG (a0, struct Hook *hook), REG (a2, Object * obj), REG (a1, char **content))
{
  unsigned char *str = *content, *tmp;

  if ((tmp = (unsigned char *) AllocSPooled (gd.gd_pool, MAXURLSIZE)))
    {
      for (int i = 0; *str != '\0' && i < (MAXURLSIZE - 4); str++, i++)
        {
          if (!isufmask (*str, __UF_UNRESERVED | __UF_URIC | __UF_SPECIAL))
            {
              tmp[i++] = '%';
              tmp[i++] = hexd[*str >> 4];
              tmp[i] = hexd[*str & '\x0f'];
            }
          else
            tmp[i] = *str;
        }

      tmp[i] = '\0';
      set (obj, MUIA_String_Contents, tmp);

      FreeSPooled (gd.gd_pool, tmp, MAXURLSIZE);
    }
  else
    set (obj, MUIA_String_Contents, "");

  return (NULL);
}


SAVEDS (ULONG)
UrlStrFunc (REG (a0, struct Hook * hook), REG (a2, struct SGWork *sgw), REG (a1, ULONG * msg))
{
  ULONG return_code;
  int error = 0;
  return_code = ~0L;

  D (kprintf ("msg: %ld, editop: %ld\n", *msg, sgw->EditOp));


  if (*msg == SGH_KEY)
    {
      if ((sgw->EditOp == EO_REPLACECHAR) || (sgw->EditOp == EO_INSERTCHAR))
        {
          if (isufmask (sgw->Code, __UF_UNRESERVED | __UF_URIC | __UF_SPECIAL))
            {
              sgw->WorkBuffer[sgw->BufferPos - 1] = sgw->Code;
              sgw->Actions |= SGA_USE;
            }
          else
            {
              if ((sgw->NumChars + 2) < sgw->StringInfo->MaxChars)
                {
                  strcpy (sgw->WorkBuffer + sgw->BufferPos, sgw->PrevBuffer + sgw->BufferPos - 3);
                  sgw->WorkBuffer[sgw->BufferPos++ - 1] = '%';
                  sgw->WorkBuffer[sgw->BufferPos++ - 1] = hexd[sgw->Code >> 4];
                  sgw->WorkBuffer[sgw->BufferPos - 1] = hexd[sgw->Code & '\x0f'];

                  sgw->NumChars += 2;
                  sgw->Actions |= SGA_USE;
                }
              else
                error = TRUE;
            }
        }
      else if (sgw->EditOp == EO_ENTER)
        {
          sgw->WorkBuffer[sgw->BufferPos] = '\0';
          sgw->Actions |= SGA_END;
        }
    }
  else
    return_code = 0L;           /* Unsupported command */

  if (error)
    {
      sgw->Actions |= SGA_BEEP;
      sgw->Actions &= ~SGA_USE;
    }

  return (return_code);
}

///

/* WinGrab MUI class */

/// "New"
char *register_titles[] =
{NULL,
 NULL,
 NULL,
 NULL,
 NULL};


char *links_titles[] =
{NULL,
 NULL,
 NULL,
 NULL,
 NULL};

char *html_titles[] =
{
  "HTML 2.0",
  "HTML 3.2",
  "HTML 4.0",
  NULL
};

static const struct Hook UrlStrHook =
{
  {NULL, NULL}, (HOOKFUNC) UrlStrFunc, NULL, NULL
};

static const struct Hook EndStrHook =
{
  {NULL, NULL}, (HOOKFUNC) EndStrFunc, NULL, NULL
};

ULONG
mUrlEditWin_New (struct IClass *cl, Object * obj, struct opSet *msg)
{
  APTR REG_OBJ;
  APTR STR_URL, STR_TITLE, STR_NAME, STR_PASS;
  APTR BT_Use, BT_Reset, BT_Cancel;
  APTR NUM_MAXSIZE, CHK_MAXSIZE;
  APTR CYC_SERVER, NUM_LEV;
  APTR CYC_HTML, CHK_IE, CHK_NS, CHK_OTHER;
  APTR CHK_INIMG, CHK_INBACK, CHK_INAPPL, CHK_INOBJ;
  APTR GR_EXTS, GR_INLINE;

  if (!register_titles[0])
  {
  register_titles[0] = STRING (Menu_URL, "URL");
  register_titles[1] = STRING (EDIT_Links, "Links");
  register_titles[2] = STRING (EDIT_HTML, "HTML");
  register_titles[3] = STRING (EDIT_Download, "Download");
  }

  if(!links_titles[0])
  {
  links_titles[0] = STRING (EDIT_NServ, "None Server");
  links_titles[1] = STRING (EDIT_SServ, "Same Server");
  links_titles[2] = STRING (EDIT_EServ, "Extern Server");
  links_titles[3] = STRING (EDIT_AServ, "All Servers");
  }

// *INDENT-OFF*
  obj = (Object *) DoSuperNew(cl, obj,
                                MUIA_Window_Title, STRING (EDIT_Wintitle, "Url Properties"),
                                MUIA_Window_ID, MAKE_ID('E','W','I','N'),
                                MUIA_Window_NoMenus, TRUE,
                                MUIA_HelpNode, "WIN_EDIT",
                                WindowContents, VGroup,
                                  Child, REG_OBJ = RegisterObject,
                                           MUIA_Register_Titles, register_titles,

                                           Child, VGroup,

                                               Child, VGroup, // Url data
                                                        MUIA_Group_Columns, 2,
                                                        MUIA_Frame, MUIV_Frame_Group,
                                                        MUIA_FrameTitle, STRING (EDIT_Urldata, "Url data"),
                                                        // First Column
                                                        Child, Label2(STRING (EDIT_Url, "URL")),
                                                        Child, STR_URL = StrDropObject,
                                                                 MUIA_String_MaxLen, MAXURLSIZE,
                                                                 MUIA_String_EditHook, &UrlStrHook,
                                                                 MUIA_String_AdvanceOnCR, TRUE,
                                                                 MUIA_HelpNode, "URL_String",
                                                                 MUIA_ShortHelp, STRING (ShortHelp_UrlString, "\33cInsert a new url in the form:\nhtpp://netlocation:port/path/;param?query"),
                                                               End,
                                                        // Second Column
                                                        Child, Label2(STRING (EDIT_Title, "Title")),
                                                        Child, STR_TITLE = StrDropObject,
                                                                 MUIA_String_MaxLen, MAXURLSIZE,
                                                                 MUIA_String_AdvanceOnCR, TRUE,
                                                                 MUIA_HelpNode, "Title_String",
                                                               End,

                                               End,

                                               Child, VGroup, // Authoriz.
                                                        MUIA_Group_Columns, 2,
                                                        MUIA_Frame, MUIV_Frame_Group,
                                                        MUIA_FrameTitle, STRING (EDIT_Auth, "Authorization"),
                                                        // First Column
                                                        Child, Label2(STRING (EDIT_Name, "Name")),
                                                        Child, STR_NAME = StrDropObject,
                                                                 MUIA_String_MaxLen, MAXURLSIZE,
                                                                 MUIA_String_AdvanceOnCR, TRUE,
                                                                 MUIA_HelpNode, "Name_String",
                                                        End,

                                                        // Second Column
                                                        Child, Label2(STRING (EDIT_Password, "Password")),
                                                        Child, STR_PASS = StrDropObject,
                                                                 MUIA_String_MaxLen, MAXURLSIZE,
                                                                 MUIA_String_Secret, TRUE,
                                                                 MUIA_String_AdvanceOnCR, TRUE,
                                                                 MUIA_HelpNode, "Passwd_String",
                                                        End,
                                               End,

                                           End,

                                           Child, VGroup, /* Links */
                                           MUIA_HelpNode, "EDIT_Links",

                                                   Child, VGroup,
                                                        MUIA_Group_Columns, 3,
                                                        MUIA_Frame, MUIV_Frame_Group,
                                                        MUIA_FrameTitle, STRING (EDIT_Links, "Links"),

                                                        //First
                                                        Child, CYC_SERVER = CycleObject,
                                                               MUIA_Cycle_Entries, links_titles,
                                                        End,

                                                        Child, Label2(STRING (EDIT_LinkDepth, "Link depth: ")),
                                                        Child, NUM_LEV = NumericbuttonObject,
                                                                 MUIA_Disabled,   TRUE,
                                                                 MUIA_Numeric_Min,   1,
                                                                 MUIA_Numeric_Max, 512,
                                                        End,

                                                        Child, HSpace (2),
                                                   End,

                                                   /*Child, VGroup,
                                                        MUIA_Group_Columns, 2,
                                                        MUIA_Frame, MUIV_Frame_Group,
                                                        MUIA_FrameTitle, STRING (EDIT_EExt, "Exclude: "),

                                                        Child, Label2 ("by extension"),
                                                        Child, STR_EXTENSION = StrDropObject,
                                                             MUIA_String_MaxLen, MAXURLSIZE,
                                                             MUIA_String_AdvanceOnCR, TRUE,
                                                             //MUIA_HelpNode, "Passwd_String",
                                                        End,

                                                        Child, Label2 ("by type"),
                                                        Child, STR_TYPES = StrDropObject,
                                                             MUIA_String_MaxLen, MAXURLSIZE,
                                                             MUIA_String_AdvanceOnCR, TRUE,
                                                             //MUIA_HelpNode, "Passwd_String",
                                                        End,
                                                   End, */
                                           End,

                                           Child, VGroup, /* HTML */
                                           MUIA_HelpNode, "EDIT_HTML",

                                               Child, VGroup,
                                                   MUIA_Frame, MUIV_Frame_Group,
                                                   MUIA_FrameTitle, STRING (EDIT_Include, "Include"),
                                                   //First
                                                   Child, HGroup,
                                                       Child, CYC_HTML = CycleObject,
                                                              MUIA_Cycle_Entries, html_titles,
                                                              MUIA_Cycle_Active, 2,
                                                       End,

                                                       Child, Label2(STRING (EDIT_Tags, "Tags")),
                                                   End,

                                                   Child, Label2 (STRING (EDIT_Extensions, "\033lExtensions:")),

                                                   Child, GR_EXTS = HGroup,

                                                       Child, CHK_IE = CheckMarkObject,
                                                           MUIA_Selected, FALSE,
                                                           MUIA_ShortHelp, STRING (ShortHelp_IncludeIE, "\33cInclude Microsoft® Internet Explorer HTML extensions\n(\33isee documentation\33n)"),
                                                       End,
                                                       Child, Label1(STRING (EDIT_IE, "\033lInternet Explorer")),


                                                       Child, CHK_NS = CheckMarkObject,
                                                           MUIA_Selected, FALSE,
                                                           MUIA_ShortHelp, STRING (ShortHelp_NS, "\33cInclude Netscape HTML extensions\n(\33isee documentation\33n)"),
                                                       End,

                                                       Child, Label1(STRING (EDIT_IncludeNS, "\033lNetscape")),


                                                       Child, CHK_OTHER = CheckMarkObject,
                                                           MUIA_Selected, FALSE,
                                                           MUIA_ShortHelp, STRING (ShortHelp_IncOther, "\33cInclude other HTML extensions\n(\33isee documentation\33n)"),
                                                       End,
                                                       Child, Label1(STRING (EDIT_Others, "\033lOthers...")),

                                                   End,

                                               End,

                                               Child, GR_INLINE = HGroup,
                                                   MUIA_Frame, MUIV_Frame_Group,
                                                   MUIA_FrameTitle, STRING (EDIT_Exclude, "Exclude"),
                                                   MUIA_Group_Columns, 2,
                                                   MUIA_Group_Rows,    2,

                                                       Child, CHK_INIMG = CheckMarkObject,
                                                           MUIA_Selected, FALSE,
                                                           MUIA_ShortHelp, STRING (ShortHelp_InlineImages, "\33cExclude image inclusion tags"),
                                                       End,
                                                       Child, Label1(STRING (EDIT_Inimgs, "\033lInlined images")),


                                                       Child, CHK_INBACK = CheckMarkObject,
                                                           MUIA_Selected, FALSE,
                                                           MUIA_ShortHelp, STRING (ShortHelp_InlineBackgrounds, "\33cExclude background inclusion tags"),
                                                       End,
                                                       Child, Label1(STRING (EDIT_Inbacks, "\033lInlined backgrounds")),


                                                       Child, CHK_INAPPL = CheckMarkObject,
                                                           MUIA_Selected, TRUE,
                                                           MUIA_ShortHelp, STRING (ShortHelp_InlineApplets, "\33cExclude applets inclusion tags"),
                                                       End,
                                                       Child, Label1(STRING (EDIT_Inappls, "\033lInlined applets")),


                                                       Child, CHK_INOBJ = CheckMarkObject,
                                                           MUIA_Selected, TRUE,
                                                           MUIA_ShortHelp, STRING (ShortHelp_InlineObjects, "\33cExclude generic object inclusion tags"),
                                                       End,
                                                       Child, Label1(STRING (EDIT_Inobjs, "\033lInlined objects")),

                                               End,
                                           End,


                                           Child, VGroup, // Download
                                           MUIA_HelpNode, "EDIT_Download",

                                                    MUIA_Frame, MUIV_Frame_Group,
                                                    MUIA_FrameTitle, STRING (EDIT_Download, "Download settings"),
                                                    // First Column
                                                    Child, HGroup,
                                                             Child, CHK_MAXSIZE = CheckMark(FALSE),
                                                             Child, Label2(STRING (EDIT_MaxSize, "Max size: ")),
                                                             Child, NUM_MAXSIZE = StringObject,
                                                                      MUIA_String_AdvanceOnCR, TRUE,
                                                                      MUIA_Frame, MUIV_Frame_String,
                                                                      MUIA_String_Accept, "0123456789",
                                                                      MUIA_String_Integer, 0L,
                                                                      MUIA_String_MaxLen,  8,
                                                                      MUIA_FixWidthTxt, "000000000",
                                                                      MUIA_Disabled,      TRUE,
                                                                    End,
                                                             Child, Label2("Kbyte"),
                                                             Child, HSpace (2),
                                                    End,
                                                  End,

                                  End,

                                  Child, HGroup,
                                           Child, BT_Use    = SimpleButton(STRING (MSG_Use,   "_Use")),
                                           Child, BT_Reset  = SimpleButton(STRING (MSG_Reset, "_Reset")),
                                           Child, BT_Cancel = SimpleButton(STRING (MSG_Cancel,"_Cancel")),
                                         End,
                                End,
                                TAG_MORE, msg->ops_AttrList);
// *INDENT-ON*





  if (obj)
    {
      register struct UrlEditWinData *data = (struct UrlEditWinData *) INST_DATA (cl, obj);

      //ergo, set data
      data->self = obj;

      data->STR_Url = STR_URL;
      data->STR_Title = STR_TITLE;
      data->STR_Name = STR_NAME;
      data->STR_Password = STR_PASS;

      // Links

      data->CYC_Server = CYC_SERVER;
      data->NUM_Levels = NUM_LEV;
      data->CYC_Direction = NULL;       //CYC_DIRECTION;

      data->STR_Extension = NULL;
      data->STR_Types = NULL;   //STR_TYPES;

      // HTML
      data->CYC_HTML = CYC_HTML;
      data->CHK_IE = CHK_IE;
      data->CHK_NS = CHK_NS;
      data->CHK_Other = CHK_OTHER;
      data->CHK_Inimg = CHK_INIMG;
      data->CHK_Inback = CHK_INBACK;
      data->CHK_Inappl = CHK_INAPPL;
      data->CHK_Inobj = CHK_INOBJ;

      // Download

      data->CHK_MaxSize = CHK_MAXSIZE;
      data->NUM_MaxSize = NUM_MAXSIZE;

      data->BT_Use = BT_Use;
      data->BT_Reset = BT_Reset;
      data->BT_Cancel = BT_Cancel;

      data->nd = (struct URLNode *) GetTagData (MUIA_UrlEditWin_URLNode, NULL, msg->ops_AttrList);
      data->parent = (APTR) GetTagData (MUIA_UrlEditWin_ProjWin, NULL, msg->ops_AttrList);
      data->wnd = (struct EditWinNode *) GetTagData (MUIA_UrlEditWin_WinNode, NULL, msg->ops_AttrList);

      /* The given hook will be called after every change */

      DoMethod ((ULONG *) STR_URL, MUIM_Notify,
                MUIA_String_Contents, MUIV_EveryTime,
                STR_URL, 3, MUIM_CallHook, &EndStrHook, MUIV_TriggerValue);

      // HTML
      /*
         DoMethod ((ULONG *) CYC_HTML, MUIM_Notify, MUIA_Cycle_Active, 0,
         GR_EXTS, 3, MUIM_Set, MUIA_Disabled, TRUE);

         DoMethod ((ULONG *) CYC_HTML, MUIM_Notify, MUIA_Cycle_Active, 1,
         GR_EXTS, 3, MUIM_Set, MUIA_Disabled, FALSE);

         DoMethod ((ULONG *) CYC_HTML, MUIM_Notify, MUIA_Cycle_Active, 2,
         GR_EXTS, 3, MUIM_Set, MUIA_Disabled, FALSE);



         DoMethod ((ULONG *) CYC_HTML, MUIM_Notify, MUIA_Cycle_Active, 0,
         GR_INLINE, 3, MUIM_Set, MUIA_Disabled, TRUE);

         DoMethod ((ULONG *) CYC_HTML, MUIM_Notify, MUIA_Cycle_Active, 1,
         GR_INLINE, 3, MUIM_Set, MUIA_Disabled, FALSE);

         DoMethod ((ULONG *) CYC_HTML, MUIM_Notify, MUIA_Cycle_Active, 2,
         GR_INLINE, 3, MUIM_Set, MUIA_Disabled, FALSE);



         DoMethod ((ULONG *) CHK_IE, MUIM_Notify, MUIA_Disabled, TRUE,
         CHK_IE, 3, MUIM_Set, MUIA_Selected, FALSE);

         DoMethod ((ULONG *) CHK_NS, MUIM_Notify, MUIA_Disabled, TRUE,
         CHK_NS, 3, MUIM_Set, MUIA_Selected, FALSE);

         DoMethod ((ULONG *) CHK_INAPPL, MUIM_Notify, MUIA_Disabled, TRUE,
         CHK_INAPPL, 3, MUIM_Set, MUIA_Selected, FALSE);

         DoMethod ((ULONG *) CHK_INOBJ, MUIM_Notify, MUIA_Disabled, TRUE,
         CHK_INOBJ, 3, MUIM_Set, MUIA_Selected, FALSE);
       */

      // Download

      DoMethod ((ULONG *) CYC_SERVER, MUIM_Notify, MUIA_Cycle_Active, 0,
                NUM_LEV, 3, MUIM_Set, MUIA_Disabled, TRUE);

      DoMethod ((ULONG *) CYC_SERVER, MUIM_Notify, MUIA_Cycle_Active, 1,
                NUM_LEV, 3, MUIM_Set, MUIA_Disabled, FALSE);

      DoMethod ((ULONG *) CYC_SERVER, MUIM_Notify, MUIA_Cycle_Active, 2,
                NUM_LEV, 3, MUIM_Set, MUIA_Disabled, FALSE);

      DoMethod ((ULONG *) CYC_SERVER, MUIM_Notify, MUIA_Cycle_Active, 3,
                NUM_LEV, 3, MUIM_Set, MUIA_Disabled, FALSE);


      DoMethod ((ULONG *) CHK_MAXSIZE, MUIM_Notify, MUIA_Selected, TRUE,
                NUM_MAXSIZE, 3, MUIM_Set, MUIA_Disabled, FALSE);

      DoMethod ((ULONG *) CHK_MAXSIZE, MUIM_Notify, MUIA_Selected, FALSE,
                NUM_MAXSIZE, 3, MUIM_Set, MUIA_Disabled, TRUE);

      DoMethod ((ULONG *) BT_Use, MUIM_Notify, MUIA_Pressed, FALSE,
                obj, 2, MUIM_UrlEditWin_Use, NULL);

      DoMethod ((ULONG *) BT_Reset, MUIM_Notify, MUIA_Pressed, FALSE,
                obj, 2, MUIM_UrlEditWin_Reset, NULL);

      DoMethod ((ULONG *) BT_Cancel, MUIM_Notify, MUIA_Pressed, FALSE,
                obj, 3, MUIM_Set, MUIA_Window_CloseRequest, TRUE);


      DoMethod ((ULONG *) obj,
                MUIM_Window_SetCycleChain, REG_OBJ,
                STR_URL,
                STR_TITLE,

                STR_NAME,
                STR_PASS,

                CYC_SERVER,
                NUM_LEV,

                CYC_HTML,
                CHK_IE,
                CHK_NS,
                CHK_OTHER,
                CHK_INIMG,
                CHK_INBACK,
                CHK_INAPPL,
                CHK_INOBJ,

                CHK_MAXSIZE,
                NUM_MAXSIZE,

                BT_Use,
                BT_Reset,
                BT_Cancel,
                NULL);

      DoMethod ((ULONG *) oa->App, OM_ADDMEMBER, obj);
      DoMethod ((ULONG *) obj, MUIM_UrlEditWin_Reset, NULL);
      set ((ULONG *) obj, MUIA_Window_Open, TRUE);

      return ((ULONG) obj);
    }
  else
    {
      D (printf ("UrlEditWin: New error\n"));
      error_req (STRING (MSG_OK, "*_OK"), STRING (ERR_NOMEM, "Out of Memory"));
    }

  return (NULL);
}
///

/// "Dispose"
ULONG
mUrlEditWin_Dispose (struct IClass * cl, Object * obj, Msg msg)
{
  register struct UrlEditWinData *data = (struct UrlEditWinData *) INST_DATA (cl, obj);

  if (data->wnd)
    {
      Remove ((struct Node *) data->wnd);
      FreeSPooled (gd.gd_pool, data->wnd, sizeof (struct EditWinNode));
      data->wnd = NULL;
    }

  DoMethod ((ULONG *) oa->App, OM_REMMEMBER, obj);

  return (DoSuperMethodA (cl, obj, msg));
}
///

/// "Set"
ULONG
mUrlEditWin_Set (struct IClass * cl, Object * obj, Msg msg)
{
  register struct UrlEditWinData *data = (struct UrlEditWinData *) INST_DATA (cl, obj);

  struct TagItem *tags, *tag;
  for (tags = ((struct opSet *) msg)->ops_AttrList; (tag = (struct TagItem *) NextTagItem (&tags));)
    {
      switch (tag->ti_Tag)
        {
        case MUIA_UrlEditWin_URLNode:
          data->nd = (struct URLNode *) tag->ti_Data;
          DoMethod (obj, MUIM_UrlEditWin_Reset, NULL);
          break;

        case MUIA_UrlEditWin_ProjWin:
          data->parent = (APTR) tag->ti_Data;
          break;

        case MUIA_Window_CloseRequest:
          if (tag->ti_Data == TRUE)
            {

              if (data->nd)
                {
                  data->nd->status = ST_CLEAR;
                  DoMethod ((ULONG *) data->parent, MUIM_NList_RedrawEntry, data->nd);
                }

              DoMethod ((ULONG *) oa->App, MUIM_Application_PushMethod, obj, 2, OM_DISPOSE, NULL);
              return (NULL);
            }
          break;

        }
    }

  return (DoSuperMethodA (cl, obj, msg));
}
///

/// "Use"
ULONG
mUrlEditWin_Use (struct IClass * cl, Object * obj, Msg msg)
{
  register struct UrlEditWinData *data = (struct UrlEditWinData *) INST_DATA (cl, obj);
  struct URLNode *nd = data->nd, *nd2;
  char *buffer;
  LONG num_buffer;

  if ((nd2 = (struct URLNode *) AllocSPooled (gd.gd_pool, sizeof (struct URLNode))))
    {
      memset (nd2, 0, sizeof (struct URLNode));

      // Url data

      get (data->STR_Url, MUIA_String_Contents, &buffer);

      if ((nd2->url = newstrcpy (gd.gd_pool, buffer)))
        {

          get (data->STR_Title, MUIA_String_Contents, &buffer);
          nd2->title = newstrcpy (gd.gd_pool, buffer);

          get (data->STR_Name, MUIA_String_Contents, &buffer);
          nd2->name = newstrcpy (gd.gd_pool, buffer);

          get (data->STR_Password, MUIA_String_Contents, &buffer);
          nd2->password = newstrcpy (gd.gd_pool, buffer);


          // Links

          get (data->CYC_Server, MUIA_Cycle_Active, &num_buffer);

          if (num_buffer == 0)  /* None server ? */
            {
              nd2->flags &= ~(URLN_SAMESERVER | URLN_EXTERNSERVER);
            }
          else if (num_buffer == 1)     /* Same server ? */
            {
              nd2->flags |= URLN_SAMESERVER;
              nd2->flags &= ~URLN_EXTERNSERVER;
            }
          else if (num_buffer == 2)     /* ext ?? */
            {
              nd2->flags &= ~URLN_SAMESERVER;
              nd2->flags |= URLN_EXTERNSERVER;
            }
          else if (num_buffer == 3)     /* all ?? */
            {
              nd2->flags |= (URLN_SAMESERVER | URLN_EXTERNSERVER);
            }


          get (data->NUM_Levels, MUIA_Numeric_Value, &num_buffer);
          nd2->depth = num_buffer;


          //get (data->CYC_Direction, MUIA_Cycle_Active, &num_buffer);

          /*if (num_buffer == 0)  // forward
             {
             nd2->flags |= URLN_FORWARD;
             nd2->flags &= ~URLN_BACKWARD;
             }
             else if (num_buffer == 1)     // backward
             {
             nd2->flags |= URLN_BACKWARD;
             nd2->flags &= ~URLN_FORWARD;
             }
             else if (num_buffer == 2)     // both
             { */
          nd2->flags &= ~(URLN_FORWARD | URLN_BACKWARD);
          //}

          // HTML
          get (data->CYC_HTML, MUIA_Cycle_Active, &num_buffer);


          if (num_buffer == 0)  /* HTML 2.0 */
            {
              nd2->htmlflags &= ~(HTML_HTML_32 | HTML_HTML_40);
              nd2->htmlflags |= HTML_HTML_20;
            }
          else if (num_buffer == 1)     /* HTML 3.2 */
            {
              nd2->htmlflags &= ~(HTML_HTML_20 | HTML_HTML_40);
              nd2->htmlflags |= HTML_HTML_32;
            }
          else if (num_buffer == 2)     /* HTML 4.0 */
            {
              nd2->htmlflags &= ~(HTML_HTML_20 | HTML_HTML_32);
              nd2->htmlflags |= HTML_HTML_40;
            }

          get (data->CHK_IE, MUIA_Selected, &num_buffer);

          if (num_buffer == TRUE)
            {
              nd2->htmlflags |= HTML_HTML_IE;
            }

          get (data->CHK_NS, MUIA_Selected, &num_buffer);

          if (num_buffer == TRUE)
            {
              nd2->htmlflags |= HTML_HTML_NS;
            }

          get (data->CHK_Other, MUIA_Selected, &num_buffer);

          if (num_buffer == TRUE)
            {
              nd2->htmlflags |= HTML_HTML_OTHER;
            }

          get (data->CHK_Inimg, MUIA_Selected, &num_buffer);


          if (num_buffer == TRUE)
            {
              nd2->htmlflags |= HTML_HTML_INIMG
            }

          get (data->CHK_Inback, MUIA_Selected, &num_buffer);

          if (num_buffer == TRUE)
            {
              nd2->htmlflags |= HTML_HTML_INBACK;
            }

          get (data->CHK_Inappl, MUIA_Selected, &num_buffer);

          if (num_buffer == TRUE)
            {
              nd2->htmlflags |= HTML_HTML_INAPPL;
            }

          get (data->CHK_Inobj, MUIA_Selected, &num_buffer);

          if (num_buffer == TRUE)
            {
              nd2->htmlflags |= HTML_HTML_INOBJ;
            }


          // Download

          get (data->CHK_MaxSize, MUIA_Selected, &num_buffer);

          if (num_buffer == TRUE)
            {
              get (data->NUM_MaxSize, MUIA_String_Integer, &num_buffer);
              nd2->maxsize = num_buffer;
            }
          else
            nd2->maxsize = 0;

          nd2->status = ST_CLEAR;
          nd2->size = 0;
          memset (&nd2->date, 0, sizeof (struct DateStamp));

          if (nd)
            {
              DoMethod ((ULONG *) data->parent,
                        MUIM_ProjWin_ChangeNode, nd, nd2);

            }
          else
            {
              DoMethod ((ULONG *) data->parent,
                        MUIM_ProjWin_AddNode, nd2);
            }

          data->parent = NULL;
          data->nd = NULL;

          return ((ULONG) set (obj, MUIA_Window_CloseRequest, TRUE));

        }

      FreeUrlNode (nd2);
    }

  return (NULL);
}
///

/// "Reset"
ULONG
mUrlEditWin_Reset (struct IClass * cl, Object * obj, Msg msg)
{
  register struct UrlEditWinData *data = (struct UrlEditWinData *) INST_DATA (cl, obj);
  char *null_str = "";
  struct URLNode *nd = data->nd;

  if (nd)
    {
      set (data->STR_Url, MUIA_String_Contents, nd->url);

      if (nd->title)
        set (data->STR_Title, MUIA_String_Contents, nd->title);
      else
        set (data->STR_Title, MUIA_String_Contents, null_str);

      if (nd->name)
        set (data->STR_Name, MUIA_String_Contents, nd->name);
      else
        set (data->STR_Name, MUIA_String_Contents, null_str);

      if (nd->password)
        set (data->STR_Password, MUIA_String_Contents, nd->password);
      else
        set (data->STR_Password, MUIA_String_Contents, null_str);


      // Links

      set (data->NUM_Levels, MUIA_Disabled, FALSE);

      if ((nd->flags & URLN_SAMESERVER) && (nd->flags & URLN_EXTERNSERVER))
        set (data->CYC_Server, MUIA_Cycle_Active, 3);
      else if (nd->flags & URLN_EXTERNSERVER)
        set (data->CYC_Server, MUIA_Cycle_Active, 2);
      else if (nd->flags & URLN_SAMESERVER)
        set (data->CYC_Server, MUIA_Cycle_Active, 1);
      else
        {
          set (data->CYC_Server, MUIA_Cycle_Active, 0);
          set (data->NUM_Levels, MUIA_Disabled, TRUE);
        }

      set (data->NUM_Levels, MUIA_Numeric_Value, nd->depth);


      // HTML

      if (nd->htmlflags & HTML_HTML_40)
        {
          set (data->CYC_HTML, MUIA_Cycle_Active, 2);
        }
      else if (nd->htmlflags & HTML_HTML_32)
        {
          set (data->CYC_HTML, MUIA_Cycle_Active, 1);
        }
      else
        /* HTML_20_TAGS */
        {
          set (data->CYC_HTML, MUIA_Cycle_Active, 0);
        }

      if (nd->htmlflags & HTML_HTML_IE)
        set (data->CHK_IE, MUIA_Selected, TRUE);
      else
        set (data->CHK_IE, MUIA_Selected, FALSE);

      if (nd->htmlflags & HTML_HTML_NS)
        set (data->CHK_NS, MUIA_Selected, TRUE);
      else
        set (data->CHK_NS, MUIA_Selected, FALSE);


      if (nd->htmlflags & HTML_HTML_OTHER)
        set (data->CHK_Other, MUIA_Selected, TRUE);
      else
        set (data->CHK_Other, MUIA_Selected, FALSE);


      if (nd->htmlflags & HTML_HTML_INIMG)
        set (data->CHK_Inimg, MUIA_Selected, TRUE);
      else
        set (data->CHK_Inimg, MUIA_Selected, FALSE);

      if (nd->htmlflags & HTML_HTML_INBACK)
        set (data->CHK_Inback, MUIA_Selected, TRUE);
      else
        set (data->CHK_Inback, MUIA_Selected, FALSE);

      // Inlined exclusion

      if (nd->htmlflags & HTML_HTML_INAPPL)
        set (data->CHK_Inappl, MUIA_Selected, TRUE);
      else
        set (data->CHK_Inappl, MUIA_Selected, FALSE);

      if (nd->htmlflags & HTML_HTML_INOBJ)
        set (data->CHK_Inobj, MUIA_Selected, TRUE);
      else
        set (data->CHK_Inobj, MUIA_Selected, FALSE);

      // Download

      if (nd->maxsize > 0L)
        {
          set (data->CHK_MaxSize, MUIA_Selected, TRUE);
          set (data->NUM_MaxSize, MUIA_String_Integer, nd->maxsize);
        }
      else
        {
          set (data->CHK_MaxSize, MUIA_Selected, FALSE);
          set (data->NUM_MaxSize, MUIA_String_Integer, 0L);
        }
    }
  else
    {
      set (data->STR_Url, MUIA_String_Contents, "http://");
      set (data->STR_Title, MUIA_String_Contents, null_str);
      set (data->STR_Name, MUIA_String_Contents, null_str);
      set (data->STR_Password, MUIA_String_Contents, null_str);

      set (data->CYC_HTML, MUIA_Cycle_Active, 2);
      set (data->CHK_IE, MUIA_Selected, FALSE);
      set (data->CHK_NS, MUIA_Selected, FALSE);
      set (data->CHK_Other, MUIA_Selected, FALSE);
      set (data->CHK_Inimg, MUIA_Selected, FALSE);
      set (data->CHK_Inback, MUIA_Selected, FALSE);
      set (data->CHK_Inappl, MUIA_Selected, TRUE);
      set (data->CHK_Inobj, MUIA_Selected, TRUE);


      set (data->CYC_Server, MUIA_Cycle_Active, 0);
      set (data->NUM_Levels, MUIA_Disabled, TRUE);
      set (data->NUM_Levels, MUIA_Numeric_Value, 0L);

      set (data->CHK_MaxSize, MUIA_Selected, FALSE);
      set (data->NUM_MaxSize, MUIA_String_Integer, 0L);
    }

  return (NULL);
}
///

/// "Dispatcher"
SAVEDS (ULONG)
UrlEditWin_Dispatcher (REG (a0, struct IClass * cl), REG (a2, Object * obj), REG (a1, Msg msg))
{
  switch (msg->MethodID)
    {
    case OM_NEW:
      return ((ULONG) mUrlEditWin_New (cl, obj, (struct opSet *) msg));
    case OM_DISPOSE:
      return ((ULONG) mUrlEditWin_Dispose (cl, obj, (Msg) msg));
    case OM_SET:
      return ((ULONG) mUrlEditWin_Set (cl, obj, (Msg) msg));

    case MUIM_UrlEditWin_Reset:
      return ((ULONG) mUrlEditWin_Reset (cl, obj, (Msg) msg));

    case MUIM_UrlEditWin_Use:
      return ((ULONG) mUrlEditWin_Use (cl, obj, (Msg) msg));
    }
  return (DoSuperMethodA (cl, (ULONG *) obj, msg));
}
///
