/*===========================================================================*/
/*          Copyright (c) 1987 - 1988, Future Soft Engineering, Inc.         */
/*                              Houston, Texas                               */
/*===========================================================================*/

#define  NOGDICAPMASKS     TRUE
#define  NOVIRTUALKEYCODES TRUE
#define  NOICONS	         TRUE
#define  NOKEYSTATES       TRUE
#define  NOSYSCOMMANDS     TRUE
#define  NOATOM	         TRUE
#define  NOCLIPBOARD       TRUE
#define  NODRAWTEXT	      TRUE
#define  NOMINMAX	         TRUE
#define  NOOPENFILE	      TRUE
#define  NOSCROLL	         TRUE
#define  NOHELP            TRUE
#define  NOPROFILER	      TRUE
#define  NODEFERWINDOWPOS  TRUE
#define  NOPEN             TRUE
#define  NO_TASK_DEFINES   TRUE
#define  NOLSTRING         TRUE
#define  WIN31

#include <windows.h>
#include <port1632.h>
#include "dcrc.h"
#include "dynacomm.h"
#include "task.h"                            /* mbbx 1.04: using taskState.string */
#include "connect.h"
#include <ctype.h>    /* adding for prototype of isalpha() -sdj*/

#define SAVEPARAMS                  struct saveParams    /* mbbx 1.04 ... */
#define PSAVEPARAMS                 SAVEPARAMS *

struct saveParams
{
   HANDLE            hData;
   recTrmParams FAR  *lpData;
   INT               saveLevel;
};


/*---------------------------------------------------------------------------*/
/* doSettings() -                                                      [mbb] */
/*---------------------------------------------------------------------------*/

BOOL doSettings(INT      dbResID, DLGPROC  dbProc)
{
   BOOL     doSettings = FALSE;
   CHAR     work[STR255];

   doSettings = DialogBox(hInst, MAKEINTRESOURCE(dbResID), hItWnd, dbProc);

   if(doSettings == -1)
   {
      LoadString(hInst, STR_OUTOFMEMORY, work, STR255-1);
      testMsg(work,NULL,NULL);
   }

   return(doSettings);
}


/*---------------------------------------------------------------------------*/
/* initDlgPos() -                                                      [mbb] */
/*---------------------------------------------------------------------------*/

VOID initDlgPos(HWND hDlg)
{
   RECT  dialogRect, windowRect;


   GetWindowRect(hDlg, &dialogRect);
   dialogRect.right -= dialogRect.left;
   dialogRect.bottom -= dialogRect.top;

   GetWindowRect(hItWnd, &windowRect);
   windowRect.left += (((windowRect.right - windowRect.left) - dialogRect.right) / 2);
   windowRect.top += (((windowRect.bottom - windowRect.top) - dialogRect.bottom) / 2);

   if(windowRect.left < 10)
      windowRect.left = 10;
   else if((windowRect.left + dialogRect.right) > (GetSystemMetrics(SM_CXSCREEN) - 10))
      windowRect.left = (GetSystemMetrics(SM_CXSCREEN) - 10) - dialogRect.right;

   if(windowRect.top < 10)
      windowRect.top = 10;
   else if((windowRect.top + dialogRect.bottom) > (GetSystemMetrics(SM_CYSCREEN) - 10))
      windowRect.top = (GetSystemMetrics(SM_CYSCREEN) - 10) - dialogRect.bottom;

   MoveWindow(hDlg, windowRect.left, windowRect.top, dialogRect.right, dialogRect.bottom, FALSE);
}


/*---------------------------------------------------------------------------*/
/* loadListData() -                                                    [mbb] */
/*---------------------------------------------------------------------------*/

VOID NEAR loadListData(HWND  hDlg, INT   nItem, INT   nList)
{
   INT   ndx;
   CHAR  work[STR255];

   for(ndx = 0; LoadString(hInst, nList + ndx, work, STR255-1); ndx += 1)
      SendDlgItemMessage(hDlg, nItem, LB_INSERTSTRING, -1, (LPARAM) work);
}


/*---------------------------------------------------------------------------*/
/* dbPhon() -                                                                */
/*---------------------------------------------------------------------------*/

INT_PTR  APIENTRY dbPhon(HWND  hDlg, UINT  message, WPARAM wParam, LPARAM lParam)
{
   BYTE szPhone[((DCS_MODEMCMDSZ-1)*2)+1];
   BYTE work[255]; /* jtf 3.20 */
   updateTimer();

   switch(message)
   {
   case WM_INITDIALOG:
      initDlgPos(hDlg);

      SendDlgItemMessage(hDlg, ITMPHONENUMBER, EM_LIMITTEXT, sizeof(szPhone)-1, 0L);  /* mbbx 2.00 */
      strcpy(szPhone,trmParams.phone);
      strcpy(szPhone+strlen(szPhone),trmParams.phone2);
      SetDlgItemText(hDlg, ITMPHONENUMBER, szPhone);

      SetDlgItemInt(hDlg, ITMRETRYTIME, trmParams.dlyRetry, FALSE);
      CheckDlgButton(hDlg, ITMRETRY, trmParams.flgRetry);
      CheckDlgButton(hDlg, ITMSIGNAL, trmParams.flgSignal);
      return(TRUE);

   case WM_COMMAND:
      switch(GET_WM_COMMAND_ID(wParam, lParam))
      {
      case IDOK:
         GetDlgItemText(hDlg, ITMPHONENUMBER, szPhone, sizeof(szPhone));
         strncpy(trmParams.phone, szPhone, DCS_MODEMCMDSZ);
         trmParams.phone[DCS_MODEMCMDSZ-1] = 0;
         strcpy(trmParams.phone2, szPhone+strlen(trmParams.phone));

         if((trmParams.dlyRetry = GetDlgItemInt(hDlg, ITMRETRYTIME, NULL, FALSE)) < 30)
            { /* jtf 3.20 */
            LoadString(hInst, STR_MINTIME, work, STR255-1);
            testMsg(work,NULL,NULL);
            trmParams.dlyRetry = 30;
            }
         trmParams.flgRetry = (BYTE)IsDlgButtonChecked(hDlg, ITMRETRY);
         trmParams.flgSignal = (BYTE)IsDlgButtonChecked(hDlg, ITMSIGNAL);
         termData.flags |= TF_CHANGED;
         break;

      case IDCANCEL:
         break;

      case ITMRETRY:
      case ITMSIGNAL:
         CheckDlgButton(hDlg, GET_WM_COMMAND_ID(wParam, lParam), !IsDlgButtonChecked(hDlg, GET_WM_COMMAND_ID(wParam, lParam)));
         return(TRUE);

      default:
         return(TRUE);
      }
      break;

   default:
      return(FALSE);
   }

   EndDialog(hDlg, TRUE);
   return(TRUE);
}


/*---------------------------------------------------------------------------*/
/*  dbEmul() -                                                               */
/*---------------------------------------------------------------------------*/

INT_PTR APIENTRY dbEmul(HWND  hDlg, UINT  message, WPARAM wParam, LPARAM lParam)
{
   updateTimer();

   switch(message)
   {
   case WM_INITDIALOG:
      chkGrpButton(hDlg, ITMTERMFIRST, ITMTERMLAST, (trmParams.emulate != ITMDELTA) ? trmParams.emulate : ITMTTY);
      initDlgPos(hDlg);
      return(TRUE);

   case WM_COMMAND:
      switch(GET_WM_COMMAND_ID(wParam, lParam))
      {
      case IDOK:
         if((wParam = whichGrpButton(hDlg, ITMTERMFIRST, ITMTERMLAST)) != trmParams.emulate)
         {
            trmParams.emulate = (BYTE)wParam;
            resetEmul();
         }
         termData.flags |= TF_CHANGED;
         break;

      case IDCANCEL:
         break;

      default:
         chkGrpButton(hDlg, ITMTERMFIRST, ITMTERMLAST, GET_WM_COMMAND_ID(wParam, lParam));
         return(TRUE);
      }
      break;

   default:
      return(FALSE);
   }

   EndDialog(hDlg, TRUE);
   return(TRUE);
}


/*---------------------------------------------------------------------------*/
/* dbTerm() - Terminal Settings dialog control.                        [mbb] */
/*---------------------------------------------------------------------------*/

/* mbbx 2.00: all new font enumeration code... */

int APIENTRY nextFontName(const LOGFONT *lpLogFont, const TEXTMETRIC *lpTextMetrics, 
                          DWORD          FontType, LPARAM lParam)

{
   HWND hDlg = (HWND)lParam;
   BYTE testStr[40];
   BYTE testStr1[40];

   if (lpLogFont->lfPitchAndFamily & FIXED_PITCH)  /* jtf 3.21 */
#ifdef ORGCODE
      SendDlgItemMessage((HWND) LOWORD((LONG) lpData), ITMFONTFACE, LB_ADDSTRING, 0, (LONG) lpLogFont->lfFaceName);
#else
      SendDlgItemMessage(hDlg, ITMFONTFACE, LB_ADDSTRING, 0, (LPARAM) lpLogFont->lfFaceName);
#endif

   lstrcpy( testStr, (LPSTR) lpLogFont->lfFaceName); /* jtf 3.21 */
   LoadString(hInst, STR_INI_FONTFACE, testStr1, LF_FACESIZE);
   /* changed from strcmpi -sdj */
   if (lstrcmpi(testStr,testStr1) == 0)
#ifdef ORGCODE
      SendDlgItemMessage((HWND) LOWORD((LONG) lpData), ITMFONTFACE, LB_ADDSTRING, 0, (LONG) lpLogFont->lfFaceName);
#else
      SendDlgItemMessage(hDlg, ITMFONTFACE, LB_ADDSTRING, 0, (LPARAM) lpLogFont->lfFaceName);
#endif
   return(TRUE);
}


VOID NEAR loadFontNames(HWND  hDlg)
{
   getPort();
#ifdef ORGCODE
   EnumFonts(thePort, NULL, nextFontName, ((LONG) hDlg));
#else
   EnumFonts(thePort, NULL, nextFontName, (LPARAM) hDlg);
#endif
   releasePort();

   SendDlgItemMessage(hDlg, ITMFONTFACE, LB_SELECTSTRING, -1, (LPARAM) (trmParams.fontFace));
}


VOID NEAR loadFontSizes(HWND  hDlg, BYTE  *faceName, INT   fontSize)
{
   CHAR  sizeList[64], work[16];
   INT   ndx, ndx1;

   listFontSizes(faceName, sizeList, 64-1);

   ndx = -1;
   for(ndx1 = 7; ndx1 < 64; ndx1 += 1)
      if(sizeList[ndx1] != 0)
      {
         sprintf(work, "%d", ndx1);
         SendDlgItemMessage(hDlg, ITMFONTSIZE, LB_INSERTSTRING, -1, (LPARAM) (work));

         if((ndx1 <= fontSize) || (ndx == -1))
            ndx += 1;
      }

   SendDlgItemMessage(hDlg, ITMFONTSIZE, LB_SETCURSEL, ndx, 0L);
}


INT NEAR getFontSize(HWND hDlg)                   /* mbbx 2.00: font selection... */
{
   INT   ndx;
   CHAR  work[16];

   ndx = (INT)SendDlgItemMessage(hDlg, ITMFONTSIZE, LB_GETCURSEL, 0, 0L);
   SendDlgItemMessage(hDlg, ITMFONTSIZE, LB_GETTEXT, ndx, (LPARAM) (work));
   sscanf(work, "%d", &ndx);

   return(ndx);
}

INT_PTR APIENTRY dbTerm(HWND  hDlg, UINT  message, WPARAM wParam, LPARAM lParam)
{
   WORD  tempWord;
   BOOL  tempBool;

   updateTimer();

   switch(message)
   {
   case WM_INITDIALOG:
      initDlgPos(hDlg);

      if((((PSAVEPARAMS) taskState.string)->hData = GlobalAlloc(GMEM_MOVEABLE, (DWORD) sizeof(recTrmParams))) == NULL)
         break;
      ((PSAVEPARAMS) taskState.string)->lpData = (recTrmParams FAR *) GlobalLock(((PSAVEPARAMS) taskState.string)->hData);
      *(((PSAVEPARAMS) taskState.string)->lpData) = trmParams;

      CheckDlgButton(hDlg,   ITMLINEWRAP,    trmParams.lineWrap);
      CheckDlgButton(hDlg,   ITMLOCALECHO,   trmParams.localEcho);
      CheckDlgButton(hDlg,   ITMSOUND,       trmParams.sound);
      CheckDlgButton(hDlg,   ITMINCRLF,      trmParams.inpCRLF);
      CheckDlgButton(hDlg,   ITMOUTCRLF,     trmParams.outCRLF);
      CheckRadioButton(hDlg, ITM80COL,       ITM132COL, trmParams.columns);
      CheckRadioButton(hDlg, ITMBLKCURSOR,   ITMUNDCURSOR, trmParams.termCursor);
      CheckDlgButton(hDlg,   ITMBLINKCURSOR, trmParams.cursorBlink);

      loadFontNames(hDlg);                   /* mbbx 2.00: font selection... */
      loadFontSizes(hDlg, trmParams.fontFace, trmParams.fontSize);

      ((PSAVEPARAMS) taskState.string)->saveLevel = -1;

      loadListData(hDlg, ITMTRANSLATE, STR_ICS_NAME);
      SendDlgItemMessage(hDlg, ITMTRANSLATE, LB_SETCURSEL, trmParams.language, 0L);

      SetDlgItemInt(hDlg, ITMBUFFERLINES, trmParams.bufferLines = maxLines, FALSE); /* mbbx 2.00.03 ... */

      CheckDlgButton(hDlg, ITMSCROLLBARS, !trmParams.fHideTermVSB);
      CheckDlgButton(hDlg, ITMIBMXANSI, trmParams.setIBMXANSI); /* rjs swat */
      CheckDlgButton(hDlg, ITMWINCTRL,  trmParams.useWinCtrl);  /* rjs swat */

      return(TRUE);

   case WM_COMMAND:
      switch(GET_WM_COMMAND_ID(wParam, lParam))
      {
      case IDOK:
                                             /* mbbx 2.00.03 ... */
/* rjs bug2 002 */
         tempWord = GetDlgItemInt(hDlg, ITMBUFFERLINES, (BOOL FAR *)&tempBool, FALSE);

         if(tempBool)
         {
            if(tempWord > 399)
            {
               MessageBeep(0);
               lParam = 0xFFFF0000;
               SendDlgItemMessage(hDlg, ITMBUFFERLINES, EM_SETSEL, GET_EM_SETSEL_MPS( 0, lParam));
               return(TRUE);
            }
         }
         else
         {
               MessageBeep(0);
               lParam = 0xFFFF0000;
               SendDlgItemMessage(hDlg, ITMBUFFERLINES, EM_SETSEL, GET_EM_SETSEL_MPS(0, lParam));
               return(TRUE);
         }
/* end rjs bug2 002 */

         if(tempWord != trmParams.bufferLines)
            trmParams.bufferLines = tempWord;

         resetTermBuffer();

         icsResetTable((WORD) SendDlgItemMessage(hDlg, ITMTRANSLATE, LB_GETCURSEL, 0, 0L));

         if(((PSAVEPARAMS) taskState.string)->saveLevel != -1)    /* mbbx 2.00: font selection... */
            buildTermFont();

         updateTermScrollBars(FALSE);

         if(!IsIconic(hItWnd))/* rjs bugs 015 */
            sizeTerm(0L);

         termData.flags |= TF_CHANGED;

         // clears the hTermWnd make sure there's no garbage left
         // when font is changed.
         InvalidateRect (hTermWnd, NULL, TRUE);
         UpdateWindow (hTermWnd);
         break;

      case IDCANCEL:
         trmParams = *(((PSAVEPARAMS) taskState.string)->lpData);
         break;

      case ITMIBMXANSI:
         CheckDlgButton(hDlg, ITMIBMXANSI, trmParams.setIBMXANSI = !trmParams.setIBMXANSI);
         return(TRUE);
      case ITMLINEWRAP:
         CheckDlgButton(hDlg, ITMLINEWRAP, trmParams.lineWrap = !trmParams.lineWrap);
         return(TRUE);
      case ITMLOCALECHO:
         CheckDlgButton(hDlg, ITMLOCALECHO, trmParams.localEcho = !trmParams.localEcho);
         return(TRUE);
      case ITMSOUND:
         CheckDlgButton(hDlg, ITMSOUND, trmParams.sound = !trmParams.sound);
         return(TRUE);

      case ITMINCRLF:
         CheckDlgButton(hDlg, ITMINCRLF, trmParams.inpCRLF = !trmParams.inpCRLF);
         return(TRUE);
      case ITMOUTCRLF:
         CheckDlgButton(hDlg, ITMOUTCRLF, trmParams.outCRLF = !trmParams.outCRLF);
         return(TRUE);

      case ITM80COL:
      case ITM132COL:
         CheckRadioButton(hDlg, ITM80COL, ITM132COL, trmParams.columns = wParam);
         return(TRUE);

      case ITMBLKCURSOR:
      case ITMUNDCURSOR:
         CheckRadioButton(hDlg, ITMBLKCURSOR, ITMUNDCURSOR, trmParams.termCursor = wParam);
         return(TRUE);
      case ITMBLINKCURSOR:
         CheckDlgButton(hDlg, ITMBLINKCURSOR, trmParams.cursorBlink = !trmParams.cursorBlink);
         return(TRUE);

      case ITMFONTFACE:
// -sdj 10/09 LBN_ HAS CHANGED IN WIN32, have to take care of this in spec.
#ifdef ORGCODE
         if(HIWORD(lParam) == LBN_SELCHANGE)    /* mbbx 2.00: font selection... */
#else
         if(HIWORD(wParam) == LBN_SELCHANGE)    /* mbbx 2.00: font selection... */
#endif
         {
            SendDlgItemMessage(hDlg, ITMFONTFACE, LB_GETTEXT, SendDlgItemMessage(hDlg, ITMFONTFACE, LB_GETCURSEL, 0, 0L), 
                               (LPARAM) (trmParams.fontFace));

            SendDlgItemMessage(hDlg, ITMFONTSIZE, LB_RESETCONTENT, 0, 0L);
            loadFontSizes(hDlg, trmParams.fontFace, trmParams.fontSize);
         }
      case ITMFONTSIZE:

// -sdj 10/09 LBN_ HAS CHANGED IN WIN32, have to take care of this in spec.
#ifdef ORGCODE
         if(HIWORD(lParam) == LBN_SELCHANGE)    /* mbbx 2.00: font selection... */
#else
         if(HIWORD(wParam) == LBN_SELCHANGE)    /* mbbx 2.00: font selection... */
#endif
         {
            trmParams.fontSize = getFontSize(hDlg);
            ((PSAVEPARAMS) taskState.string)->saveLevel = 0;
         }
         return(TRUE);

      case ITMTRANSLATE:
      case ITMBUFFERLINES:
         return(TRUE);

      case ITMSCROLLBARS:
         CheckDlgButton(hDlg, ITMSCROLLBARS, !(trmParams.fHideTermVSB = !trmParams.fHideTermVSB));
         trmParams.fHideTermHSB = trmParams.fHideTermVSB;
         return(TRUE);

      case ITMWINCTRL:
         CheckDlgButton(hDlg, ITMWINCTRL, trmParams.useWinCtrl = !trmParams.useWinCtrl);
         return(TRUE);
      }
      break;

   default:
      return(FALSE);
   }

   if(((PSAVEPARAMS) taskState.string)->hData != NULL)
   {
      GlobalUnlock(((PSAVEPARAMS) taskState.string)->hData);
      GlobalFree(((PSAVEPARAMS) taskState.string)->hData);
   }

   EndDialog(hDlg, TRUE);
   return(TRUE);
}


/*---------------------------------------------------------------------------*/
/* dbFkey() - Dialog box control for function keys.                          */
/*---------------------------------------------------------------------------*/

VOID NEAR setDlgFkeys(HWND  hDlg, INT   level)
{
   INT   key;

   for(key = 0; key < DCS_NUMFKEYS; key += 1)
   {
      SetDlgItemText(hDlg, ITMFKEYTITLE+(key+1), trmParams.fKeyTitle[level-1][key]); /* rkhx 2.00 */
      SetDlgItemText(hDlg, ITMFKEYTEXT+(key+1), trmParams.fKeyText[level-1][key]);
   }
}


VOID NEAR getDlgFkeys(HWND  hDlg, INT   level)
{
   INT   key;

   for(key = 0; key < DCS_NUMFKEYS; key += 1)
   {
      GetDlgItemText(hDlg, ITMFKEYTITLE+(key+1), trmParams.fKeyTitle[level-1][key], DCS_FKEYTITLESZ-2); /* rkhx 2.00 */
      GetDlgItemText(hDlg, ITMFKEYTEXT+(key+1), trmParams.fKeyText[level-1][key], DCS_FKEYTEXTSZ-2); /* jtf 3.12 */
   }
}


INT_PTR APIENTRY dbFkey(HWND  hDlg, UINT  message, WPARAM wParam, LPARAM lParam)
{
   updateTimer();

   switch(message)
   {
   case WM_INITDIALOG:
      initDlgPos(hDlg);

      if((((PSAVEPARAMS) taskState.string)->hData = GlobalAlloc(GMEM_MOVEABLE, (DWORD) sizeof(recTrmParams))) == NULL)
         break;
      ((PSAVEPARAMS) taskState.string)->lpData = (recTrmParams FAR *) GlobalLock(((PSAVEPARAMS) taskState.string)->hData);
      *(((PSAVEPARAMS) taskState.string)->lpData) = trmParams;
      ((PSAVEPARAMS) taskState.string)->saveLevel = curLevel;


      for(wParam = 1; wParam <= DCS_NUMFKEYS; wParam += 1)
      {
         SendDlgItemMessage(hDlg, ITMFKEYTITLE + wParam, EM_LIMITTEXT, DCS_FKEYTITLESZ-2, 0L);
         SendDlgItemMessage(hDlg, ITMFKEYTEXT + wParam, EM_LIMITTEXT, DCS_FKEYTEXTSZ-3, 0L); /* jtf 3.12 */
      }
      setDlgFkeys(hDlg, curLevel);

      CheckRadioButton(hDlg, ITMLEVEL1, ITMLEVEL4, ITMLEVEL1+(curLevel-1));

      CheckDlgButton(hDlg, ITMSHOWFKEYS, trmParams.environmentFlags & DCS_EVF_FKEYSSHOW);    /* mbbx 2.00: show fkeys... */
      return(TRUE);

   case WM_COMMAND:
      switch(GET_WM_COMMAND_ID(wParam, lParam))
      {
      case IDOK:
         getDlgFkeys(hDlg, curLevel);

         setFKeyLevel(curLevel, TRUE);       /* mbbx 2.00 */

         if(IsDlgButtonChecked(hDlg, ITMSHOWFKEYS))   /* mbbx 2.00: show fkeys... */
         {
            if(!(trmParams.environmentFlags & DCS_EVF_FKEYSSHOW))
            {
               showHidedbmyControls(TRUE, TRUE);
               trmParams.environmentFlags |= DCS_EVF_FKEYSSHOW;
            }
         }
         else
	    trmParams.environmentFlags &= ~DCS_EVF_FKEYSSHOW;

// -sdj: 02jun92 when keys visible is ticked and ok pressed
//	 IsDlgButtonChecked(hDlg, AUTOARRANGE ) is called, but
//	 AUTOARRANGE is not present in the rc file, NT doesnt like
//	 this any more! If this flag is important then we need to
//	 define this some place to avoid Unknown control Id error
//	 from USER.

#ifdef BUGBYPASS
#else
         if(IsDlgButtonChecked(hDlg, ITMAUTOARRANGE))
            trmParams.environmentFlags |= DCS_EVF_FKEYSARRANGE;
         else
	    trmParams.environmentFlags &= ~DCS_EVF_FKEYSARRANGE;
#endif

         termData.flags |= TF_CHANGED;
         break;

      case IDCANCEL:
         trmParams = *(((PSAVEPARAMS) taskState.string)->lpData);
         curLevel = ((PSAVEPARAMS) taskState.string)->saveLevel;
         break;

      case ITMLEVEL1:
      case ITMLEVEL2:
      case ITMLEVEL3:
      case ITMLEVEL4:
         CheckRadioButton(hDlg, ITMLEVEL1, ITMLEVEL4, GET_WM_COMMAND_ID(wParam, lParam));
         getDlgFkeys(hDlg, curLevel);
         setDlgFkeys(hDlg, curLevel = wParam-(ITMLEVEL1-1));
         return(TRUE);

      case ITMSHOWFKEYS:                     /* mbbx 2.00 ... */
         CheckDlgButton(hDlg, GET_WM_COMMAND_ID(wParam, lParam), !IsDlgButtonChecked(hDlg, GET_WM_COMMAND_ID(wParam, lParam)));
         return(TRUE);

      default:
         return(TRUE);
      }
      break;

   default:
      return(FALSE);
   }

   if(((PSAVEPARAMS) taskState.string)->hData != NULL)
   {
      GlobalUnlock(((PSAVEPARAMS) taskState.string)->hData);
      GlobalFree(((PSAVEPARAMS) taskState.string)->hData);
   }

   EndDialog(hDlg, TRUE);
   return(TRUE);
}


/*---------------------------------------------------------------------------*/
/* dbTxtX() - Control for Text transfer dialogue box.                        */
/*---------------------------------------------------------------------------*/

VOID NEAR enableStdItems(HWND  hDlg, BOOL  bEnable)
{
   ShowWindow(GetDlgItem(hDlg, ITMSTDGRP), bEnable ? SW_SHOWNOACTIVATE : SW_HIDE);
   ShowWindow(GetDlgItem(hDlg, ITMSTDXON), bEnable && (trmParams.flowControl == ITMXONFLOW) ? SW_SHOWNOACTIVATE : SW_HIDE);
   ShowWindow(GetDlgItem(hDlg, ITMSTDHARD), bEnable && (trmParams.flowControl == ITMHARDFLOW) ? SW_SHOWNOACTIVATE : SW_HIDE);
   ShowWindow(GetDlgItem(hDlg, ITMSTDNONE), bEnable && (trmParams.flowControl == ITMNOFLOW) ? SW_SHOWNOACTIVATE : SW_HIDE);
   UpdateWindow(hDlg);     /* rjs bugs 001 */
}


VOID NEAR enableChrItems(HWND  hDlg, BOOL  bEnable)
{
   INT   nCmdShow, nResID;

   nCmdShow = bEnable ? SW_SHOWNOACTIVATE : SW_HIDE;
   for(nResID = ITMCHRGRP; nResID <= ITMCHRUNITS; nResID += 1)
      ShowWindow(GetDlgItem(hDlg, nResID), nCmdShow);

   if(bEnable)
      EnableWindow(GetDlgItem(hDlg, ITMCHRTIME), trmParams.xChrType == ITMCHRDELAY);

   UpdateWindow(hDlg);     /* rjs bugs 001 */
}


VOID NEAR enableLinItems(HWND  hDlg, BOOL  bEnable)
{
   INT   nCmdShow, nResID;

   nCmdShow = bEnable ? SW_SHOWNOACTIVATE : SW_HIDE;
   for(nResID = ITMLINGRP; nResID <= ITMLINSTR; nResID += 1)
      ShowWindow(GetDlgItem(hDlg, nResID), nCmdShow);

   if(bEnable)
   {
      EnableWindow(GetDlgItem(hDlg, ITMLINTIME), trmParams.xLinType == ITMLINDELAY);
      EnableWindow(GetDlgItem(hDlg, ITMLINSTR), trmParams.xLinType == ITMLINWAIT);
   }

   UpdateWindow(hDlg);     /* rjs bugs 001 */
}


INT_PTR APIENTRY dbTxtX(HWND  hDlg, UINT  message, WPARAM wParam, LPARAM lParam)
{
   DWORD  temp;
   BYTE  tempStr[16];

   updateTimer();

   switch(message)
   {
   case WM_INITDIALOG:
      if((((PSAVEPARAMS) taskState.string)->hData = GlobalAlloc(GMEM_MOVEABLE, (DWORD) sizeof(recTrmParams))) == NULL)
         break;
      ((PSAVEPARAMS) taskState.string)->lpData = (recTrmParams FAR *) GlobalLock(((PSAVEPARAMS) taskState.string)->hData);
      *(((PSAVEPARAMS) taskState.string)->lpData) = trmParams;

      CheckRadioButton(hDlg, ITMSTD, ITMLIN, trmParams.xTxtType);
      enableStdItems(hDlg, trmParams.xTxtType == ITMSTD);
      enableChrItems(hDlg, trmParams.xTxtType == ITMCHR);
      enableLinItems(hDlg, trmParams.xTxtType == ITMLIN);

      CheckRadioButton(hDlg, ITMCHRDELAY, ITMCHRWAIT, trmParams.xChrType);
      SetDlgItemInt(hDlg, ITMCHRTIME, trmParams.xChrDelay, FALSE);

      CheckRadioButton(hDlg, ITMLINDELAY, ITMLINWAIT, trmParams.xLinType);
      SetDlgItemInt(hDlg, ITMLINTIME, trmParams.xLinDelay, FALSE);
      SendDlgItemMessage(hDlg, ITMLINSTR, EM_LIMITTEXT, DCS_XLINSTRSZ-1, 0L); /* rkhx 2.00 */
      SetDlgItemText(hDlg, ITMLINSTR, trmParams.xLinStr);

      CheckDlgButton(hDlg, ITMWORDWRAP, trmParams.xWordWrap);
      EnableWindow(GetDlgItem(hDlg, ITMWRAPCOL), trmParams.xWordWrap);
      SetDlgItemInt(hDlg, ITMWRAPCOL, trmParams.xWrapCol, FALSE);
      initDlgPos(hDlg);
      return(TRUE);

   case WM_COMMAND:
      switch(GET_WM_COMMAND_ID(wParam, lParam))
      {
      case IDOK:
         trmParams.xTxtType = whichGrpButton(hDlg, ITMSTD, ITMLIN);
#ifdef OLDCODE       /* rjs bugs 007 */
         trmParams.xChrDelay = GetDlgItemInt(hDlg, ITMCHRTIME, NULL, FALSE);
         trmParams.xLinDelay = GetDlgItemInt(hDlg, ITMLINTIME, NULL, FALSE);
         trmParams.xWrapCol  = GetDlgItemInt(hDlg, ITMWRAPCOL, NULL, FALSE);
#endif
         GetDlgItemText(hDlg, ITMLINSTR, trmParams.xLinStr, DCS_XLINSTRSZ-1); /* rkhx 2.00 */

 /* rjs bugs 007 */
         GetDlgItemText(hDlg, ITMCHRTIME, tempStr, DCS_XLINSTRSZ-1); /* rjs bugs 007 */
         temp = 0;
         while(tempStr[temp])
            if(isalpha(tempStr[temp++]))
            {
               MessageBeep(0);
               return(TRUE);
            }
         sscanf(tempStr, "%u", &temp);
         if(temp > 255)
         {
            MessageBeep(0);
            return(TRUE);
         }
         trmParams.xChrDelay = temp;

         GetDlgItemText(hDlg, ITMLINTIME, tempStr, DCS_XLINSTRSZ-1); /* rjs bugs 007 */
         temp = 0;
         while(tempStr[temp])
            if(isalpha(tempStr[temp++]))
            {
               MessageBeep(0);
               return(TRUE);
            }
         sscanf(tempStr, "%u", &temp);
         if(temp > 255)
         {
            MessageBeep(0);
            return(TRUE);
         }
         trmParams.xLinDelay = temp;

         GetDlgItemText(hDlg, ITMWRAPCOL, tempStr, DCS_XLINSTRSZ-1); /* rjs bugs 007 */
         temp = 0;
         while(tempStr[temp])
            if(isalpha(tempStr[temp++]))
            {
               MessageBeep(0);
               return(TRUE);
            }
         sscanf(tempStr, "%u", &temp);
         if(temp > 255)
         {
            MessageBeep(0);
            return(TRUE);
         }

         trmParams.xWrapCol = temp;
         termData.flags |= TF_CHANGED;
         break;

      case IDCANCEL:
         trmParams = *(((PSAVEPARAMS) taskState.string)->lpData);
         break;

      case ITMSTD:
      case ITMCHR:
      case ITMLIN:
            CheckRadioButton(hDlg, ITMSTD, ITMLIN, trmParams.xTxtType = GET_WM_COMMAND_ID(wParam, lParaqm));
            enableLinItems(hDlg, GET_WM_COMMAND_ID(wParam, lParam) == ITMLIN);
            enableChrItems(hDlg, GET_WM_COMMAND_ID(wParam, lParam) == ITMCHR);
            enableStdItems(hDlg, GET_WM_COMMAND_ID(wParam, lParam) == ITMSTD);
            return(TRUE);

      case ITMCHRDELAY:
      case ITMCHRWAIT:
         if(trmParams.xTxtType == ITMCHR)
         {
            CheckRadioButton(hDlg, ITMCHRDELAY, ITMCHRWAIT, trmParams.xChrType = GET_WM_COMMAND_ID(wParam, lParam));
            enableChrItems(hDlg, TRUE);
         }
         return(TRUE);

      case ITMLINDELAY:
      case ITMLINWAIT:
         if(trmParams.xTxtType == ITMLIN)
         {
            CheckRadioButton(hDlg, ITMLINDELAY, ITMLINWAIT, trmParams.xLinType = GET_WM_COMMAND_ID(wParam, lParam));
            enableLinItems(hDlg, TRUE);
         }
         return(TRUE);

      case ITMWORDWRAP:
         CheckDlgButton(hDlg, ITMWORDWRAP, trmParams.xWordWrap = !trmParams.xWordWrap);
         EnableWindow(GetDlgItem(hDlg, ITMWRAPCOL), trmParams.xWordWrap);
         if(trmParams.xWordWrap)
         {
            SetFocus(GetDlgItem(hDlg, ITMWRAPCOL));
            SendDlgItemMessage(hDlg, ITMWRAPCOL, EM_SETSEL, GET_EM_SETSEL_MPS(0, MAKELONG(0, 0x7FFF)));
         }
         return(TRUE);

      default:
         return(TRUE);
      }
      break;

   default:
      return(FALSE);
   }

   if(((PSAVEPARAMS) taskState.string)->hData != NULL)
   {
      GlobalUnlock(((PSAVEPARAMS) taskState.string)->hData);
      GlobalFree(((PSAVEPARAMS) taskState.string)->hData);
   }

   EndDialog(hDlg, TRUE);
   return(TRUE);
}


/*---------------------------------------------------------------------------*/
/* dbBinX() - Dialogue box control for Binary File Transfers.                */
/*---------------------------------------------------------------------------*/

INT_PTR APIENTRY dbBinX(HWND  hDlg, UINT  message, WPARAM wParam, LPARAM lParam)
{
   updateTimer();

   switch(message)
   {
   case WM_INITDIALOG:
      chkGrpButton(hDlg, ITMKERMIT, ITMXMODEM, trmParams.xBinType);
      initDlgPos(hDlg);
      return(TRUE);

   case WM_COMMAND:
      switch(GET_WM_COMMAND_ID(wParam, lParam))
      {
      case IDOK:
//	  trmParams.xBinType = whichGrpButton(hDlg, ITMDYNACOMM, ITMYTERM);
// change this to kermit,xmodem, to avoid controlid unknown error from user
// -sdj 02jun92
	  trmParams.xBinType = whichGrpButton(hDlg, ITMKERMIT, ITMXMODEM);
         termData.flags |= TF_CHANGED;
         break;

      case IDCANCEL:
         break;

      default:
// change this to kermit,xmodem, to avoid control id unknown error from user
// -sdj 02jun92
//	  chkGrpButton(hDlg, ITMDYNACOMM, ITMYTERM, GET_WM_COMMAND_ID(wParam, lParam));
	  chkGrpButton(hDlg, ITMKERMIT, ITMXMODEM, GET_WM_COMMAND_ID(wParam, lParam));
         return(TRUE);
      }
      break;

   default:
      return(FALSE);
   }

   EndDialog(hDlg, TRUE);
   return(TRUE);
}

/*---------------------------------------------------------------------------*/
/* dbComm() -                                                          [mbb] */
/*---------------------------------------------------------------------------*/

#ifdef ORGCODE
BYTE  comDevList[5];
#else
BYTE  comDevList[20];
#endif


VOID initComDevSelect(HWND hDlg,WORD  wListID,BOOL bInit)  /* mbbx 2.01.09 ... */
{
   BYTE  str1[8], str2[8], str3[16];
   INT   ndx;

   loadListData(hDlg, wListID, STR_COM_CONNECT);

   LoadString(hInst, STR_COM_CONNECT+2, str1, sizeof(str1));
   comDevList[0] = 0;
   for(ndx = 1; ndx <= MaxComPortNumberInMenu; ndx += 1)
   {
      //sprintf(str2, str1, ndx);
      //if(GetProfileString("ports", (LPSTR) str2, (LPSTR) NULL_STR, (LPSTR) str3, sizeof(str3)))

      if (TRUE)
      {
	 SendDlgItemMessage(hDlg, wListID, LB_INSERTSTRING, -1, (LPARAM) (arComNumAndName[ndx].PortName));
         comDevList[++comDevList[0]] = ndx;
      }
   }

#ifdef ORGCODE
#else

   comDevList[(comDevList[0])+1] = ndx;

   //MaxComPortNumberInMenu	 = ndx-1;

   SendDlgItemMessage(hDlg, wListID, LB_INSERTSTRING, -1, (LPARAM)"TELNET");

#endif



   if(bInit)
   {
      ndx = 0;
   }
   else
   {
      loadListData(hDlg, wListID, STR_COM_CONNECT+4);

      if(trmParams.comDevRef < ITMNETCOM)
      {
         for(ndx = comDevList[0]; ndx > 0; ndx -= 1)
            if(comDevList[ndx] == trmParams.comPortRef)
               break;
      }
      else
         ndx = trmParams.comDevRef + (comDevList[0] - 1);
   }

   SendDlgItemMessage(hDlg, wListID, LB_SETCURSEL, ndx, 0L);
}


BYTE getComDevSelect(HWND hDlg, WORD wListID, BYTE *newDevRef)  /* mbbx 2.01.09 ... */
{
   BYTE  comPortRef = 0;

   if((*newDevRef = SendDlgItemMessage(hDlg, wListID, LB_GETCURSEL, 0, 0L)) != (BYTE) -1)
   {
#ifdef ORGCODE
      if(*newDevRef <= comDevList[0])
#else
      if(*newDevRef <= (comDevList[0])+1)
#endif
      {
         if(*newDevRef > ITMNOCOM)
         {
            comPortRef = comDevList[*newDevRef];
            *newDevRef = ITMWINCOM;
         }
      }
      else
         *newDevRef -= (comDevList[0] - 1);
   }
   else
      *newDevRef = ITMNOCOM;

   return(comPortRef);
}


/*---------------------------------------------------------------------------*/

VOID NEAR enableGrpItems(HWND  hDlg, INT   itemFirst, INT   itemLast, INT   itemSelect)
{
   INT   itemNext;

   CheckRadioButton(hDlg, itemFirst, itemLast, itemSelect);
   for(itemNext = itemFirst; itemNext <= itemLast; itemNext += 1)
      EnableWindow(GetDlgItem(hDlg, itemNext), itemSelect);
}


VOID NEAR enableCommItems(HWND  hDlg, BYTE  comDevRef)
{
   WORD  wBaudID;

   switch(trmParams.speed)
   {
   case 110:
      wBaudID = ITMBD110;
      break;
   case 300:
      wBaudID = ITMBD300;
      break;
   case 600:
      wBaudID = ITMBD600;
      break;
   case 2400:
      wBaudID = ITMBD240;
      break;
   case 4800:
      wBaudID = ITMBD480;
      break;
   case 9600:
      wBaudID = ITMBD960;
      break;
   case 14400:
      wBaudID = ITMBD144;
      break;
   case 19200:
      wBaudID = ITMBD192;
      break;

   case 38400:
      wBaudID = ITMBD384;
      break;
   case 57600:
      wBaudID = ITMBD576;
      break;
   case 57601:
      wBaudID = ITMBD1152;
      break;
   //case 57602:
   //	wBaudID = ITMBD1280;
   //	break;


   default:
      wBaudID = ITMBD120;
      trmParams.speed = 1200;
      break;
   }

   switch(comDevRef)
   {
   case ITMWINCOM:
      enableGrpItems(hDlg, ITMBD110, ITMBD1152, wBaudID);
      enableGrpItems(hDlg, ITMDATA5, ITMDATA8, trmParams.dataBits); /* jtf 3.24 */
      enableGrpItems(hDlg, ITMSTOP1, ITMSTOP2, trmParams.stopBits);
      enableGrpItems(hDlg, ITMNOPARITY, ITMSPACEPARITY, trmParams.parity);
      enableGrpItems(hDlg, ITMXONFLOW, ITMNOFLOW, trmParams.flowControl);
      if(trmParams.dataBits == ITMDATA5) /* jtf 3.24 */
        {
        EnableWindow(GetDlgItem(hDlg, ITMDATA6), FALSE);
        EnableWindow(GetDlgItem(hDlg, ITMDATA7), FALSE);
        EnableWindow(GetDlgItem(hDlg, ITMDATA8), FALSE);
        }
      else
        EnableWindow(GetDlgItem(hDlg, ITMDATA5), FALSE);

      break;

   default:
      enableGrpItems(hDlg, ITMBD110, ITMBD1152, 0);
      enableGrpItems(hDlg, ITMDATA5, ITMDATA8, 0);  /* jtf 3.24 */
      enableGrpItems(hDlg, ITMSTOP1, ITMSTOP2, 0);
      enableGrpItems(hDlg, ITMNOPARITY, ITMSPACEPARITY, 0);
      enableGrpItems(hDlg, ITMXONFLOW, ITMNOFLOW, 0);
      break;
   }

   CheckDlgButton(hDlg, ITMPARITY, (comDevRef == ITMWINCOM) ? trmParams.fParity : FALSE);
   EnableWindow(GetDlgItem(hDlg, ITMPARITY), (comDevRef == ITMWINCOM) ? TRUE : FALSE);
   CheckDlgButton(hDlg, ITMCARRIER, (comDevRef == ITMWINCOM) ? trmParams.fCarrier : FALSE);
   EnableWindow(GetDlgItem(hDlg, ITMCARRIER), (comDevRef == ITMWINCOM) ? TRUE : FALSE);
}


INT_PTR APIENTRY dbComm(HWND  hDlg, UINT  message, WPARAM wParam, LPARAM lParam)
{
   WORD  wCurSel;                            /* seh nova 005 */
   LPCONNECTOR_CONTROL_BLOCK  lpWorkCCB;     /* slc nova 047 */
   WORD  lastItem;                           /* slc nova 117 */
   WORD  lastPort;			     /* slc nova 117 */
   BOOL  prevcarrier;

   updateTimer();

   switch(message)
   {
   case WM_INITDIALOG:
      initDlgPos(hDlg);

      if((((PSAVEPARAMS) taskState.string)->hData = GlobalAlloc(GMEM_MOVEABLE, (DWORD) sizeof(recTrmParams))) == NULL)
         break;
      ((PSAVEPARAMS) taskState.string)->lpData = (recTrmParams FAR *) GlobalLock(((PSAVEPARAMS) taskState.string)->hData);
      *(((PSAVEPARAMS) taskState.string)->lpData) = trmParams;

      trmParams.newDevRef = -1;              /* mbbx 2.00: network... */
      enableCommItems(hDlg, trmParams.comDevRef);

      initComDevSelect(hDlg, ITMCONNECTOR, FALSE);    /* mbbx 2.01.09 ... */

/* rjs bug2 - add tcp/ip connector for microsoft */
      EnableWindow(GetDlgItem(hDlg, ITMSETUP), FALSE);   /* slc nova 031, seh nova 005 */
      ShowWindow(GetDlgItem(hDlg, ITMSETUP), SW_HIDE);   /* seh nova 005 */
      addConnectorList(hDlg, ITMCONNECTOR);  /* slc nova 012 bjw gold 027 */
      ghWorkConnector = NULL;                /* slc nova 031 */
      if(trmParams.comDevRef == ITMDLLCONNECT)
      {
         SendDlgItemMessage(hDlg, ITMCONNECTOR, LB_SETCURSEL, trmParams.comExtRef - 1, 0L);
         ghWorkConnector = ghCCB;            /* slc nova 031 */
      }
/* end of rjs bug2 */
      return(TRUE);

   case WM_COMMAND:
      switch(GET_WM_COMMAND_ID(wParam, lParam))
      {
      case IDOK:


         if(!trmParams.fResetDevice)
         {
            if(trmParams.newDevRef != (BYTE) -1)   /* mbbx 2.00.04: force reload... */
               trmParams.fResetDevice = TRUE;
         }

         if(trmParams.newDevRef == ITMDLLCONNECT)  /* slc nova 031 */
         {
            if((ghWorkConnector != NULL) &&
               (ghWorkConnector != ghCCB))
            {
               GlobalFree(ghCCB);
               ghCCB = ghWorkConnector;
               ghWorkConnector = NULL;
            }
         }

         resetSerial(&trmParams, (trmParams.newDevRef != (BYTE) -1), FALSE, 0);  /* slc swat */

         if(sPort == (HANDLE)-1)
	    break;	 //return(TRUE);

         if((trmParams.newDevRef != (BYTE) -1) && (trmParams.comDevRef != trmParams.newDevRef))
            return(TRUE);

         termData.flags |= TF_CHANGED;
         break;

      case IDCANCEL:
         trmParams = *(((PSAVEPARAMS) taskState.string)->lpData);
         break;

/* rjs bug2 - begin */
      case ITMSETUP:
         if(ghWorkConnector != NULL)
            DLL_SetupConnector(ghWorkConnector, TRUE);
         SetFocus(GetDlgItem(hDlg, IDOK));
         return(TRUE);
/* rjs bug2 - end */

      case ITMBD110:
      case ITMBD300:
      case ITMBD600:                         /* mbbx 2.00: support 600 baud... */
      case ITMBD120:
      case ITMBD240:
      case ITMBD480:
      case ITMBD960:
      case ITMBD144:
      case ITMBD192:
      case ITMBD384:
      case ITMBD576:
      case ITMBD1152:
         switch(GET_WM_COMMAND_ID(wParam, lParam))
         {
         case ITMBD110:
            trmParams.speed = 110;
            break;
         case ITMBD300:
            trmParams.speed = 300;
            break;
         case ITMBD600:
            trmParams.speed = 600;
            break;
         case ITMBD120:
            trmParams.speed = 1200;
            break;
         case ITMBD240:
            trmParams.speed = 2400;
            break;
         case ITMBD480:
            trmParams.speed = 4800;
            break;
         case ITMBD960:
	    trmParams.speed = 9600;
	    break;
	 case ITMBD144:
	    trmParams.speed = 14400;
            break;
         case ITMBD192:
	    trmParams.speed = 19200;
	    break;
	 case ITMBD384:
	    trmParams.speed = 38400;
	    break;
	 case ITMBD576:
	    trmParams.speed = 57600;
	    break;
	 case ITMBD1152:
	    trmParams.speed = 57601;
	    break;
	 //case ITMBD1280:
	 //   trmParams.speed = 57602;
	 //   break;


         }

	 CheckRadioButton(hDlg, ITMBD110, ITMBD1152, GET_WM_COMMAND_ID(wParam, lParam));
         return(TRUE);

      case ITMDATA8:                         /* mbbx 2.00 ... */
         if(trmParams.parity != ITMNOPARITY)
            CheckRadioButton(hDlg, ITMNOPARITY, ITMSPACEPARITY, trmParams.parity = ITMNOPARITY);
                                             /* then fall thru... */
      case ITMDATA5:
      case ITMDATA6:
      case ITMDATA7:
         CheckRadioButton(hDlg, ITMDATA5, ITMDATA8, trmParams.dataBits = GET_WM_COMMAND_ID(wParam, lParam)); /* jtf 3.24 */
         return(TRUE);

      case ITMSTOP5:                      /* jtf 3.24 */
         CheckRadioButton(hDlg, ITMSTOP1, ITMSTOP2, trmParams.stopBits = GET_WM_COMMAND_ID(wParam, lParam));
         CheckRadioButton(hDlg, ITMDATA5, ITMDATA8, trmParams.dataBits = ITMDATA5); /* jtf 3.24 */
         EnableWindow(GetDlgItem(hDlg, ITMDATA5), TRUE);
         EnableWindow(GetDlgItem(hDlg, ITMDATA6), FALSE);
         EnableWindow(GetDlgItem(hDlg, ITMDATA7), FALSE);
         EnableWindow(GetDlgItem(hDlg, ITMDATA8), FALSE);
         return(TRUE);
        
      case ITMSTOP1:
      case ITMSTOP2:
         EnableWindow(GetDlgItem(hDlg, ITMDATA5), FALSE);
         EnableWindow(GetDlgItem(hDlg, ITMDATA6), TRUE);
         EnableWindow(GetDlgItem(hDlg, ITMDATA7), TRUE);
         EnableWindow(GetDlgItem(hDlg, ITMDATA8), TRUE);
         if (trmParams.dataBits = ITMDATA5)
            CheckRadioButton(hDlg, ITMDATA5, ITMDATA8, trmParams.dataBits = ITMDATA8); /* jtf 3.24 */
         CheckRadioButton(hDlg, ITMSTOP1, ITMSTOP2, trmParams.stopBits = GET_WM_COMMAND_ID(wParam, lParam));
         return(TRUE);

      case ITMODDPARITY:                     /* mbbx 2.00 ... */
      case ITMEVENPARITY:
      case ITMMARKPARITY:
      case ITMSPACEPARITY:
         if(trmParams.dataBits == ITMDATA8)
            CheckRadioButton(hDlg, ITMDATA5, ITMDATA8, trmParams.dataBits = ITMDATA7); /* jtf 3.24 */
                                             /* then fall thru... */
      case ITMNOPARITY:
         CheckRadioButton(hDlg, ITMNOPARITY, ITMSPACEPARITY, trmParams.parity = GET_WM_COMMAND_ID(wParam, lParam));
         return(TRUE);

      case ITMXONFLOW:
      case ITMHARDFLOW:
      case ITMNOFLOW:
         CheckRadioButton(hDlg, ITMXONFLOW, ITMNOFLOW, trmParams.flowControl = GET_WM_COMMAND_ID(wParam, lParam));
         return(TRUE);

      case ITMCONNECTOR:
         switch(GET_WM_COMMAND_CMD(wParam, lParam))              /* mbbx 2.00: network... */
         {
	 case LBN_SELCHANGE:		     /* mbbx 2.01.09 ... */
            lastItem = trmParams.newDevRef;  /* slc nova 117 */
            lastPort = trmParams.comPortRef; /* slc nova 117 */
            trmParams.comPortRef = getComDevSelect(hDlg, ITMCONNECTOR, &trmParams.newDevRef);

            if(trmParams.comPortRef > ITMCOM4)
            {
               wCurSel = (WORD) SendDlgItemMessage(hDlg, ITMCONNECTOR, LB_GETCURSEL, 0, 0L);  /* seh nova 005 */
               SendDlgItemMessage(hDlg, ITMCONNECTOR, LB_GETTEXT, wCurSel,
                                 (LPARAM) gszWork); /* bjw gold 027, seh nova 005 */

               if((ghWorkConnector == NULL) ||   /* slc nova 031 */
                  (ghWorkConnector == ghCCB))
               {
                  ghWorkConnector = GlobalAlloc(GHND | GMEM_ZEROINIT, (DWORD)sizeof(CONNECTOR_CONTROL_BLOCK));
               }

               EnableWindow(GetDlgItem(hDlg, ITMSETUP), FALSE);   /* slc nova 031 */
               ShowWindow(GetDlgItem(hDlg, ITMSETUP), SW_HIDE);
               if(loadConnector(hDlg, ghWorkConnector, gszWork, FALSE)) /* slc nova 031 */
               {
                  trmParams.comExtRef = (BYTE)(wCurSel + 1);
                  trmParams.newDevRef = ITMDLLCONNECT;
                  lstrcpy(trmParams.szConnectorName, gszWork);

                  if(DLL_HasSetupBox(ghWorkConnector))   /* slc nova 031 */
                  {
                     EnableWindow(GetDlgItem(hDlg, ITMSETUP), TRUE);
                     ShowWindow(GetDlgItem(hDlg, ITMSETUP), SW_SHOW);
                  }
               }
            }

            enableCommItems(hDlg, trmParams.newDevRef);
	    trmParams.fResetDevice = FALSE;
            break;
	 }
	 return(TRUE);



      case ITMPARITY:
         CheckDlgButton(hDlg, ITMPARITY, trmParams.fParity = !trmParams.fParity);
         return(TRUE);

      case ITMCARRIER:
	 prevcarrier = trmParams.fCarrier;
	 CheckDlgButton(hDlg, ITMCARRIER, trmParams.fCarrier = !trmParams.fCarrier);
	 //-sdj if fcarrier is disabled by the user, reset the mdmOnLine flag
	 //-sdj so that, the Dial menu item gets enabled. bug# 735
	 if (prevcarrier && !(trmParams.fCarrier) ) mdmOnLine = FALSE;
         return(TRUE);
      }
      break;

   default:
      return(FALSE);
   }

   if(((PSAVEPARAMS) taskState.string)->hData != NULL)
   {
      GlobalUnlock(((PSAVEPARAMS) taskState.string)->hData);
      GlobalFree(((PSAVEPARAMS) taskState.string)->hData);
   }

   EndDialog(hDlg, TRUE);
   return(TRUE);
}

/*---------------------------------------------------------------------------*/
/* dbModem() -                                                         [mbb] */
/*---------------------------------------------------------------------------*/

VOID NEAR loadModemData(HWND  hDlg, WORD  wMdmType)
{
   WORD  nResID;
   INT   ndx;
   BYTE  work[STR255];

   switch(wMdmType)
   {
   case ITMHAYES:
      nResID = STR_MDM_HAYES;
      break;
   case ITMMULTITECH:
      nResID = STR_MDM_MNP;
      break;
   case ITMTRAILBLAZER:
      nResID = STR_MDM_TELEBIT;
      break;
   default:                                  /* ITMNOMODEM */
      nResID = STR_MDM_NONE;
      break;
   }

   for(ndx = 0; ndx < 10; ndx ++)      /* rjs swat - changed to 10 from 11 */
   {
      LoadString(hInst, nResID + ndx, work, STR255-1);
      SetDlgItemText(hDlg, ITMDIAL + ndx, work);
   }

   ndx++;

   LoadString(hInst, nResID + ndx, work, STR255-1);
   SetDlgItemText(hDlg, ITMDIAL + ndx, work);
}


INT_PTR APIENTRY dbModem(HWND  hDlg, UINT  message, WPARAM wParam, LPARAM lParam)
{
   updateTimer();

   switch(message)
   {
   case WM_INITDIALOG:
      initDlgPos(hDlg);

      if((((PSAVEPARAMS) taskState.string)->hData = GlobalAlloc(GMEM_MOVEABLE, (DWORD) sizeof(recTrmParams))) == NULL)
         break;
      ((PSAVEPARAMS) taskState.string)->lpData = (recTrmParams FAR *) GlobalLock(((PSAVEPARAMS) taskState.string)->hData);
      *(((PSAVEPARAMS) taskState.string)->lpData) = trmParams;

      SetDlgItemText(hDlg, ITMDIAL, trmParams.dialPrefix);
      SetDlgItemText(hDlg, ITMDIAL+1, trmParams.dialSuffix);
      SetDlgItemText(hDlg, ITMHANGUP, trmParams.hangPrefix);
      SetDlgItemText(hDlg, ITMHANGUP+1, trmParams.hangSuffix);
      SetDlgItemText(hDlg, ITMBINTX, trmParams.binTXPrefix);
      SetDlgItemText(hDlg, ITMBINTX+1, trmParams.binTXSuffix);
      SetDlgItemText(hDlg, ITMBINRX, trmParams.binRXPrefix);
      SetDlgItemText(hDlg, ITMBINRX+1, trmParams.binRXSuffix);
      SetDlgItemText(hDlg, ITMFASTQRY, trmParams.fastInq);
      SetDlgItemText(hDlg, ITMFASTQRY+1, trmParams.fastRsp);
      SetDlgItemText(hDlg, ITMANSWER, trmParams.answer);
      SetDlgItemText(hDlg, ITMORIGIN, trmParams.originate);

      CheckRadioButton(hDlg, ITMMODEMFIRST, ITMMODEMLAST, trmParams.xMdmType);

      ((PSAVEPARAMS) taskState.string)->saveLevel = -1;
      
      return(TRUE);

   case WM_COMMAND:
      switch(GET_WM_COMMAND_ID(wParam, lParam))
      {
      case IDOK:
         GetDlgItemText(hDlg, ITMDIAL, trmParams.dialPrefix, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMDIAL+1, trmParams.dialSuffix, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMHANGUP, trmParams.hangPrefix, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMHANGUP+1, trmParams.hangSuffix, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMBINTX, trmParams.binTXPrefix, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMBINTX+1, trmParams.binTXSuffix, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMBINRX, trmParams.binRXPrefix, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMBINRX+1, trmParams.binRXSuffix, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMFASTQRY, trmParams.fastInq, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMFASTQRY+1, trmParams.fastRsp, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMANSWER, trmParams.answer, DCS_MODEMCMDSZ-1);
         GetDlgItemText(hDlg, ITMORIGIN, trmParams.originate, DCS_MODEMCMDSZ-1);

         trmParams.xMdmType = whichGrpButton(hDlg, ITMMODEMFIRST, ITMMODEMLAST);

         termData.flags |= TF_CHANGED;

         break;

      case IDCANCEL:
         trmParams = *(((PSAVEPARAMS) taskState.string)->lpData);
         break;

      case ITMHAYES:
      case ITMMULTITECH:
      case ITMTRAILBLAZER:
      case ITMNOMODEM:
         CheckRadioButton(hDlg, ITMMODEMFIRST, ITMMODEMLAST, GET_WM_COMMAND_ID(wParam, lParam));
         loadModemData(hDlg, GET_WM_COMMAND_ID(wParam, lParam));
         return(TRUE);

      default:
         return(TRUE);
      }
      break;

   default:
      return(FALSE);
   }

   EndDialog(hDlg, TRUE);
   return(TRUE);
}




/*---------------------------------------------------------------------------*/
/* chkGrpButton() -  Toggle on radio buttons.                                */
/*---------------------------------------------------------------------------*/

VOID chkGrpButton(HWND hDlg, INT iFirst, INT iLast, INT item)
{
   if((item >= iFirst) && (item <= iLast))   /* mbbx 1.04 ... */
      CheckRadioButton(hDlg, iFirst, iLast, item);
}


/*---------------------------------------------------------------------------*/
/* whichGrpButton() - Return which button in a group was pressed.            */
/*---------------------------------------------------------------------------*/

BYTE whichGrpButton(HWND  hDlg, INT   iFirst, INT iLast)
{
   INT   which;

   for(which = iFirst; which <= iLast; which += 1)
      if(IsDlgButtonChecked(hDlg, which))
         return((BYTE) which);

   return((BYTE) iFirst);
}
