#ifndef CARDBOARD_INCLUDED
#define CARDBOARD_INCLUDED

#define MAXBUTTONS		32
#define MAXCARDSTACKS	32
#define MAXDROPZONES	8

class CardRegion;
class CardButton;

LRESULT CALLBACK CardWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);

class CardWindow
{
	friend class CardRegion;
	friend class CardButton;

	friend void RegisterCardWindow();

public:

	CardWindow();
	~CardWindow();

	//
	//	Basic windowing support
	//
	BOOL Create(HWND hwndParent, DWORD dwExStyle, DWORD dwStyle, int x, int y, int width, int height);
	BOOL Destroy();

	operator HWND() { return m_hWnd; }

	CardButton *CreateButton (int id, TCHAR *szText, UINT uStyle, bool fVisible, int x, int y, int width, int height);
	CardRegion *CreateRegion (int id, bool fVisible, int x, int y, int xoffset, int yoffset);

	CardButton *CardButtonFromId(int id);
	CardRegion *CardRegionFromId(int id);

	bool DeleteButton(CardButton *pButton);
	bool DeleteRegion(CardRegion *pRegion);
	bool DeleteAll();

	void	 SetBackColor(COLORREF cr);
	COLORREF GetBackColor();
	void	 SetBackCardIdx(UINT uBackIdx);
	UINT	 GetBackCardIdx();
	void	 SetBackImage(HBITMAP hBitmap);

	void EmptyStacks(void);
	void Redraw(void);
	void Update(void);

	bool DistributeStacks(int nIdFrom, int nNumStacks, UINT xJustify, int xSpacing, int nStartX);
	void SetResizeProc(pResizeWndProc proc);
	int  GetWidth() { return nWidth; }
	int  GetHeight() { return nHeight; }

	//
	//	Dropzone support
	//
	bool	  RegisterDropZone(int id, RECT *rect, pDropZoneProc proc);
	bool	  DeleteDropZone(int id);

private:

	int		  GetNumDropZones() { return nNumDropZones; }
	DropZone* GetDropZoneFromRect(RECT *rect);

	//
	//	Window procedure - don't call
	//
	   LRESULT CALLBACK WndProc    (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK CardWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);

	//
	//	Private functions
	//
	void Paint(HDC hdc);
	void PaintCardRgn(HDC hdc, int dx, int dy, int width, int height, int sx, int sy);

	HPALETTE CreateCardPalette();

	CardButton *CardButtonFromPoint(int x, int y);
	CardRegion *CardRegionFromPoint(int x, int y);
	CardRegion *GetBestStack(int x, int y, int w, int h);

	//
	//	Private members
	//

	HWND m_hWnd;			//window handle!
	int  nWidth, nHeight;

	UINT	nBackCardIdx;	//all stacks share this card index by default

	HBITMAP	hbmBackImage;
	HDC		hdcBackImage;


	CardButton  * Buttons[MAXBUTTONS];
	int			  nNumButtons;

	CardRegion  * Regions[MAXCARDSTACKS];
	int			  nNumCardRegions;

	DropZone	* dropzone[MAXDROPZONES];
	int			  nNumDropZones;

	COLORREF  crBackgnd;

	pResizeWndProc  ResizeWndCallback;


};

#endif /* CARDBOARD_INCLUDED */