#include "common.h"
#include "options.h"
#include "icons.h"

Options options;

HWND hwndOptions;

HANDLE hMainMenuItemRestart, hMainMenuItemUpdateAndExit;
HANDLE hBackupPath, hDataPath, hArchivePath;

void add_restart_menu_item()
{
	CLISTMENUITEM mi = {0};
	mi.cbSize=sizeof(mi);
	mi.flags = CMIM_ALL | CMIF_ICONFROMICOLIB;
	mi.icolibItem = GetIconHandle(I_RSTRT);
	mi.pszName = "Restart";
	mi.pszService= MS_UPDATE_MENURESTART;
	mi.position = 2000099900;
	hMainMenuItemRestart = Menu_AddMainMenuItem(&mi);
}

void add_update_and_exit_menu_item()
{
	CLISTMENUITEM mi = {0};
	mi.cbSize = sizeof(mi);
	mi.flags = CMIM_ALL | CMIF_ICONFROMICOLIB;
	mi.icolibItem = GetIconHandle(I_CHKUPDEXT);
	mi.pszName = "Update and Exit";
	mi.pszService = MS_UPDATE_MENUUPDATEANDEXIT;
	mi.position = 2000099901;
	hMainMenuItemUpdateAndExit = Menu_AddMainMenuItem(&mi);
}

void remove_restart_menu_item() {
#ifdef MS_CLIST_REMOVEMAINMENUITEM
	CallService(MS_CLIST_REMOVEMAINMENUITEM, (WPARAM)hMainMenuItemRestart, 0);
#endif
}

void remove_update_and_exit_menu_item() {
#ifdef MS_CLIST_REMOVEMAINMENUITEM
	CallService(MS_CLIST_REMOVEMAINMENUITEM, (WPARAM)hMainMenuItemUpdateAndExit, 0);
#endif
}

static int EnumerateFuncFillList(char *szComponentName, UpdateOptions *update_options, LPARAM lParam) {
	LVITEM lvI = {0};
	HWND hwndDlg = (HWND)lParam;
	HWND hwndLV = GetDlgItem(hwndDlg, IDC_LST_REGISTERED);
	TCHAR *temp_str;

	// Some code to create the list-view control.
	// Initialize LVITEM members that are common to all
	// items. 
	lvI.mask = LVIF_TEXT | LVIF_PARAM;
	lvI.lParam = (update_options->enabled ? 1 : 0) | (update_options->use_beta ? 2 : 0) | (update_options->fixed ? 4 : 0);

	lvI.iSubItem = 0;
	lvI.pszText = (temp_str = GetTString(szComponentName));
	lvI.iItem = ListView_InsertItem(hwndLV, &lvI);
	mir_free(temp_str);

	lvI.mask = LVIF_TEXT;
	lvI.iSubItem = 1;
	//lvI.pszText = LPSTR_TEXTCALLBACK;
	if (((int)lvI.lParam & 4) == 4) {
		lvI.pszText = (((int)lvI.lParam & 2) == 2 ? TranslateT("FORCED") : TranslateT("N/A"));
	} else {
		lvI.pszText = (((int)lvI.lParam & 2) == 2 ? TranslateT("TRUE") : TranslateT("FALSE"));
	}
	
	ListView_SetItem(hwndLV, &lvI);

	ListView_SetCheckState(hwndLV, lvI.iItem, update_options->enabled);

	return 0;
}

static INT_PTR CALLBACK DlgProcOpts1(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {

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

		CheckDlgButton(hwndDlg, IDC_CHK_ONSTART, options.check_on_startup);
		{
			HWND hw = GetDlgItem(hwndDlg, IDC_CHK_ONCE);
			EnableWindow(hw, (IsDlgButtonChecked(hwndDlg, IDC_CHK_ONSTART) ? TRUE : FALSE));
		}
		CheckDlgButton(hwndDlg, IDC_CHK_ONCE, options.check_once);
		CheckDlgButton(hwndDlg, IDC_CHK_DAILY, options.check_daily);
		if (!ServiceExists(MS_TRIGGER_REGISTERACTION)) {
			HWND hw = GetDlgItem(hwndDlg, IDC_CHK_NOCONFIDLE);
			EnableWindow(hw, (IsDlgButtonChecked(hwndDlg, IDC_CHK_DAILY) ? TRUE : FALSE));
		}
		CheckDlgButton(hwndDlg, IDC_CHK_NOCONFIDLE, options.no_conf_idle);
		CheckDlgButton(hwndDlg, IDC_CHK_BACKUP, options.backup);
		CheckDlgButton(hwndDlg, IDC_CHK_STARTOFFLINE, options.start_offline);
		CheckDlgButton(hwndDlg, IDC_CHK_POPUP, options.popup_notify);
		CheckDlgButton(hwndDlg, IDC_CHK_RESTART, options.restart_menu_item);
		CheckDlgButton(hwndDlg, IDC_CHK_UPDATEANDEXIT, options.update_and_exit_menu_item);
		CheckDlgButton(hwndDlg, IDC_CHK_SAVEZIPS, options.save_zips);
		{
			HWND hw = GetDlgItem(hwndDlg, IDC_CHK_POPUP);
			EnableWindow(hw, ArePopupsEnabled() ? TRUE : FALSE);
			hw = GetDlgItem(hwndDlg, IDC_CHK_NOUNZIP);
			EnableWindow(hw, options.save_zips ? TRUE : FALSE);
		}
		CheckDlgButton(hwndDlg, IDC_CHK_NOUNZIP, options.no_unzip);
		CheckDlgButton(hwndDlg, IDC_CHK_DLLSONLY, options.auto_dll_only);

		// set up Version Requirement slider
		SendDlgItemMessage(hwndDlg, IDC_SLID_VERREQ, TBM_SETRANGE, 0, MAKELONG(0, 3));

		SendDlgItemMessage(hwndDlg, IDC_SLID_VERREQ, TBM_SETPOS, TRUE, (int)options.ver_req);
		switch(options.ver_req) {
		case VR_MAJOR:
			SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on major version change."));
			break;
		case VR_MINOR:
			SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on minor version change."));
			break;
		case VR_RELEASE:
			SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on release number change."));
			break;
		case VR_BUILD:
			SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on build number change."));
			break;
		}


		SendMessage(GetDlgItem(hwndDlg, IDC_LST_REGISTERED),LVM_SETEXTENDEDLISTVIEWSTYLE, 0,LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);

		{
			LVCOLUMN lvc; 
			// Initialize the LVCOLUMN structure.
			// The mask specifies that the format, width, text, and
			// subitem members of the structure are valid. 
			lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
			lvc.fmt = LVCFMT_LEFT;
	  
			lvc.iSubItem = 0;
			lvc.pszText = TranslateT("Component Name");	
			lvc.cx = 260;     // width of column in pixels
			ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), 0, &lvc);

			lvc.iSubItem = 1;
			lvc.pszText = TranslateT("Use Beta?");	
			lvc.cx = 90;     // width of column in pixels
			ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), 1, &lvc);
		}

		ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_LST_REGISTERED));
		CallService(MS_UPDATE_ENUMERATE, (WPARAM)EnumerateFuncFillList, (LPARAM)hwndDlg);
		
		//SendDlgItemMessage(hwndDlg, IDC_BTN_CHECK, WM_SETICON, ICON_SMALL, (LPARAM)hIconCheck);
		//SendDlgItemMessage(hwndDlg, IDC_BTN_CHECKNORESTART, WM_SETICON, ICON_SMALL, (LPARAM)hIconCheckExit);
		SendDlgItemMessage(hwndDlg, IDC_BTN_CHECK, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx(I_CHKUPD));
		SendDlgItemMessage(hwndDlg, IDC_BTN_CHECKNORESTART, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx(I_CHKUPDEXT));

		return FALSE;

	case WMU_CHECKING:
		{
			HWND hw = GetDlgItem(hwndDlg, IDC_BTN_CHECK);
			EnableWindow(hw, FALSE);
			hw = GetDlgItem(hwndDlg, IDC_BTN_CHECKNORESTART);
			EnableWindow(hw, FALSE);
		}
		return TRUE;

	case WMU_DONECHECKING:
		{
			HWND hw = GetDlgItem(hwndDlg, IDC_BTN_CHECK);
			EnableWindow(hw, TRUE);
			hw = GetDlgItem(hwndDlg, IDC_BTN_CHECKNORESTART);
			EnableWindow(hw, TRUE);
		}
		return TRUE;

	case WM_HSCROLL:
		//if (LOWORD(wParam) == TB_PAGEUP || LOWORD(wParam) == TB_PAGEDOWN) 
		{
			VersionRequirement vr = (VersionRequirement)SendDlgItemMessage(hwndDlg, IDC_SLID_VERREQ, TBM_GETPOS, 0, 0);
			switch(vr) {
			case VR_MAJOR:
				SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on major version change."));
				break;
			case VR_MINOR:
				SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on minor version change."));
				break;
			case VR_RELEASE:
				SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on release number change."));
				break;
			case VR_BUILD:
				SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on build number change."));
				break;
			}
			SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
			return TRUE;
		}
		break;
	case WM_COMMAND:
		if ( HIWORD( wParam ) == BN_CLICKED ) {
			switch( LOWORD( wParam )) {
				case IDC_CHK_ONSTART:
					{
						HWND hw = GetDlgItem(hwndDlg, IDC_CHK_ONCE);
						EnableWindow(hw, (IsDlgButtonChecked(hwndDlg, IDC_CHK_ONSTART) ? TRUE : FALSE));
					}
					SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
					return TRUE;
				case IDC_CHK_ONCE:
					SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
					return TRUE;
				case IDC_CHK_DAILY:
					if (!ServiceExists(MS_TRIGGER_REGISTERACTION)) {
						HWND hw = GetDlgItem(hwndDlg, IDC_CHK_NOCONFIDLE);
						EnableWindow(hw, (IsDlgButtonChecked(hwndDlg, IDC_CHK_DAILY) ? TRUE : FALSE));
					}
					SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
					return TRUE;
				case IDC_CHK_NOCONFIDLE:
				case IDC_CHK_BACKUP:
				case IDC_CHK_STARTOFFLINE:
				case IDC_CHK_POPUP:
				case IDC_CHK_RESTART:
				case IDC_CHK_UPDATEANDEXIT:
				case IDC_CHK_NOUNZIP:
				case IDC_CHK_DLLSONLY:
					SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
					return TRUE;
				case IDC_CHK_SAVEZIPS:
					{
						HWND hw = GetDlgItem(hwndDlg, IDC_CHK_NOUNZIP);
						EnableWindow(hw, (IsDlgButtonChecked(hwndDlg, IDC_CHK_SAVEZIPS) ? TRUE : FALSE));
					}
					SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
					return TRUE;
				case IDC_BTN_CHECK:
					CallService(MS_UPDATE_CHECKFORUPDATES, 0, 0);
					return TRUE;
				case IDC_BTN_CHECKNORESTART:
					CallService(MS_UPDATE_CHECKFORUPDATES, 0, 1);
					return TRUE;
			}
		}
		break;

	case WM_NOTIFY:
		if (((LPNMHDR) lParam)->hwndFrom == GetDlgItem(hwndDlg, IDC_LST_REGISTERED)) {
			switch (((LPNMHDR) lParam)->code) {
			case NM_CLICK:
				if (((LPNMLISTVIEW)lParam)->iSubItem == 1) {
					LVITEM lvi = {0};
					lvi.mask = LVIF_PARAM;
					lvi.iItem = ((LPNMLISTVIEW)lParam)->iItem;
					lvi.iSubItem = 0;
					SendMessage(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), LVM_GETITEM, 0, (LPARAM)&lvi);
					if (((int)lvi.lParam & 4) == 0) {
						lvi.lParam ^= 2;
						ListView_SetItem(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), &lvi);

						lvi.iSubItem = 1;
						lvi.mask = LVIF_TEXT;
						if (((int)lvi.lParam & 4) == 4) {
							lvi.pszText = (((int)lvi.lParam & 2) == 2 ? TranslateT("FORCED") : TranslateT("N/A"));
						} else {
							lvi.pszText = (((int)lvi.lParam & 2) == 2 ? TranslateT("TRUE") : TranslateT("FALSE"));
						}
						ListView_SetItem(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), &lvi);

						ListView_RedrawItems(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), lvi.iItem, lvi.iItem);
						SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
					}
				}
				return 0;
			case LVN_ITEMCHANGED:
				{
					NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam;

					if(IsWindowVisible(GetDlgItem(hwndDlg, IDC_LST_REGISTERED)) && ((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK))
						SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
				}
				break;
			case LVN_GETDISPINFO:
				{
					LVITEM lvi = {0};
					lvi.mask = LVIF_PARAM;
					lvi.iItem = ((NMLVDISPINFO *)lParam)->item.iItem;
					lvi.iSubItem = 0;
					SendMessage(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), LVM_GETITEM, 0, (LPARAM)&lvi);
					switch (((NMLVDISPINFO *)lParam)->item.iSubItem) {
					case 0:
						MessageBox(0, _T("LVN_GETDISPINFO (0)"), _T("msg"), MB_OK);
						break;
					case 1:
						if (((int)lvi.lParam & 4) == 4) {
							((NMLVDISPINFO *)lParam)->item.pszText = ((lvi.lParam & 2) == 2 ? TranslateT("FORCED") : TranslateT("N/A"));
							((NMLVDISPINFO *)lParam)->item.cchTextMax = (int)_tcslen(((NMLVDISPINFO *)lParam)->item.pszText);
						} else {
							((NMLVDISPINFO *)lParam)->item.pszText = ((lvi.lParam & 2) == 2 ? TranslateT("TRUE") : TranslateT("FALSE"));
							((NMLVDISPINFO *)lParam)->item.cchTextMax = (int)_tcslen(((NMLVDISPINFO *)lParam)->item.pszText);
						}
						break;
					}
				}
				return 0;
			}
		} else 
			if (((LPNMHDR)lParam)->code == (unsigned)PSN_APPLY ) {
				options.check_on_startup = (IsDlgButtonChecked(hwndDlg, IDC_CHK_ONSTART) ? true : false);
				options.check_once = (IsDlgButtonChecked(hwndDlg, IDC_CHK_ONCE) ? true : false);
				options.check_daily = (IsDlgButtonChecked(hwndDlg, IDC_CHK_DAILY) ? true : false);
				options.no_conf_idle = (IsDlgButtonChecked(hwndDlg, IDC_CHK_NOCONFIDLE) ? true : false);
				options.backup = (IsDlgButtonChecked(hwndDlg, IDC_CHK_BACKUP) ? true : false);
				options.start_offline = (IsDlgButtonChecked(hwndDlg, IDC_CHK_STARTOFFLINE) ? true : false);
				options.popup_notify = (IsDlgButtonChecked(hwndDlg, IDC_CHK_POPUP) ? true : false);
				options.ver_req = (VersionRequirement)SendDlgItemMessage(hwndDlg, IDC_SLID_VERREQ, TBM_GETPOS, 0, 0);
				options.save_zips = (IsDlgButtonChecked(hwndDlg, IDC_CHK_SAVEZIPS) ? true : false);
				options.no_unzip = (IsDlgButtonChecked(hwndDlg, IDC_CHK_NOUNZIP) ? true : false);
				options.auto_dll_only = (IsDlgButtonChecked(hwndDlg, IDC_CHK_DLLSONLY) ? true : false);

				bool restart_menu_item = (IsDlgButtonChecked(hwndDlg, IDC_CHK_RESTART) ? true : false);
				if(options.restart_menu_item != restart_menu_item) {
					options.restart_menu_item = restart_menu_item;
					if(options.restart_menu_item) add_restart_menu_item();
					else remove_restart_menu_item();
				}

				bool update_and_exit_menu_item = (IsDlgButtonChecked(hwndDlg, IDC_CHK_UPDATEANDEXIT) ? true : false);
				if(options.update_and_exit_menu_item != update_and_exit_menu_item) {
					options.update_and_exit_menu_item = update_and_exit_menu_item;
					if(options.update_and_exit_menu_item) add_update_and_exit_menu_item();
					else remove_update_and_exit_menu_item();
				}

				int count = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_LST_REGISTERED));
				UpdateOptions uo;
				LVITEM lvi;
				lvi.mask = LVIF_TEXT | LVIF_PARAM;
				TCHAR buff[256];
				lvi.pszText = buff;
				lvi.cchTextMax = 256;
				lvi.iSubItem = 0;
				for(int i = 0; i < count; i++) {
					lvi.iItem = i;
					SendMessage(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), LVM_GETITEM, 0, (LPARAM)&lvi);

					uo.enabled = (ListView_GetCheckState(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), lvi.iItem) == TRUE);
					uo.use_beta = (((int)lvi.lParam & 2) == 2);
					uo.fixed = (((int)lvi.lParam & 4) == 4);
					
					CallService(MS_UPDATE_SETUPDATEOPTIONS, (WPARAM)lvi.pszText, (LPARAM)&uo);
				}

				SaveOptions();
				return TRUE;
			}
		break;
	case WM_DESTROY:
		ReleaseIconEx((HICON)SendDlgItemMessage(hwndDlg, IDC_BTN_CHECK, BM_SETIMAGE, IMAGE_ICON, 0));
		ReleaseIconEx((HICON)SendDlgItemMessage(hwndDlg, IDC_BTN_CHECKNORESTART, BM_SETIMAGE, IMAGE_ICON, 0));
		hwndOptions = 0;
		break;
	}

	return FALSE;
}

int OptInit(WPARAM wParam,LPARAM lParam)
{
	OPTIONSDIALOGPAGE odp = { 0 };
	odp.cbSize = sizeof(odp);
	odp.flags = ODPF_BOLDGROUPS;
	odp.position = -790000000;
	odp.hInstance = hInst;
	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT1);
	odp.pszTitle = LPGEN("Updater");
	odp.pszGroup = LPGEN("Services");
	odp.nIDBottomSimpleControl	= 0;
	odp.pfnDlgProc = DlgProcOpts1;
	Options_AddPage(wParam, &odp);

	return 0;
}

void InitOptionsMenuItems()
{
	if(options.restart_menu_item)
		add_restart_menu_item();

	if(options.update_and_exit_menu_item)
		add_update_and_exit_menu_item();
}

int FoldersPathChanged(WPARAM wParam, LPARAM lParam) 
{
	FOLDERSGETDATA fgd = {0};
	fgd.cbSize = sizeof(fgd);
	fgd.nMaxPathSize = MAX_PATH;

	fgd.szPathT = options.backup_folder;
	CallService(MS_FOLDERS_GET_PATH, (WPARAM)hBackupPath, (WPARAM)&fgd);

	fgd.szPathT = options.data_folder;
	CallService(MS_FOLDERS_GET_PATH, (WPARAM)hDataPath, (WPARAM)&fgd);

	fgd.szPathT = options.zip_folder;
	CallService(MS_FOLDERS_GET_PATH, (WPARAM)hArchivePath, (WPARAM)&fgd);

	mir_sntprintf(options.temp_folder, SIZEOF(options.temp_folder), _T("%s\\updates"), options.data_folder);

	return 0;
}

void LoadOptions(void) 
{
	options.check_on_startup = (DBGetContactSettingByte(0, MODULE, "CheckOnStartup", 1) == 1);
	options.check_once = (DBGetContactSettingByte(0, MODULE, "CheckOnce", 1) == 1);
	options.check_daily = (DBGetContactSettingByte(0, MODULE, "CheckDaily", 1) == 1);
	options.no_conf_idle = (DBGetContactSettingByte(0, MODULE, "NoConfIdle", 0) == 1);
	options.backup = (DBGetContactSettingByte(0, MODULE, "Backup", 1) == 1);
	//options.use_xml_backend = (DBGetContactSettingByte(0, MODULE, "UseXML", 1) == 1);
	options.use_xml_backend = true;
	options.start_offline = (DBGetContactSettingByte(0, MODULE, "StartOffline", 0) == 1);
	options.popup_notify = (DBGetContactSettingByte(0, MODULE, "PopupNotify", 0) == 1);
	options.restart_menu_item = (DBGetContactSettingByte(0, MODULE, "RestartMenuItem", 0) == 1);
	options.update_and_exit_menu_item = (DBGetContactSettingByte(0, MODULE, "UpdateAndExitMenuItem", 0) == 1);
	options.save_zips = (DBGetContactSettingByte(0, MODULE, "SaveZips", 0) == 1);
	options.no_unzip = (DBGetContactSettingByte(0, MODULE, "NoUnzip", 0) == 1);

	options.set_colours = false; // = (DBGetContactSettingByte(0, MODULE, "PopupSetColours", 0) == 1); // popup colours - not implemented
	options.bkCol = DBGetContactSettingDword(0, MODULE, "PopupBkCol", 0);
	options.textCol = DBGetContactSettingDword(0, MODULE, "PopupTextCol", 0x00FFFFFF);

	options.ver_req = (VersionRequirement)DBGetContactSettingByte(0, MODULE, "VersionRequirement", VR_BUILD);
	options.auto_dll_only = (DBGetContactSettingByte(0, MODULE, "AutoDLLOnly", 0) == 1);

	if(ServiceExists(MS_FOLDERS_GET_PATH)) 
	{
		FOLDERSDATA fd = {0};
		fd.cbSize = sizeof(fd);

		fd.flags = FF_UNICODE;

		strcpy(fd.szSection, "Updates");

		strcpy(fd.szName, "Backups");
		fd.szFormatT = _T("%miranda_userdata%\\updater\\backups");
		hBackupPath = (HANDLE)CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM)&fd);

		strcpy(fd.szName, "Data");
		fd.szFormatT = _T("%miranda_userdata%\\updater\\data");
		hDataPath = (HANDLE)CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM)&fd);

		strcpy(fd.szName, "Saved Archives");
		fd.szFormatT = _T("%miranda_userdata%\\updater\\archives");
		hArchivePath = (HANDLE)CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM)&fd);

		HookEvent(ME_FOLDERS_PATH_CHANGED, FoldersPathChanged);
		FoldersPathChanged(0, 0);
	}
	else
	{
		TCHAR* mir_path = Utils_ReplaceVarsT(_T("%miranda_userdata%"));

		mir_sntprintf(options.backup_folder, SIZEOF(options.backup_folder), _T("%s\\Updater\\Backups"), mir_path);
		mir_sntprintf(options.data_folder, SIZEOF(options.data_folder), _T("%s\\Updater\\Data"), mir_path);
		mir_sntprintf(options.zip_folder, SIZEOF(options.zip_folder), _T("%s\\Updater\\Archives"), mir_path);
		mir_sntprintf(options.temp_folder, SIZEOF(options.temp_folder), _T("%s\\updates"), options.data_folder);

		mir_free(mir_path);
	}
}

void SaveOptions(void) 
{
	DBWriteContactSettingByte(0, MODULE, "CheckOnStartup", options.check_on_startup ? 1 : 0);
	DBWriteContactSettingByte(0, MODULE, "CheckOnce", options.check_once ? 1 : 0);
	DBWriteContactSettingByte(0, MODULE, "CheckDaily", options.check_daily ? 1 : 0);
	DBWriteContactSettingByte(0, MODULE, "NoConfIdle", options.no_conf_idle ? 1 : 0);
	DBWriteContactSettingByte(0, MODULE, "Backup", options.backup ? 1 : 0);
	DBWriteContactSettingByte(0, MODULE, "UseXML", options.use_xml_backend ? 1 : 0);
	DBWriteContactSettingByte(0, MODULE, "StartOffline", options.start_offline ? 1 : 0);
	DBWriteContactSettingByte(0, MODULE, "PopupNotify", options.popup_notify ? 1 : 0);
	DBWriteContactSettingByte(0, MODULE, "RestartMenuItem", options.restart_menu_item ? 1 : 0);
	DBWriteContactSettingByte(0, MODULE, "UpdateAndExitMenuItem", options.update_and_exit_menu_item ? 1 : 0);
	DBWriteContactSettingByte(0, MODULE, "VersionRequirement", (int)options.ver_req);
	DBWriteContactSettingByte(0, MODULE, "SaveZips", (int)options.save_zips);
	DBWriteContactSettingByte(0, MODULE, "NoUnzip", (int)options.no_unzip);
	DBWriteContactSettingByte(0, MODULE, "AutoDLLOnly", options.auto_dll_only ? 1 : 0);
}