{Dialog visual part, depends of Dialog window}
  procedure SHControl(ctrl,mode:dword);
  begin
    ShowWindow(GetDlgItem(Dialog,ctrl),mode);
  end;

  procedure SetupControls(group,mode:dword);
  begin
    case group of
      ACT_CONTACT: begin
        SHControl(IDC_STAT_CONTACT,mode);
        SHControl(IDC_CONTACTLIST ,mode);
        SHControl(IDC_CNT_KEEP    ,mode);
        SHControl(IDC_CNT_FILTER  ,mode);
        SHControl(IDC_STAT_FORMAT ,mode);
        SHControl(IDC_EDIT_FORMAT ,mode);
        SHControl(IDC_CNT_APPLY   ,mode);
        SHControl(IDC_STAT_FHELP  ,mode);
      end;
      ACT_SERVICE: begin
        SHControl(IDC_STAT_WPAR   ,mode);
        SHControl(IDC_STAT_LPAR   ,mode);
        SHControl(IDC_STAT_WPAR1  ,mode);
        SHControl(IDC_STAT_LPAR1  ,mode);
        SHControl(IDC_STAT_SERVICE,mode);
        SHControl(IDC_EDIT_SERVICE,mode);
        SHControl(IDC_SRV_SRVC    ,mode);
        SHControl(IDC_FLAG_WPAR   ,mode);
        SHControl(IDC_FLAG_LPAR   ,mode);

        SHControl(IDC_RES_GROUP   ,mode);
        SHControl(IDC_RES_POPUP   ,mode);
        SHControl(IDC_RES_MESSAGE ,mode);
        SHControl(IDC_RES_INSERT  ,mode);

        SHControl(IDC_SRV_RESULT  ,mode);
        SHControl(IDC_SRV_RESSTAT ,mode);

        if mode=SW_SHOW then
        begin
//!! Check parameter type
          if CB_GetData(GetDlgItem(Dialog,IDC_FLAG_WPAR))=ptStruct then
//          if SendDlgItemMessage(Dialog,IDC_FLAG_WPAR,CB_GETCURSEL,0,0)=ptStruct then
          begin
            SHControl(IDC_WSTRUCT  ,SW_SHOW);
            SHControl(IDC_EDIT_WPAR,SW_HIDE);
            SHControl(IDC_SRV_WPAR ,SW_HIDE);
          end
          else
          begin
            SHControl(IDC_WSTRUCT  ,SW_HIDE);
            SHControl(IDC_EDIT_WPAR,SW_SHOW);
            SHControl(IDC_SRV_WPAR ,SW_SHOW);
          end;
          if CB_GetData(GetDlgItem(Dialog,IDC_FLAG_LPAR))=ptStruct then
//          if SendDlgItemMessage(Dialog,IDC_FLAG_LPAR,CB_GETCURSEL,0,0)=ptStruct then
          begin
            SHControl(IDC_LSTRUCT  ,SW_SHOW);
            SHControl(IDC_EDIT_LPAR,SW_HIDE);
            SHControl(IDC_SRV_LPAR ,SW_HIDE);
          end
          else
          begin
            SHControl(IDC_LSTRUCT  ,SW_HIDE);
            SHControl(IDC_EDIT_LPAR,SW_SHOW);
            SHControl(IDC_SRV_LPAR ,SW_SHOW);
          end;

          case CB_GetData(GetDlgItem(Dialog,IDC_SRV_RESULT)) of
            sresHex: ;
            sresInt: SHControl(IDC_RES_SIGNED,SW_SHOW);
            sresString: begin
              SHControl(IDC_RES_UNICODE,SW_SHOW);
              SHControl(IDC_RES_FREEMEM,SW_SHOW);
            end;
            sresStruct: ;
          end;

        end
        else
        begin
          SHControl(IDC_WSTRUCT    ,SW_HIDE);
          SHControl(IDC_LSTRUCT    ,SW_HIDE);
          SHControl(IDC_SRV_WPAR   ,SW_HIDE);
          SHControl(IDC_SRV_LPAR   ,SW_HIDE);
          SHControl(IDC_EDIT_WPAR  ,SW_HIDE);
          SHControl(IDC_EDIT_LPAR  ,SW_HIDE);
          SHControl(IDC_RES_FREEMEM,SW_HIDE);
          SHControl(IDC_RES_UNICODE,SW_HIDE);
          SHControl(IDC_RES_SIGNED ,SW_HIDE);
        end;
      end;
      ACT_PROGRAM: begin
        SHControl(IDC_PROCESS_GROUP,mode);
        SHControl(IDC_PROGRAM      ,mode);
        SHControl(IDC_EDIT_PROCTIME,mode);
        SHControl(IDC_EDIT_PRGPATH ,mode);
        SHControl(IDC_PRG_PRG      ,mode);
        SHControl(IDC_EDIT_PRGARGS ,mode);
        SHControl(IDC_PRG_ARG      ,mode);
        SHControl(IDC_STAT_PROCTIME,mode);
        SHControl(IDC_STAT_PRGPATH ,mode);
        SHControl(IDC_STAT_PRGARGS ,mode);

        SHControl(IDC_PRSTART_GROUP,mode);
        SHControl(IDC_FLAG_NORMAL  ,mode);
        SHControl(IDC_FLAG_HIDDEN  ,mode);
        SHControl(IDC_FLAG_MAXIMIZE,mode);
        SHControl(IDC_FLAG_MINIMIZE,mode);

        SHControl(IDC_FLAG_CURPATH,mode);
        SHControl(IDC_FLAG_CONTINUE,mode);
        SHControl(IDC_FLAG_PARALLEL,mode);

        if mode=SW_SHOW then
        begin
          if isVarsInstalled then
             SHControl(IDC_HLP_FVARS,SW_SHOW);
        end
        else
          SHControl(IDC_HLP_FVARS,SW_HIDE);
      end;
      ACT_TEXT: begin
        SHControl(IDC_FLAG_CLIP   ,mode);
        SHControl(IDC_FLAG_MESSAGE,mode);
        SHControl(IDC_CLIP_COPYTO ,mode);
        SHControl(IDC_CLIP_PASTE  ,mode);
        SHControl(IDC_CLIP_GROUP  ,mode);
        SHControl(IDC_FILE_ENC    ,mode);

        SHControl(IDC_FLAG_FILE   ,mode);
        SHControl(IDC_FILE_PATH   ,mode);
        SHControl(IDC_TXT_FILE    ,mode);
        SHControl(IDC_FILE_FILEBTN,mode);
        SHControl(IDC_FILE_READ   ,mode);
        SHControl(IDC_FILE_WRITE  ,mode);
        SHControl(IDC_FILE_APPEND ,mode);
        SHControl(IDC_FILE_GROUP  ,mode);

        SHControl(IDC_TXT_TEXT     ,mode);
        SHControl(IDC_EDIT_INSERT  ,mode);
        SHControl(IDC_STAT_INSERT  ,mode);

        if mode=SW_SHOW then
        begin
          if isVarsInstalled then
             SHControl(IDC_HLP_VARS,SW_SHOW);
        end
        else
          SHControl(IDC_HLP_VARS,SW_HIDE);
      end;
      ACT_ADVANCE: begin
        SHControl(IDC_CONDITION,mode);
        SHControl(IDC_FLAG_GT  ,mode);
        SHControl(IDC_FLAG_LT  ,mode);
        SHControl(IDC_FLAG_EQ  ,mode);
        SHControl(IDC_FLAG_NOP ,mode);
        SHControl(IDC_FLAG_NOT ,mode);
        SHControl(IDC_ADV_VALUE,mode);
        SHControl(IDC_STAT_VAL ,mode);
        SHControl(IDC_ADV_ASINT,mode);

        SHControl(IDC_OPERATION ,mode);
        SHControl(IDC_FLAG_BREAK,mode);
        SHControl(IDC_FLAG_JUMP ,mode);
        SHControl(IDC_FLAG_ANOP ,mode);

        SHControl(IDC_FLAG_MATH,mode);
        SHControl(IDC_ADV_OPER ,mode);
        SHControl(IDC_ADV_VAL2 ,mode);
        SHControl(IDC_ADV_VAL1 ,mode);

        if mode=SW_SHOW then
        begin
          if isVarsInstalled then
             SHControl(IDC_ADV_HVARS,SW_SHOW);
        end
        else
          SHControl(IDC_ADV_HVARS,SW_HIDE);
        SHControl(IDC_FLAG_VARS,mode);
        SHControl(IDC_ADV_VARS ,mode);
      end;
      ACT_CHAIN: begin
        SHControl(IDC_STAT_GROUPS,mode);
        SHControl(IDC_GROUP_LIST ,mode);
      end;
      ACT_RW: begin
        SHControl(IDC_STAT_CONTACT,mode);
        SHControl(IDC_CONTACTLIST ,mode);

        SHControl(IDC_RW_OPER   ,mode);
        SHControl(IDC_RW_VAL    ,mode);
        SHControl(IDC_RW_READ   ,mode);
        SHControl(IDC_RW_WRITE  ,mode);
        SHControl(IDC_RW_DELETE ,mode);
        SHControl(IDC_RW_STATM  ,mode);
        SHControl(IDC_RW_MODULE ,mode);
        SHControl(IDC_RW_STATS  ,mode);
        SHControl(IDC_RW_SETTING,mode);
        SHControl(IDC_RW_TVAR   ,mode);

        if mode=SW_SHOW then
        begin
          if CB_GetData(GetDlgItem(Dialog,IDC_RW_DATATYPE))>2 then
          begin
            SHControl(IDC_RW_VALUE,SW_HIDE);
            SHControl(IDC_RW_TEXT ,SW_SHOW);
          end
          else
          begin
            SHControl(IDC_RW_VALUE,SW_SHOW);
            SHControl(IDC_RW_TEXT ,SW_HIDE);
          end
        end
        else
        begin
          SHControl(IDC_RW_VALUE,SW_HIDE);
          SHControl(IDC_RW_TEXT ,SW_HIDE);
        end;
        SHControl(IDC_RW_DATATYPE,mode);

        SHControl(IDC_RW_CURRENT,mode);
        SHControl(IDC_RW_PARAM  ,mode);
        SHControl(IDC_RW_RESULT ,mode);
        SHControl(IDC_RW_MANUAL ,mode);
        SHControl(IDC_RW_LAST   ,mode);

        SHControl(IDC_RW_MVAR   ,mode);
        SHControl(IDC_RW_SVAR   ,mode);
      end;
      ACT_MESSAGE: begin
        SHControl(IDC_MSG_KEEP  ,mode);
        SHControl(IDC_MSG_STAT1 ,mode);
        SHControl(IDC_MSG_STAT2 ,mode);
        SHControl(IDC_MSG_TITLE ,mode);
        SHControl(IDC_MSG_TEXT  ,mode);
        SHControl(IDC_MSG_BTNS  ,mode);
        SHControl(IDC_MSGB_ARI  ,mode);
        SHControl(IDC_MSGB_OK   ,mode);
        SHControl(IDC_MSGB_OC   ,mode);
        SHControl(IDC_MSGB_RC   ,mode);
        SHControl(IDC_MSGB_YN   ,mode);
        SHControl(IDC_MSGB_YNC  ,mode);
        SHControl(IDC_MSG_ICONS ,mode);
        SHControl(IDC_MSGI_NONE ,mode);
        SHControl(IDC_MSGI_WARN ,mode);
        SHControl(IDC_MSGI_INFO ,mode);
        SHControl(IDC_MSGI_QUEST,mode);
        SHControl(IDC_MSGI_ERROR,mode);

        SHControl(IDC_MSG_TTL   ,mode);
        SHControl(IDC_MSG_TXT   ,mode);
      end;
    end;
  end;

  procedure SetButtonOnOff(ctrl,state:dword);
  begin
    CheckDlgButton(Dialog,ctrl,state);
    case ctrl of
      IDC_SRV_WPAR,
      IDC_SRV_LPAR,
      IDC_SRV_SRVC,
      IDC_PRG_PRG ,
      IDC_PRG_ARG ,
      IDC_TXT_FILE,
      IDC_TXT_TEXT,
      IDC_RW_MVAR ,
      IDC_RW_SVAR ,
      IDC_RW_TVAR ,
      IDC_MSG_TTL ,
      IDC_MSG_TXT : SetButtonIcon(GetDlgItem(Dialog,ctrl),checknames[state]);
     end;
  end;

  procedure ButtonOff(ctrl:dword); {$IFDEF MSWINDOWS}inline;{$ENDIF}
  begin
    SetButtonOnOff(ctrl,BST_UNCHECKED);
  end;

  procedure ButtonOn(ctrl:dword); {$IFDEF MSWINDOWS}inline;{$ENDIF}
  begin
    SetButtonOnOff(ctrl,BST_CHECKED);
  end;

  procedure TextClear(ctrl:dword);
  begin
    SetDlgItemTextW(Dialog,ctrl,nil);
  end;

  function FixParam(buf:PAnsiChar;flag:integer):integer;
  begin
    if      lstrcmpia(buf,Translate('hContact' ))=0 then result:=ptCurrent
    else if lstrcmpia(buf,Translate('parameter'))=0 then result:=ptParam
    else if lstrcmpia(buf,Translate('result'   ))=0 then result:=ptResult
    else if lstrcmpia(buf,Translate('structure'))=0 then result:=ptStruct
    else
    begin
      if (buf[0] in ['0'..'9']) or ((buf[0]='-') and (buf[1] in ['0'..'9'])) or
        ((buf[0]='$') and (buf[1] in sHexNum)) then
        result:=ptNumber
      else
        result:=ptString;
    end;

    CB_SelectData(Dialog,flag,result);
//    SendDlgItemMessage(Dialog,flag,CB_SETCURSEL,result,0);
    SendMessage(Dialog,WM_COMMAND,(CBN_SELCHANGE shl 16) or flag,GetDlgItem(Dialog,flag));
  end;

  procedure ReloadService;
  var
    pc:pAnsiChar;
    buf,buf1:array [0..MaxDescrLen] of AnsiChar;
    wnd:hwnd;
    i:integer;
//    bufw:array [0..MaxDescrLen] of WideChar;
  begin
    wnd:=GetDlgItem(Dialog,IDC_EDIT_SERVICE);
    SendMessageA(wnd,CB_GETLBTEXT,SendMessage(wnd,CB_GETCURSEL,0,0),tlparam(@buf));
    ApiCard.Service:=@buf;

    pc:=ApiCard.FillParams(GetDlgItem(Dialog,IDC_EDIT_WPAR),true);
    if pc<>nil then
    begin
      if GetDlgItemTextA(Dialog,IDC_EDIT_WPAR,buf1,SizeOf(buf1))>0 then
        case FixParam(@buf1,IDC_FLAG_WPAR) of
          ptStruct: begin
            mFreeMem(wstruct);
            StrDup(wstruct,StrScan(pc,'|')+1);
//            AnsiToWide(StrScan(pc,'|')+1,wstruct,MirandaCP);
          end;
        end;
      mFreeMem(pc);
    end;

    pc:=ApiCard.FillParams(GetDlgItem(Dialog,IDC_EDIT_LPAR),false);
    if pc<>nil then
    begin
      if GetDlgItemTextA(Dialog,IDC_EDIT_LPAR,buf1,SizeOf(buf1))>0 then
        case FixParam(@buf1,IDC_FLAG_LPAR) of
          ptStruct: begin
            mFreeMem(lstruct);
            StrDup(lstruct,StrScan(pc,'|')+1);
//            AnsiToWide(StrScan(pc,'|')+1,lstruct,MirandaCP);
          end;
        end;
      mFreeMem(pc);
    end;

    pc:=ApiCard.ResultType;
    i:=sresInt;
    if pc<>nil then
    begin
      if      lstrcmpia(pc,'struct')=0 then i:=sresStruct
      else if lstrcmpia(pc,'hex'   )=0 then i:=sresHex
      else if lstrcmpia(pc,'int')=0 then
      begin
        i:=sresInt;
        ButtonOff(IDC_RES_SIGNED);
      end
      else if lstrcmpia(pc,'signed')=0 then
      begin
        i:=sresInt;
        ButtonOn(IDC_RES_SIGNED);
      end
      else if lstrcmpia(pc,'str')=0 then
      begin
        i:=sresString;
        ButtonOff(IDC_RES_UNICODE);
      end
      else if lstrcmpia(pc,'wide')=0 then
      begin
        i:=sresString;
        ButtonOn(IDC_RES_UNICODE);
      end;
      mFreeMem(pc);
    end;
    CB_SelectData(Dialog,IDC_SRV_RESULT,i);

//    ApiCard.Show;
  end;

  procedure SelectActionType(group:dword);
  var
    i:integer;
  begin
    for i:=0 to ACT_MAXTYPE-1 do
      if ActIds[i].code=group then break;
    SendDlgItemMessage(Dialog,IDC_ACTION_TYPE,CB_SETCURSEL,i,0);
  end;

  procedure ClearControls(group:dword);
  begin
//!    SelectActionType(group);
    case group of
      ACT_CONTACT: begin
        EnableWindow(GetDlgItem(Dialog,IDC_CONTACTLIST),true);
        SendDlgItemMessage(Dialog,IDC_CONTACTLIST,CB_SETCURSEL,0,0);
        ButtonOff(IDC_CNT_KEEP);
        ButtonOff(IDC_CNT_FILTER);
        TextClear(IDC_EDIT_FORMAT);
      end;
      ACT_SERVICE: begin
        TextClear(IDC_EDIT_SERVICE);
        TextClear(IDC_EDIT_WPAR);
        TextClear(IDC_EDIT_LPAR);
        EnableWindow(GetDlgItem(Dialog,IDC_EDIT_WPAR),true);
        EnableWindow(GetDlgItem(Dialog,IDC_EDIT_LPAR),true);
//        SendDlgItemMessage(Dialog,IDC_FLAG_WPAR,CB_SETCURSEL,0,0);
//        SendDlgItemMessage(Dialog,IDC_FLAG_LPAR,CB_SETCURSEL,0,0);
        CB_SelectData(GetDlgItem(Dialog,IDC_FLAG_WPAR),ptNumber);
        CB_SelectData(GetDlgItem(Dialog,IDC_FLAG_LPAR),ptNumber);

        CB_SelectData(GetDlgItem(Dialog,IDC_SRV_RESULT),sresInt);

        SendMessage(GetDlgItem(Dialog,IDC_EDIT_WPAR),CB_RESETCONTENT,0,0);
        SendMessage(GetDlgItem(Dialog,IDC_EDIT_LPAR),CB_RESETCONTENT,0,0);

        ButtonOff(IDC_RES_POPUP);
        ButtonOff(IDC_RES_MESSAGE);
        ButtonOff(IDC_RES_INSERT);

        ButtonOff(IDC_RES_FREEMEM);
        ButtonOff(IDC_RES_UNICODE);
        ButtonOff(IDC_RES_SIGNED);

        ButtonOff(IDC_SRV_WPAR);
        ButtonOff(IDC_SRV_LPAR);
        ButtonOff(IDC_SRV_SRVC);
      end;
      ACT_PROGRAM: begin
        TextClear(IDC_EDIT_PROCTIME);
        TextClear(IDC_EDIT_PRGPATH);
        TextClear(IDC_EDIT_PRGARGS);

        ButtonOff(IDC_FLAG_NORMAL);
        ButtonOff(IDC_FLAG_HIDDEN);
        ButtonOff(IDC_FLAG_MINIMIZE);
        ButtonOff(IDC_FLAG_MAXIMIZE);

        ButtonOff(IDC_FLAG_CURPATH);
        ButtonOff(IDC_FLAG_CONTINUE);
        ButtonOff(IDC_FLAG_PARALLEL);

        ButtonOff(IDC_PRG_PRG);
        ButtonOff(IDC_PRG_ARG);
      end;
      ACT_TEXT: begin
        ButtonOff(IDC_FLAG_CLIP);
        ButtonOff(IDC_FLAG_MESSAGE);
        ButtonOff(IDC_CLIP_COPYTO);
        ButtonOff(IDC_CLIP_PASTE);

        ButtonOff(IDC_FLAG_FILE);
        TextClear(IDC_FILE_PATH);
        ButtonOff(IDC_FILE_READ);
        ButtonOff(IDC_FILE_WRITE);
        ButtonOff(IDC_FILE_APPEND);
        
        EnableWindow(GetDlgItem(Dialog,IDC_EDIT_INSERT ),false);
        EnableWindow(GetDlgItem(Dialog,IDC_CLIP_COPYTO ),false);
        EnableWindow(GetDlgItem(Dialog,IDC_CLIP_PASTE  ),false);

        EnableWindow(GetDlgItem(Dialog,IDC_FILE_ENC    ),false);
        EnableWindow(GetDlgItem(Dialog,IDC_FILE_PATH   ),false);
        EnableWindow(GetDlgItem(Dialog,IDC_FILE_FILEBTN),false);
        EnableWindow(GetDlgItem(Dialog,IDC_FILE_READ   ),false);
        EnableWindow(GetDlgItem(Dialog,IDC_FILE_WRITE  ),false);
        EnableWindow(GetDlgItem(Dialog,IDC_FILE_APPEND ),false);

        TextClear(IDC_EDIT_INSERT);

        ButtonOff(IDC_TXT_FILE);
        ButtonOff(IDC_TXT_TEXT);
      end;
      ACT_ADVANCE: begin
        ButtonOff(IDC_FLAG_GT);
        ButtonOff(IDC_FLAG_LT);
        ButtonOff(IDC_FLAG_EQ);
        ButtonOff(IDC_FLAG_NOP);
        ButtonOff(IDC_FLAG_NOT);
        TextClear(IDC_ADV_VALUE);

        ButtonOff(IDC_FLAG_BREAK);
        ButtonOff(IDC_FLAG_JUMP);
        ButtonOff(IDC_FLAG_ANOP);
        EnableWindow(GetDlgItem(Dialog,IDC_ADV_VAL2),false);

        ButtonOff(IDC_FLAG_MATH);
        SendDlgItemMessage(Dialog,IDC_ADV_OPER,CB_SETCURSEL,0,0);
        TextClear(IDC_ADV_VAL1);
        ButtonOff(IDC_ADV_ASINT);

        EnableWindow(GetDlgItem(Dialog,IDC_ADV_OPER),false);
        EnableWindow(GetDlgItem(Dialog,IDC_ADV_VAL1),false);
        EnableWindow(GetDlgItem(Dialog,IDC_ADV_VARS),false);

        ButtonOff(IDC_FLAG_VARS);
        TextClear(IDC_ADV_VARS);
      end;
      ACT_CHAIN: begin
//        FillChainList(Dialog);
        SendDlgItemMessage(Dialog,IDC_GROUP_LIST,CB_SETCURSEL,0,0);
      end;
      ACT_RW: begin
        ButtonOff(IDC_RW_READ);
        ButtonOff(IDC_RW_WRITE);
        ButtonOff(IDC_RW_DELETE);
        SendDlgItemMessage(Dialog,IDC_CONTACTLIST,CB_SETCURSEL,0,0);
        EnableWindow(GetDlgItem(Dialog,IDC_CONTACTLIST),true);
        TextClear(IDC_CONTACTLIST);
        TextClear(IDC_RW_MODULE);
        TextClear(IDC_RW_SETTING);
        TextClear(IDC_RW_VALUE);
        TextClear(IDC_RW_TEXT);

        ButtonOff(IDC_RW_CURRENT);
        ButtonOff(IDC_RW_PARAM);
        ButtonOff(IDC_RW_RESULT);
        ButtonOff(IDC_RW_MANUAL);
        ButtonOff(IDC_RW_LAST);

        ButtonOff(IDC_RW_MVAR);
        ButtonOff(IDC_RW_SVAR);
        ButtonOff(IDC_RW_TVAR);
      end;
      ACT_MESSAGE: begin
        TextClear(IDC_MSG_TITLE);
        TextClear(IDC_MSG_TEXT);
        ButtonOff(IDC_MSG_KEEP);
        ButtonOff(IDC_MSGB_OK);
        ButtonOff(IDC_MSGB_OC);
        ButtonOff(IDC_MSGB_ARI);
        ButtonOff(IDC_MSGB_YNC);
        ButtonOff(IDC_MSGB_YN);
        ButtonOff(IDC_MSGB_RC);
        ButtonOff(IDC_MSGI_NONE);
        ButtonOff(IDC_MSGI_ERROR);
        ButtonOff(IDC_MSGI_QUEST);
        ButtonOff(IDC_MSGI_WARN);
        ButtonOff(IDC_MSGI_INFO);

        ButtonOff(IDC_MSG_TTL);
        ButtonOff(IDC_MSG_TXT);
      end;
    end;
  end;

  procedure ClearDialogData;
  begin
    ClearControls(ACT_CONTACT);
    ClearControls(ACT_SERVICE);
    ClearControls(ACT_PROGRAM);
    ClearControls(ACT_TEXT);
    ClearControls(ACT_ADVANCE);
    ClearControls(ACT_CHAIN);
    ClearControls(ACT_RW);
    ClearControls(ACT_MESSAGE);
    mFreeMem(wstruct);
    mFreeMem(lstruct);
  end;

  procedure SHWindows(exclude:dword=0);
  begin
    SetupControls(ACT_CONTACT,SW_HIDE);
    SetupControls(ACT_SERVICE,SW_HIDE);
    SetupControls(ACT_PROGRAM,SW_HIDE);
    SetupControls(ACT_TEXT   ,SW_HIDE);
    SetupControls(ACT_ADVANCE,SW_HIDE);
    SetupControls(ACT_CHAIN  ,SW_HIDE);
    SetupControls(ACT_RW     ,SW_HIDE);
    SetupControls(ACT_MESSAGE,SW_HIDE);
{
    if exclude<>ACT_CONTACT then SetupControls(ACT_CONTACT,SW_HIDE);
    if exclude<>ACT_SERVICE then SetupControls(ACT_SERVICE,SW_HIDE);
    if exclude<>ACT_PROGRAM then SetupControls(ACT_PROGRAM,SW_HIDE);
    if exclude<>ACT_TEXT    then SetupControls(ACT_TEXT   ,SW_HIDE);
    if exclude<>ACT_ADVANCE then SetupControls(ACT_ADVANCE,SW_HIDE);
    if exclude<>ACT_CHAIN   then SetupControls(ACT_CHAIN  ,SW_HIDE);
    if exclude<>ACT_RW      then SetupControls(ACT_RW     ,SW_HIDE);
}
    case exclude of
      ACT_CONTACT,
      ACT_SERVICE,
      ACT_PROGRAM,
      ACT_TEXT   ,
      ACT_ADVANCE,
      ACT_CHAIN  ,
      ACT_RW     ,
      ACT_MESSAGE: begin
        SetupControls(exclude,SW_SHOW);
      end;
    end;
  end;

  procedure SHActButtons(mode:integer);
  begin
    ShowWindow(GetDlgItem(Dialog,IDC_STAT_ACTION),mode);
    ShowWindow(GetDlgItem(Dialog,IDC_ACTION_TYPE),mode);
  end;

  procedure InitDef(exclude:dword=0);
  begin
    if exclude<>ACT_CONTACT then
    begin
      ButtonOn(IDC_CNT_FILTER);
      // do nothing
    end;
    if exclude<>ACT_SERVICE then
    begin
      CB_SelectData(Dialog,IDC_SRV_RESULT,sresInt);
    end;
    if exclude<>ACT_PROGRAM then
    begin
      ButtonOn(IDC_FLAG_PARALLEL);
      ButtonOn(IDC_FLAG_NORMAL);
      SetDlgItemInt(Dialog,IDC_EDIT_PROCTIME,0,false);
    end;
    if exclude<>ACT_TEXT then
    begin
      ButtonOn(IDC_FLAG_CLIP);
      EnableWindow(GetDlgItem(Dialog,IDC_CLIP_COPYTO),true);
      EnableWindow(GetDlgItem(Dialog,IDC_CLIP_PASTE ),true);
      ButtonOn(IDC_CLIP_COPYTO);

      ButtonOn(IDC_FILE_READ);
      // do nothing
    end;
    if exclude<>ACT_ADVANCE then
    begin
      ButtonOn(IDC_FLAG_NOP);
      ButtonOn(IDC_FLAG_ANOP);
      SetDlgItemInt(Dialog,IDC_ADV_VALUE,0,false);
      SetDlgItemInt(Dialog,IDC_ADV_VAL1 ,0,false);
      EnableWindow(GetDlgItem(Dialog,IDC_ADV_VAL1),false);
      EnableWindow(GetDlgItem(Dialog,IDC_ADV_VAL2),false);
      EnableWindow(GetDlgItem(Dialog,IDC_ADV_OPER),false);
//      SendDlgItemMessage(Dialog,IDC_ADV_OPER,CB_SETCURSEL,0,0);
      CB_SelectData(Dialog,IDC_ADV_OPER,ORD(aeNot));
    end;
    if exclude<>ACT_CHAIN then
    begin
//      FillChainList(Dialog);
      SendDlgItemMessage(Dialog,IDC_GROUP_LIST,CB_SETCURSEL,0,0);
    end;
    if exclude<>ACT_RW then
    begin
      ButtonOn(IDC_RW_READ);
      SetDlgItemInt(Dialog,IDC_RW_VALUE,0,false);
      ButtonOn(IDC_RW_MANUAL);
      EnableWindow(GetDlgItem(Dialog,IDC_RW_VALUE),true);
      EnableWindow(GetDlgItem(Dialog,IDC_RW_TEXT ),true);
    end;
    if exclude<>ACT_MESSAGE then
    begin
      ButtonOn(IDC_MSGB_OK);
      ButtonOn(IDC_MSGI_NONE);
    end;
  end;

  // set buttons by options
  procedure FillAction(CurAction:integer);
  var
    i:integer;
    bb:boolean;
    wnd:HWND;
  begin
    with NewActionList^[CurAction] do
    begin
      if (flags and ACF_ASSIGNED)=0 then
        exit;
      if actionType=0 then
        actionType:=ACT_CONTACT;

      InitDef(actionType);
      SelectActionType(actionType);
      case actionType of

        ACT_CONTACT: begin
          if (flags and ACF_KEEPONLY)<>0 then
            ButtonOn(IDC_CNT_KEEP);
          if fCLfilter then
            ButtonOn(IDC_CNT_FILTER);
          SetDlgItemTextW(Dialog,IDC_EDIT_FORMAT,fCLformat);

          SendDlgItemMessage(Dialog,IDC_CONTACTLIST,CB_SETCURSEL,
            FindContact(GetDlgItem(Dialog,IDC_CONTACTLIST),contact),0);
        end;

        ACT_SERVICE: begin
          if SendDlgItemMessageA(Dialog,IDC_EDIT_SERVICE,CB_SELECTSTRING,twparam(-1),tlparam(service))<>CB_ERR then
            ReloadService
          else
            SetDlgItemTextA(Dialog,IDC_EDIT_SERVICE,service);

          if (flags2 and ACF2_SRV_WPAR)<>0 then ButtonOn(IDC_SRV_WPAR);
          if (flags2 and ACF2_SRV_LPAR)<>0 then ButtonOn(IDC_SRV_LPAR);
          if (flags2 and ACF2_SRV_SRVC)<>0 then ButtonOn(IDC_SRV_SRVC);

          if (flags and ACF_MESSAGE)<>0 then ButtonOn(IDC_RES_MESSAGE);
          if (flags and ACF_POPUP  )<>0 then ButtonOn(IDC_RES_POPUP);
          if (flags and ACF_INSERT )<>0 then ButtonOn(IDC_RES_INSERT);

          if (flags and ACF_HEX)<>0 then
            i:=sresHex
          else if (flags and ACF_STRUCT)<>0 then
            i:=sresStruct
          else if (flags and ACF_STRING)<>0 then
          begin
            i:=sresString;
            if (flags  and ACF_UNICODE )<>0 then ButtonOn(IDC_RES_UNICODE);
            if (flags2 and ACF2_FREEMEM)<>0 then ButtonOn(IDC_RES_FREEMEM);
          end
          else
          begin
            i:=sresInt;
            if (flags and ACF_SIGNED)<>0 then
              ButtonOn(IDC_RES_SIGNED);
          end;
          CB_SelectData(Dialog,IDC_SRV_RESULT,i);

          if (flags and ACF_WPARAM)<>0 then
          begin
            EnableWindow(GetDlgItem(Dialog,IDC_EDIT_WPAR),false);
            i:=ptParam;
          end
          else if (flags and ACF_WRESULT)<>0 then
          begin
            EnableWindow(GetDlgItem(Dialog,IDC_EDIT_WPAR),false);
            i:=ptResult;
          end
          else if (flags and ACF_WPARNUM)<>0 then
          begin
            if (flags and ACF_WCURRENT)<>0 then
            begin
              EnableWindow(GetDlgItem(Dialog,IDC_EDIT_WPAR),false);
              i:=ptCurrent
            end
            else
            begin
              i:=ptNumber;
              SetNumValue(GetDlgItem(Dialog,IDC_EDIT_WPAR),wparam,
                  (flags2 and ACF2_SRV_WPAR)<>0,
                  (flags2 and ACF2_SRV_WHEX)<>0);
//              SetDlgItemInt(Dialog,IDC_EDIT_WPAR,wparam,true)
            end;
          end
          else if (flags and ACF_WSTRUCT)<>0 then
          begin
            i:=ptStruct;
            SHControl(IDC_EDIT_WPAR,SW_HIDE);
            SHControl(IDC_WSTRUCT  ,SW_SHOW);
            mFreeMem(wstruct);
            StrDup(wstruct,PAnsiChar(wparam));
          end
          else if (flags and ACF_WUNICODE)<>0 then
          begin
            i:=ptUnicode;
            SetDlgItemTextW(Dialog,IDC_EDIT_WPAR,pWideChar(wparam));
          end
          else
          begin
            i:=ptString;
            SetDlgItemTextA(Dialog,IDC_EDIT_WPAR,PAnsiChar(wparam));
          end;
          CB_SelectData(GetDlgItem(Dialog,IDC_FLAG_WPAR),i);
          SendDlgItemMessage(Dialog,IDC_FLAG_WPAR,CB_SETCURSEL,i,0);

          if (flags and ACF_LPARAM)<>0 then
          begin
            EnableWindow(GetDlgItem(Dialog,IDC_EDIT_LPAR),false);
            i:=ptParam;
          end
          else if (flags and ACF_LRESULT)<>0 then
          begin
            EnableWindow(GetDlgItem(Dialog,IDC_EDIT_LPAR),false);
            i:=ptResult;
          end
          else if (flags and ACF_LPARNUM)<>0 then
          begin
            if (flags and ACF_LCURRENT)<>0 then
            begin
              EnableWindow(GetDlgItem(Dialog,IDC_EDIT_LPAR),false);
              i:=ptCurrent;
            end
            else
            begin
              i:=ptNumber;
              SetNumValue(GetDlgItem(Dialog,IDC_EDIT_LPAR),lparam,
                  (flags2 and ACF2_SRV_LPAR)<>0,
                  (flags2 and ACF2_SRV_LHEX)<>0);
//              SetDlgItemInt(Dialog,IDC_EDIT_LPAR,lparam,true)
            end;
          end
          else if (flags and ACF_LSTRUCT)<>0 then
          begin
            i:=ptStruct;
            SHControl(IDC_EDIT_LPAR,SW_HIDE);
            SHControl(IDC_LSTRUCT  ,SW_SHOW);
            mFreeMem(lstruct);
            StrDup(lstruct,PAnsiChar(lparam));
          end
          else if (flags and ACF_LUNICODE)<>0 then
          begin
            i:=ptUnicode;
            SetDlgItemTextW(Dialog,IDC_EDIT_LPAR,pWideChar(lparam));
          end
          else
          begin
            i:=ptString;
            SetDlgItemTextA(Dialog,IDC_EDIT_LPAR,PAnsiChar(lparam));
          end;
          CB_SelectData(GetDlgItem(Dialog,IDC_FLAG_LPAR),i);

        end;

        ACT_PROGRAM: begin
          if (flags2 and ACF2_PRG_PRG)<>0 then
            ButtonOn(IDC_PRG_PRG);
          if (flags2 and ACF2_PRG_ARG)<>0 then
            ButtonOn(IDC_PRG_ARG);

          SetDlgItemTextW(Dialog,IDC_EDIT_PRGPATH ,prgname);
          SetDlgItemTextW(Dialog,IDC_EDIT_PRGARGS ,args);
          SetDlgItemInt  (Dialog,IDC_EDIT_PROCTIME,time,false);
          case show of
            SW_HIDE         : ButtonOn(IDC_FLAG_HIDDEN);
            SW_SHOWMINIMIZED: ButtonOn(IDC_FLAG_MINIMIZE);
            SW_SHOWMAXIMIZED: ButtonOn(IDC_FLAG_MAXIMIZE);
          else
            {SW_SHOWNORMAL   :} ButtonOn(IDC_FLAG_NORMAL);
          end;
          if (flags and ACF_CURPATH)<>0 then
            ButtonOn(IDC_FLAG_CURPATH);
          if (flags and ACF_PRTHREAD)<>0 then
            ButtonOn(IDC_FLAG_PARALLEL)
          else
            ButtonOn(IDC_FLAG_CONTINUE);

        end;

        ACT_TEXT: begin
          if (flags and ACF_CLIPBRD)<>0 then
          begin
            ButtonOn(IDC_FLAG_CLIP);
            EnableWindow(GetDlgItem(Dialog,IDC_CLIP_COPYTO),true);
            EnableWindow(GetDlgItem(Dialog,IDC_CLIP_PASTE ),true);
            if (flags and ACF_COPYTO)<>0 then
              ButtonOn(IDC_CLIP_COPYTO)
            else
              ButtonOn(IDC_CLIP_PASTE);
// for switches
            ButtonOn(IDC_FILE_READ);
          end

          else
          begin
            if (flags and (ACF_FILE or ACF_FAPPEND or ACF_FWRITE))<>ACF_FILE then
              EnableWindow(GetDlgItem(Dialog,IDC_EDIT_INSERT),true);
            SetDlgItemTextW(Dialog,IDC_EDIT_INSERT,text);
// for switches
            ButtonOn(IDC_CLIP_COPYTO);

            if (flags2 and ACF2_TXT_TEXT)<>0 then
              ButtonOn(IDC_TXT_TEXT);

            if (flags and ACF_FILE)<>0 then
            begin
              if (flags2 and ACF2_TXT_FILE)<>0 then
                ButtonOn(IDC_TXT_FILE);
              ButtonOn(IDC_FLAG_FILE);
              EnableWindow(GetDlgItem(Dialog,IDC_FILE_PATH   ),true);
              EnableWindow(GetDlgItem(Dialog,IDC_FILE_FILEBTN),true);
              EnableWindow(GetDlgItem(Dialog,IDC_FILE_READ   ),true);
              EnableWindow(GetDlgItem(Dialog,IDC_FILE_WRITE  ),true);
              EnableWindow(GetDlgItem(Dialog,IDC_FILE_APPEND ),true);

              wnd:=GetDlgItem(Dialog,IDC_FILE_ENC);
              EnableWindow(wnd,true);
              if (flags and ACF_ANSI)<>0 then
                CB_SelectData(wnd,0)
              else if (flags and ACF_UTF8)<>0 then
              begin
                if (flags and ACF_SIGN)<>0 then
                  CB_SelectData(wnd,2)
                else
                  CB_SelectData(wnd,1);
              end
              else if (flags and ACF_SIGN)<>0 then
                CB_SelectData(wnd,4)
              else
                CB_SelectData(wnd,3);

              if      (flags and ACF_FAPPEND)<>0 then ButtonOn(IDC_FILE_APPEND)
              else if (flags and ACF_FWRITE )<>0 then ButtonOn(IDC_FILE_WRITE)
              else ButtonOn(IDC_FILE_READ);
              SetDlgItemTextW(Dialog,IDC_FILE_PATH,tfile);
            end
            else
            begin
              ButtonOn(IDC_FLAG_MESSAGE);
// for switches
              ButtonOn(IDC_FILE_READ);
            end;
          end;

        end;

        ACT_ADVANCE: begin
          FillSubList(Dialog);
//          SendDlgItemMessage(Dialog,IDC_ADV_VAL2,CB_SETCURSEL,0,0);

          case condition and not ADV_COND_NOT of
            ADV_COND_GT: ButtonOn(IDC_FLAG_GT);
            ADV_COND_LT: ButtonOn(IDC_FLAG_LT);
            ADV_COND_EQ: ButtonOn(IDC_FLAG_EQ);
          else // ADV_COND_NOP
            ButtonOn(IDC_FLAG_NOP);
          end;
          SetDlgItemInt(Dialog,IDC_ADV_VALUE,value,false);
          if (condition and ADV_COND_NOT)<>0 then
            ButtonOn(IDC_FLAG_NOT);

          SetDlgItemInt(Dialog,IDC_ADV_VAL1,mathval,true);
          case action and ADV_ACTION of
            ADV_ACT_MATH: begin
              ButtonOn(IDC_FLAG_MATH);
              CB_SelectData(GetDlgItem(Dialog,IDC_ADV_OPER),oper);
//              SendDlgItemMessage(Dialog,IDC_ADV_OPER,CB_SETCURSEL,oper,0);
              EnableWindow(GetDlgItem(Dialog,IDC_ADV_VAL1),true);
              EnableWindow(GetDlgItem(Dialog,IDC_ADV_OPER),true);
            end;
            ADV_ACT_VARS: begin
              ButtonOn(IDC_FLAG_VARS);
              if (flags and ACF_VARASINT)<>0 then
                ButtonOn(IDC_ADV_ASINT);
              EnableWindow(GetDlgItem(Dialog,IDC_ADV_VARS),true);
              SetDlgItemTextW(Dialog,IDC_ADV_VARS,varval);
            end;
          end;
          bb:=false;
          case action and ADV_ACT_POST of
            ADV_ACT_BREAK: ButtonOn(IDC_FLAG_BREAK);
            ADV_ACT_JUMP : begin
              SendDlgItemMessageW(Dialog,IDC_ADV_VAL2,CB_SELECTSTRING,twparam(-1),tlparam(operval));
              ButtonOn(IDC_FLAG_JUMP);
              bb:=true;
            end;
          else // ADV_ACT_NOP
            ButtonOn(IDC_FLAG_ANOP);
          end;
          EnableWindow(GetDlgItem(Dialog,IDC_ADV_VAL2),bb);
        end;

        ACT_CHAIN: begin
//          FillChainList(Dialog);
          if (flags and ACF_BYNAME)<>0 then
            SendDlgItemMessageW(Dialog,IDC_GROUP_LIST,CB_SELECTSTRING,twparam(-1),tlparam(actname))
          else
            SendDlgItemMessageW(Dialog,IDC_GROUP_LIST,CB_SELECTSTRING,twparam(-1),tlparam(GetGroupName(id)));
        end;

        ACT_RW: begin
          if      (flags and ACF_DBDELETE)<>0 then ButtonOn(IDC_RW_DELETE)
          else if (flags and ACF_DBWRITE )= 0 then ButtonOn(IDC_RW_READ)
          else                                     ButtonOn(IDC_RW_WRITE);

          bb:=false;
          if (flags and ACF_CURRENT)<>0 then
          begin
            ButtonOn(IDC_RW_CURRENT);
            EnableWindow(GetDlgItem(Dialog,IDC_CONTACTLIST),false);
          end
          else if (flags and ACF_PARAM)<>0 then
          begin
            ButtonOn(IDC_RW_PARAM);
            EnableWindow(GetDlgItem(Dialog,IDC_CONTACTLIST),false);
          end
          else if (flags and ACF_RESULT)<>0 then
          begin
            ButtonOn(IDC_RW_RESULT);
            EnableWindow(GetDlgItem(Dialog,IDC_CONTACTLIST),false);
          end
          else
          begin
            ButtonOn(IDC_RW_MANUAL);
            bb:=true;
            EnableWindow(GetDlgItem(Dialog,IDC_CONTACTLIST),true);
            SendDlgItemMessage(Dialog,IDC_CONTACTLIST,CB_SETCURSEL,
              FindContact(GetDlgItem(Dialog,IDC_CONTACTLIST),dbcontact),0);
          end;
          EnableWindow(GetDlgItem(Dialog,IDC_CONTACTLIST),bb);

          if (flags and ACF_LAST)<>0 then
          begin
            ButtonOn(IDC_RW_LAST);
            bb:=false;
          end
          else
            bb:=true;
          if (flags and ACF_DBDELETE)<>0 then
            bb:=false;

          EnableWindow(GetDlgItem(Dialog,IDC_RW_VALUE),bb);
          EnableWindow(GetDlgItem(Dialog,IDC_RW_TEXT ),bb);

          SetDlgItemTextA(Dialog,IDC_RW_MODULE ,dbmodule);
          SetDlgItemTextA(Dialog,IDC_RW_SETTING,dbsetting);
          if (flags2 and ACF2_RW_MVAR)<>0 then ButtonOn(IDC_RW_MVAR);
          if (flags2 and ACF2_RW_SVAR)<>0 then ButtonOn(IDC_RW_SVAR);
          if (flags2 and ACF2_RW_TVAR)<>0 then ButtonOn(IDC_RW_TVAR);


          wnd:=GetDlgItem(Dialog,IDC_RW_DATATYPE);
          if ((flags and ACF_DBANSI )=ACF_DBANSI) or
             ((flags and ACF_DBUTEXT)=ACF_DBUTEXT) then
          begin
            SHControl(IDC_RW_TEXT ,SW_SHOW);
            SHControl(IDC_RW_VALUE,SW_HIDE);
            if (flags and ACF_DBANSI)=ACF_DBANSI then
              CB_SelectData(wnd,3)
            else
              CB_SelectData(wnd,4);
            SetDlgItemTextW(Dialog,IDC_RW_TEXT,pWideChar(dbvalue));
          end
          else
          begin
            if (flags and ACF_DBBYTE)=ACF_DBBYTE then
              CB_SelectData(wnd,0)
            else if (flags and ACF_DBWORD)=ACF_DBWORD then
              CB_SelectData(wnd,1)
            else
              CB_SelectData(wnd,2);
            SHControl(IDC_RW_TEXT ,SW_HIDE);
            SHControl(IDC_RW_VALUE,SW_SHOW);

            SetNumValue(GetDlgItem(Dialog,IDC_RW_VALUE),dbvalue,
                (flags2 and ACF2_RW_TVAR)<>0,
                (flags2 and ACF2_RW_HEX )<>0);
          end;

        end;

        ACT_MESSAGE: begin
          SetDlgItemTextW(Dialog,IDC_MSG_TITLE,msgtitle);
          SetDlgItemTextW(Dialog,IDC_MSG_TEXT ,msgtext);
          if (flags2 and ACF2_MSG_TTL)<>0 then ButtonOn(IDC_MSG_TTL);
          if (flags2 and ACF2_MSG_TXT)<>0 then ButtonOn(IDC_MSG_TXT);
          if (flags  and ACF_MSG_KEEP)<>0 then ButtonOn(IDC_MSG_KEEP);

          case boxopts and $0F of
            1: ButtonOn(IDC_MSGB_OC);
            2: ButtonOn(IDC_MSGB_ARI);
            3: ButtonOn(IDC_MSGB_YNC);
            4: ButtonOn(IDC_MSGB_YN);
            5: ButtonOn(IDC_MSGB_RC);
          else
            ButtonOn(IDC_MSGB_OK);
          end;
          case boxopts and $F0 of
            $10: ButtonOn(IDC_MSGI_ERROR);
            $20: ButtonOn(IDC_MSGI_QUEST);
            $30: ButtonOn(IDC_MSGI_WARN);
            $40: ButtonOn(IDC_MSGI_INFO);
          else
            ButtonOn(IDC_MSGI_NONE);
          end;
        end;
      end;
      SHWindows(actionType);
    end;
  end;