/*

IEView Plugin for Miranda IM
Copyright (C) 2005  Piotr Piastucki

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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/

#ifndef M_IEVIEW_INCLUDED
#define M_IEVIEW_INCLUDED

#define MS_IEVIEW_WINDOW   "IEVIEW/NewWindow"
#define MS_IEVIEW_EVENT    "IEVIEW/Event"
#define MS_IEVIEW_NAVIGATE "IEVIEW/Navigate"

#define ME_IEVIEW_OPTIONSCHANGED  "IEVIEW/OptionsChanged"

/* IEView window commands */
#define IEW_CREATE  1               // create new window (control)
#define IEW_DESTROY 2               // destroy control
#define IEW_SETPOS  3               // set window position and size
#define IEW_SCROLLBOTTOM 4          // scroll text to bottom

/* IEView window type/mode */
#define IEWM_TABSRMM  1             // TabSRMM-compatible HTML builder
#define IEWM_SCRIVER  3             // Scriver-compatible HTML builder
#define IEWM_MUCC     4             // MUCC group chats GUI
#define IEWM_CHAT     5             // chat.dll group chats GUI
#define IEWM_HISTORY  6             // history viewer
#define IEWM_BROWSER  256           // empty browser window

typedef struct {
	int			cbSize;             // size of the strusture
	int			iType;				// one of IEW_* values
	DWORD		dwMode;				// compatibility mode - one of IEWM_* values
	DWORD		dwFlags;			// flags, one of IEWF_* values
	HWND		parent;             // parent window HWND
	HWND 		hwnd;               // IEW_CREATE returns WebBrowser control's HWND here
	int			x;                  // IE control horizontal position
	int			y;                  // IE control vertical position
	int			cx;                 // IE control horizontal size
	int			cy;                 // IE control vertical size

} IEVIEWWINDOW;

#define IEEDF_UNICODE 			0x00000001          // if set pszText is a pointer to wchar_t string instead of char string
#define IEEDF_UNICODE_TEXT		0x00000001          // if set pszText is a pointer to wchar_t string instead of char string
#define IEEDF_UNICODE_NICK		0x00000002          // if set pszNick is a pointer to wchar_t string instead of char string
#define IEEDF_UNICODE_TEXT2		0x00000004          // if set pszText2 is a pointer to wchar_t string instead of char string

/* The following flags are valid only for message events (IEED_EVENT_MESSAGE) */
#define IEEDF_FORMAT_FONT		0x00000100 // if set pszFont (font name) is valid and should be used
#define IEEDF_FORMAT_SIZE		0x00000200 // if set fontSize is valid and should be used
#define IEEDF_FORMAT_COLOR		0x00000400 // if set color is valid and should be used
#define IEEDF_FORMAT_STYLE		0x00000800 // if set fontSize is valid and should be used

#define IEEDF_READ				0x00001000 // if set
#define IEEDF_SENT				0x00002000 // if set
#define IEEDF_RTL				0x00004000 // if set

#define IEED_EVENT_MESSAGE			0x0001 // message
#define IEED_EVENT_STATUSCHANGE		0x0002 // status change
#define IEED_EVENT_FILE				0x0003 // file
#define IEED_EVENT_URL				0x0004 // url
#define IEED_EVENT_ERRMSG           0x0005 // error message
#define IEED_EVENT_SYSTEM           0x0006 // system event

#define IEED_MUCC_EVENT_MESSAGE		0x0001 // message
#define IEED_MUCC_EVENT_TOPIC		0x0002 // topic change
#define IEED_MUCC_EVENT_JOINED		0x0003 // user joined
#define IEED_MUCC_EVENT_LEFT		0x0004 // user left
#define IEED_MUCC_EVENT_ERROR		0x0005 // error

/* MUCC-related dwData bit flags */
#define IEEDD_MUCC_SHOW_NICK		0x00000001
#define IEEDD_MUCC_MSG_ON_NEW_LINE	0x00000002
#define IEEDD_MUCC_SHOW_DATE		0x00000010
#define IEEDD_MUCC_SHOW_TIME		0x00000020
#define IEEDD_MUCC_SECONDS			0x00000040
#define IEEDD_MUCC_LONG_DATE		0x00000080

#define IEED_GC_EVENT_HIGHLIGHT 	0x8000
#define IEED_GC_EVENT_MESSAGE   	0x0001
#define IEED_GC_EVENT_TOPIC     	0x0002
#define IEED_GC_EVENT_JOIN      	0x0003
#define IEED_GC_EVENT_PART      	0x0004
#define IEED_GC_EVENT_QUIT      	0x0006
#define IEED_GC_EVENT_NICK      	0x0007
#define IEED_GC_EVENT_ACTION    	0x0008
#define IEED_GC_EVENT_KICK      	0x0009
#define IEED_GC_EVENT_NOTICE    	0x000A
#define IEED_GC_EVENT_INFORMATION   0x000B
#define IEED_GC_EVENT_ADDSTATUS     0x000C
#define IEED_GC_EVENT_REMOVESTATUS  0x000D

/* GC-related dwData bit flags */
#define IEEDD_GC_SHOW_NICK			0x00000001
#define IEEDD_GC_SHOW_TIME			0x00000002
#define IEEDD_GC_SHOW_ICON			0x00000004
#define IEEDD_GC_MSG_ON_NEW_LINE	0x00001000

#define IE_FONT_BOLD			0x000100	// Bold font flag
#define IE_FONT_ITALIC			0x000200	// Italic font flag
#define IE_FONT_UNDERLINE		0x000400	// Underlined font flags

typedef struct tagIEVIEWEVENTDATA {
	int			cbSize;
	int			iType;				// Event type, one of MUCC_EVENT_* values
	DWORD		dwFlags;			// Event flags - IEEF_*
	const char *fontName;			// Text font name
	int			fontSize;			// Text font size (in pixels)
	int         fontStyle;          // Text font style (combination of IE_FONT_* flags)
	COLORREF	color;				// Text color
	union {
		const TCHAR *ptszNick;		// Nick, usage depends on type of event
		const char *pszNick;		// Nick - ANSII
		const wchar_t *pszNickW;    // Nick - Unicode
	};
	union {
		const TCHAR *ptszText;		// Text, usage depends on type of event
		const char *pszText;		// Text - ANSII
		const wchar_t *pszTextW;	// Text - Unicode
	};
	DWORD		dwData;				// DWORD data e.g. status see IEEDD_* values
	BOOL		bIsMe;				// TRUE if the event is related to the user
	DWORD		time;				// Time of the event
	struct tagIEVIEWEVENTDATA *next;
	union {
		const TCHAR *ptszText2;			// Text2, usage depends on type of event
		const char *pszText2;			// Text2 - ANSII
		const wchar_t *pszText2W;		// Text2 - Unicode
	};
} IEVIEWEVENTDATA;

/* IEView events */
#define IEE_LOG_DB_EVENTS  	1       // log specified number of DB events
#define IEE_CLEAR_LOG		2       // clear log
#define IEE_GET_SELECTION	3       // get selected text
#define IEE_SAVE_DOCUMENT	4       // save current document
#define IEE_LOG_MEM_EVENTS 	5       // log specified number of IEView events

/* IEView event flags */
#define IEEF_RTL          1           // turn on RTL support
#define IEEF_NO_UNICODE   2           // disable Unicode support - valid for IEE_LOG_DB_EVENTS and IEE_GET_SELECTION events

#define IEVIEWEVENT_SIZE_V1 28
#define IEVIEWEVENT_SIZE_V2 32
#define IEVIEWEVENT_SIZE_V3 36

typedef struct {
	int cbSize;           // size of the strusture
	int iType;				 // one of IEE_* values
	DWORD dwFlags;			 // one of IEEF_* values
	HWND hwnd;            // HWND returned by IEW_CREATE
	MCONTACT hContact;    // contact
	union {
		MEVENT hDbEventFirst;   // first event to log, when IEE_LOG_EVENTS returns it will contain
										// the last event actually logged or NULL if no event was logged (IEE_LOG_EVENTS)
		IEVIEWEVENTDATA *eventData;	// the pointer to an array of IEVIEWEVENTDATA objects (IEE_LOG_IEV_EVENTS)
	};
	int count;            // number of events to log
	int codepage;         // ANSI codepage
	const char *pszProto; // Name of the protocol
} IEVIEWEVENT;

#define IEN_NAVIGATE 	1       // navigate to the given destination
#define IENF_UNICODE	1       // if set urlW is used instead of urlW

typedef struct {
	int			cbSize;             // size of the strusture
	int			iType;				// one of IEN_* values
	DWORD		dwFlags;			// one of IEEF_* values
	HWND		hwnd;               // HWND returned by IEW_CREATE
	union {
		const char *url;			// Text, usage depends on type of event
		const wchar_t *urlW;		// Text - Unicode
	};
} IEVIEWNAVIGATE;

#endif