#ifndef NULLSOFT_WINAMP_OMBROWSER_TOOLBAR_HEADER
#define NULLSOFT_WINAMP_OMBROWSER_TOOLBAR_HEADER

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

#include <wtypes.h>

// registered classes

#define TOOLCLS_STATIC				"static"
#define TOOLCLS_BUTTON				"button"
#define TOOLCLS_RATING				"rating"
#define TOOLCLS_PROGRESS			"progress"
#define TOOLCLS_ADDRESSBAR			"addressbar"

#define TOOLITEM_SEPARATOR			"separator"
#define TOOLITEM_SPACE				"space"
#define TOOLITEM_FLEXSPACE			"spaceFlexible"
#define TOOLITEM_CHEVRON			"chevron"

#define TOOLITEM_BUTTON_HOME			(TOOLCLS_BUTTON "Home")
#define TOOLITEM_BUTTON_BACK			(TOOLCLS_BUTTON "Back")
#define TOOLITEM_BUTTON_FORWARD			(TOOLCLS_BUTTON "Forward")
#define TOOLITEM_BUTTON_STOP			(TOOLCLS_BUTTON "Stop")
#define TOOLITEM_BUTTON_REFRESH			(TOOLCLS_BUTTON "Refresh")
#define TOOLITEM_BUTTON_HISTORY			(TOOLCLS_BUTTON "History")
#define TOOLITEM_CMDLINK_INFO			(TOOLCLS_BUTTON "Info")
#define TOOLITEM_CMDLINK_REPORT			(TOOLCLS_BUTTON "Report")
#define TOOLITEM_CMDLINK_UNSUBSCRIBE	(TOOLCLS_BUTTON "Unsubscribe")

#define TOOLITEM_USERRATING				(TOOLCLS_RATING "User")
#define TOOLITEM_DOWNLOADPROGRESS		(TOOLCLS_PROGRESS "Download")
#define TOOLITEM_ADDRESSBAR				(TOOLCLS_ADDRESSBAR "Main")

#define TOOLITEM_BUTTON_SCRIPTERROR			(TOOLCLS_BUTTON "ScriptError")
#define TOOLITEM_BUTTON_SECURECONNECTION	(TOOLCLS_BUTTON "SecureConnection")

#define NWC_ONLINEMEDIATOOLBAR		L"Nullsoft_omBrowserToolbar"


BOOL Toolbar_RegisterClass(HINSTANCE hInstance);

#define ITEM_ERR			((INT)-1)

// styles
#define TBS_LOCKUPDATE			0x00000001 // do not reset directly use Toolbar_LockUpdate().
#define TBS_AUTOHIDE			0x00000002
#define TBS_BOTTOMDOCK			0x00000004
#define TBS_TABSTOP				0x00000008
#define TBS_SHOWADDRESS			0x00000010
#define TBS_FORCEADDRESS		0x00000020
#define TBS_FANCYADDRESS		0x00000040

// item styles
#define TBIS_HIDDEN			0x0001
#define TBIS_DISABLED		0x0002
#define TBIS_CHEVRONONLY		0x0004	// show item only in chevron
#define TBIS_NOCHEVRON		0x0008	// show item in toolbar and ignore in chevron
#define TBIS_POPUP			0x0010	// item only take space when visible


// messages
#define TBM_FIRST			(WM_USER + 10)

#define TBM_UPDATESKIN			(TBM_FIRST + 0) //wParam = not used, lParam = (LPARAM)(BOOL)fRedraw.
#define Toolbar_UpdateSkin(/*HWND*/ __hToolbar, /*BOOL*/ __fRedraw)\
	(SENDMSG(__hToolbar, TBM_UPDATESKIN, 0, (LPARAM)(__fRedraw)))

#define TBM_GETIDEALHEIGHT	(TBM_FIRST + 1)
#define Toolbar_GetIdealHeight(/*HNWD*/__hToolbar)\
	((INT)SendMessage((__hToolbar), TBM_GETIDEALHEIGHT, 0, 0L))

#define TBM_GETICONSIZE		(TBM_FIRST + 3)
#define Toolbar_GetIconSize(/*HWND*/ __hToolbar, /*INT*/ __iconIndex, /*PSIZE*/ __sizeOut)\
	((BOOL)SendMessage((__hToolbar), TBM_GETICONSIZE, (WPARAM)(__iconIndex), (LPARAM)(__sizeOut)))

#define TBM_SENDCOMMAND		(TBM_FIRST + 4)
#define Toolbar_SendCommand(/*HWND*/ __hToolbar, /*INT*/ __commandId)\
	((BOOL)SendMessage((__hToolbar), TBM_SENDCOMMAND, (WPARAM)(__commandId), 0L))


typedef struct __TOOLBARDRAWICONPARAM
{
	HDC	 hdcDst;
	INT	 iconIndex;
	INT	 x;
	INT	 y;
	INT  cx;
	INT  cy;
	UINT itemState;
} TOOLBARDRAWICONPARAM;

#define TBM_DRAWICON				(TBM_FIRST + 5)
#define Toolbar_DrawIcon(/*HWND*/ __hToolbar, /*TOOLBARDRAWICONPARAM* */ __toolbarDrawIconParam)\
	((BOOL)SendMessage((__hToolbar), TBM_DRAWICON, 0, (LPARAM)(__toolbarDrawIconParam)))

#define Toolbar_LockUpdate(/*HWND*/ __hToolbar, /*BOOL*/__fLock)\
	(SendMessage((__hToolbar), WM_SETREDRAW, (WPARAM)(0 == (__fLock)), 0L))

#define TBM_GETITEMCOUNT			(TBM_FIRST + 6)
#define Toolbar_GetItemCount(/*HWND*/ __hToolbar)\
	((INT)SendMessage((__hToolbar), TBM_GETITEMCOUNT, 0, 0L))

#define TBM_CLEAR				(TBM_FIRST + 7)
#define Toolbar_Clear(/*HWND*/ __hToolbar)\
	((BOOL)SendMessage((__hToolbar), TBM_CLEAR, 0, 0L))

#define TBIP_FIRST		0x0000
#define TBIP_LAST		0xFFFFFF

typedef struct __TOOLBARINSERTITEM
{
	INT		cbSize;
	INT		insertBefore; // you can use TBIP_XXX here
	LPCSTR	pszName;
	UINT	style;
} TOOLBARINSERTITEM;

#define TBM_INSERTITEM			(TBM_FIRST + 8)  // wParam - not used, lParam = (LPARAM)(TOOLBARINSERTITEM*)pInsertItem; Return item index or ITEM_ERR
#define Toolbar_InsertItem(/*HWND*/ __hToolbar, /*TOOLBARINSERTITEM*/ __pInsertItem)\
	((INT)SendMessage((__hToolbar), TBM_INSERTITEM, 0, (LPARAM)__pInsertItem))

#define TBM_FINDITEM				(TBM_FIRST + 9)
#define Toolbar_FindItem(/*HWND*/ __hToolbar, /*LPCSTR*/ __pszItemName)\
	((INT)SendMessage((__hToolbar), TBM_FINDITEM, 0, (LPARAM)(__pszItemName)))

#define TBM_REMOVEITEM			(TBM_FIRST + 10) // itemName can be INT index
#define Toolbar_RemoveItem(/*HWND*/ __hToolbar,  /*LPCSTR*/__pszItemName)\
	((BOOL)SendMessage((__hToolbar), TBM_REMOVEITEM, 0, (LPARAM)(__pszItemName)))

#define TBM_SETITEMINT				(TBM_FIRST + 11)		// itemName can be INT index
#define Toolbar_SetItemInt(/*HWND*/ __hToolbar, /*LPCSTR*/ __pszItemName, /*INT*/ __intValue)\
	((BOOL)SendMessage((__hToolbar), TBM_SETITEMINT, (WPARAM)(__intValue), (LPARAM)(__pszItemName)))

#define TBM_SETITEMSTRING			(TBM_FIRST + 12) // itemName can be INT index
#define Toolbar_SetItemString(/*HWND*/ __hToolbar, /*LPCSTR*/ __pszItemName, /*LPCWSTR*/ __stringValue)\
	((BOOL)SendMessage((__hToolbar), TBM_SETITEMSTRING, (WPARAM)(__stringValue), (LPARAM)(__pszItemName)))

#define TBM_GETBKCOLOR				(TBM_FIRST + 13)
#define Toolbar_GetBkColor(/*HWND*/ __hToolbar)\
	((COLORREF)SendMessage((__hToolbar), TBM_GETBKCOLOR, 0, 0L))

#define TBM_GETFGCOLOR				(TBM_FIRST + 14)
#define Toolbar_GetFgColor(/*HWND*/ __hToolbar)\
	((COLORREF)SendMessage((__hToolbar), TBM_GETFGCOLOR, 0, 0L))

#define TBM_GETTEXTCOLOR				(TBM_FIRST + 15)
#define Toolbar_GetTextColor(/*HWND*/ __hToolbar)\
	((COLORREF)SendMessage((__hToolbar), TBM_GETTEXTCOLOR, 0, 0L))

#define TBM_GETHILITECOLOR				(TBM_FIRST + 16)
#define Toolbar_GetHiliteColor(/*HWND*/ __hToolbar)\
	((COLORREF)SendMessage((__hToolbar), TBM_GETHILITECOLOR, 0, 0L))

#define TBM_ENABLEITEM				(TBM_FIRST + 17) // itemName can be INT index
#define Toolbar_EnableItem(/*HWND*/ __hToolbar, /*LPCSTR*/ __pszItemName, /*BOOL*/ __fEnable)\
	((BOOL)SendMessage((__hToolbar), TBM_ENABLEITEM, (WPARAM)(__fEnable), (LPARAM)(__pszItemName)))

#define TBM_SHOWITEM				(TBM_FIRST + 18) // itemName can be INT index
#define Toolbar_ShowItem(/*HWND*/ __hToolbar, /*LPCSTR*/ __pszItemName, /*BOOL*/ __fShow)\
	((BOOL)SendMessage((__hToolbar), TBM_SHOWITEM, (WPARAM)(__fShow), (LPARAM)(__pszItemName)))

#define TBM_UPDATETIP				(TBM_FIRST + 19)
#define Toolbar_UpdateTip(/*HWND*/ __hToolbar)\
	((BOOL)SendMessage((__hToolbar), TBM_UPDATETIP, 0, 0L))

typedef struct __TOOLBARTEXTMETRIC
{
	INT height;
	INT baseY;
	INT origY;
	INT aveCharWidth;
	INT overhang;
} TOOLBARTEXTMETRIC;

#define TBM_GETTEXTMETRICS				(TBM_FIRST + 20)
#define Toolbar_GetTextMetrics(/*HWND*/ __hToolbar, /*TOOLBARTEXTMETRIC* */ __textMetric)\
	((BOOL)SendMessage((__hToolbar), TBM_GETTEXTMETRICS, 0, (LPARAM)__textMetric))

#define TBM_GETBKBRUSH					(TBM_FIRST + 21)
#define Toolbar_GetBkBrush(/*HWND*/ __hToolbar)\
	((HBRUSH)SendMessage((__hToolbar), TBM_GETBKBRUSH, 0, 0L))

typedef struct __TOOLBARLAYOUT
{
	const RECT *prcParent;		// [in] - parent window rect
	HWND	 insertAfter;		// [out] - toolar insert after
	RECT toolbarRect;		// [out] - toolbar rect
	RECT clientRect;		// [out] - new parent client rect
} TOOLBARLAYOUT;

#define TBM_LAYOUT				(TBM_FIRST + 22)
#define Toolbar_Layout(/*HWND*/ __hToolbar, /*TOOLBARLAYOUT* */ __pLayout)\
	((BOOL)SendMessage((__hToolbar), TBM_LAYOUT, 0, (LPARAM)(__pLayout)))

#define TBNS_NEXTITEM			MAKEINTRESOURCEA(0)
#define TBNS_PREVITEM			MAKEINTRESOURCEA(1)

#define TBM_NEXTITEM				(TBM_FIRST + 23)
#define Toolbar_NextItem(/*HWND*/ __hToolbar, /*LPCSTR*/ __pszItemName, /*BOOL*/ __fUseName)\
	((BOOL)SendMessage((__hToolbar), TBM_NEXTITEM, (WPARAM)(__fUseName), (LPARAM)(__pszItemName)))

#define TBM_GETITEMSTYLE			(TBM_FIRST + 24) // itemName can be INT index, 
#define Toolbar_GetItemStyle(/*HWND*/ __hToolbar,  /*LPCSTR*/ __pszItemName, /*UINT*/ __fMask)\
	((UINT)SendMessage((__hToolbar), TBM_GETITEMSTYLE, (WPARAM)(__fMask), (LPARAM)(__pszItemName)))

#define TBM_GETITEMCOMMAND		(TBM_FIRST + 25) // itemName can be INT index, 
#define Toolbar_GetItemCommand(/*HWND*/ __hToolbar,  /*LPCSTR*/ __pszItemName)\
	((INT)SendMessage((__hToolbar), TBM_GETITEMCOMMAND, 0, (LPARAM)(__pszItemName)))

#define TBM_SETITEMDESCRIPTION	(TBM_FIRST + 26) // itemName can be INT index
#define Toolbar_SetItemDescription(/*HWND*/ __hToolbar,  /*LPCSTR*/ __pszItemName, /*LPCWSTR*/__pszDescription)\
	((BOOL)SendMessage((__hToolbar), TBM_SETITEMDESCRIPTION, (WPARAM)(__pszDescription), (LPARAM)(__pszItemName)))

typedef struct __TBITEMINFO
{
	INT commandId;
	UINT style;
	LPWSTR pszText;
	INT cchText;
	LPWSTR pszDescription;
	INT cchDescription;
} TBITEMINFO;

#define TBM_GETITEMINFO				(TBM_FIRST + 27) // itemName can be INT index
#define Toolbar_GetItemInfo(/*HWND*/ __hToolbar,  /*LPCSTR*/ __pszItemName, /*TBITEM* */__itemInfo)\
	((BOOL)SendMessage((__hToolbar), TBM_GETITEMINFO, (WPARAM)(__itemInfo), (LPARAM)(__pszItemName)))

#define TBPF_NORMAL					0x00000000
#define TBPF_NOSERVICECOMMANDS		0x00000001
#define TBPF_READONLYADDRESS		0x00000004

#define TBM_AUTOPOPULATE				(TBM_FIRST + 28) //wParam - (WPARAM)(UINT)populateFlags; lParam = (LPARAM)(ifc_omservice*)service; Return: number of buttons added.
#define Toolbar_AutoPopulate(/*HWND*/ __hToolbar,  /*ifc_omservice* */ __service, /*UINT*/__populateFlags)\
	((UINT)SendMessage((__hToolbar), TBM_AUTOPOPULATE, (WPARAM)(__populateFlags), (LPARAM)(__service)))

#define TBM_ENABLEBOTTOMDOCK			(TBM_FIRST + 29) //wParam - not used; lParam = (LPARAM)(BOOL)fEnable; Return: previous state.
#define Toolbar_EnableBottomDock(/*HWND*/ __hToolbar,  /*BOOL*/ __fEnable)\
	((BOOL)SendMessage((__hToolbar), TBM_ENABLEBOTTOMDOCK, 0, (LPARAM)(__fEnable)))

#define TBM_ENABLEAUTOHIDE			(TBM_FIRST + 30) //wParam - not used; lParam = (LPARAM)(BOOL)fEnable; Return: previous state.
#define Toolbar_EnableAutoHide(/*HWND*/ __hToolbar,  /*BOOL*/ __fEnable)\
	((BOOL)SendMessage((__hToolbar), TBM_ENABLEAUTOHIDE, 0, (LPARAM)(__fEnable)))

#define TBM_ENABLETABSTOP			(TBM_FIRST + 31) //wParam - not used; lParam = (LPARAM)(BOOL)fEnable; Return: previous state.
#define Toolbar_EnableTabStop(/*HWND*/ __hToolbar,  /*BOOL*/ __fEnable)\
	((BOOL)SendMessage((__hToolbar), TBM_ENABLETABSTOP, 0, (LPARAM)(__fEnable)))

#define TBM_SETBROWSERHOST			(TBM_FIRST + 32) //wParam = 0, lParam = (LPARAM)(HWND)hwndBrowserHost.
#define Toolbar_SetBrowserHost(/*HWND*/ __hStatusbar, /*HWND*/ __hwndBrowserHost)\
	((BOOL)SENDMSG(__hStatusbar, TBM_SETBROWSERHOST, 0, (LPARAM)(__hwndBrowserHost)))

#define TBM_GETEDITCOLOR				(TBM_FIRST + 33)
#define Toolbar_GetEditColor(/*HWND*/ __hToolbar)\
	((COLORREF)SendMessage((__hToolbar), TBM_GETEDITCOLOR, 0, 0L))

#define TBM_GETEDITBKCOLOR				(TBM_FIRST + 34)
#define Toolbar_GetEditBkColor(/*HWND*/ __hToolbar)\
	((COLORREF)SendMessage((__hToolbar), TBM_GETEDITBKCOLOR, 0, 0L))

#define TBM_GETIMAGELISTHEIGHT			(TBM_FIRST + 35)
#define Toolbar_GetImageListHeight(/*HWND*/ __hToolbar)\
	((INT)SendMessage((__hToolbar), TBM_GETIMAGELISTHEIGHT, 0, 0L))


#define TBM_GETNEXTTABITEM				(TBM_FIRST + 36)
#define Toolbar_GetNextTabItem(/*HWND*/ __hToolbar, /*LPCSTR*/ __pszItemName, /*BOOL*/ __fPrevious)\
	((INT)SendMessage((__hToolbar), TBM_GETNEXTTABITEM, (BOOL)(__fPrevious), (LPARAM)(__pszItemName)))

#define TBM_CHECKHIDE					(TBM_FIRST + 37) // wParam - not used, lParam = (LPARAM)(BOOL)__fImmediate
#define Toolbar_CheckHide(/*HWND*/ __hToolbar, /*BOOL*/ __fImmediate)\
	(SendMessage((__hToolbar), TBM_CHECKHIDE, 0, (BOOL)(__fImmediate)))

#define TBM_ENABLEFORCEADDRESS			(TBM_FIRST + 38) //wParam - not used; lParam = (LPARAM)(BOOL)fEnable; Return: previous state.
#define Toolbar_EnableForceAddress(/*HWND*/ __hToolbar,  /*BOOL*/ __fEnable)\
	((BOOL)SendMessage((__hToolbar), TBM_ENABLEFORCEADDRESS, 0, (LPARAM)(__fEnable)))

#define TBM_ENABLEFANCYADDRESS			(TBM_FIRST + 39) //wParam - not used; lParam = (LPARAM)(BOOL)fEnable; Return: previous state.
#define Toolbar_EnableFancyAddress(/*HWND*/ __hToolbar,  /*BOOL*/ __fEnable)\
	((BOOL)SendMessage((__hToolbar), TBM_ENABLEFANCYADDRESS, 0, (LPARAM)(__fEnable)))

#define TBM_GETTEXTLENGTH				(TBM_FIRST + 40) // wParam - (WPARAM)(size_t*)__textLengthOut, lParam - (LPARAM)(LPCSTR)(__itemName); Return TRUE if supported
#define Toolbar_GetTextLength(/*HWND*/ __hToolbar, /*LPCSTR*/ __pszItemName, /*size_t* */ __textLengthOut)\
	((BOOL)SendMessage((__hToolbar), TBM_GETTEXTLENGTH, (WPARAM)(__textLengthOut), (LPARAM)(__pszItemName)))

// Nitifications (WM_COMMAND)
#define TBN_DOCKCHANGED			1
#define TBN_AUTOHIDECHANGED		2
#define TBN_TABSTOPCHANGED		3

#endif //NULLSOFT_WINAMP_OMBROWSER_TOOLBAR_HEADER