/****************************************************************/
/*																*/
/*  UserAccountsDlg.cpp											*/
/*																*/
/*  Implementation of the CUserAccountsDlg class.				*/
/*																*/
/*  Programmed by LYFZ van der Meer							*/
/*  Copyright LYFZ Software Solutions 2002						*/
/*	http://www.LYFZvandermeer.nl								*/
/*																*/
/*  Last updated: 10 july 2002									*/
/*																*/
/****************************************************************/

#include "stdafx.h"
#include "DBServer.h"
#include "UserAccountsDlg.h"
#include "AddUserDlg.h"
#include "DirectoryDlg.h"
#include "WizardPages.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CDBServer theApp;

CUserAccountsDlg::CUserAccountsDlg(CWnd* pParent /*=NULL*/)
	: CDialogResize(CUserAccountsDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CUserAccountsDlg) IDC_USERS
	m_strPassword = _T("");
	m_bDisableAccount = FALSE;
	//}}AFX_DATA_INIT
	m_nPreviousIndex = LB_ERR;
	m_hIcon = AfxGetApp()->LoadIcon(IDI_DBServer);
}

CUserAccountsDlg::~CUserAccountsDlg()
{
	
}


void CUserAccountsDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogResize::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CUserAccountsDlg)
	DDX_Control(pDX, IDC_USERS, m_UsersList);
	DDX_Control(pDX, IDC_DIR_LIST, m_DirectoryList);
	DDX_Text(pDX, IDC_PASSWORD, m_strPassword);
	DDX_Check(pDX, IDC_DISABLE_ACCOUNT, m_bDisableAccount);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CUserAccountsDlg, CDialogResize)
	//{{AFX_MSG_MAP(CUserAccountsDlg)
	ON_LBN_SELCHANGE(IDC_USER_LIST, OnSelchangeUserlist)
	ON_NOTIFY(NM_DBLCLK, IDC_DIR_LIST, OnDblclkDirlist)
	ON_BN_CLICKED(IDC_ADD_DIR, OnAddDir)
	ON_BN_CLICKED(IDC_EDIT_DIR, OnEditDir)
	ON_BN_CLICKED(IDC_DEL_DIR, OnDelDir)
	ON_BN_CLICKED(IDC_SET_HOME, OnSetHome)
	ON_BN_CLICKED(IDC_ADD_USER, OnAddUser)
	ON_BN_CLICKED(IDC_EDIT_USER, OnEditUser)
	ON_BN_CLICKED(IDC_DEL_USER, OnDelUser)
	ON_UPDATE_COMMAND_UI(IDC_EDIT_USER, OnUpdateControls)
	ON_UPDATE_COMMAND_UI(IDC_DISABLE_ACCOUNT, OnUpdateDisableAccount)
	ON_NOTIFY(NM_CLICK, IDC_USERS, OnClickUsers)
	ON_NOTIFY(LVN_KEYDOWN, IDC_USERS, OnKeydownUsers)
	ON_BN_CLICKED(IDC_DISABLE_ACCOUNT, OnDisableAccount)
	ON_UPDATE_COMMAND_UI(IDC_DEL_USER, OnUpdateControls)
	ON_UPDATE_COMMAND_UI(IDC_PASSWORD, OnUpdateControls)
	ON_UPDATE_COMMAND_UI(IDC_DIR_LIST, OnUpdateControls)
	ON_UPDATE_COMMAND_UI(IDC_ADD_DIR, OnUpdateControls)
	ON_UPDATE_COMMAND_UI(IDC_EDIT_DIR, OnUpdateControls)
	ON_UPDATE_COMMAND_UI(IDC_DEL_DIR, OnUpdateControls)
	ON_UPDATE_COMMAND_UI(IDC_SET_HOME, OnUpdateControls)
	ON_BN_CLICKED(IDC_WIZARD, OnWizard)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


BEGIN_DLGRESIZE_MAP(CUserAccountsDlg)
	DLGRESIZE_CONTROL(IDC_ADD_DIR, DLSZ_MOVE_Y)
	DLGRESIZE_CONTROL(IDC_EDIT_DIR, DLSZ_MOVE_Y)
	DLGRESIZE_CONTROL(IDC_DEL_DIR, DLSZ_MOVE_X | DLSZ_MOVE_Y)
	DLGRESIZE_CONTROL(IDC_SET_HOME, DLSZ_MOVE_X | DLSZ_MOVE_Y)
	DLGRESIZE_CONTROL(IDCANCEL, DLSZ_MOVE_X | DLSZ_MOVE_Y)
	DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_X | DLSZ_MOVE_Y)
	DLGRESIZE_CONTROL(IDC_DIR_LIST, DLSZ_SIZE_X | DLSZ_SIZE_Y)
	DLGRESIZE_CONTROL(IDC_STATIC3, DLSZ_SIZE_X | DLSZ_SIZE_Y)
	DLGRESIZE_CONTROL(IDC_STATIC1, DLSZ_SIZE_Y)
	DLGRESIZE_CONTROL(IDC_STATIC2, DLSZ_SIZE_X)
	DLGRESIZE_CONTROL(IDC_USERS, DLSZ_SIZE_Y)
	DLGRESIZE_CONTROL(IDC_ADD_USER, DLSZ_MOVE_Y)
	DLGRESIZE_CONTROL(IDC_EDIT_USER, DLSZ_MOVE_Y)
	DLGRESIZE_CONTROL(IDC_DEL_USER, DLSZ_MOVE_Y)
	DLGRESIZE_CONTROL(IDC_WIZARD, DLSZ_MOVE_Y)
END_DLGRESIZE_MAP()


/********************************************************************/
/*																	*/
/* Function name : OnInitDialog										*/
/* Description   : Initialize dialog								*/
/*																	*/
/********************************************************************/
BOOL CUserAccountsDlg::OnInitDialog() 
{
	CDialogResize::OnInitDialog();
	
	InitResizing();
	
	// Set the icon for this dialog.
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	CRect rc;
	m_UsersList.GetClientRect(rc);
	m_UsersList.InsertColumn(0, "�û�", LVCFMT_LEFT, rc.Width()-5);

	// fill user list
	for (int i=0; i < m_UserArray.GetSize(); i++)
	{
		int nIndex = m_UsersList.InsertItem(0, m_UserArray[i].m_strName, 2);
		m_UsersList.SetItemData(nIndex, i);
	}
	// setup directory list
	m_DirectoryList.InsertColumn(0, "ʵ��Ŀ¼", LVCFMT_LEFT, 100);
	m_DirectoryList.InsertColumn(1, "����Ŀ¼", LVCFMT_LEFT, 100);
	m_DirectoryList.InsertColumn(2, "����", LVCFMT_LEFT, 10);
	m_DirectoryList.InsertColumn(3, "�ϴ�", LVCFMT_LEFT, 10);
	m_DirectoryList.InsertColumn(4, "����", LVCFMT_LEFT, 10);
	m_DirectoryList.InsertColumn(5, "ɾ��", LVCFMT_LEFT, 10);
	m_DirectoryList.InsertColumn(6, "��Ŀ¼", LVCFMT_LEFT, 10);

	// create and attach imagelist
	m_ImageList.Create(16, 16, ILC_MASK, 3, 3);
	HICON hIcon = AfxGetApp()->LoadIcon(IDI_NONE);
	m_ImageList.Add(hIcon);
	DestroyIcon(hIcon);

	hIcon = AfxGetApp()->LoadIcon(IDI_HOME);
	m_ImageList.Add(hIcon);
	DestroyIcon(hIcon);

	hIcon = AfxGetApp()->LoadIcon(IDI_USER);
	m_ImageList.Add(hIcon);
	DestroyIcon(hIcon);

	m_DirectoryList.SetImageList(&m_ImageList, LVSIL_SMALL);
	m_UsersList.SetImageList(&m_ImageList, LVSIL_SMALL);

	// select preferred user ?
	if (!m_strUserName.IsEmpty())
	{
		LVFINDINFO info;
	
		info.flags = LVFI_STRING;
		info.psz = (LPCTSTR)m_strUserName;

		int nIndex = m_UsersList.FindItem(&info);
		m_UsersList.SetItemState(nIndex ,LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); 
	}
	else
	{
		m_UsersList.SetItemState(0 ,LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); 
	}

	GetDlgItem(IDC_PASSWORD)->ModifyStyle(NULL, ES_PASSWORD);
	((CEdit *)GetDlgItem(IDC_PASSWORD))->SetPasswordChar('*');

	OnSelchangeUserlist();
	
	UpdateDialogControls(this, FALSE);
	AutoSizeColumns();	
	return TRUE;
}


/********************************************************************/
/*																	*/
/* Function name : OnClickUsers										*/
/* Description   : Selection in the user listcontrol has changed.	*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnClickUsers(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnSelchangeUserlist();
	*pResult = 0;
}


/********************************************************************/
/*																	*/
/* Function name : OnKeydownUsers									*/
/* Description   : Selection in the user listcontrol has changed.	*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnKeydownUsers(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;

    // get index of selected item
	int nIndex = m_UsersList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
    
    if(nIndex == -1)
        return;

	if (pLVKeyDow->wVKey == VK_DOWN)
	{
		if (m_UsersList.GetItemCount()-1 > nIndex)
		{
			m_UsersList.SetItemState(nIndex + 1, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); 
		}
	}
	else
	if (pLVKeyDow->wVKey == VK_UP)
	{
		if (nIndex > 0)
		{
			m_UsersList.SetItemState(nIndex - 1, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); 
		}
	}
	else
	if (pLVKeyDow->wVKey == VK_NEXT)
	{
		m_UsersList.SetItemState(m_UsersList.GetItemCount()-1, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); 
	}
	else
	if (pLVKeyDow->wVKey == VK_PRIOR)
	{
		m_UsersList.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); 
	}

	OnSelchangeUserlist();
	*pResult = 1;
}


/********************************************************************/
/*																	*/
/* Function name : OnSelchangeUserlist								*/
/* Description   : Selection in the user listcontrol has changed.	*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnSelchangeUserlist() 
{
	UpdateData();
	// save data of previous selected user
	if (m_nPreviousIndex != -1)
	{
		int nOldindex = m_UsersList.GetItemData(m_nPreviousIndex);
		m_UserArray[nOldindex].m_strPassword = m_strPassword;
		m_UserArray[nOldindex].m_bAccountDisabled = m_bDisableAccount;
	}

	// get selected user
	int nSelIndex = m_UsersList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
	if (nSelIndex != -1)
	{
		int nUserIndex = m_UsersList.GetItemData(nSelIndex);

		// update dialog variables
		m_strPassword = m_UserArray[nUserIndex].m_strPassword;
		m_bDisableAccount = m_UserArray[nUserIndex].m_bAccountDisabled;

		m_DirectoryList.DeleteAllItems();
		
		// fill the directory list
		for (int i=0; i < m_UserArray[nUserIndex].m_DirectoryArray.GetSize(); i++)
		{
			int nItem = m_DirectoryList.InsertItem(i, m_UserArray[nUserIndex].m_DirectoryArray[i].m_strDir);

			m_DirectoryList.SetItemText(nItem, 1, m_UserArray[nUserIndex].m_DirectoryArray[i].m_strAlias);
			m_DirectoryList.SetItemText(nItem, 2, m_UserArray[nUserIndex].m_DirectoryArray[i].m_bAllowDownload ? "Y" : "N");
			m_DirectoryList.SetItemText(nItem, 3, m_UserArray[nUserIndex].m_DirectoryArray[i].m_bAllowUpload ? "Y" : "N");
			m_DirectoryList.SetItemText(nItem, 4, m_UserArray[nUserIndex].m_DirectoryArray[i].m_bAllowRename ? "Y" : "N");
			m_DirectoryList.SetItemText(nItem, 5, m_UserArray[nUserIndex].m_DirectoryArray[i].m_bAllowDelete ? "Y" : "N");
			m_DirectoryList.SetItemText(nItem, 6, m_UserArray[nUserIndex].m_DirectoryArray[i].m_bAllowCreateDirectory ? "Y" : "N");
			LVITEM lvi;
			ZeroMemory(&lvi, sizeof (LV_ITEM));
			lvi.mask = LVIF_IMAGE|LVIF_PARAM;
			lvi.iItem = nItem;
			m_DirectoryList.GetItem(&lvi);
			lvi.lParam = i;
			lvi.iImage = m_UserArray[nUserIndex].m_DirectoryArray[i].m_bIsHomeDir ? 1 : 0;
			m_DirectoryList.SetItem(&lvi);
		}
		m_nPreviousIndex = nSelIndex;
	}
	else
	{
		// nothing selected...
		m_DirectoryList.DeleteAllItems();
		m_strPassword = "";
		m_bDisableAccount = FALSE;
		m_nPreviousIndex=-1;
	}
	UpdateData(FALSE);

 	UpdateDialogControls(this, FALSE);
	
	AutoSizeColumns();
}


/********************************************************************/
/*																	*/
/* Function name : OnOK												*/
/* Description   : Called when the user clicks the OK button.		*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnOK() 
{
	m_UsersList.SetItemState(-1 ,LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); 
	// force update
	OnSelchangeUserlist();
	
	CDialogResize::OnOK();
}


/********************************************************************/
/*																	*/
/* Function name : OnDblclkDirlist									*/
/* Description   : Double clicked a directy item.					*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnDblclkDirlist(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnEditDir();
	*pResult = 0;
}


/********************************************************************/
/*																	*/
/* Function name : OnAddUser										*/
/* Description   : Add a new user account.							*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnAddUser() 
{
	CAddUserDlg dlg;
	if (dlg.DoModal() == IDOK)
	{
		for (int i=0; i<m_UsersList.GetItemCount(); i++)
		{
			CString strName;
			strName = m_UsersList.GetItemText(i, 0);
			if (strName.CompareNoCase(dlg.m_strName) == 0)
			{
				AfxMessageBox("���û��Ѵ���!");
				return;
			}
		}

		CUser user;
		user.m_strName = dlg.m_strName;
		user.m_strPassword = "";

		int nItem = m_UsersList.InsertItem(0, user.m_strName, 2);
		if (nItem <= m_nPreviousIndex)
			m_nPreviousIndex++;

		int index = m_UserArray.Add(user);
		
		m_UsersList.SetItemData(nItem, index);
		m_UsersList.SetItemState(nItem, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); 

		OnSelchangeUserlist();
	} 
}


/********************************************************************/
/*																	*/
/* Function name : OnEditUser										*/
/* Description   : Edit user account name.							*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnEditUser() 
{
	// get selected user
	int nSelIndex = m_UsersList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
    if(nSelIndex == -1)
        return;

	int nUserIndex = m_UsersList.GetItemData(nSelIndex);

	CAddUserDlg dlg;
	dlg.m_strTitle = "Edit User";
	dlg.m_strName = m_UserArray[nUserIndex].m_strName;

	if (dlg.DoModal() == IDOK)
	{
		// check if user already exists
		for (int i=0; i<m_UsersList.GetItemCount(); i++)
		{
			if (i != nSelIndex)
			{
				CString strName;
				strName = m_UsersList.GetItemText(i, 0);
				if (strName.CompareNoCase(dlg.m_strName) == 0)
				{
					AfxMessageBox("Sorry, this user already exists!");
					return;
				}
			}
		}

		m_UserArray[nUserIndex].m_strName = dlg.m_strName;

		m_UsersList.DeleteItem(nSelIndex);
		nSelIndex = m_UsersList.InsertItem(0, dlg.m_strName, 2);

		m_UsersList.SetItemData(nSelIndex, nUserIndex);
		m_UsersList.SetItemState(nSelIndex, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); 
		m_nPreviousIndex = nSelIndex;

		OnSelchangeUserlist();
	} 
}


/********************************************************************/
/*																	*/
/* Function name : OnDelUser										*/
/* Description   : Delete user account.								*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnDelUser() 
{
	int nSelIndex = m_UsersList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
    if(nSelIndex == -1)
        return;

	int nUserIndex = m_UsersList.GetItemData(nSelIndex);
	// remove user from listcontrol
	m_UsersList.DeleteItem(nSelIndex);
	// remove user from array
	m_UserArray.RemoveAt(nUserIndex);

	m_nPreviousIndex = -1;
	// update item data values
	for (int i=0; i<m_UsersList.GetItemCount(); i++)
	{
		int nItemData = m_UsersList.GetItemData(i);
		if (nItemData > nSelIndex)
			m_UsersList.SetItemData(i, nItemData-1);
	}
	OnSelchangeUserlist();	
}



/********************************************************************/
/*																	*/
/* Function name : OnAddDir											*/
/* Description   : Add directory entry to user account.				*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnAddDir() 
{
	int nSelIndex = m_UsersList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
    if(nSelIndex == -1)
        return;

	CDirectoryDlg dlg;

	dlg.m_bIsHomeDir = m_DirectoryList.GetItemCount() ? FALSE : TRUE;

	if (dlg.DoModal() == IDOK)
	{
		int nUserIndex = m_UsersList.GetItemData(nSelIndex);
		
		CDirectory dir;
		dir.m_bAllowCreateDirectory = dlg.m_bAllowCreateDirectory;
		dir.m_bAllowDelete = dlg.m_bAllowDelete;
		dir.m_bAllowDownload = dlg.m_bAllowDownload;
		dir.m_bAllowRename = dlg.m_bAllowRename;
		dir.m_bAllowUpload = dlg.m_bAllowUpload;
		dir.m_bIsHomeDir = FALSE;
		dir.m_strDir = dlg.m_strPath;
		dir.m_strAlias = dlg.m_strAlias;

		dir.m_bIsHomeDir = m_DirectoryList.GetItemCount() ? FALSE : TRUE;

		int nIndex = m_UserArray[nUserIndex].m_DirectoryArray.Add(dir);

		int nItem = m_DirectoryList.InsertItem(LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE, 0, dlg.m_strPath, 0, 0, dir.m_bIsHomeDir?1:0, nIndex);
		m_DirectoryList.SetItemText(nItem, 1, dir.m_strAlias);
		m_DirectoryList.SetItemText(nItem, 2, dir.m_bAllowDownload ? "Y" : "N");
		m_DirectoryList.SetItemText(nItem, 3, dir.m_bAllowUpload ? "Y" : "N");
		m_DirectoryList.SetItemText(nItem, 4, dir.m_bAllowRename ? "Y" : "N");
		m_DirectoryList.SetItemText(nItem, 5, dir.m_bAllowDelete ? "Y" : "N");
		m_DirectoryList.SetItemText(nItem, 6, dir.m_bAllowCreateDirectory ? "Y" : "N");

		m_DirectoryList.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
	}
}


/********************************************************************/
/*																	*/
/* Function name : OnEditDir										*/
/* Description   : Edit directory entry properties.					*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnEditDir() 
{
	// get selected user
	int nSelIndex = m_UsersList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
    if(nSelIndex == -1)
        return;

	int nUserIndex = m_UsersList.GetItemData(nSelIndex);

    // get index of selected directory item
	nSelIndex = m_DirectoryList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
    
    if(nSelIndex == -1)
        return;

	int nDirIndex = m_DirectoryList.GetItemData(nSelIndex);
	
	CDirectoryDlg dlg;

	dlg.m_strTitle = "Edit Directory";

	dlg.m_bAllowCreateDirectory = m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bAllowCreateDirectory;
	dlg.m_bAllowDelete = m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bAllowDelete;
	dlg.m_bAllowDownload = m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bAllowDownload;
	dlg.m_bAllowRename = m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bAllowRename;
	dlg.m_bAllowUpload = m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bAllowUpload;
	dlg.m_strPath = m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_strDir;
	dlg.m_strAlias = m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_strAlias;
	dlg.m_bIsHomeDir = m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bIsHomeDir;

	if (!dlg.m_strAlias.IsEmpty())
		dlg.m_bVirtualDir = TRUE;

	if (dlg.DoModal() == IDOK)
	{
		m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bAllowCreateDirectory = dlg.m_bAllowCreateDirectory;
		m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bAllowDelete = dlg.m_bAllowDelete;
		m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bAllowDownload = dlg.m_bAllowDownload;
		m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bAllowRename = dlg.m_bAllowRename;
		m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_bAllowUpload = dlg.m_bAllowUpload;
		m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_strDir = dlg.m_strPath;
		if (dlg.m_bVirtualDir)
			m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_strAlias = dlg.m_strAlias;
		else
			m_UserArray[nUserIndex].m_DirectoryArray[nDirIndex].m_strAlias = "";

		m_DirectoryList.SetItemText(nDirIndex, 0, dlg.m_strPath);
		m_DirectoryList.SetItemText(nDirIndex, 1, dlg.m_strAlias);
		m_DirectoryList.SetItemText(nDirIndex, 2, dlg.m_bAllowDownload ? "Y" : "N");
		m_DirectoryList.SetItemText(nDirIndex, 3, dlg.m_bAllowUpload ? "Y" : "N");
		m_DirectoryList.SetItemText(nDirIndex, 4, dlg.m_bAllowRename ? "Y" : "N");
		m_DirectoryList.SetItemText(nDirIndex, 5, dlg.m_bAllowDelete ? "Y" : "N");
		m_DirectoryList.SetItemText(nDirIndex, 6, dlg.m_bAllowCreateDirectory ? "Y" : "N");

		OnSelchangeUserlist();
	}
}


/********************************************************************/
/*																	*/
/* Function name : OnDelDir											*/
/* Description   : Delete directory entry from user account.		*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnDelDir() 
{
	int nSelIndex = m_UsersList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
    if(nSelIndex == -1)
        return;

    // get index of selected user item
	int nUserIndex = m_UsersList.GetItemData(nSelIndex);
	
    // get index of selected directory item
	nSelIndex = m_DirectoryList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
    
    if(nSelIndex == -1)
        return;

	int nDirIndex = m_DirectoryList.GetItemData(nSelIndex);
	
	// delete item from list
	m_DirectoryList.DeleteItem(nSelIndex);

	m_UserArray[nUserIndex].m_DirectoryArray.RemoveAt(nDirIndex);

	for (int i=0; i < m_DirectoryList.GetItemCount(); i++)
	{
		int nItemData = m_DirectoryList.GetItemData(i);
		if (nItemData > nDirIndex)
		{
			m_DirectoryList.SetItemData(i, nItemData-1);
		}
	}
	UpdateDialogControls(this, FALSE);
}


/********************************************************************/
/*																	*/
/* Function name : OnSetHome										*/
/* Description   : Make selected directory the home directory.		*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnSetHome() 
{
	int nSelIndex = m_UsersList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
    if(nSelIndex == -1)
        return;

	int nUserIndex = m_UsersList.GetItemData(nSelIndex);

    // get index of selected directory item
	POSITION pos;
	pos = m_DirectoryList.GetFirstSelectedItemPosition();
	if (!pos)
		return;
	
	int nDirIndex = m_DirectoryList.GetNextSelectedItem(pos);
	
	for (int i=0; i<m_UserArray[nUserIndex].m_DirectoryArray.GetSize(); i++)
	{
		LVITEM lvi;
		ZeroMemory(&lvi, sizeof (LV_ITEM));
		lvi.mask = LVIF_IMAGE|LVIF_PARAM;
		lvi.iItem = i;
		m_DirectoryList.GetItem(&lvi);
		if (i == nDirIndex)
		{
			// set bIsHome flag for selected directory
			lvi.iImage = 1;
			m_UserArray[nUserIndex].m_DirectoryArray[lvi.lParam].m_bIsHomeDir = TRUE;
		}
		else
		{
			// clear old bIsHomeDir flag	
			lvi.iImage = 0;
			m_UserArray[nUserIndex].m_DirectoryArray[lvi.lParam].m_bIsHomeDir = FALSE;
		}
		m_DirectoryList.SetItem(&lvi);
	}
}


void CUserAccountsDlg::OnUpdateControls(CCmdUI* pCmdUI) 
{
	int nSelIndex = m_UsersList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
	if(nSelIndex!=-1)
	{
		CString str;
		str= m_UsersList.GetItemText (nSelIndex, 0);
		if(str=="photo1account" || str=="photo2account" || str=="photo3account" || str=="photo4account")
		{
			pCmdUI->Enable(0);return;
		}
	}
	pCmdUI->Enable(nSelIndex != -1 && !IsDlgButtonChecked(IDC_DISABLE_ACCOUNT));
}

void CUserAccountsDlg::OnUpdateDisableAccount(CCmdUI* pCmdUI) 
{
	int nSelIndex = m_UsersList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); 
	if(nSelIndex!=-1)
	{
		CString str;
		str= m_UsersList.GetItemText (nSelIndex, 0);
		if(str=="photo1account" || str=="photo2account" || str=="photo3account" || str=="photo4account")
		{
			pCmdUI->Enable(0);return;
		}
	}
	pCmdUI->Enable(nSelIndex != -1);
}



CString CUserAccountsDlg::GetAttributes(CDirectory &dir)
{
	CString strResult;

	strResult.Format("%c%c%c%c%c", dir.m_bAllowDownload ? 'Y':'-',
								 dir.m_bAllowUpload ? 'Y':'-',
								 dir.m_bAllowRename ? 'Y':'-',
								 dir.m_bAllowDelete ? 'Y':'-',
								 dir.m_bAllowCreateDirectory ? 'Y':'-');
	return strResult;
}


/********************************************************************/
/*																	*/
/* Function name : AutoSizeColumns									*/
/* Description   : Make all columns fit nicely.						*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::AutoSizeColumns() 
{
	// Call this after your the control is filled
	m_DirectoryList.SetRedraw(FALSE);
	int mincol = 0;
    int maxcol = m_DirectoryList.GetHeaderCtrl()->GetItemCount()-1;
	int col;
    for (col = mincol; col <= maxcol; col++) 
	{
		m_DirectoryList.SetColumnWidth(col,LVSCW_AUTOSIZE);
        int wc1 = m_DirectoryList.GetColumnWidth(col);
        m_DirectoryList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);
        int wc2 = m_DirectoryList.GetColumnWidth(col);
        // 10 is minumim column width
		int wc = max(10, max(wc1,wc2));
        m_DirectoryList.SetColumnWidth(col,wc);
     }
     m_DirectoryList.SetRedraw(TRUE);
}


/********************************************************************/
/*																	*/
/* Function name : OnDisableAccount									*/
/* Description   : Disable account has been clicked					*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnDisableAccount() 
{
	UpdateDialogControls(this, FALSE);
}


/********************************************************************/
/*																	*/
/* Function name : OnWizard											*/
/* Description   : Launch New Account Wizard						*/
/*																	*/
/********************************************************************/
void CUserAccountsDlg::OnWizard() 
{
	CBitmap bmpHeader, bmpWatermark;

	VERIFY(bmpHeader.LoadBitmap(IDB_BANNER));
	VERIFY(bmpWatermark.LoadBitmap(IDB_WATERMARK));
	
	// show windows 2000-like wizard
	CWizardSheet wizSheet("New Account Wizard", this, 0, bmpWatermark, NULL, bmpHeader);
	wizSheet.m_psh.hInstance = ::GetModuleHandle(NULL);
	if (wizSheet.DoModal() == ID_WIZFINISH)
	{
		int nIndex = -1;
		int nItem = -1;
		
		// existing account ?
		for (int i=0; i<m_UsersList.GetItemCount(); i++)
		{
			CString strName;
			strName = m_UsersList.GetItemText(i, 0);
			if (strName.CompareNoCase(wizSheet.m_Page1.m_strAccountName) == 0)
			{
				nItem = i;
				nIndex = m_UsersList.GetItemData(i);
				break;
			}
		}

		// add new account
		if (nIndex == -1)
		{
			CUser user;

			int nItem = m_UsersList.InsertItem(0, wizSheet.m_Page1.m_strAccountName, 2);
			nIndex = m_UserArray.Add(user);
			m_UsersList.SetItemData(nItem, nIndex);
		}		
		else
		{
			// clear old bIsHomeDir flag	
			for (int i=0; i<m_UserArray[nIndex].m_DirectoryArray.GetSize(); i++)
			{
				m_UserArray[nIndex].m_DirectoryArray[i].m_bIsHomeDir = FALSE;
			}
		}

		m_UserArray[nIndex].m_bAccountDisabled = FALSE;
		m_UserArray[nIndex].m_strName = wizSheet.m_Page1.m_strAccountName;
		m_UserArray[nIndex].m_strPassword = wizSheet.m_Page2.m_strPassword;
		
		// add home directory
		CDirectory directory;
		
		directory.m_strDir = wizSheet.m_Page3.m_strHomeDirectory;
		directory.m_strAlias = "";
		directory.m_bIsHomeDir = TRUE;
		directory.m_bAllowCreateDirectory = wizSheet.m_Page4.m_bAllowCreateDirectory;
		directory.m_bAllowDelete = wizSheet.m_Page4.m_bAllowDelete;
		directory.m_bAllowDownload = wizSheet.m_Page4.m_bAllowDownload;
		directory.m_bAllowRename = wizSheet.m_Page4.m_bAllowRename;
		directory.m_bAllowUpload = wizSheet.m_Page4.m_bAllowUpload;
		directory.m_strAlias = "";

		m_UserArray[nIndex].m_DirectoryArray.Add(directory);
		
		if (m_nPreviousIndex == nItem)
			m_nPreviousIndex = -1;

		// select updated account
		m_UsersList.SetItemState(nItem, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); 
		OnSelchangeUserlist();	
	}	
}