#include "commonheaders.h"

INT_PTR exportContacts(WPARAM wParam,LPARAM lParam) 
{
	char fn[MAX_PATH];
	if (!Openfile(fn, 0))
		return 0;

	FILE* file;
	if (MessageBox(0, TranslateT("Do you want to overwrite the contents of the file?\r\n\r\nPressing No will append these contacts to the end of the file."),_T(modFullname), MB_YESNO) == IDYES)
		file = fopen(fn, "w");
	else
		file = fopen(fn, "a");
	if (!file)
		return 0;

	for (HANDLE hContact = db_find_first(MODNAME); hContact; hContact = db_find_next(hContact, MODNAME)) {
		int tmp;
		char DBVar[1024];
		if (db_get_static(hContact, MODNAME, "Name", DBVar)) {
			fprintf(file, "\r\n[Non-IM Contact]\r\nName=%s\r\n", DBVar);
			if (db_get_static(hContact, MODNAME, "ProgramString", DBVar))
				fprintf(file, "ProgramString=%s\r\n", DBVar);
			if (db_get_static(hContact, MODNAME, "ProgramParamString", DBVar))
				fprintf(file, "ProgramParamString=%s\r\n", DBVar);
			if (db_get_static(hContact, MODNAME, "ToolTip", DBVar))
				fprintf(file, "ToolTip=%s</tooltip>\r\n", DBVar);
			if (db_get_static(hContact, "CList", "Group", DBVar))
				fprintf(file, "Group=%s\r\n", DBVar);
			if (tmp = db_get_w(hContact, MODNAME, "Icon", 40072))
				fprintf(file, "Icon=%d\r\n", tmp);
			if (tmp = db_get_b(hContact, MODNAME, "UseTimer", 0))
				fprintf(file, "UseTimer=%d\r\n", tmp);
			if (tmp = db_get_b(hContact, MODNAME, "Minutes", 1))
				fprintf(file, "Minutes=%d\r\n", tmp);
			if (tmp = db_get_w(hContact, MODNAME, "Timer", 0))
				fprintf(file, "Timer=%d\r\n", tmp);
			fprintf(file, "[/Non-IM Contact]\r\n");
		}
	}
	fclose(file);
	return 0;
}

int Openfile(char *outputFile, int saveOpen) //0=save, 1=open
{
	char filename[MAX_PATH] = "";
	char *filter = "All Files\0*.*\0";
	int r;
	char title[16];
	if (saveOpen)
		strcpy(title, "Open file");
	else strcpy(title, "Save to file");

	OPENFILENAMEA ofn = { sizeof(ofn) };
	ofn.lpstrFile = filename;
	ofn.lpstrFilter = filter;
	ofn.Flags = saveOpen? OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_SHAREAWARE | OFN_PATHMUSTEXIST: OFN_HIDEREADONLY | OFN_SHAREAWARE | OFN_PATHMUSTEXIST; 
	ofn.lpstrTitle = title;
	ofn.nMaxFile = MAX_PATH;

	if (saveOpen)
		r = GetOpenFileNameA(&ofn);
	else
		r = GetSaveFileNameA(&ofn);
	if (!r)
		return 0;
	lstrcpyA(outputFile,filename);
	return 1;
}


void reloadFiles(HWND fileList)
{
	int i, index;
	char file[MAX_PATH], fn[6];
	SendMessage(fileList,CB_RESETCONTENT, 0,0);
	for (i=0; ;i++)
	{
		mir_snprintf(fn, SIZEOF(fn), "fn%d", i);
		if (db_get_static(NULL, MODNAME, fn, file)) {
			index = SendMessageA(fileList, CB_ADDSTRING,0, (LPARAM)(char*)file);
			SendMessage(fileList, CB_SETITEMDATA, index,  (LPARAM)(int)i);
			SendMessage(fileList, CB_SETCURSEL, index,0);
			SetDlgItemTextA(GetParent(fileList), IDC_FN, _itoa(i, fn, 10));
			/* add the file contents to the edit box */
		}
		else break;
	}
}

int savehtml(char* outFile)
{
	FILE* file = fopen(outFile, "w");
	if (!file) 
	{
		fclose(file);		
		return 0;
	}
	fprintf(file, "%s", szInfo);
	fclose(file);
	return 1;
}

void readFile(HWND hwnd)
{
	int lineNumber, fileLength=0, width=0;
	char temp[MAX_STRING_LENGTH], szFileName[512], temp1[MAX_STRING_LENGTH], fn[8];
	FILE* filen;
	int fileNumber = SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_GETCURSEL, 0,0);
	mir_snprintf(fn, SIZEOF(fn), "fn%d", fileNumber);
	if (!db_get_static(NULL, MODNAME, fn, szFileName)) {
		msg(Translate("File couldn't be opened"),fn);
		return;
	}

	if ( (!strncmp("http://", szFileName, strlen("http://"))) || (!strncmp("https://", szFileName, strlen("https://"))) )
		mir_snprintf(szFileName, SIZEOF(szFileName), "%s\\plugins\\fn%d.html", getMimDir(temp), fileNumber);

	filen = fopen(szFileName,"r");
	if (!filen) {
		MessageBoxA(0, Translate("File couldn't be opened,2"), modFullname,MB_OK);
		return;
	}
	lineNumber = 0;
	SendDlgItemMessage(hwnd, IDC_FILE_CONTENTS,LB_RESETCONTENT, 0,0);
	while (lineNumber < (MAXLINES) && (fgets(temp, MAX_STRING_LENGTH, filen)))
	{
		if (temp[0] == '\t') temp[0] = ' ';
		if (temp[strlen(temp)-1]=='\n' && temp[strlen(temp)-2]=='\r') 
			temp[strlen(temp)-2]='\0';
		else if (temp[strlen(temp)-1]=='\n') 
			temp[strlen(temp)-1]='\0';
        else temp[strlen(temp)]='\0';
		mir_snprintf(temp1, SIZEOF(temp1), Translate("line(%-3d) = | %s"), lineNumber, temp);
		SendDlgItemMessageA(hwnd, IDC_FILE_CONTENTS,LB_ADDSTRING,0,(LPARAM)temp1);
		lineNumber++;
		fileLength++;
		if ((unsigned int)SendDlgItemMessage(hwnd, IDC_FILE_CONTENTS,LB_GETHORIZONTALEXTENT,0,0) <= (strlen(temp1)*db_get_b(NULL, MODNAME, "WidthMultiplier", 5)))
			SendDlgItemMessage(hwnd, IDC_FILE_CONTENTS,LB_SETHORIZONTALEXTENT,(strlen(temp1)*db_get_b(NULL, MODNAME, "WidthMultiplier", 5)),0);
	}
	fclose(filen);
	
	return ;
}

#define WM_RELOADWINDOW (WM_USER+11)

INT_PTR CALLBACK DlgProcFiles(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg) {
	case WM_RELOADWINDOW:
		{
			char fn[MAX_PATH], string[MAX_STRING_LENGTH], tmp[MAX_STRING_LENGTH];
			reloadFiles(GetDlgItem(hwnd, IDC_FILE_LIST));
			int i = SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_GETCURSEL, 0 ,0);
			mir_snprintf(fn, SIZEOF(fn), "fn%d", i);
			SendDlgItemMessage(hwnd, IDC_FILE_CONTENTS,LB_RESETCONTENT, 0,0);
			if (db_get_static(NULL, MODNAME, fn, string) )
			{
				if ( (!strncmp("http://", string, strlen("http://"))) || (!strncmp("https://", string, strlen("https://"))) )
				{
					SetDlgItemTextA(hwnd,IDC_URL, string);
					SetDlgItemTextA(hwnd, IDC_WWW_TIMER, _itoa(db_get_w(NULL, MODNAME, strcat(fn, "_timer"), 60), tmp, 10));
				}
				readFile(hwnd);
			}
		}
		break;

	case WM_INITDIALOG:
		{
			SendMessage(hwnd, WM_RELOADWINDOW, 0,0);
			TranslateDialogDefault(hwnd);
		}
		return TRUE;
	case WM_COMMAND:
		SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0);
		switch(LOWORD(wParam)) {
		case IDC_ADD_URL:
			{
				if (GetWindowTextLength(GetDlgItem(hwnd,IDC_URL))) 
				{
					char text[512], url[512], fn[10] = "fn0", szFileName[MAX_PATH], temp[512];
					int i, timer;
					GetDlgItemTextA(hwnd,IDC_URL,text,sizeof(text));
					strcpy(url, text);
					if (!InternetDownloadFile(text))
					{
						for (i=0; ;i++)
						{
							mir_snprintf(fn, SIZEOF(fn), "fn%d", i);
							if (!db_get_static(NULL, MODNAME, fn, text))
								break;
						}
						mir_snprintf(szFileName, SIZEOF(szFileName), "%s\\plugins\\%s.html", getMimDir(temp), fn);
						if (savehtml(szFileName))
						{
							mir_snprintf(fn, SIZEOF(fn), "fn%d", i);
							db_set_s(NULL, MODNAME, fn, url);
							if (!GetWindowTextLength(GetDlgItem(hwnd,IDC_WWW_TIMER))) 
								timer = 60;
							else
							{
								GetDlgItemTextA(hwnd,IDC_WWW_TIMER,text,sizeof(text));
								timer = atoi(text);
							}
							db_set_w(NULL, MODNAME, strcat(fn, "_timer"), (WORD)timer);
							SendMessage(hwnd, WM_RELOADWINDOW, 0,0);
						}
					}
				}
			}
			break;
		case IDC_WWW_TIMER:
			if (HIWORD(wParam) == EN_CHANGE)
				SendMessage(GetParent(hwnd),PSM_CHANGED,0,0);
			break;
		case IDC_ADD_FILE:
			{
				int i, index;
				char file[MAX_PATH], fn[6];
				for (i=0; ;i++)
				{
					mir_snprintf(fn, SIZEOF(fn), "fn%d", i);
					if (!db_get_static(NULL, MODNAME, fn, file))
						break;
				}
				if (Openfile(file,1))
				{
					db_set_s(NULL, MODNAME, fn, file);
					index = SendMessageA(GetDlgItem(hwnd, IDC_FILE_LIST),CB_ADDSTRING,0,(LPARAM)(char*)file);
					SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_SETITEMDATA,index,(LPARAM)(int)i);
					SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_SETCURSEL, index ,0);
					SetDlgItemTextA(hwnd, IDC_FN, _itoa(i, fn, 10));
					mir_snprintf(fn, SIZEOF(fn), "fn%d", index);
					readFile(hwnd);
				}

			}
			break;
		case IDC_DEL_FILE:
			{
				int index = SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_GETCURSEL, 0,0),i= (int)SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_GETITEMDATA, index,0);
				char fn[6], fn1[4], tmp[256];
				int count = SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_GETCOUNT, 0,0) -1;
				if (index == count)
				{
					mir_snprintf(fn, SIZEOF(fn), "fn%d", index);
					db_unset(NULL, MODNAME, fn);
					SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_DELETESTRING, index ,0);
					SendMessage(hwnd, WM_RELOADWINDOW, 0,0);
					if (!index) {
						SetDlgItemText(hwnd, IDC_FN,_T(""));
						SetDlgItemText(hwnd, IDC_FILE_CONTENTS,_T(""));
					}

				}
				else
				{
					mir_snprintf(fn, SIZEOF(fn), "fn%d", i);
					while (db_get_static(NULL, MODNAME, fn,tmp))
					{
						mir_snprintf(fn1, SIZEOF(fn1), "fn%d", i-1);
						db_set_s(NULL, MODNAME, fn1 , tmp);
						mir_snprintf(fn, SIZEOF(fn), "fn%d", ++i);
					}
					mir_snprintf(fn, SIZEOF(fn), "fn%d", --i);
					db_unset(NULL, MODNAME, fn);
					SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_DELETESTRING, index ,0);
					SendMessage(hwnd, WM_RELOADWINDOW, 0,0);
				}

			}
			break;


		case IDC_FILE_LIST:
			if (HIWORD(wParam) == CBN_SELCHANGE )
			{
				int index = SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_GETCURSEL, 0,0);
				char fn[6], tmp[MAX_PATH];
				SetDlgItemTextA(hwnd, IDC_FN, _itoa(index, fn, 10));
				mir_snprintf(fn, SIZEOF(fn), "fn%d", index);
				if (db_get_static(NULL, MODNAME, fn, tmp) )
				{
					if (!strncmp("http://", tmp, strlen("http://")) || !strncmp("https://", tmp, strlen("https://")))
					{
						SetDlgItemTextA(hwnd,IDC_URL, tmp);
						SetDlgItemTextA(hwnd, IDC_WWW_TIMER, _itoa(db_get_w(NULL, MODNAME, strcat(fn, "_timer"), 60), tmp, 10));
					}
					else 
					{
						SetDlgItemText(hwnd,IDC_URL, _T(""));
						SetDlgItemText(hwnd, IDC_WWW_TIMER,_T(""));
					}
					readFile(hwnd);
				}
			}
			break;
		case IDCANCEL:
			DestroyWindow(hwnd);
			break;
			return TRUE;
		}
		break;
	case WM_NOTIFY:
		switch(((LPNMHDR)lParam)->idFrom) {
		case 0:
			switch (((LPNMHDR)lParam)->code) {
			case PSN_APPLY:
				int i = SendDlgItemMessage(hwnd, IDC_FILE_LIST,CB_GETCURSEL, 0 ,0);
				int timer;
				char fn[MAX_PATH], string[1000];
				mir_snprintf(fn, SIZEOF(fn), "fn%d", i);
				if (GetWindowTextLength(GetDlgItem(hwnd,IDC_WWW_TIMER))) {
					TCHAR text[5];
					GetDlgItemText(hwnd,IDC_WWW_TIMER,text,SIZEOF(text));
					timer = _ttoi(text);
				}
				else timer = 60;

				if (db_get_static(NULL, MODNAME, fn, string) )
					if (!strncmp("http://", string, strlen("http://")) || !strncmp("https://", string, strlen("https://")))
						db_set_w(NULL, MODNAME, strcat(fn, "_timer"), (WORD)timer);

				return TRUE;
			}
		}
		break;
	}
	return FALSE;
}

char* getMimDir(char* file)
{
	GetModuleFileNameA(NULL, file, MAX_PATH);

	char *p1 = strrchr(file,'\\');
	if (p1)
		*p1 = '\0';

	if (file[0] == '\\')
		file[strlen(file)-1] = '\0';

	return file;
}