//*********************************************************************
//*                  Microsoft Windows                               **
//*            Copyright(c) Microsoft Corp., 1993                    **
//*********************************************************************

#include "admincfg.h"

extern HIMAGELIST hImageListSmall;
HWND hwndUserList;
CHAR gszName[MAXSTRLEN];
BOOL gfMaintenance;

//-----------------------------------------------------------------------
// Function: AddPage(lphPages,lpwCount,id,pfn,lpsi)
//
// Action: Add a property sheet page to the list of pages to display.
//
// Return: TRUE if page was added, FALSE if not
//-----------------------------------------------------------------------
BOOL NEAR PASCAL AddPage(HPROPSHEETPAGE *lphPages,
                         UINT           *lpwCount,
                         UINT            id,
                         DLGPROC         pfn,
                         HWND            hwndUser)
{
	PROPSHEETPAGE psp;

    memset(&psp,0,sizeof(PROPSHEETPAGE));

    if(NUM_WIZARD_PAGES > *lpwCount)
    {
	    psp.dwSize = sizeof(psp);
	    psp.dwFlags = PSP_DEFAULT;
	    psp.hInstance = ghInst;
	    psp.pszTemplate = MAKEINTRESOURCE(id);
	    psp.pfnDlgProc = pfn;
        psp.lParam = (LPARAM)hwndUser;

        // Use release function for the first page only. This means it
        // always gets called exactly once if any of our pages are visited,
        if(!*lpwCount)
        {
            psp.dwFlags |= PSP_USECALLBACK;
        }

        lphPages[*lpwCount] = CreatePropertySheetPage(&psp);
        if(lphPages[*lpwCount])
        {
            (*lpwCount)++;
            return TRUE;
        }
    }

    return FALSE;
}
/*******************************************************************

	NAME:		BeginEndDlgProc

	SYNOPSIS:	Generic dialog proc for the beginning and ending wizard pages

********************************************************************/
BOOL CALLBACK BeginEndDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
	LPARAM lParam)
{
	
	LPPROPSHEETPAGE lpsp;

	lpsp = (LPPROPSHEETPAGE)GetWindowLong(hDlg,DWL_USER);

	switch (uMsg) {

		case WM_INITDIALOG:

			{
				// get propsheet page struct passed in
				lpsp = (LPPROPSHEETPAGE) lParam;

				// store pointer to private page info in window data for later
                SetWindowLong(hDlg,DWL_USER,lParam);
				return TRUE;
			}
			break;	// WM_INITDIALOG
				  	
	 	case WM_NOTIFY:

			{
				switch (((NMHDR *)lParam)->code){

					case PSN_SETACTIVE:
						// initialize 'back' and 'next' wizard buttons
						if (lpsp->pszTemplate == MAKEINTRESOURCE(IDD_INTRO_DLG))
						    PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT);
						else if (lpsp->pszTemplate == MAKEINTRESOURCE(IDD_EXPLAIN_DLG))
						    PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT | PSWIZB_BACK);
						else if (lpsp->pszTemplate == MAKEINTRESOURCE(IDD_END_DLG))
						{
							PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_FINISH |PSWIZB_BACK);
							PropSheet_CancelToClose(GetParent(hDlg));
						}
						return TRUE;
						break;

					case PSN_QUERYCANCEL:

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);
						return TRUE;
						break;

                    case PSN_WIZBACK:
                    	//Finish dlg goes to different place.
                        
						if (lpsp->pszTemplate == MAKEINTRESOURCE(IDD_END_DLG))
						{
						    PropSheet_SetCurSel(GetParent(hDlg),NULL, I_USER_DLG);
                            SetWindowLong(hDlg,DWL_MSGRESULT, IDD_USER_DLG);
                            return TRUE;
                        }

				}
			}
			break;

	}

	return FALSE;
}

/****************************************************************************\
 *
 *	NAME:		RestDlgProc
 *
 *	SYNOPSIS:	Generic dialog proc for the beginning and ending wizard pages
 *
\****************************************************************************/
BOOL CALLBACK RestDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
	LPARAM lParam)
{
	
	LPPROPSHEETPAGE lpsp;

	lpsp = (LPPROPSHEETPAGE)GetWindowLong(hDlg,DWL_USER);

	switch (uMsg) {

		case WM_INITDIALOG:

			{
				// get propsheet page struct passed in
				lpsp = (LPPROPSHEETPAGE) lParam;

				// store pointer to private page info in window data for later
                SetWindowLong(hDlg,DWL_USER,lParam);

				// initialize 'back' and 'next' wizard buttons, if
				// page wants something different it can fix in init proc below

				PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT | PSWIZB_BACK);

				return TRUE;
			}
			break;	// WM_INITDIALOG
				  	
	 	case WM_NOTIFY:

			{
				switch (((NMHDR *)lParam)->code){

					case PSN_SETACTIVE:
						// initialize 'back' and 'next' wizard buttons
						PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT | PSWIZB_BACK);

						return TRUE;
						break;

					case PSN_QUERYCANCEL:

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);
						return TRUE;
						break;
				}
			}
			break;

	}

	return FALSE;
}

/*******************************************************************

	NAME:		MainDlgProc


********************************************************************/
BOOL CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
	LPARAM lParam)
{
	
	LPPROPSHEETPAGE lpsp;
	USERHDR UserHdr;
	HGLOBAL hUser;

	lpsp = (LPPROPSHEETPAGE)GetWindowLong(hDlg,DWL_USER);

	switch (uMsg) {

		case WM_INITDIALOG:

			{
				// get propsheet page struct passed in
				lpsp = (LPPROPSHEETPAGE) lParam;

				// store pointer to private page info in window data for later
                SetWindowLong(hDlg,DWL_USER,lParam);

				hUser = FindUser((HWND)lpsp->lParam,gszName,UT_USER);

				if (!hUser || !GetUserHeader(hUser,&UserHdr)) {
				 		MsgBox(hDlg,IDS_ErrOUTOFMEMORY,MB_ICONEXCLAMATION,MB_OK);
 		                return FALSE;
	            }

			    PropSheet_SetTitle(GetParent(hDlg), PSH_PROPTITLE, UserHdr.szName);

				// initialize 'back' and 'next' wizard buttons
				PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT | PSWIZB_BACK);

				GlobalUnlock(hUser);
				return TRUE;
			}
			break;	// WM_INITDIALOG
				  	
	 	case WM_NOTIFY:												 

			{
				switch (((NMHDR *)lParam)->code){

					case PSN_SETACTIVE:
						// initialize 'back' and 'next' wizard buttons
						PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT | PSWIZB_BACK);

						return TRUE;
						break;

					case PSN_QUERYCANCEL:

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);
						return TRUE;
						break;

				    case PSN_WIZBACK:
						// In maintenance mode, Back brings you to a different screen.
						if (gfMaintenance)
						{
						    SetWindowLong(hDlg,DWL_MSGRESULT,IDD_USER_DLG);
							return TRUE;
						}
						break;
				}
			}
			break;

	}

	return FALSE;
}

/****************************************************************************\
 *
 *	NAME:		UserDlgProc
 *
 *	SYNOPSIS:	Generic dialog proc for the beginning and ending wizard pages
 *
\****************************************************************************/
BOOL CALLBACK UserDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
	LPARAM lParam)
{
	
	LPPROPSHEETPAGE lpsp;
    USERDATA       *pUserData;
    HGLOBAL         hUser;
    UINT            i;

	lpsp = (LPPROPSHEETPAGE)GetWindowLong(hDlg,DWL_USER);

	switch (uMsg) {

		case WM_INITDIALOG:

			{
				// get propsheet page struct passed in
				lpsp = (LPPROPSHEETPAGE) lParam;

				// store pointer to private page info in window data for later
                SetWindowLong(hDlg,DWL_USER,lParam);

				PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_FINISH);
				
				// Once we're here, it's the same as maintenance mode.
				gfMaintenance = TRUE;
				return TRUE;
			}
			break;	// WM_INITDIALOG

	 	case WM_COMMAND:
			switch (wParam) {

				case IDD_USER_ADD:
				    //if (HIWORD(wParam) == BN_CLICK
				    PropSheet_PressButton(GetParent(hDlg), PSBTN_NEXT);
					break;

				case IDD_USER_CHANGE:
				    i = SendDlgItemMessage(hDlg, IDD_USER_LIST, LB_GETCURSEL, 0, 0L);

					if (i >= 0)
					{
					    SendDlgItemMessage(hDlg, IDD_USER_LIST, LB_GETTEXT, i, (LPARAM)gszName);
						PropSheet_SetCurSel(GetParent(hDlg),NULL, I_MAIN_DLG);
					}
					break;
			}

			break;

	 	case WM_NOTIFY:

			{
				switch (((NMHDR *)lParam)->code){

					case PSN_SETACTIVE:
						// initialize 'back' and 'next' wizard buttons
					
						SendDlgItemMessage(hDlg, IDD_USER_LIST, LB_RESETCONTENT,0,0);
						i = 0;
		                while ((hUser = (HGLOBAL) ListView_GetItemParm(hwndUser,i)) &&
		                    (pUserData = (USERDATA *) GlobalLock(hUser)))
		                { 
		                    SendDlgItemMessage(hDlg,IDD_USER_LIST, LB_ADDSTRING, 0, (LPARAM)pUserData->hdr.szName  );
		                    GlobalUnlock(hUser);
		                    i++;
		                }
                

				        PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_FINISH);

						return TRUE;
						break;

					case PSN_QUERYCANCEL:

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);
						return TRUE;
						break;

					case PSN_WIZFINISH:
						// save changes if user OK's the dialog
						dwAppState = AS_FILELOADED | AS_FILEHASNAME | AS_POLICYFILE | AS_FILEDIRTY;
						if (!SaveFile(szDatFilename,hDlg,(HWND)lpsp->lParam))
							dwDlgRetCode = AD_POLSAVEERR;

                        PropSheet_SetCurSel(GetParent(hDlg),NULL, I_END_DLG);
					    SetWindowLong(hDlg,DWL_MSGRESULT,IDD_END_DLG);
						return TRUE;
						break;
				}
			}
			break;

	}

	return FALSE;
}


/*******************************************************************

	NAME:		NewUserDlgProc


********************************************************************/
BOOL CALLBACK NewUserDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
	LPARAM lParam)
{
	
	LPPROPSHEETPAGE lpsp;
    HGLOBAL         hUser;
    UINT            nRet;
	CHAR			szName[MAXSTRLEN];

	lpsp = (LPPROPSHEETPAGE)GetWindowLong(hDlg,DWL_USER);

	switch (uMsg) {

		case WM_INITDIALOG:

			{
				// get propsheet page struct passed in
				lpsp = (LPPROPSHEETPAGE) lParam;

				// store pointer to private page info in window data for later
                SetWindowLong(hDlg,DWL_USER,lParam);

				PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT | PSWIZB_BACK);
				return TRUE;
			}
			break;	// WM_INITDIALOG

	 	case WM_NOTIFY:

			{
				switch (((NMHDR *)lParam)->code){

					case PSN_WIZNEXT:

						if (!GetDlgItemText(hDlg, IDD_NEWUSER_NAME, szName, sizeof(szName)))
                        {
                            MsgBox(hDlg, IDS_NOUSER, MB_ICONEXCLAMATION,MB_OK);
                            SetWindowLong(hDlg,DWL_MSGRESULT, -1);
                            return TRUE;
                        }
                        

						hUser = FindUser(hwndUser,szName, UT_USER);

						if ((hUser) &&
							(MsgBox(hDlg, IDS_USEREXISTS, MB_ICONEXCLAMATION, MB_YESNO) != IDYES))
						{
						    // Allow user to enter another name.
						    SetWindowLong(hDlg,DWL_MSGRESULT,-1);
				        	return TRUE;
						}

						if (!hUser) {
							hUser = AddUser(hwndUser,szName,UT_USER);
						}

						if (!hUser) {
							MsgBox(hDlg,IDS_ErrOUTOFMEMORY,MB_ICONEXCLAMATION,MB_OK);
							dwDlgRetCode = AD_OUTOFMEMORY;
							return FALSE;
						}

	                    GlobalUnlock(hUser);
                    	lstrcpy(szName, gszName);

	                    SetWindowLong(hDlg,DWL_MSGRESULT, IDD_MAIN_DLG);
						return TRUE;
						break;



					case PSN_SETACTIVE:
						// initialize 'back' and 'next' wizard buttons
				        PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT | PSWIZB_BACK);

						return TRUE;
						break;

					case PSN_QUERYCANCEL:

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);
						return TRUE;
						break;
				}
			}
			break;

	}

	return FALSE;
}

BOOL WINAPI DoWizard(HWND hWnd, HWND hwndUser)
{
    HPROPSHEETPAGE      hPages[NUM_WIZARD_PAGES];
    PROPSHEETHEADER     psHeader;
    int                 iRet;

	// zero out structures
    memset(&hPages,0,sizeof(hPages));
	memset(&psHeader,0,sizeof(psHeader));

    AddPage((HPROPSHEETPAGE *)&hPages, &psHeader.nPages, IDD_INTRO_DLG,   BeginEndDlgProc, hwndUser);
    AddPage((HPROPSHEETPAGE *)&hPages, &psHeader.nPages, IDD_EXPLAIN_DLG, BeginEndDlgProc, hwndUser);
    AddPage((HPROPSHEETPAGE *)&hPages, &psHeader.nPages, IDD_MAIN_DLG,    MainDlgProc, hwndUser);
    AddPage((HPROPSHEETPAGE *)&hPages, &psHeader.nPages, IDD_UNRATE_DLG,  RestDlgProc, hwndUser);
    AddPage((HPROPSHEETPAGE *)&hPages, &psHeader.nPages, IDD_USER_DLG,    UserDlgProc, hwndUser);
    AddPage((HPROPSHEETPAGE *)&hPages, &psHeader.nPages, IDD_NEWUSER_DLG, NewUserDlgProc, hwndUser);
    AddPage((HPROPSHEETPAGE *)&hPages, &psHeader.nPages, IDD_END_DLG,     BeginEndDlgProc, hwndUser);

	// fill out property sheet header struct
	psHeader.dwSize = sizeof(psHeader);
    psHeader.dwFlags = PSH_WIZARD;
    psHeader.hwndParent = hWnd;
	psHeader.hInstance = ghInst;
	psHeader.phpage = hPages;

	// Set global information
	LoadSz(IDS_DEFAULTUSER,gszName,sizeof(gszName));
	gfMaintenance = FALSE; 

	// run the Wizard
    iRet = PropertySheet(&psHeader);

	if (iRet < 0) {
		// property sheet failed, most likely due to lack of memory
        MsgBox(NULL,IDS_ErrOUTOFMEMORY,MB_ICONEXCLAMATION,MB_OK);
    }

	return (iRet > 0);
}