/*
Plugin of Miranda IM for communicating with users of the AIM protocol.
Copyright (c) 2008-2012 Boris Krasnovskiy
Copyright (C) 2005-2006 Aaron Myles Landwehr

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "stdafx.h"

HANDLE hThemeButton = NULL;
COLORREF foreground=0;
COLORREF background=0xffffff;
COLORREF custColours[16]={0};

static int CALLBACK EnumFontsProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX* /*lpntme*/, int /*FontType*/, LPARAM lParam)
{
	if (!IsWindow((HWND)lParam))
		return FALSE;
	if (SendMessage((HWND)lParam, CB_FINDSTRINGEXACT, 1, (LPARAM)lpelfe->elfLogFont.lfFaceName) == CB_ERR)
		SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)lpelfe->elfLogFont.lfFaceName);
	return TRUE;
}

void DrawMyControl(HDC hDC, HWND /*hwndButton*/, HANDLE hTheme, UINT iState, RECT rect)
{
	BOOL bIsPressed = (iState & ODS_SELECTED);
	BOOL bIsFocused = (iState & ODS_FOCUS);
	if (hTheme) {
		DWORD state = (bIsPressed) ? PBS_PRESSED : PBS_NORMAL;
		if (state == PBS_NORMAL) {
			if (bIsFocused)
				state = PBS_DEFAULTED;
		}
		rect.top -= 1;
		rect.left -= 1;
		DrawThemeBackground(hTheme, hDC, BP_PUSHBUTTON, state, &rect, NULL);
	}
	else {
		if (bIsFocused) {
			HBRUSH br = CreateSolidBrush(RGB(0, 0, 0));
			FrameRect(hDC, &rect, br);
			InflateRect(&rect, -1, -1);
			DeleteObject(br);
		} // if
		COLORREF crColor = GetSysColor(COLOR_BTNFACE);
		HBRUSH	brBackground = CreateSolidBrush(crColor);
		FillRect(hDC, &rect, brBackground);
		DeleteObject(brBackground);
		// Draw pressed button
		if (bIsPressed) {
			HBRUSH brBtnShadow = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
			FrameRect(hDC, &rect, brBtnShadow);
			DeleteObject(brBtnShadow);
		}
		else // ...else draw non pressed button
		{
			UINT uState = DFCS_BUTTONPUSH;
			DrawFrameControl(hDC, &rect, DFC_BUTTON, uState);
		}
	}
}

/////////////////////////////////////////////////////////////////////////////////////////
// User info dialog

static INT_PTR CALLBACK userinfo_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	CAimProto* ppro = (CAimProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);

	switch (msg) {
	case WM_INITDIALOG:
		{
			SendDlgItemMessage(hwndDlg, IDC_BOLD, BUTTONSETASPUSHBTN, TRUE, 0);
			SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETEVENTMASK, 0, ENM_CHANGE | ENM_SELCHANGE | ENM_REQUESTRESIZE);
			SendDlgItemMessage(hwndDlg, IDC_BACKGROUNDCOLORPICKER, CPM_SETCOLOUR, 0, 0x00ffffff);
			LOGFONT lf = { 0 };
			HDC hdc = GetDC(hwndDlg);
			lf.lfCharSet = DEFAULT_CHARSET;
			lf.lfFaceName[0] = 0;
			lf.lfPitchAndFamily = 0;
			EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumFontsProc, (LPARAM)GetDlgItem(hwndDlg, IDC_TYPEFACE), 0);
			ReleaseDC(hwndDlg, hdc);
			SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_ADDSTRING, 0, (LPARAM)TEXT("8"));
			SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_ADDSTRING, 0, (LPARAM)TEXT("10"));
			SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_ADDSTRING, 0, (LPARAM)TEXT("12"));
			SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_ADDSTRING, 0, (LPARAM)TEXT("14"));
			SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_ADDSTRING, 0, (LPARAM)TEXT("18"));
			SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_ADDSTRING, 0, (LPARAM)TEXT("24"));
			SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_ADDSTRING, 0, (LPARAM)TEXT("36"));
			SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_SETCURSEL, 2, 0);
			if (SendDlgItemMessage(hwndDlg, IDC_TYPEFACE, CB_SELECTSTRING, 1, (LPARAM)TEXT("Arial")) != CB_ERR) {
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(cf);
				cf.yHeight = 12 * 20;
				cf.dwMask = CFM_SIZE | CFM_FACE;
				mir_wstrcpy(cf.szFaceName, TEXT("Arial"));
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
			}
			else {
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(cf);
				cf.yHeight = 12 * 20;
				cf.dwMask = CFM_SIZE;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
			}
			break;
		}
	case WM_CLOSE:
		EndDialog(hwndDlg, 0);
		break;

	case WM_SIZING:
		{
			RECT* rect = (RECT*)lParam;
#define MIN_HEIGHT 200
#define MIN_WIDTH 400
			if (WMSZ_RIGHT == wParam || WMSZ_TOPRIGHT == wParam || WMSZ_BOTTOMRIGHT == wParam) {
				if (rect->right - rect->left < MIN_WIDTH)
					rect->right = rect->left + MIN_WIDTH;
			}
			if (WMSZ_LEFT == wParam || WMSZ_TOPLEFT == wParam || WMSZ_BOTTOMLEFT == wParam) {
				if (rect->right - rect->left < MIN_WIDTH)
					rect->left = rect->right - MIN_WIDTH;
			}
			if (WMSZ_TOP == wParam || WMSZ_TOPRIGHT == wParam || WMSZ_TOPLEFT == wParam) {
				if (rect->bottom - rect->top < MIN_HEIGHT)
					rect->top = rect->bottom - MIN_HEIGHT;
			}
			if (WMSZ_BOTTOM == wParam || WMSZ_BOTTOMLEFT == wParam || WMSZ_BOTTOMRIGHT == wParam) {
				if (rect->bottom - rect->top < MIN_HEIGHT)
					rect->bottom = rect->top + MIN_HEIGHT;
			}
			break;
		}

	case WM_SIZE:
		{
			int width = LOWORD(lParam);
			int height = HIWORD(lParam);
			SetWindowPos(GetDlgItem(hwndDlg, IDC_PROFILE), HWND_TOP, 6, 60, width - 12, height - 67, 0);	// this 'case' should go away
			SetWindowPos(GetDlgItem(hwndDlg, IDC_SETPROFILE), HWND_TOP, width - 97, height - 224, 0, 0, SWP_NOSIZE);	// since there's no profile window resize anymore
			break;
		}
	case WM_NOTIFY:
		switch (LOWORD(wParam)) {
		case IDC_PROFILE:
			if (((LPNMHDR)lParam)->code == EN_SELCHANGE) {
				CHARFORMAT2 cfOld;
				cfOld.cbSize = sizeof(CHARFORMAT2);
				cfOld.dwMask = CFM_FACE | CFM_SIZE;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
				if (SendDlgItemMessage(hwndDlg, IDC_TYPEFACE, CB_SELECTSTRING, 1, (LPARAM)cfOld.szFaceName) == -1) {
					SendDlgItemMessage(hwndDlg, IDC_TYPEFACE, CB_ADDSTRING, 0, (LPARAM)cfOld.szFaceName);
					SendDlgItemMessage(hwndDlg, IDC_TYPEFACE, CB_SELECTSTRING, 1, (LPARAM)cfOld.szFaceName);
				}
				char size[10];
				_itoa(cfOld.yHeight / 20, size, sizeof(size));
				//SetDlgItemText(hwndDlg, IDC_FONTSIZE, size);
				SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_SELECTSTRING, 1, (LPARAM)size);
				InvalidateRect(GetDlgItem(hwndDlg, IDC_SUPERSCRIPT), NULL, FALSE);
				InvalidateRect(GetDlgItem(hwndDlg, IDC_NORMALSCRIPT), NULL, FALSE);
				InvalidateRect(GetDlgItem(hwndDlg, IDC_SUBSCRIPT), NULL, FALSE);
				InvalidateRect(GetDlgItem(hwndDlg, IDC_BOLD), NULL, FALSE);
				InvalidateRect(GetDlgItem(hwndDlg, IDC_ITALIC), NULL, FALSE);
				InvalidateRect(GetDlgItem(hwndDlg, IDC_UNDERLINE), NULL, FALSE);
			}
			else if (((LPNMHDR)lParam)->code == EN_REQUESTRESIZE) {
				//	REQRESIZE* rr= (REQRESIZE*)lParam;
				//SetWindowPos(GetDlgItem(hwndDlg, IDC_PROFILE),HWND_TOP,rr->rc.left,rr->rc.top,rr->rc.right,rr->rc.bottom,0);
			}
			break;

		default:
			if (((LPNMHDR)lParam)->code == PSN_PARAMCHANGED) {
				ppro = (CAimProto*)((PSHNOTIFY*)lParam)->lParam;
				SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)ppro);

				DBVARIANT dbv;
				if (!db_get_utf(NULL, ppro->m_szModuleName, AIM_KEY_PR, &dbv)) {
					html_decode(dbv.pszVal);
					wchar_t *txt = mir_utf8decodeW(dbv.pszVal);
					SetDlgItemText(hwndDlg, IDC_PROFILE, txt);
					mir_free(txt);
					db_free(&dbv);
				}
			}
		}
		break;

	case WM_DRAWITEM:
		{
			CloseThemeData(hThemeButton);
			hThemeButton = OpenThemeData(GetDlgItem(hwndDlg, IDC_BOLD), L"Button");
			LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT)lParam;
			if (lpDIS->CtlID == IDC_SUPERSCRIPT) {
				CHARFORMAT2 cfOld;
				cfOld.cbSize = sizeof(CHARFORMAT2);
				cfOld.dwMask = CFM_SUPERSCRIPT;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
				BOOL isSuper = (cfOld.dwEffects & CFE_SUPERSCRIPT) && (cfOld.dwMask & CFM_SUPERSCRIPT);
				if (isSuper) {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_BOLD), hThemeButton, lpDIS->itemState | ODS_SELECTED, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("sup_scrpt"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("sup_scrpt");
				}
				else {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_BOLD), hThemeButton, lpDIS->itemState, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("nsup_scrpt"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("nsup_scrpt");
				}
			}
			else if (lpDIS->CtlID == IDC_NORMALSCRIPT) {
				CHARFORMAT2 cfOld;
				cfOld.cbSize = sizeof(CHARFORMAT2);
				cfOld.dwMask = CFM_SUBSCRIPT | CFM_SUPERSCRIPT;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
				BOOL isSub = (cfOld.dwEffects & CFE_SUBSCRIPT) && (cfOld.dwMask & CFM_SUBSCRIPT);
				BOOL isSuper = (cfOld.dwEffects & CFE_SUPERSCRIPT) && (cfOld.dwMask & CFM_SUPERSCRIPT);
				if (!isSub&&!isSuper) {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_BOLD), hThemeButton, lpDIS->itemState | ODS_SELECTED, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("norm_scrpt"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("norm_scrpt");
				}
				else {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_BOLD), hThemeButton, lpDIS->itemState, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("nnorm_scrpt"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("nnorm_scrpt");
				}
			}
			else if (lpDIS->CtlID == IDC_SUBSCRIPT) {
				CHARFORMAT2 cfOld;
				cfOld.cbSize = sizeof(CHARFORMAT2);
				cfOld.dwMask = CFM_SUBSCRIPT;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
				BOOL isSub = (cfOld.dwEffects & CFE_SUBSCRIPT) && (cfOld.dwMask & CFM_SUBSCRIPT);
				if (isSub) {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_BOLD), hThemeButton, lpDIS->itemState | ODS_SELECTED, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("sub_scrpt"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("sub_scrpt");
				}
				else {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_BOLD), hThemeButton, lpDIS->itemState, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("nsub_scrpt"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("nsub_scrpt");
				}
			}
			else if (lpDIS->CtlID == IDC_BOLD) {
				CHARFORMAT2 cfOld;
				cfOld.cbSize = sizeof(CHARFORMAT2);
				cfOld.dwMask = CFM_BOLD;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
				BOOL isBold = (cfOld.dwEffects & CFE_BOLD) && (cfOld.dwMask & CFM_BOLD);
				if (!isBold) {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_BOLD), hThemeButton, lpDIS->itemState, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("nbold"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("nbold");
				}
				else {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_BOLD), hThemeButton, lpDIS->itemState | ODS_SELECTED, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("bold"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("bold");
				}
			}
			else if (lpDIS->CtlID == IDC_ITALIC) {
				CHARFORMAT2 cfOld;
				cfOld.cbSize = sizeof(CHARFORMAT2);
				cfOld.dwMask = CFM_ITALIC;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
				BOOL isItalic = (cfOld.dwEffects & CFE_ITALIC) && (cfOld.dwMask & CFM_ITALIC);
				if (!isItalic) {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_ITALIC), hThemeButton, lpDIS->itemState, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("nitalic"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("nitalic");
				}
				else {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_ITALIC), hThemeButton, lpDIS->itemState | ODS_SELECTED, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("italic"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("italic");
				}
			}
			else if (lpDIS->CtlID == IDC_UNDERLINE) {
				CHARFORMAT2 cfOld;
				cfOld.cbSize = sizeof(CHARFORMAT2);
				cfOld.dwMask = CFM_UNDERLINE;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
				BOOL isUnderline = (cfOld.dwEffects & CFE_UNDERLINE) && (cfOld.dwMask & CFM_UNDERLINE);
				if (!isUnderline) {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_UNDERLINE), hThemeButton, lpDIS->itemState, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("nundrln"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("nundrln");
				}
				else {
					DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_UNDERLINE), hThemeButton, lpDIS->itemState | ODS_SELECTED, lpDIS->rcItem);
					DrawIconEx(lpDIS->hDC, 4, 5, LoadIconEx("undrln"), 16, 16, 0, 0, DI_NORMAL);
					ReleaseIconEx("undrln");
				}
			}
			else if (lpDIS->CtlID == IDC_FOREGROUNDCOLOR) {
				DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_FOREGROUNDCOLOR), hThemeButton, lpDIS->itemState, lpDIS->rcItem);
				DrawIconEx(lpDIS->hDC, 4, 2, LoadIconEx("foreclr"), 16, 16, 0, 0, DI_NORMAL);
				ReleaseIconEx("foreclr");
				HBRUSH	hbr = CreateSolidBrush(foreground);
				HPEN hp = CreatePen(PS_SOLID, 1, ~foreground & 0x00ffffff);
				SelectObject(lpDIS->hDC, hp);
				RECT rect = lpDIS->rcItem;
				rect.top += 18;
				rect.bottom -= 4;
				rect.left += 5;
				rect.right -= 5;
				Rectangle(lpDIS->hDC, rect.left - 1, rect.top - 1, rect.right + 1, rect.bottom + 1);
				FillRect(lpDIS->hDC, &rect, hbr);
				DeleteObject(hbr);
				DeleteObject(hp);
			}
			else if (lpDIS->CtlID == IDC_FOREGROUNDCOLORPICKER) {
				DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_FOREGROUNDCOLORPICKER), hThemeButton, lpDIS->itemState, lpDIS->rcItem);
				HBRUSH	hbr = CreateSolidBrush(foreground);
				HPEN hp = CreatePen(PS_SOLID, 1, ~foreground & 0x00ffffff);
				SelectObject(lpDIS->hDC, hbr);
				SelectObject(lpDIS->hDC, hp);
				POINT tri[3];
				tri[0].x = 3;
				tri[0].y = 10;
				tri[1].x = 9;
				tri[1].y = 10;
				tri[2].x = 6;
				tri[2].y = 15;
				Polygon(lpDIS->hDC, tri, 3);
				DeleteObject(hbr);
				DeleteObject(hp);
			}
			else if (lpDIS->CtlID == IDC_BACKGROUNDCOLOR) {
				DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_BACKGROUNDCOLOR), hThemeButton, lpDIS->itemState, lpDIS->rcItem);
				DrawIconEx(lpDIS->hDC, 4, 2, LoadIconEx("backclr"), 16, 16, 0, 0, DI_NORMAL);
				ReleaseIconEx("backclr");
				HBRUSH	hbr = CreateSolidBrush(background);
				HPEN hp = CreatePen(PS_SOLID, 1, ~background & 0x00ffffff);
				SelectObject(lpDIS->hDC, hp);
				RECT rect = lpDIS->rcItem;
				rect.top += 18;
				rect.bottom -= 4;
				rect.left += 5;
				rect.right -= 5;
				Rectangle(lpDIS->hDC, rect.left - 1, rect.top - 1, rect.right + 1, rect.bottom + 1);
				FillRect(lpDIS->hDC, &rect, hbr);
				DeleteObject(hbr);
				DeleteObject(hp);
			}
			else if (lpDIS->CtlID == IDC_BACKGROUNDCOLORPICKER) {
				DrawMyControl(lpDIS->hDC, GetDlgItem(hwndDlg, IDC_BACKGROUNDCOLORPICKER), hThemeButton, lpDIS->itemState, lpDIS->rcItem);
				HBRUSH	hbr = CreateSolidBrush(background);
				HPEN hp = CreatePen(PS_SOLID, 1, ~background & 0x00ffffff);
				SelectObject(lpDIS->hDC, hbr);
				SelectObject(lpDIS->hDC, hp);
				POINT tri[3];
				tri[0].x = 3;
				tri[0].y = 10;
				tri[1].x = 9;
				tri[1].y = 10;
				tri[2].x = 6;
				tri[2].y = 15;
				Polygon(lpDIS->hDC, tri, 3);
				DeleteObject(hbr);
				DeleteObject(hp);
			}
			break;
		}

	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDC_PROFILE:
			if (HIWORD(wParam) == EN_CHANGE)
				EnableWindow(GetDlgItem(hwndDlg, IDC_SETPROFILE), TRUE);
			break;

		case IDC_SETPROFILE:
			{
				char* buf = rtf_to_html(hwndDlg, IDC_PROFILE);
				db_set_utf(NULL, ppro->m_szModuleName, AIM_KEY_PR, buf);
				if (ppro->m_state == 1)
					ppro->aim_set_profile(ppro->m_hServerConn, ppro->m_seqno, buf);//also see set caps for profile setting

				mir_free(buf);
				EnableWindow(GetDlgItem(hwndDlg, IDC_SETPROFILE), FALSE);
			}
			break;

		case IDC_SUPERSCRIPT:
			if (HIWORD(wParam) == BN_CLICKED) {
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(CHARFORMAT2);
				cf.dwMask = CFM_SUPERSCRIPT;
				cf.dwEffects = CFE_SUPERSCRIPT;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
				InvalidateRect(GetDlgItem(hwndDlg, IDC_NORMALSCRIPT), NULL, FALSE);
				InvalidateRect(GetDlgItem(hwndDlg, IDC_SUBSCRIPT), NULL, FALSE);
			}
			break;

		case IDC_NORMALSCRIPT:
			if (HIWORD(wParam) == BN_CLICKED) {
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(CHARFORMAT2);
				cf.dwMask = CFM_SUPERSCRIPT;
				cf.dwEffects &= ~CFE_SUPERSCRIPT;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
				InvalidateRect(GetDlgItem(hwndDlg, IDC_SUPERSCRIPT), NULL, FALSE);
				InvalidateRect(GetDlgItem(hwndDlg, IDC_SUBSCRIPT), NULL, FALSE);
			}
			break;

		case IDC_SUBSCRIPT:
			if (HIWORD(wParam) == BN_CLICKED) {
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(CHARFORMAT2);
				cf.dwMask = CFM_SUBSCRIPT;
				cf.dwEffects = CFE_SUBSCRIPT;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
				InvalidateRect(GetDlgItem(hwndDlg, IDC_SUPERSCRIPT), NULL, FALSE);
				InvalidateRect(GetDlgItem(hwndDlg, IDC_NORMALSCRIPT), NULL, FALSE);
			}
			break;

		case IDC_BOLD:
			if (HIWORD(wParam) == BN_CLICKED) {
				CHARFORMAT2 cfOld;
				cfOld.cbSize = sizeof(CHARFORMAT2);
				cfOld.dwMask = CFM_BOLD;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
				BOOL isBold = (cfOld.dwEffects & CFE_BOLD) && (cfOld.dwMask & CFM_BOLD);
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(CHARFORMAT2);
				cf.dwEffects = isBold ? 0 : CFE_BOLD;
				cf.dwMask = CFM_BOLD;
				CheckDlgButton(hwndDlg, IDC_BOLD, !isBold ? BST_CHECKED : BST_UNCHECKED);
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
			}
			break;

		case IDC_ITALIC:
			if (HIWORD(wParam) == BN_CLICKED) {
				CHARFORMAT2 cfOld;
				cfOld.cbSize = sizeof(CHARFORMAT2);
				cfOld.dwMask = CFM_ITALIC;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
				BOOL isItalic = (cfOld.dwEffects & CFE_ITALIC) && (cfOld.dwMask & CFM_ITALIC);
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(CHARFORMAT2);
				cf.dwEffects = isItalic ? 0 : CFE_ITALIC;
				cf.dwMask = CFM_ITALIC;
				CheckDlgButton(hwndDlg, IDC_ITALIC, !isItalic ? BST_CHECKED : BST_UNCHECKED);
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
			}
			break;

		case IDC_UNDERLINE:
			if (HIWORD(wParam) == BN_CLICKED) {
				CHARFORMAT2 cfOld;
				cfOld.cbSize = sizeof(CHARFORMAT2);
				cfOld.dwMask = CFM_UNDERLINE;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
				BOOL isUnderline = (cfOld.dwEffects & CFE_UNDERLINE) && (cfOld.dwMask & CFM_UNDERLINE);
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(CHARFORMAT2);
				cf.dwEffects = isUnderline ? 0 : CFE_UNDERLINE;
				cf.dwMask = CFM_UNDERLINE;
				CheckDlgButton(hwndDlg, IDC_UNDERLINE, !isUnderline ? BST_CHECKED : BST_UNCHECKED);
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
			}
			break;

		case IDC_FOREGROUNDCOLOR:
			if (HIWORD(wParam) == BN_CLICKED) {
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(CHARFORMAT2);
				cf.dwMask = CFM_COLOR;
				cf.dwEffects = 0;
				cf.crTextColor = foreground;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
				SetWindowPos(GetDlgItem(hwndDlg, IDC_FOREGROUNDCOLORPICKER), GetDlgItem(hwndDlg, IDC_FOREGROUNDCOLOR), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
			}
			break;

		case IDC_FOREGROUNDCOLORPICKER:
			if (HIWORD(wParam) == BN_CLICKED) {
				CHOOSECOLOR cc = { 0 };
				custColours[0] = foreground;
				custColours[1] = background;
				cc.lStructSize = sizeof(CHOOSECOLOR);
				cc.hwndOwner = hwndDlg;
				cc.hInstance = (HWND)GetModuleHandleA("mir_app.mir");
				cc.lpCustColors = custColours;
				cc.Flags = CC_ANYCOLOR | CC_FULLOPEN | CC_RGBINIT;
				if (ChooseColor(&cc)) {
					foreground = cc.rgbResult;
					InvalidateRect(GetDlgItem(hwndDlg, IDC_FOREGROUNDCOLOR), NULL, FALSE);
				}
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
			}
			break;

		case IDC_BACKGROUNDCOLOR:
			if (HIWORD(wParam) == BN_CLICKED) {
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(CHARFORMAT2);
				cf.dwMask = CFM_BACKCOLOR;
				cf.dwEffects = 0;
				cf.crBackColor = background;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
			}
			break;

		case IDC_BACKGROUNDCOLORPICKER:
			if (HIWORD(wParam) == BN_CLICKED) {
				CHOOSECOLOR cc = { 0 };
				custColours[0] = foreground;
				custColours[1] = background;
				cc.lStructSize = sizeof(CHOOSECOLOR);
				cc.hwndOwner = hwndDlg;
				cc.hInstance = (HWND)GetModuleHandle(NULL);
				cc.lpCustColors = custColours;
				cc.Flags = CC_ANYCOLOR | CC_FULLOPEN | CC_RGBINIT;
				if (ChooseColor(&cc)) {
					background = cc.rgbResult;
					InvalidateRect(GetDlgItem(hwndDlg, IDC_BACKGROUNDCOLOR), NULL, FALSE);
				}
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
			}
			break;

		case IDC_TYPEFACE:
			if (HIWORD(wParam) == CBN_SELENDOK) {
				CHARFORMAT2A cf;
				cf.cbSize = sizeof(cf);
				cf.dwMask = CFM_FACE;
				cf.dwEffects = 0;
				SendDlgItemMessage(hwndDlg, IDC_TYPEFACE, CB_GETLBTEXT, SendDlgItemMessage(hwndDlg, IDC_TYPEFACE, CB_GETCURSEL, 0, 0), (LPARAM)cf.szFaceName);
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
				break;
			}
			break;

		case IDC_FONTSIZE:
			if (HIWORD(wParam) == CBN_SELENDOK) {
				CHARFORMAT2 cf;
				cf.cbSize = sizeof(CHARFORMAT2);
				cf.dwMask = CFM_SIZE;
				cf.dwEffects = 0;
				char chsize[5] = "";
				SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_GETLBTEXT, SendDlgItemMessage(hwndDlg, IDC_FONTSIZE, CB_GETCURSEL, 0, 0), (LPARAM)chsize);
				//strlcpy(cf.szFaceName,size,mir_strlen(size)+1);
				cf.yHeight = atoi(chsize) * 20;
				SendDlgItemMessage(hwndDlg, IDC_PROFILE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
				SetFocus(GetDlgItem(hwndDlg, IDC_PROFILE));
				break;
			}
			break;
		}
		break;
	}
	return FALSE;
}

/////////////////////////////////////////////////////////////////////////////////////////
// View admin dialog

INT_PTR CALLBACK admin_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	CAimProto* ppro = (CAimProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
	DBVARIANT dbv;

	switch (msg) {
	case WM_INITDIALOG:
		TranslateDialogDefault(hwndDlg);
		SendDlgItemMessage(hwndDlg, IDC_FNAME, EM_LIMITTEXT, 63, 0);
		SendDlgItemMessage(hwndDlg, IDC_CEMAIL, EM_LIMITTEXT, 253, 0);
		SendDlgItemMessage(hwndDlg, IDC_CPW, EM_LIMITTEXT, 253, 0);
		SendDlgItemMessage(hwndDlg, IDC_NPW1, EM_LIMITTEXT, 253, 0);
		SendDlgItemMessage(hwndDlg, IDC_NPW2, EM_LIMITTEXT, 253, 0);
		break;

	case WM_NOTIFY:
		switch (((LPNMHDR)lParam)->code) {
		case PSN_PARAMCHANGED:
			ppro = (CAimProto*)((LPPSHNOTIFY)lParam)->lParam;
			SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)ppro);

			if (ppro->wait_conn(ppro->m_hAdminConn, ppro->m_hAdminEvent, 0x07)) { // Make a connection
				ppro->aim_admin_request_info(ppro->m_hAdminConn, ppro->m_admin_seqno, 0x01);	// Get our screenname
				ppro->aim_admin_request_info(ppro->m_hAdminConn, ppro->m_admin_seqno, 0x11);	// Get our email
			}

		case PSN_INFOCHANGED:
			if (!ppro->getString(AIM_KEY_SN, &dbv)) {
				SetDlgItemTextA(hwndDlg, IDC_FNAME, dbv.pszVal);
				db_free(&dbv);
			}
			if (!ppro->getString(AIM_KEY_EM, &dbv)) {
				SetDlgItemTextA(hwndDlg, IDC_CEMAIL, dbv.pszVal);
				db_free(&dbv);
			}
			break;
		}
		break;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDC_SAVECHANGES) {
			if (!ppro->wait_conn(ppro->m_hAdminConn, ppro->m_hAdminEvent, 0x07))             // Make a connection
				break;

			char name[64];
			GetDlgItemTextA(hwndDlg, IDC_FNAME, name, _countof(name));
			if (mir_strlen(trim_str(name)) > 0 && !ppro->getString(AIM_KEY_SN, &dbv)) {
				if (mir_strcmp(name, dbv.pszVal))
					ppro->aim_admin_format_name(ppro->m_hAdminConn, ppro->m_admin_seqno, name);
				db_free(&dbv);
			}

			char email[254];
			GetDlgItemTextA(hwndDlg, IDC_CEMAIL, email, _countof(email));
			if (mir_strlen(trim_str(email)) > 1 && !ppro->getString(AIM_KEY_EM, &dbv)) // Must be greater than 1 or a SNAC error is thrown.
			{
				if (mir_strcmp(email, dbv.pszVal))
					ppro->aim_admin_change_email(ppro->m_hAdminConn, ppro->m_admin_seqno, email);
				db_free(&dbv);
			}

			ShowWindow(GetDlgItem(hwndDlg, IDC_PINFO), SW_HIDE);

			char cpw[256], npw1[256], npw2[256];
			GetDlgItemTextA(hwndDlg, IDC_CPW, cpw, _countof(cpw));
			GetDlgItemTextA(hwndDlg, IDC_NPW1, npw1, _countof(npw1));
			GetDlgItemTextA(hwndDlg, IDC_NPW2, npw2, _countof(npw2));
			if (cpw[0] != 0 && npw1[0] != 0 && npw2[0] != 0) {
				// AOL only requires that you send the current password and a (single) new password.
				// Let's allow the client to type (two) new passwords incase they make a mistake so we
				// can handle any input error locally.
				if (mir_strcmp(npw1, npw2) == 0) {
					ppro->aim_admin_change_password(ppro->m_hAdminConn, ppro->m_admin_seqno, cpw, npw1);
				}
				else {
					SetDlgItemTextA(hwndDlg, IDC_CPW, "");
					SetDlgItemTextA(hwndDlg, IDC_NPW1, "");
					SetDlgItemTextA(hwndDlg, IDC_NPW2, "");
					ShowWindow(GetDlgItem(hwndDlg, IDC_PINFO), SW_SHOW);
				}
			}
		}
		else if (LOWORD(wParam) == IDC_CONFIRM)	// Confirmation
		{
			if (ppro->wait_conn(ppro->m_hAdminConn, ppro->m_hAdminEvent, 0x07))             // Make a connection
				ppro->aim_admin_account_confirm(ppro->m_hAdminConn, ppro->m_admin_seqno);
		}
		break;
	}
	return FALSE;
}

int CAimProto::OnUserInfoInit(WPARAM wParam, LPARAM lParam)
{
	if (!lParam)//hContact
	{
		OPTIONSDIALOGPAGE odp = { 0 };
		odp.position = -1900000000;
		odp.flags = ODPF_USERINFOTAB | ODPF_UNICODE;
		odp.hInstance = hInstance;
		odp.pwszTitle = m_tszUserName;
		odp.dwInitParam = LPARAM(this);

		odp.pwszTab = LPGENW("Profile");
		odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO);
		odp.pfnDlgProc = userinfo_dialog;
		UserInfo_AddPage(wParam, &odp);

		odp.pwszTab = LPGENW("Admin");
		odp.pszTemplate = MAKEINTRESOURCEA(IDD_ADMIN);
		odp.pfnDlgProc = admin_dialog;
		UserInfo_AddPage(wParam, &odp);
	}
	return 0;
}

INT_PTR CAimProto::EditProfile(WPARAM, LPARAM)
{
	DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_AIM), NULL, userinfo_dialog, LPARAM(this));
	return 0;
}

/////////////////////////////////////////////////////////////////////////////////////////
// Options dialog

static INT_PTR CALLBACK options_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	CAimProto* ppro = (CAimProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);

	switch (msg) {
	case WM_INITDIALOG:
		TranslateDialogDefault(hwndDlg);

		SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
		ppro = (CAimProto*)lParam;
		{
			DBVARIANT dbv;
			if (!ppro->getString(AIM_KEY_SN, &dbv)) {
				SetDlgItemTextA(hwndDlg, IDC_SN, dbv.pszVal);
				db_free(&dbv);
			}
			if (!ppro->getString(AIM_KEY_NK, &dbv)) {
				SetDlgItemTextA(hwndDlg, IDC_NK, dbv.pszVal);
				db_free(&dbv);
			}
			else if (!ppro->getString(AIM_KEY_SN, &dbv)) {
				SetDlgItemTextA(hwndDlg, IDC_NK, dbv.pszVal);
				db_free(&dbv);
			}
			if (!ppro->getString(AIM_KEY_PW, &dbv)) {
				SetDlgItemTextA(hwndDlg, IDC_PW, dbv.pszVal);
				db_free(&dbv);
			}
			if (!ppro->getString(AIM_KEY_HN, &dbv)) {
				SetDlgItemTextA(hwndDlg, IDC_HN, dbv.pszVal);
				db_free(&dbv);
			}
			else SetDlgItemTextA(hwndDlg, IDC_HN, AIM_DEFAULT_SERVER);

			SetDlgItemInt(hwndDlg, IDC_PN, ppro->get_default_port(), FALSE);

			CheckDlgButton(hwndDlg, IDC_DC, ppro->getByte(AIM_KEY_DC, 0) ? BST_CHECKED : BST_UNCHECKED);//Message Delivery Confirmation
			CheckDlgButton(hwndDlg, IDC_FP, ppro->getByte(AIM_KEY_FP, 0) ? BST_CHECKED : BST_UNCHECKED);//force proxy
			CheckDlgButton(hwndDlg, IDC_AT, ppro->getByte(AIM_KEY_AT, 0) ? BST_CHECKED : BST_UNCHECKED);//Account Type Icons
			CheckDlgButton(hwndDlg, IDC_ES, ppro->getByte(AIM_KEY_ES, 0) ? BST_CHECKED : BST_UNCHECKED);//Extended Status Type Icons
			CheckDlgButton(hwndDlg, IDC_HF, ppro->getByte(AIM_KEY_HF, 0) ? BST_CHECKED : BST_UNCHECKED);//Fake hiptopness
			CheckDlgButton(hwndDlg, IDC_DM, ppro->getByte(AIM_KEY_DM, 0) ? BST_CHECKED : BST_UNCHECKED);//Disable Sending Mode Message
			CheckDlgButton(hwndDlg, IDC_FI, ppro->getByte(AIM_KEY_FI, 1) ? BST_CHECKED : BST_UNCHECKED);//Format incoming messages
			CheckDlgButton(hwndDlg, IDC_FO, ppro->getByte(AIM_KEY_FO, 1) ? BST_CHECKED : BST_UNCHECKED);//Format outgoing messages
			CheckDlgButton(hwndDlg, IDC_II, ppro->getByte(AIM_KEY_II, 0) ? BST_CHECKED : BST_UNCHECKED);//Instant Idle
			CheckDlgButton(hwndDlg, IDC_CM, ppro->getByte(AIM_KEY_CM, 0) ? BST_CHECKED : BST_UNCHECKED);//Check Mail
			CheckDlgButton(hwndDlg, IDC_MG, ppro->getByte(AIM_KEY_MG, 1) ? BST_CHECKED : BST_UNCHECKED);//Manage Groups
			CheckDlgButton(hwndDlg, IDC_DA, ppro->getByte(AIM_KEY_DA, 0) ? BST_CHECKED : BST_UNCHECKED);//Disable Avatars
			CheckDlgButton(hwndDlg, IDC_DSSL, ppro->getByte(AIM_KEY_DSSL, 0) ? BST_CHECKED : BST_UNCHECKED);//Disable SSL
			CheckDlgButton(hwndDlg, IDC_CLIENTLOGIN, ppro->getByte(AIM_KEY_CLIENTLOGIN, 1) ? BST_CHECKED : BST_UNCHECKED);//use clientlogin
			{
				HWND dssl = GetDlgItem(hwndDlg, IDC_DSSL);
				bool clientlogin = ppro->getByte(AIM_KEY_CLIENTLOGIN, 1) != 0;
				EnableWindow(dssl,  clientlogin);
				if(!clientlogin)
					CheckDlgButton(hwndDlg, IDC_DSSL, BST_CHECKED);
			}
			CheckDlgButton(hwndDlg, IDC_FSC, ppro->getByte(AIM_KEY_FSC, 0) ? BST_CHECKED : BST_UNCHECKED);//Force Single Client
		}
		break;

	case WM_COMMAND:
		switch (LOWORD(wParam)) {


		case IDC_SVRRESET:
			SetDlgItemTextA(hwndDlg, IDC_HN, AIM_DEFAULT_SERVER);
			SetDlgItemInt(hwndDlg, IDC_PN, ppro->get_default_port(), FALSE);
			break;

		case IDC_SN:
		case IDC_PN:
		case IDC_NK:
		case IDC_PW:
		case IDC_HN:
			if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())
				return 0;
			break;
		}
		if (IsDlgButtonChecked(hwndDlg, IDC_CLIENTLOGIN))
		{
			HWND dssl = GetDlgItem(hwndDlg, IDC_DSSL);
			EnableWindow(dssl, true);
		}
		else
		{
			HWND dssl = GetDlgItem(hwndDlg, IDC_DSSL);
			EnableWindow(dssl, false);
			CheckDlgButton(hwndDlg, IDC_DSSL, BST_CHECKED);
		}
		SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
		break;

	case WM_NOTIFY:
		switch (((LPNMHDR)lParam)->code) {
		case PSN_APPLY:
			{
				char str[128];
				//SN
				GetDlgItemTextA(hwndDlg, IDC_SN, str, _countof(str));
				if (str[0] != 0)
					ppro->setString(AIM_KEY_SN, str);
				else
					ppro->delSetting(AIM_KEY_SN);
				//END SN

				//NK
				if (GetDlgItemTextA(hwndDlg, IDC_NK, str, _countof(str)))
					ppro->setString(AIM_KEY_NK, str);
				else {
					GetDlgItemTextA(hwndDlg, IDC_SN, str, _countof(str));
					ppro->setString(AIM_KEY_NK, str);
				}
				//END NK

				//PW
				GetDlgItemTextA(hwndDlg, IDC_PW, str, _countof(str));
				if (str[0] != 0)
					ppro->setString(AIM_KEY_PW, str);
				else
					ppro->delSetting(AIM_KEY_PW);
				//END PW

				//HN
				GetDlgItemTextA(hwndDlg, IDC_HN, str, _countof(str));
				if (str[0] != 0 && mir_strcmp(str, AIM_DEFAULT_SERVER))
					ppro->setString(AIM_KEY_HN, str);
				else
					ppro->delSetting(AIM_KEY_HN);
				//END HN

				//Delivery Confirmation
				ppro->setByte(AIM_KEY_DC, IsDlgButtonChecked(hwndDlg, IDC_DC) != 0);
				//End Delivery Confirmation

				//Disable Avatar
				ppro->setByte(AIM_KEY_DA, IsDlgButtonChecked(hwndDlg, IDC_DA) != 0);
				//Disable Avatar

				//Disable SSL
				ppro->setByte(AIM_KEY_DSSL, IsDlgButtonChecked(hwndDlg, IDC_DSSL) != 0);
				//Disable SSL

				//use "clientlogin"
				ppro->setByte(AIM_KEY_CLIENTLOGIN, IsDlgButtonChecked(hwndDlg, IDC_CLIENTLOGIN) != 0);
				//use "clientlogin"

				//Force Single Login
				ppro->setByte(AIM_KEY_FSC, IsDlgButtonChecked(hwndDlg, IDC_FSC) != 0);
				//Force Single Login

				//Force Proxy Transfer
				ppro->setByte(AIM_KEY_FP, IsDlgButtonChecked(hwndDlg, IDC_FP) != 0);
				//End Force Proxy Transfer

				//PN
				int port = GetDlgItemInt(hwndDlg, IDC_PN, NULL, FALSE);
				if (port > 0 && port != AIM_DEFAULT_PORT)
					ppro->setWord(AIM_KEY_PN, (WORD)port);
				else
					ppro->delSetting(AIM_KEY_PN);
				//END PN

				//Disable Account Type Icons
				if (IsDlgButtonChecked(hwndDlg, IDC_AT)) {
					int acc_disabled = ppro->getByte(AIM_KEY_AT, 0);
					if (!acc_disabled)
						remove_AT_icons(ppro);
					ppro->setByte(AIM_KEY_AT, 1);
				}
				else {
					int acc_disabled = ppro->getByte(AIM_KEY_AT, 0);
					if (acc_disabled)
						add_AT_icons(ppro);
					ppro->setByte(AIM_KEY_AT, 0);
				}
				//END
				//Disable Extra Status Icons
				if (IsDlgButtonChecked(hwndDlg, IDC_ES)) {
					int es_disabled = ppro->getByte(AIM_KEY_ES, 0);
					ppro->setByte(AIM_KEY_ES, 1);
					if (!es_disabled)
						remove_ES_icons(ppro);
				}
				else {
					int es_disabled = ppro->getByte(AIM_KEY_ES, 0);
					ppro->setByte(AIM_KEY_ES, 0);
					if (es_disabled)
						add_ES_icons(ppro);
				}
				//End

				//Fake Hiptop
				if (IsDlgButtonChecked(hwndDlg, IDC_HF)) {
					int hf = ppro->getByte(AIM_KEY_HF, 0);
					if (!hf)
						ShowWindow(GetDlgItem(hwndDlg, IDC_MASQ), SW_SHOW);
					ppro->setByte(AIM_KEY_HF, 1);
				}
				else {
					int hf = ppro->getByte(AIM_KEY_HF, 0);
					if (hf)
						ShowWindow(GetDlgItem(hwndDlg, IDC_MASQ), SW_SHOW);
					ppro->setByte(AIM_KEY_HF, 0);
				}
				//End

				//Disable Mode Message Sending
				ppro->setByte(AIM_KEY_DM, IsDlgButtonChecked(hwndDlg, IDC_DM) != 0);
				//End Disable Mode Message Sending

				//Format Incoming Messages
				ppro->setByte(AIM_KEY_FI, IsDlgButtonChecked(hwndDlg, IDC_FI) != 0);
				//End Format Incoming Messages

				//Format Outgoing Messages
				ppro->setByte(AIM_KEY_FO, IsDlgButtonChecked(hwndDlg, IDC_FO) != 0);
				//End Format Outgoing Messages

				//Instant Idle on Login
				ppro->setByte(AIM_KEY_II, IsDlgButtonChecked(hwndDlg, IDC_II) != 0);
				//End
				//Check Mail on Login
				ppro->setByte(AIM_KEY_CM, IsDlgButtonChecked(hwndDlg, IDC_CM) != 0);
				//End

				//Manage Groups
				ppro->setByte(AIM_KEY_MG, IsDlgButtonChecked(hwndDlg, IDC_MG) != 0);
				//End
			}
		}
		break;
	}
	return FALSE;
}


static INT_PTR CALLBACK privacy_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static const int btns[] = { IDC_ALLOWALL, IDC_BLOCKALL, IDC_ALLOWBELOW, IDC_BLOCKBELOW, IDC_ALLOWCONT };
	CAimProto* ppro = (CAimProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
	int i;

	switch (msg) {
	case WM_INITDIALOG:
		TranslateDialogDefault(hwndDlg);

		SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
		ppro = (CAimProto*)lParam;

		CheckRadioButton(hwndDlg, IDC_ALLOWALL, IDC_BLOCKBELOW, btns[ppro->m_pd_mode - 1]);

		for (i = 0; i < ppro->m_allow_list.getCount(); ++i)
			SendDlgItemMessageA(hwndDlg, IDC_ALLOWLIST, LB_ADDSTRING, 0, (LPARAM)ppro->m_allow_list[i].name);

		for (i = 0; i < ppro->m_block_list.getCount(); ++i)
			SendDlgItemMessageA(hwndDlg, IDC_BLOCKLIST, LB_ADDSTRING, 0, (LPARAM)ppro->m_block_list[i].name);

		CheckDlgButton(hwndDlg, IDC_SIS, (ppro->m_pref1_flags & 0x400) ? BST_CHECKED : BST_CHECKED);
		break;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDC_ALLOWADD) {
			char nick[80];
			GetDlgItemTextA(hwndDlg, IDC_ALLOWEDIT, nick, _countof(nick));
			SendDlgItemMessageA(hwndDlg, IDC_ALLOWLIST, LB_ADDSTRING, 0, (LPARAM)trim_str(nick));
		}
		else if (LOWORD(wParam) == IDC_BLOCKADD) {
			char nick[80];
			GetDlgItemTextA(hwndDlg, IDC_BLOCKEDIT, nick, _countof(nick));
			SendDlgItemMessageA(hwndDlg, IDC_BLOCKLIST, LB_ADDSTRING, 0, (LPARAM)trim_str(nick));
		}
		else if (LOWORD(wParam) == IDC_ALLOWREMOVE) {
			i = SendDlgItemMessage(hwndDlg, IDC_ALLOWLIST, LB_GETCURSEL, 0, 0);
			SendDlgItemMessage(hwndDlg, IDC_ALLOWLIST, LB_DELETESTRING, i, 0);
		}
		else if (LOWORD(wParam) == IDC_BLOCKREMOVE) {
			i = SendDlgItemMessage(hwndDlg, IDC_BLOCKLIST, LB_GETCURSEL, 0, 0);
			SendDlgItemMessage(hwndDlg, IDC_BLOCKLIST, LB_DELETESTRING, i, 0);
		}

		SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
		break;

	case WM_NOTIFY:
		if (((LPNMHDR)lParam)->code == PSN_APPLY) {
			ppro->aim_ssi_update(ppro->m_hServerConn, ppro->m_seqno, true);
			for (i = 0; i < 5; ++i) {
				if (IsDlgButtonChecked(hwndDlg, btns[i]) && ppro->m_pd_mode != i + 1) {
					ppro->m_pd_mode = (char)(i + 1);
					ppro->m_pd_flags = 1;
					ppro->aim_set_pd_info(ppro->m_hServerConn, ppro->m_seqno);
					break;
				}
			}
			for (i = 0; i < ppro->m_block_list.getCount(); ++i) {
				BdListItem& pd = ppro->m_block_list[i];
				if (SendDlgItemMessageA(hwndDlg, IDC_BLOCKLIST, LB_FINDSTRING, (WPARAM)-1, (LPARAM)pd.name) == LB_ERR) {
					ppro->aim_delete_contact(ppro->m_hServerConn, ppro->m_seqno, pd.name, pd.item_id, 0, 3, false);
					ppro->m_block_list.remove(i--);
				}
			}
			i = SendDlgItemMessage(hwndDlg, IDC_BLOCKLIST, LB_GETCOUNT, 0, 0);
			for (; i--;) {
				char nick[80];
				SendDlgItemMessageA(hwndDlg, IDC_BLOCKLIST, LB_GETTEXT, i, (LPARAM)nick);
				if (ppro->m_block_list.find_id(nick) == 0) {
					unsigned short id = ppro->m_block_list.add(nick);
					ppro->aim_add_contact(ppro->m_hServerConn, ppro->m_seqno, nick, id, 0, 3);
				}
			}

			for (i = 0; i < ppro->m_allow_list.getCount(); ++i) {
				BdListItem& pd = ppro->m_allow_list[i];
				if (SendDlgItemMessageA(hwndDlg, IDC_ALLOWLIST, LB_FINDSTRING, (WPARAM)-1, (LPARAM)pd.name) == LB_ERR) {
					ppro->aim_delete_contact(ppro->m_hServerConn, ppro->m_seqno, pd.name, pd.item_id, 0, 2, false);
					ppro->m_allow_list.remove(i--);
				}
			}
			i = SendDlgItemMessage(hwndDlg, IDC_ALLOWLIST, LB_GETCOUNT, 0, 0);
			for (; i--;) {
				char nick[80];
				SendDlgItemMessageA(hwndDlg, IDC_ALLOWLIST, LB_GETTEXT, i, (LPARAM)nick);
				if (ppro->m_allow_list.find_id(nick) == 0) {
					unsigned short id = ppro->m_allow_list.add(nick);
					ppro->aim_add_contact(ppro->m_hServerConn, ppro->m_seqno, nick, id, 0, 2);
				}
			}

			unsigned mask = (IsDlgButtonChecked(hwndDlg, IDC_SIS) == BST_CHECKED) << 10;
			if ((ppro->m_pref1_flags & 0x400) ^ mask) {
				ppro->m_pref1_flags = (ppro->m_pref1_flags & ~0x400) | mask;
				ppro->aim_ssi_update_preferences(ppro->m_hServerConn, ppro->m_seqno);
			}

			ppro->aim_ssi_update(ppro->m_hServerConn, ppro->m_seqno, false);
		}
		break;
	}
	return FALSE;
}


int CAimProto::OnOptionsInit(WPARAM wParam, LPARAM)
{
	OPTIONSDIALOGPAGE odp = { 0 };
	odp.position = 1003000;
	odp.hInstance = hInstance;
	odp.pwszGroup = LPGENW("Network");
	odp.pwszTitle = m_tszUserName;
	odp.dwInitParam = LPARAM(this);
	odp.flags = ODPF_BOLDGROUPS | ODPF_UNICODE | ODPF_DONTTRANSLATE;

	odp.pwszTab = LPGENW("Basic");
	odp.pszTemplate = MAKEINTRESOURCEA(IDD_AIM);
	odp.pfnDlgProc = options_dialog;
	Options_AddPage(wParam, &odp);

	odp.pwszTab = LPGENW("Privacy");
	odp.pszTemplate = MAKEINTRESOURCEA(IDD_PRIVACY);
	odp.pfnDlgProc = privacy_dialog;
	Options_AddPage(wParam, &odp);
	return 0;
}


/////////////////////////////////////////////////////////////////////////////////////////
// Brief account info dialog

INT_PTR CALLBACK first_run_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	CAimProto* ppro = (CAimProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);

	switch (msg) {
	case WM_INITDIALOG:
		TranslateDialogDefault(hwndDlg);

		ppro = (CAimProto*)lParam;
		SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
		{
			DBVARIANT dbv;
			if (!ppro->getString(AIM_KEY_SN, &dbv)) {
				SetDlgItemTextA(hwndDlg, IDC_SN, dbv.pszVal);
				db_free(&dbv);
			}

			if (!ppro->getString(AIM_KEY_PW, &dbv)) {
				SetDlgItemTextA(hwndDlg, IDC_PW, dbv.pszVal);
				db_free(&dbv);
			}
		}
		return TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDC_NEWAIMACCOUNTLINK) {
			Utils_OpenUrl("http://www.aim.com/redirects/inclient/register.adp");
			return TRUE;
		}

		if (HIWORD(wParam) == EN_CHANGE && (HWND)lParam == GetFocus()) {
			switch (LOWORD(wParam)) {
			case IDC_SN:
			case IDC_PW:
				SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
			}
		}
		break;

	case WM_NOTIFY:
		if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY) {
			char str[128];
			GetDlgItemTextA(hwndDlg, IDC_SN, str, _countof(str));
			ppro->setString(AIM_KEY_SN, str);

			GetDlgItemTextA(hwndDlg, IDC_PW, str, _countof(str));
			ppro->setString(AIM_KEY_PW, str);
			return TRUE;
		}
		break;
	}

	return FALSE;
}

INT_PTR CAimProto::SvcCreateAccMgrUI(WPARAM, LPARAM lParam)
{
	return (INT_PTR)CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_AIMACCOUNT),
		(HWND)lParam, first_run_dialog, (LPARAM)this);
}


/////////////////////////////////////////////////////////////////////////////////////////
// Instant idle dialog

INT_PTR CALLBACK instant_idle_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	CAimProto *ppro = (CAimProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);

	switch (msg) {
	case WM_INITDIALOG:
		TranslateDialogDefault(hwndDlg);

		SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
		ppro = (CAimProto*)lParam;
		{
			Window_SetIcon_IcoLib(hwndDlg, GetIconHandle("idle"));

			unsigned long it = ppro->getDword(AIM_KEY_IIT, 0);
			unsigned long hours = it / 60;
			unsigned long minutes = it % 60;
			SetDlgItemInt(hwndDlg, IDC_IIH, hours, 0);
			SetDlgItemInt(hwndDlg, IDC_IIM, minutes, 0);
		}
		break;

	case WM_CLOSE:
		EndDialog(hwndDlg, 0);
		break;

	case WM_DESTROY:
		Window_FreeIcon_IcoLib(hwndDlg);
		break;

	case WM_COMMAND:
		{
			unsigned long hours = GetDlgItemInt(hwndDlg, IDC_IIH, 0, 0);
			unsigned short minutes = (unsigned short)GetDlgItemInt(hwndDlg, IDC_IIM, 0, 0);
			if (minutes > 59)
				minutes = 59;

			ppro->setDword(AIM_KEY_IIT, hours * 60 + minutes);
			switch (LOWORD(wParam)) {
			case IDOK:
				//Instant Idle
				if (ppro->m_state == 1) {
					ppro->aim_set_idle(ppro->m_hServerConn, ppro->m_seqno, hours * 60 * 60 + minutes * 60);
					ppro->m_instantidle = 1;
				}
				EndDialog(hwndDlg, IDOK);
				break;

			case IDCANCEL:
				ppro->aim_set_idle(ppro->m_hServerConn, ppro->m_seqno, 0);
				ppro->m_instantidle = 0;
				EndDialog(hwndDlg, IDCANCEL);
				break;
			}
		}
		break;
	}
	return FALSE;
}


/////////////////////////////////////////////////////////////////////////////////////////
// Join chat dialog

INT_PTR CALLBACK join_chat_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	CAimProto* ppro = (CAimProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);

	switch (msg) {
	case WM_INITDIALOG:
		TranslateDialogDefault(hwndDlg);

		SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
		ppro = (CAimProto*)lParam;
		Window_SetIcon_IcoLib(hwndDlg, GetIconHandle("aol"));
		break;

	case WM_CLOSE:
		EndDialog(hwndDlg, 0);
		break;

	case WM_DESTROY:
		Window_FreeIcon_IcoLib(hwndDlg);
		break;

	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDOK:
			char room[128];
			GetDlgItemTextA(hwndDlg, IDC_ROOM, room, _countof(room));
			if (ppro->m_state == 1 && room[0] != 0) {
				chatnav_param* par = new chatnav_param(room, 4);
				ppro->ForkThread(&CAimProto::chatnav_request_thread, par);
			}
			EndDialog(hwndDlg, IDOK);
			break;

		case IDCANCEL:
			EndDialog(hwndDlg, IDCANCEL);
			break;
		}
		break;
	}

	return FALSE;
}
/////////////////////////////////////////////////////////////////////////////////////////
// Invite to chat dialog

static void clist_chat_invite_send(MCONTACT hItem, HWND hwndList, chat_list_item* item, CAimProto* ppro, char *msg)
{
	if (hItem == NULL)
		hItem = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0);

	while (hItem) {
		if (IsHContactGroup(hItem)) {
			MCONTACT hItemT = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem);
			if (hItemT)
				clist_chat_invite_send(hItemT, hwndList, item, ppro, msg);
		}
		else {
			int chk = SendMessage(hwndList, CLM_GETCHECKMARK, (WPARAM)hItem, 0);
			if (chk) {
				if (IsHContactInfo(hItem)) {
					wchar_t buf[128] = L"";
					SendMessage(hwndList, CLM_GETITEMTEXT, (WPARAM)hItem, (LPARAM)buf);

					char *sn = mir_u2a(buf);
					ppro->aim_chat_invite(ppro->m_hServerConn, ppro->m_seqno,
						item->cookie, item->exchange, item->instance, sn, msg);
					mir_free(sn);
				}
				else {
					DBVARIANT dbv;
					if (!ppro->getString(hItem, AIM_KEY_SN, &dbv)) {
						ppro->aim_chat_invite(ppro->m_hServerConn, ppro->m_seqno,
							item->cookie, item->exchange, item->instance, dbv.pszVal, msg);
						db_free(&dbv);
					}
				}
			}
		}
		hItem = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXT, (LPARAM)hItem);
	}
}

static void clist_validate_contact(MCONTACT hItem, HWND hwndList, CAimProto* ppro)
{
	if (!ppro->is_my_contact(hItem) || ppro->isChatRoom(hItem) ||
		ppro->getWord(hItem, AIM_KEY_ST, ID_STATUS_OFFLINE) == ID_STATUS_ONTHEPHONE)
		SendMessage(hwndList, CLM_DELETEITEM, (WPARAM)hItem, 0);
}

static void clist_chat_prepare(MCONTACT hItem, HWND hwndList, CAimProto* ppro)
{
	if (hItem == NULL)
		hItem = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0);

	while (hItem) {
		MCONTACT hItemN = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXT, (LPARAM)hItem);
		if (IsHContactGroup(hItem)) {
			MCONTACT hItemT = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem);
			if (hItemT)
				clist_chat_prepare(hItemT, hwndList, ppro);
		}
		else if (IsHContactContact(hItem))
			clist_validate_contact(hItem, hwndList, ppro);

		hItem = hItemN;
	}
}

INT_PTR CALLBACK invite_to_chat_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	invite_chat_param* param = (invite_chat_param*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);

	switch (msg) {
	case WM_INITDIALOG:
		TranslateDialogDefault(hwndDlg);

		SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
		param = (invite_chat_param*)lParam;

		Window_SetIcon_IcoLib(hwndDlg, GetIconHandle("aol"));
		SetDlgItemTextA(hwndDlg, IDC_ROOMNAME, param->id);
		SetDlgItemTextA(hwndDlg, IDC_MSG, Translate("Join me in this buddy chat!"));
		break;

	case WM_CLOSE:
		EndDialog(hwndDlg, 0);
		break;

	case WM_NCDESTROY:
		Window_FreeIcon_IcoLib(hwndDlg);
		delete param;
		break;

	case WM_NOTIFY:
		{
			NMCLISTCONTROL *nmc = (NMCLISTCONTROL*)lParam;
			if (nmc->hdr.idFrom == IDC_CCLIST) {
				switch (nmc->hdr.code) {
				case CLN_NEWCONTACT:
					if (param && (nmc->flags & (CLNF_ISGROUP | CLNF_ISINFO)) == 0)
						clist_validate_contact((UINT_PTR)nmc->hItem, nmc->hdr.hwndFrom, param->ppro);
					break;

				case CLN_LISTREBUILT:
					if (param)
						clist_chat_prepare(NULL, nmc->hdr.hwndFrom, param->ppro);
					break;
				}
			}
		}
		break;

	case WM_COMMAND:
		{
			switch (LOWORD(wParam)) {
			case IDC_ADDSCR:
				if (param->ppro->m_state == 1) {
					wchar_t sn[64];
					GetDlgItemText(hwndDlg, IDC_EDITSCR, sn, _countof(sn));

					CLCINFOITEM cii = { 0 };
					cii.cbSize = sizeof(cii);
					cii.flags = CLCIIF_CHECKBOX | CLCIIF_BELOWCONTACTS;
					cii.pszText = sn;

					HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_CCLIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
					SendDlgItemMessage(hwndDlg, IDC_CCLIST, CLM_SETCHECKMARK, (LPARAM)hItem, 1);
				}
				break;

			case IDOK:
				{
					chat_list_item* item = param->ppro->find_chat_by_id(param->id);
					if (item) {
						char buf[1024];
						GetDlgItemTextA(hwndDlg, IDC_MSG, buf, _countof(buf));

						HWND hwndList = GetDlgItem(hwndDlg, IDC_CCLIST);
						clist_chat_invite_send(NULL, hwndList, item, param->ppro, buf);
					}
					EndDialog(hwndDlg, IDOK);
				}
				break;

			case IDCANCEL:
				EndDialog(hwndDlg, IDCANCEL);
				break;
			}
		}
		break;
	}
	return FALSE;
}

/////////////////////////////////////////////////////////////////////////////////////////
// Chat request dialog

INT_PTR CALLBACK chat_request_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	invite_chat_req_param* param = (invite_chat_req_param*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);

	switch (msg) {
	case WM_INITDIALOG:
		TranslateDialogDefault(hwndDlg);

		SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
		param = (invite_chat_req_param*)lParam;

		Window_SetIcon_IcoLib(hwndDlg, GetIconHandle("aol"));

		SetDlgItemTextA(hwndDlg, IDC_ROOMNAME, strrchr(param->cnp->id, '-') + 1);
		SetDlgItemTextA(hwndDlg, IDC_SCREENNAME, param->name);
		SetDlgItemTextA(hwndDlg, IDC_MSG, param->message);
		break;

	case WM_CLOSE:
		EndDialog(hwndDlg, 0);
		break;

	case WM_DESTROY:
		Window_FreeIcon_IcoLib(hwndDlg);
		delete param;
		break;

	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDOK:
			param->ppro->ForkThread(&CAimProto::chatnav_request_thread, param->cnp);
			EndDialog(hwndDlg, IDOK);
			break;

		case IDCANCEL:
			param->ppro->aim_chat_deny(param->ppro->m_hServerConn, param->ppro->m_seqno, param->name, param->icbm_cookie);
			delete param->cnp;
			EndDialog(hwndDlg, IDCANCEL);
			break;
		}
		break;
	}
	return FALSE;
}


void CALLBACK chat_request_cb(PVOID dwParam)
{
	CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_CHATROOM_INVITE_REQ),
		NULL, chat_request_dialog, (LPARAM)dwParam);
}