//----------------------------------------------------------------------------
//
// Copyright (c) 1997-1999  Microsoft Corporation
// All rights reserved.
//
// File Name:
//      domain.c
//
// Description:
//      This file contains the dialog procedure for the domain join
//      page (IDD_DOMAINJ).      
//
//----------------------------------------------------------------------------

#include "pch.h"
#include "resource.h"



//----------------------------------------------------------------------------
//
// Function: DlgDomainJoinPage
//           DomainPageChangeAccount
//           DomainPageChangeWorkgroup
//
// Purpose: These are the dialog procedure and friends for the domain
//          join page
//
//----------------------------------------------------------------------------


//-------------------------------------------------------------------------
//
// Function: DomainPageChangeAccount
//
// Purpose: This function exists only to support the Domain Join page.
//          It is called whenever the user decides to create a computer
//          account (or not to).  This function handles checking
//          the box and all of the (un)greying activities that must occur.
//
//-------------------------------------------------------------------------

static VOID DomainPageChangeAccount(HWND hwnd, BOOL bCreateAccount)
{
    EnableWindow( GetDlgItem( hwnd, IDC_DOMAINACCT),       bCreateAccount );
    EnableWindow( GetDlgItem( hwnd, IDC_DOMAINPASSWD),     bCreateAccount );
    EnableWindow( GetDlgItem( hwnd, IDC_USERACCOUNTLABEL), bCreateAccount );
    EnableWindow( GetDlgItem( hwnd, IDC_ACCTNAMELABEL),    bCreateAccount );
    EnableWindow( GetDlgItem( hwnd, IDC_ACCTPSWDLABEL),    bCreateAccount );
    EnableWindow( GetDlgItem( hwnd, IDC_CONFIRMLABEL),     bCreateAccount );
    EnableWindow( GetDlgItem (hwnd, IDC_CONFIRMPASSWORD),  bCreateAccount );

    CheckDlgButton( hwnd,
                    IDC_CREATEACCT,
                    bCreateAccount ? BST_CHECKED : BST_UNCHECKED );
}

//-------------------------------------------------------------------------
//
// Function: DomainPageChangeWorkgroup
//
// Purpose: This function exists only to support the Domain Join page.
//          It is called whenever the user selectes DOMAIN instead of
//          workgroup and vice versa.  This function handles checking
//          the radio button and all of the (un)greying activities
//          that must occur.
//
//-------------------------------------------------------------------------

static VOID DomainPageChangeWorkGroup(HWND hwnd,
                                      BOOL bWorkGroup,
                                      BOOL bCreateAccount)
{
    BOOL bGreyAccountFields = FALSE;

    //
    // If workgroup is to be selected do the following:
    //      1. check the radio button
    //      2. ungrey the edit box for WORKGROUP
    //      3. grey the edit box for DOMAIN
    //      4. grey the check box for CREATE_ACCT
    //
    // If workgroup is not selected, then DOMAIN is.  In this case,
    // do the oppositte.
    //

    CheckRadioButton(hwnd,
                     IDC_RAD_WORKGROUP,
                     IDC_RAD_DOMAIN,
                     bWorkGroup ? IDC_RAD_WORKGROUP : IDC_RAD_DOMAIN);

    EnableWindow(GetDlgItem(hwnd, IDC_WORKGROUP),  bWorkGroup);
    EnableWindow(GetDlgItem(hwnd, IDC_DOMAIN),     !bWorkGroup);
    EnableWindow(GetDlgItem(hwnd, IDC_CREATEACCT), !bWorkGroup);

    //
    // The edit fields for the admin domain acct and passwd must be greyed
    // in the following cases:
    //      1. if workgroup is selected
    //      2. if domain is selected AND bCreateAccount checkbox is on.
    //
    // In other words, grey these always if workgroup is selected.  If
    // workgroup is not selected, grey or un-grey them depending on whether
    // that bCreateAccount check-box is on or not.
    //
    // Note that if !bWorkgroup, then the DOMAIN name has been selected.
    //

    if ( bWorkGroup || !bCreateAccount )
        bGreyAccountFields = TRUE;

    DomainPageChangeAccount(hwnd, !bGreyAccountFields);
}

//----------------------------------------------------------------------------
//
// Function:  OnDomainJoinInitDialog
//
// Purpose: 
//
// Arguments: 
//
// Returns: 
//
//----------------------------------------------------------------------------
VOID 
OnDomainJoinInitDialog( IN HWND hwnd ) {

    //
    //  Set the text limits on the edit boxes
    //

    SendDlgItemMessage( hwnd,
                        IDC_WORKGROUP,
                        EM_LIMITTEXT,
                        (WPARAM) MAX_WORKGROUP_LENGTH,
                        (LPARAM) 0 );

    SendDlgItemMessage( hwnd,
                        IDC_DOMAIN,
                        EM_LIMITTEXT,
                        (WPARAM) MAX_DOMAIN_LENGTH,
                        (LPARAM) 0 );

    SendDlgItemMessage( hwnd,
                        IDC_DOMAINACCT,
                        EM_LIMITTEXT,
                        (WPARAM) MAX_USERNAME_LENGTH,
                        (LPARAM) 0 );

    SendDlgItemMessage( hwnd,
                        IDC_DOMAINPASSWD,
                        EM_LIMITTEXT,
                        (WPARAM) MAX_DOMAIN_PASSWORD_LENGTH,
                        (LPARAM) 0 );

    SendDlgItemMessage( hwnd,
                        IDC_CONFIRMPASSWORD,
                        EM_LIMITTEXT,
                        (WPARAM) MAX_DOMAIN_PASSWORD_LENGTH,
                        (LPARAM) 0 );

}

//----------------------------------------------------------------------------
//
// Function:  OnDomainJoinSetActive
//
// Purpose: 
//
// Arguments: 
//
// Returns: 
//
//----------------------------------------------------------------------------
VOID 
OnDomainJoinSetActive( IN HWND hwnd ) {

    //
    //  Make sure the right radio button is checked and controls are greyed out
    //  properly
    //
    if( NetSettings.bWorkgroup ) {

        CheckRadioButton( hwnd, 
                          IDC_RAD_WORKGROUP, 
                          IDC_RAD_DOMAIN, 
                          IDC_RAD_WORKGROUP );

        DomainPageChangeWorkGroup( hwnd,
                                   TRUE,
                                   NetSettings.bCreateAccount );

    }
    else {

        CheckRadioButton( hwnd, 
                          IDC_RAD_WORKGROUP, 
                          IDC_RAD_DOMAIN, 
                          IDC_RAD_DOMAIN );

        DomainPageChangeWorkGroup( hwnd,
                                   FALSE,
                                   NetSettings.bCreateAccount );

    }

    //
    //  Always re-fill the edit controls with the proper data here because
    //  they might have reset or loaded from a new answer file
    //

    SendDlgItemMessage( hwnd,
                        IDC_WORKGROUP,
                        WM_SETTEXT,
                        (WPARAM) MAX_WORKGROUP_LENGTH,
                        (LPARAM) NetSettings.WorkGroupName );

    SendDlgItemMessage( hwnd,
                        IDC_DOMAIN,
                        WM_SETTEXT,
                        (WPARAM) MAX_DOMAIN_LENGTH,
                        (LPARAM) NetSettings.DomainName );

    SendDlgItemMessage( hwnd,
                        IDC_DOMAINACCT,
                        WM_SETTEXT,
                        (WPARAM) MAX_USERNAME_LENGTH,
                        (LPARAM) NetSettings.DomainAccount );

    SendDlgItemMessage( hwnd,
                        IDC_DOMAINPASSWD,
                        WM_SETTEXT,
                        (WPARAM) MAX_DOMAIN_PASSWORD_LENGTH,
                        (LPARAM) NetSettings.DomainPassword );

    SendDlgItemMessage( hwnd,
                        IDC_CONFIRMPASSWORD,
                        WM_SETTEXT,
                        (WPARAM) MAX_DOMAIN_PASSWORD_LENGTH,
                        (LPARAM) NetSettings.ConfirmPassword );

    WIZ_BUTTONS(hwnd, PSWIZB_BACK | PSWIZB_NEXT );

}

//----------------------------------------------------------------------------
//
// Function:  OnWizNextDomainPage
//
// Purpose: 
//
// Arguments: IN HWND hwnd - handle to the dialog
//
// Returns:  BOOL
//
//----------------------------------------------------------------------------
BOOL 
OnWizNextDomainPage( IN HWND hwnd ) {

    //
    // Retrieve all of the settings on this dialog but only
    // if they are valid
    //
    
    TCHAR szWorkgroupName[MAX_WORKGROUP_LENGTH + 1]          = _T("");
    TCHAR szDomainName[MAX_DOMAIN_LENGTH + 1]                = _T("");
    TCHAR szUsername[MAX_USERNAME_LENGTH + 1]                = _T("");
    TCHAR szDomainPassword[MAX_DOMAIN_PASSWORD_LENGTH + 1]   = _T("");
    TCHAR szConfirmPassword[MAX_DOMAIN_PASSWORD_LENGTH + 1]  = _T("");

    BOOL bResult = TRUE;

    // ISSUE-2002/02/28-stelo- the only error checking done now is to
    // make sure none of the valid fields are empty, when I do more rigourous
    // error checking, try to clean up this code
    if( IsDlgButtonChecked( hwnd, IDC_RAD_WORKGROUP ) ) {
    
        //  user selected to Join a Workgroup
        NetSettings.bWorkgroup = TRUE;
        
        //
        //  Get the Workgroup string
        //
        SendDlgItemMessage( hwnd,
                            IDC_WORKGROUP,
                            WM_GETTEXT,
                            (WPARAM) AS(szWorkgroupName),
                            (LPARAM) szWorkgroupName );
        
        //
        //  see if the string in szPassword is a valid Workgroup name
        //
        
        if( szWorkgroupName[0] != _T('\0') ) {
            
            lstrcpyn( NetSettings.WorkGroupName, szWorkgroupName, AS(NetSettings.WorkGroupName) );
            
        }
        else if( GenSettings.iUnattendMode == UMODE_FULL_UNATTENDED ) {  
        
            //
            // only report an error on fully unattended
            //
            ReportErrorId( hwnd,
                           MSGTYPE_ERR,
                           IDS_ENTERWORKGROUP ) ;
            
            bResult = FALSE;
            
        }
        else {
        
            lstrcpyn( NetSettings.WorkGroupName, _T(""), AS(NetSettings.WorkGroupName) );

        }
                        
    }
    else {
          
        //  user selected to Join a Domain
        NetSettings.bWorkgroup = FALSE;

        //
        //  Get the Domain string
        //
        SendDlgItemMessage( hwnd,
                            IDC_DOMAIN,
                            WM_GETTEXT,
                            (WPARAM) AS(szDomainName),
                            (LPARAM) szDomainName );
                            
        //
        //  see if the string in szBuffer is a valid Domain name
        //

        if( szDomainName[0] != _T('\0') ) {

            lstrcpyn( NetSettings.DomainName, szDomainName, AS(NetSettings.DomainName) );
            
        }
        else if( GenSettings.iUnattendMode == UMODE_FULL_UNATTENDED ) {  
            
            //
            // only report an error on fully unattended
            //
            ReportErrorId( hwnd,
                           MSGTYPE_ERR,
                           IDS_ENTERNTDOMAIN );
            
            bResult = FALSE;
            
        }
        else {

            lstrcpyn( NetSettings.DomainName, _T(""), AS(NetSettings.DomainName) );

        }
        
        if( IsDlgButtonChecked( hwnd, IDC_CREATEACCT ) ) {
        
            SendDlgItemMessage( hwnd,
                                IDC_DOMAINACCT,
                                WM_GETTEXT,
                                (WPARAM) AS(szUsername),
                                (LPARAM) szUsername );
            
            if( szUsername[0] != _T('\0') ) {

                lstrcpyn( NetSettings.DomainAccount, szUsername, AS(NetSettings.DomainAccount) );
                
            }
            else {
            
                //  don't print this error if we've already printed an error
                if( bResult ) {

                    ReportErrorId( hwnd,
                                   MSGTYPE_ERR,
                                   IDS_ENTERUSERNAME );
                
                    bResult = FALSE;

                }
                
            }

            SendDlgItemMessage( hwnd,
                                IDC_DOMAINPASSWD,
                                WM_GETTEXT,
                                (WPARAM) AS(szDomainPassword),
                                (LPARAM) szDomainPassword );
           
            SendDlgItemMessage( hwnd,
                                IDC_CONFIRMPASSWORD,
                                WM_GETTEXT,
                                (WPARAM) AS(szConfirmPassword),
                                (LPARAM) szConfirmPassword );

            if( lstrcmp( szDomainPassword, szConfirmPassword ) != 0 ) {

                //  don't print this error if we've already printed an error
                if(  bResult ) {

                    ReportErrorId( hwnd,
                                   MSGTYPE_ERR,
                                   IDS_PASSWORDS_DONT_MATCH ) ;
                
                    bResult = FALSE;

                }

            }
            else {
            
                //
                //  The only reason why we are saving the confirm password is so that
                //  the confirm edit box is cleared with the other boxes on a Reset
                //
                lstrcpyn( NetSettings.DomainPassword, szDomainPassword, AS(NetSettings.DomainPassword) );
                lstrcpyn( NetSettings.ConfirmPassword, szConfirmPassword, AS(NetSettings.ConfirmPassword) );
                
            }
 
        }
        
    }
    
    return ( bResult );

}

INT_PTR CALLBACK DlgDomainJoinPage(
    IN HWND     hwnd,    
    IN UINT     uMsg,        
    IN WPARAM   wParam,    
    IN LPARAM   lParam)
{   
    BOOL bStatus = TRUE;

    switch (uMsg) {

        case WM_INITDIALOG:
        {

            OnDomainJoinInitDialog( hwnd );

            break;

        }

        case WM_COMMAND:
            {
                int nButtonId=LOWORD(wParam);

                switch ( nButtonId ) {

                    case IDC_RAD_WORKGROUP:

                        if ( HIWORD(wParam) == BN_CLICKED ) {

                            DomainPageChangeWorkGroup(
                                            hwnd,
                                            TRUE,
                                            NetSettings.bCreateAccount);
                        }
                        break;

                    case IDC_RAD_DOMAIN:

                        if ( HIWORD(wParam) == BN_CLICKED ) {

                            DomainPageChangeWorkGroup(
                                            hwnd,
                                            FALSE,
                                            NetSettings.bCreateAccount);
                        }
                        break;

                    case IDC_CREATEACCT:

                        if ( HIWORD(wParam) == BN_CLICKED ) {

                            NetSettings.bCreateAccount =
                                    IsDlgButtonChecked(hwnd, IDC_CREATEACCT);

                            DomainPageChangeAccount(
                                            hwnd,
                                            NetSettings.bCreateAccount);
                        }
                        break;

                    default:
                        bStatus = FALSE;
                        break;
                }
            }
            break;                

        case WM_NOTIFY:
            {
                LPNMHDR pnmh = (LPNMHDR)lParam;
                switch( pnmh->code ) {

                    case PSN_QUERYCANCEL:

                        WIZ_CANCEL(hwnd);
                        break;

                    case PSN_SETACTIVE:

                        g_App.dwCurrentHelp = IDH_WKGP_DOMN;

                        OnDomainJoinSetActive( hwnd );

                        break;

                    case PSN_WIZBACK:
                        bStatus = FALSE;
                        break;

                    case PSN_WIZNEXT:

                        if ( !OnWizNextDomainPage( hwnd ) )
                            WIZ_FAIL(hwnd);
                        else
                            bStatus = FALSE;
                        break;
                   
                    case PSN_HELP:
                        WIZ_HELP();
                        break;

                    default:
                        bStatus = FALSE;
                        break;
                }
            }
            break;

        default:
            bStatus = FALSE;
            break;
    }
    return bStatus;
}