//////////////////////////////////////////
// IDListProc.h
// Copyright (c) 09/29/2021 by BCCSkelton
//////////////////////////////////////////

/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//ウィンドウメッセージ関数
/////////////////////////////////
bool CMyWnd::OnCreate(WPARAM wParam, LPARAM lParam) {

	//コモンコントロールの初期化
	InitCommonControls();

	//ツールバー登録−Init(hWnd, hIinstance, ID, Style)
	TBar.Init(m_hWnd, m_hInstance, TOOLBAR, WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS);
	//ツールバーボタン用カスタムビットマップ追加
	TBar.AddBmp(m_hInstance, MAKEINTRESOURCE(IDI_TOOLBAR), 10);
	//ツールバーボタン追加
	TBBUTTON tbb[14];
	ZeroMemory(tbb, sizeof(tbb));
	tbb[0].iBitmap = TBar.m_id;
	tbb[0].fsState = TBSTATE_ENABLED;
	tbb[0].fsStyle = TBSTYLE_BUTTON;
	tbb[0].idCommand = IDM_OPEN;
	tbb[1].iBitmap = TBar.m_id + 1;
	tbb[1].fsState = TBSTATE_ENABLED;
	tbb[1].fsStyle = TBSTYLE_BUTTON;
	tbb[1].idCommand = IDM_SAVE;
	tbb[2].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[3].iBitmap = TBar.m_id + 2;
	tbb[3].fsState = TBSTATE_ENABLED;
	tbb[3].fsStyle = TBSTYLE_BUTTON;
	tbb[3].idCommand = IDM_EXIT;
	tbb[4].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[5].iBitmap = TBar.m_id + 3;
	tbb[5].fsState = TBSTATE_ENABLED;
	tbb[5].fsStyle = TBSTYLE_BUTTON;
	tbb[5].idCommand = IDM_ADD;
	tbb[6].iBitmap = TBar.m_id + 4;
	tbb[6].fsState = TBSTATE_ENABLED;
	tbb[6].fsStyle = TBSTYLE_BUTTON;
	tbb[6].idCommand = IDM_SEARCH;
	tbb[7].iBitmap = TBar.m_id + 5;
	tbb[7].fsState = TBSTATE_ENABLED;
	tbb[7].fsStyle = TBSTYLE_BUTTON;
	tbb[7].idCommand = IDM_EDIT;
	tbb[8].iBitmap = TBar.m_id + 6;
	tbb[8].fsState = TBSTATE_ENABLED;
	tbb[8].fsStyle = TBSTYLE_BUTTON;
	tbb[8].idCommand = IDM_DELETE;
	tbb[9].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[10].iBitmap = TBar.m_id + 7;
	tbb[10].fsState = TBSTATE_ENABLED;
	tbb[10].fsStyle = TBSTYLE_BUTTON;
	tbb[10].idCommand = IDM_SORT;
	tbb[11].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[12].iBitmap = TBar.m_id + 8;
	tbb[12].fsState = TBSTATE_ENABLED;
	tbb[12].fsStyle = TBSTYLE_BUTTON;
	tbb[12].idCommand = IDM_HELP;
	tbb[13].iBitmap = TBar.m_id + 9;
	tbb[13].fsState = TBSTATE_ENABLED;
	tbb[13].fsStyle = TBSTYLE_BUTTON;
	tbb[13].idCommand = IDM_VERSION;
	TBar.AddButtons(14, tbb);

	//ステータスバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	SBar.Init(m_hWnd, m_hInstance, STATUSBAR);
	//ステータスバー区画設定
	int sec[2] = {100, 400};
	SBar.SetSection(2, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "IDList Version 1.0");
	SBar.SetText(1, "選択メンバーシップ");

	//リストビューコントロールの作成
	//複数選択を許さない場合、スタイルにLVS_SINGLESELを加える
	g_ListView.Create(m_hWnd, m_hInstance, IDC_LISTVIEW);
	g_ListView.InsertColumn(0, 240, "メンバーシップ");
	g_ListView.InsertColumn(1, 160, "ログインID", LVCFMT_CENTER);
	g_ListView.InsertColumn(2, 160, "パスワード", LVCFMT_CENTER);
	g_ListView.InsertColumn(3, 240, "備考");

	//メニューハンドルの取得
	g_hPopup = GetSubMenu(GetMenu(m_hWnd), 1);

	//リストビューは項目未選択なので「編集」と「削除」を無効にする
	EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), IDM_EDIT, MF_GRAYED | MF_BYCOMMAND);
	EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), IDM_DELETE, MF_GRAYED | MF_BYCOMMAND);
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_EDIT, FALSE);
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_DELETE, FALSE);

	//CHMヘルプファイルの準備
	CARG arg;
	g_HelpFile = "hh \"";
	g_HelpFile = g_HelpFile + arg.Path();
	g_HelpFile = g_HelpFile + "\\IDListHelp.chm";

	//データファイルパス、名
	g_File = arg.Path();
	g_File = g_File + "\\IDList.dat";

	//起動時ファイル読込処理
	if(!DataLoad(m_hWnd, g_File.ToChar()))
		MessageBox(m_hWnd, "まだIDList.datがつくられていないか\n読み込み処理が中断されました。", "注意", MB_OK | MB_ICONWARNING);

	return TRUE;
}

bool CMyWnd::OnNotify(WPARAM wParam, LPARAM lParam) {

	if((int)wParam == IDC_LISTVIEW) {	//リストビューからのメッセージ
		int n = g_ListView.GetNextItem(-1, LVNI_ALL | LVIS_SELECTED);
		if(n == -1) {	//未選択なら
			//「編集」と「削除」を無効にする
			EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), IDM_EDIT, MF_GRAYED | MF_BYCOMMAND);
			EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), IDM_DELETE, MF_GRAYED | MF_BYCOMMAND);
			SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_EDIT, FALSE);
			SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_DELETE, FALSE);
		}
		else {
			//「編集」と「削除」を有効にする
			EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), IDM_EDIT, MF_UNCHECKED | MF_BYCOMMAND);
			EnableMenuItem(GetSubMenu(GetMenu(m_hWnd), 1), IDM_DELETE, MF_UNCHECKED | MF_BYCOMMAND);
			SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_EDIT, TRUE);
			SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_DELETE, TRUE);
			//選択メンバーシップステータスバーに表示
			char buff[MAX_PATH];
			g_ListView.GetItemText(n, 0, buff, MAX_PATH);
			SBar.SetText(1, buff);
		}
		//リストビューの通知メッセージによる処理
		switch(((LPNMLISTVIEW)lParam)->hdr.code) {
		case LVN_COLUMNCLICK:	//列見出しがクリックされたら
			if(sortsubno[((LPNMLISTVIEW)lParam)->iSubItem] == UP)
				sortsubno[((LPNMLISTVIEW)lParam)->iSubItem] = DOWN;
			else
				sortsubno[((NM_LISTVIEW*)lParam)->iSubItem] = UP;
			g_ListView.SortItem(CompProc, ((LPNMLISTVIEW)lParam)->iSubItem);
			break;
		case NM_DBLCLK:		//左ダブルクリックしたら
			if(g_ListView.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED) == -1)
				OnAdd();
			else
				OnEdit();
			break;
		case NM_RCLICK:		//右クリックしたら
			//ウインドウの位置情報を取得
			RECT rec;
			GetWindowRect(m_hWnd, &rec);
			//ポップアップメニューの表示場所を設定
			POINT pt;
			GetCursorPos(&pt);
			//ポップアップメニューの表示
			TrackPopupMenu(g_hPopup, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0, m_hWnd, &rec);
			break;
		}
		return TRUE;
	}
	//ツールバーツールチップ−因みにこの時のidCtrl(wParam)はメニューアイテムになる（例：IDM_OPEN）
	if(((LPNMHDR)lParam)->code == TTN_NEEDTEXT) {	//TTN_GETDISPINFOと同じ
		((LPTOOLTIPTEXT)lParam)->hinst = m_hInstance;
		char* tag;
		switch(((LPTOOLTIPTEXT)lParam)->hdr.idFrom) {
		case IDM_OPEN:
			tag = "データを開く";
			break;
		case IDM_SAVE:
			tag = "データの保存";
			break;
		case IDM_EXIT:
			tag = "終了";
			break;
		case IDM_ADD:
			tag = "追加";
			break;
		case IDM_SEARCH:
			tag = "検索";
			break;
		case IDM_EDIT:
			tag = "編集";
			break;
		case IDM_DELETE:
			tag = "削除";
			break;
		case IDM_SORT:
			tag = "並び替え";
			break;
		case IDM_HELP:
			tag = "本ソフトの使い方";
			break;
		case IDM_VERSION:
			tag = "バージョン情報";
			break;
		}
		((LPTOOLTIPTEXT)lParam)->lpszText = tag;
		return TRUE;
	}
	return FALSE;
}

bool CMyWnd::OnSize(WPARAM wParam, LPARAM lParam) {

	//ツールバー、ステータスバーをクライアント領域に合わせる
	TBar.AutoSize();
	SBar.AutoSize();
	//最後の「備考」幅を調整してg_ListViewをクライアント領域に合わせる
	RECT rec;
	GetClientRect(m_hWnd, &rec);
	g_ListView.m_x = rec.left;
	g_ListView.m_Width = rec.right - rec.left;
	g_ListView.m_Height = rec.bottom - rec.top;
	GetWindowRect(TBar.GetHandle(), &rec);
	g_ListView.m_y = rec.bottom - rec.top;
	g_ListView.m_Height -= g_ListView.m_y;
	GetWindowRect(SBar.GetHandle(), &rec);
	g_ListView.m_Height -= rec.bottom - rec.top;
	g_ListView.Move(g_ListView.m_x, g_ListView.m_y, g_ListView.m_Width, g_ListView.m_Height);
	g_ListView.SetColumn(3, LVCFMT_LEFT, g_ListView.m_Width - 560, "備考");
	return TRUE;
}

bool CMyWnd::OnClose(WPARAM wParam, LPARAM lParam) {

	if(MessageBox(m_hWnd, "終了しますか", "終了確認",
					MB_YESNO | MB_ICONINFORMATION) == IDYES) {
		//処理をするとDestroyWindow、PostQuitMessageが呼ばれる
		//終了時ファイル書込処理
		DataSave(m_hWnd, g_File.ToChar());
		//データファイル属性を隠しファイルとする
		DWORD attrib = GetFileAttributes(g_File.ToChar());	//属性を取得
		attrib |= FILE_ATTRIBUTE_HIDDEN;	//隠しファイル属性を追加
		SetFileAttributes(g_File.ToChar(), attrib);
		return TRUE;
	}
	else
		//そうでなければウィンドウではDefWindowProc関数をreturn、ダイアログではreturn FALSEとなる。
		return FALSE;
}

/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//メニュー項目、コントロール関数
/////////////////////////////////
bool CMyWnd::OnOpen() {

	//データファイルの読み込み
	char* cp = cmndlg.GetFileName(m_hWnd, "datファイル(*.dat)\0*.dat\0全てのファイル(*.*)\0*.*\0\0", TRUE, "dat", ".");
	if(cp) {
		bool cyph = (MessageBox(m_hWnd, "復号化しますか？", "復号化", MB_YESNO | MB_ICONQUESTION) == IDYES);
		DataLoad(m_hWnd, cp, cyph);
	}
	else {
		MessageBox(m_hWnd, "ファイルが選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	return TRUE;
}

bool CMyWnd::OnSave() {

	//ファイルの保存場所を指定する
	char* cp = cmndlg.GetFileName(m_hWnd, "datファイル(*.dat)\0*.dat\00",
						FALSE, "dat", ".");
	if(cp) {
		//ファイルの書き込み
		bool cyph = (MessageBox(m_hWnd, "暗号化しますか？", "暗号化", MB_YESNO | MB_ICONQUESTION) == IDYES);
		DataSave(m_hWnd, cp, cyph);
		return TRUE;
	}
	else {	
		MessageBox(m_hWnd, "キャンセルされました", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
}

bool CMyWnd::OnExit() {

	SendMsg(WM_CLOSE, 0, 0);
	return TRUE;
}

bool CMyWnd::OnAdd() {

	//追加の場合は、データ受け渡し用のg_Data（CSTR）を空（NULL）にする
	g_Data = "";
	//編集用ダイアログを追加用ダイアログとして使う
	if(!editdlg.DoModal(m_hWnd, "IDD_EDIT", editdlgProc) ||
		!*g_Data.ToChar())				//キャンセルされた場合、または
		return FALSE;					//データが空の場合
	int n = g_ListView.GetItemCount();	//リストの最後尾を確認
	//CSTR g_Dataのカンマ区切り文字列をEdit1〜4までに格納
	char *cp = GetDelimtStr(g_Data.ToChar());
	g_ListView.InsertItem(n, cp, -1, n);	//LVIF_PARAMをソートの為に追加
	SBar.SetText(1, cp);				//ステータスバーにメンバーシップ表示
	cp = GetDelimtStr(g_Data.ToChar());
	g_ListView.SetItem(n, 1, cp);
	cp = GetDelimtStr(g_Data.ToChar());
	g_ListView.SetItem(n, 2, cp);
	cp = GetDelimtStr(g_Data.ToChar());
	g_ListView.SetItem(n, 3, cp);
	return TRUE;
}

bool CMyWnd::OnSearch() {

	static CSTR ToFind;					//検索文字列保存用変数
	static int found = 0;				//初期値は最初から
	char buff[MAX_PATH];				//リストボックス文字列取得用バッファ
	int n = g_ListView.GetItemCount();	//リストボックスの行数確認
	//検索文字列取得ダイアログ
	SBar.SetText(1, "検索する項目に含まれる文字列を入力してください");
	searchdlg.DoModal(m_hWnd, "IDD_SEARCH", searchdlgProc);
	//前回の検索と同じ検索文字列であれば検索を継続
	if(g_Data != ToFind) {	//異なれば
		ToFind = g_Data;		//検索文字列を更新し
		found = 0;			//最初から検索する
		g_ListView.SetItemState(-1, 0, LVIS_SELECTED);	//全行の選択状態の解除
	}
	for(int i = found; i < n; i++) {		//行
		for(int j = 0; j < 4; j++) {		//列
			g_ListView.GetItemText(i, j, buff, MAX_PATH);	//文字列取得
			if(strstr(buff, ToFind.ToChar())) {			//検索文字列が含まれれば
				found = i + 1;				//次の検索のために、見つかった行の次を指す
				SetFocus(g_ListView.m_hWnd);	//g_ListViewにフォーカスがないと選択状態が表示されない
				g_ListView.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);	//選択状態にする
				return TRUE;
			}
		}
	}
	MessageBox(m_hWnd, "検索文字は見当たりませんでした", "検索結果", MB_OK | MB_ICONINFORMATION);
	g_ListView.SetItemState(-1, 0, LVIS_SELECTED);	//全行の選択状態の解除
	return TRUE;
}

bool CMyWnd::OnEdit() {

	int n = g_ListView.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
	if (n == -1) {
		MessageBox(m_hWnd, "項目が選択されていません", "警告", MB_OK);
		return FALSE;
	}
	//CSTR g_Dataに4列の項目データをカンマ区切りで格納
	char buff[MAX_PATH];
	g_ListView.GetItemText(n, 0, buff, MAX_PATH);
	g_Data = buff;
	g_Data = g_Data + ",";
	g_ListView.GetItemText(n, 1, buff, MAX_PATH);
	g_Data = g_Data + buff;
	g_Data = g_Data + ",";
	g_ListView.GetItemText(n, 2, buff, MAX_PATH);
	g_Data = g_Data + buff;
	g_Data = g_Data + ",";
	g_ListView.GetItemText(n, 3, buff, MAX_PATH);
	g_Data = g_Data + "\"";	//最終項目は
	g_Data = g_Data + buff;	//文字列中に'\n'があるので
	g_Data = g_Data + "\"";	//「""」で囲う
	//編集用ダイアログを呼び出す
	if(!editdlg.DoModal(m_hWnd, "IDD_EDIT", editdlgProc))
		return FALSE;;
	//CSTR g_Dataに格納されたカンマ区切りデータを4列の項目に格納
	char *cp = GetDelimtStr(g_Data.ToChar());
	g_ListView.SetItemText(n, 0, cp);
	SBar.SetText(1, cp);
	cp = GetDelimtStr(g_Data.ToChar());
	g_ListView.SetItemText(n, 1, cp);
	cp = GetDelimtStr(g_Data.ToChar());
	g_ListView.SetItemText(n, 2, cp);
	cp = GetDelimtStr(g_Data.ToChar());
	g_ListView.SetItemText(n, 3, cp);
	return TRUE;
}

bool CMyWnd::OnDelete() {

	//複数選択に対応
	int n = g_ListView.GetNextItem(-1, LVNI_ALL | LVIS_SELECTED);
	while(n != -1) {
		g_ListView.DeleteItem(n); 
		n = g_ListView.GetNextItem(n - 1, LVNI_ALL | LVIS_SELECTED);
	}
	SBar.SetText(1, "選択メンバーシップ");	//ステータスバー表示変更

	return TRUE;
}

bool CMyWnd::OnSort() {

	sortdlg.DoModal(m_hWnd, "IDD_SORT", sortdlgProc);
	return TRUE;
}

bool CMyWnd::OnHelp() {

	WinExec(g_HelpFile.ToChar(), SW_SHOWNORMAL);	//g_HelpFileがコマンドライン
	return TRUE;
}

bool CMyWnd::OnVersion() {

	versiondlg.DoModal(m_hWnd, "IDD_VERSION", versiondlgProc);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool EDITDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	if(!*g_Data.ToChar()) {
		SendMsg(WM_SETTEXT, 0, (LPARAM)"IDとパスワードの追加");
		SendItemMsg(IDOK, WM_SETTEXT, 0, (LPARAM)"登録終了");
		return TRUE;
	}
	//GetDelimitStrはソースを短縮してしまうのでg_Dataは保護する
	CSTR Data = g_Data;
	//CSTR g_Dataのカンマ区切り文字列をEdit1〜4までに格納
	char *cp = GetDelimtStr(Data.ToChar());
	SendItemMsg(IDC_EDIT1, WM_SETTEXT, NULL, (LPARAM)cp); 
	cp = GetDelimtStr(Data.ToChar());
	SendItemMsg(IDC_EDIT2, WM_SETTEXT, NULL, (LPARAM)cp); 
	cp = GetDelimtStr(Data.ToChar());
	SendItemMsg(IDC_EDIT3, WM_SETTEXT, NULL, (LPARAM)cp); 
	cp = GetDelimtStr(Data.ToChar());
	SendItemMsg(IDC_EDIT4, WM_SETTEXT, NULL, (LPARAM)cp); 
	return TRUE;
}

bool EDITDLG::OnIdok() {

	//CSTR g_Dataにカンマ区切りでEdit1〜4までの文字列を格納
	char buff[MAX_PATH];
	SendItemMsg(IDC_EDIT1, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)buff); 
	g_Data = buff;
	g_Data = g_Data + ",";
	SendItemMsg(IDC_EDIT2, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)buff); 
	g_Data = g_Data + buff;
	g_Data = g_Data + ",";
	SendItemMsg(IDC_EDIT3, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)buff); 
	g_Data = g_Data + buff;
	g_Data = g_Data + ",";
	SendItemMsg(IDC_EDIT4, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)buff); 
	g_Data = g_Data + "\"";	//最終項目は
	g_Data = g_Data + buff;	//文字列中に'\n'があるので
	g_Data = g_Data + "\"";	//「""」で囲う
	EndModal(TRUE);
	return TRUE;
}

bool EDITDLG::OnIdcancel() {

	EndModal(FALSE);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool SEARCHDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	SendItemMsg(IDC_EDIT1, WM_SETTEXT, 0, (LPARAM)m_ToFind);
	return TRUE;
}

bool SEARCHDLG::OnIdok() {

	SendItemMsg(IDC_EDIT1, WM_GETTEXT, MAX_PATH, (LPARAM)m_ToFind);
	g_Data = m_ToFind;
	EndModal(TRUE);
	return TRUE;
}

bool SEARCHDLG::OnIdcancel() {

	EndModal(FALSE);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool SORTDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	//コンボボックスに文字列を登録
	SendItemMsg(IDC_COMBOBOX1, CB_ADDSTRING, 0, (LPARAM)"メンバーシップ");
	SendItemMsg(IDC_COMBOBOX1, CB_ADDSTRING, 0, (LPARAM)"ログインID");
	SendItemMsg(IDC_COMBOBOX1, CB_ADDSTRING, 0, (LPARAM)"パスワード");
	SendItemMsg(IDC_COMBOBOX1, CB_ADDSTRING, 0, (LPARAM)"備考");
	SendItemMsg(IDC_COMBOBOX1, CB_SETCURSEL, 0, 0);	//一番目を選択状態にする
	SendItemMsg(IDC_COMBOBOX2, CB_ADDSTRING, 0, (LPARAM)"昇順");
	SendItemMsg(IDC_COMBOBOX2, CB_ADDSTRING, 0, (LPARAM)"降順");
	SendItemMsg(IDC_COMBOBOX2, CB_SETCURSEL, 0, 0);	//一番目を選択状態にする
	return TRUE;
}

bool SORTDLG::OnIdok() {

	//選択番号の取得
	int col = SendItemMsg(IDC_COMBOBOX1, CB_GETCURSEL, 0, 0);
	int dir = SendItemMsg(IDC_COMBOBOX2, CB_GETCURSEL, 0, 0);
	//ソート対象項目に昇順、降順のデータを書込む
	sortsubno[col] = dir;
	//ソート処理
	g_ListView.SortItem(CompProc, col);
	EndModal(TRUE);
	return TRUE;
}

bool SORTDLG::OnIdcancel() {

	EndModal(FALSE);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool VERSIONDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	//スタティックコントロールに文字列を表示
	SendItemMsg(IDC_VERTXT, WM_SETTEXT,
					0, (LPARAM)"IDList\nVersion 1.0 by YSAMA");
	return TRUE;
}

bool VERSIONDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}
