/*
UserinfoEx plugin for Miranda IM

Copyright:
� 2006-2010 DeathAxe, Yasnovidyashii, Merlin, K. Romanov, Kreol

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.
*/

#include "stdafx.h"

CMPlugin g_plugin;
HMODULE hDwmApi;

MGLOBAL myGlobals;
pfnDwmIsCompositionEnabled	dwmIsCompositionEnabled;

/////////////////////////////////////////////////////////////////////////////////////////

static PLUGININFOEX pluginInfoEx =
{
	sizeof(PLUGININFOEX),
	__PLUGIN_NAME,
	PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM),
	__DESCRIPTION,
	__AUTHOR,
	__COPYRIGHT,
	__AUTHORWEB,
	UNICODE_AWARE,
	// {9C23A24B-E6AA-43C6-B0B8-D6C36D2F7B57}
	{0x9c23a24b, 0xe6aa, 0x43c6, {0xb0, 0xb8, 0xd6, 0xc3, 0x6d, 0x2f, 0x7b, 0x57}}
};

CMPlugin::CMPlugin() :
	PLUGIN<CMPlugin>(MODULENAME, pluginInfoEx)
{}

/*
============================================================================================
	event hooks
============================================================================================
*/

/**
 * This function is called by the ME_TTB_MODULELOADED event.
 * It adds a set of buttons to the TopToolbar plugin.
 *
 * @param	wParam	- not used
 * @param	lParam	- not used
 *
 * @return	always 0
 **/
static int OnTopToolBarLoaded(WPARAM, LPARAM)
{
	TTBButton ttb = {};
	ttb.dwFlags = TTBBF_VISIBLE | TTBBF_SHOWTOOLTIP;
	ttb.pszService = MS_USERINFO_SHOWDIALOG;
	ttb.hIconHandleUp = g_plugin.getIconHandle(IDI_MAIN);
	ttb.name = ttb.pszTooltipUp = LPGEN("User &details");
	g_plugin.addTTB(&ttb);

	ttb.dwFlags = TTBBF_SHOWTOOLTIP;
	ttb.pszService = MS_USERINFO_REMINDER_LIST;
	ttb.hIconHandleUp = g_plugin.getIconHandle(IDI_ANNIVERSARY);
	ttb.name = ttb.pszTooltipUp = LPGEN("Anniversary list");
	g_plugin.addTTB(&ttb);

	ttb.pszService = MS_USERINFO_REMINDER_CHECK;
	ttb.hIconHandleUp = g_plugin.getIconHandle(IDI_BIRTHDAY);
	ttb.name = ttb.pszTooltipUp = LPGEN("Check anniversaries");
	g_plugin.addTTB(&ttb);
	return 0;
}

/**
 * This function is called by Miranda just after loading all system modules.
 *
 * @param	wParam	- not used
 * @param	lParam	- not used
 *
 * @return	always 0
 **/
static int OnModulesLoaded(WPARAM, LPARAM)
{
	// create services to receive string lists of languages and timezones
	SvcConstantsLoadModule();

	// load module to remind user about birthday and a anniversary
	SvcReminderOnModulesLoaded();

	// load extended intagration services
	SvcFlagsOnModulesLoaded();

	// build contact's menuitems
	RebuildMenu();
	HookEvent(ME_CLIST_PREBUILDSTATUSMENU, (MIRANDAHOOK)RebuildAccount);
	return 0;
}

static int OnShutdown(WPARAM, LPARAM)
{
	DlgContactInfoUnLoadModule();
	SvcReminderUnloadModule();

	// uninitialize classes
	CtrlContactUnLoadModule();
	CtrlButtonUnloadModule();

	SvcConstantsUnloadModule();
	SvcFlagsUnloadModule();

	mir_free(hMenuItemAccount);
	return 0;
}

//============================================================================================
//	plugin interface
//============================================================================================


/**
 * This function returns the provided interfaces.
 *
 * @return	array of interfaces
 **/
extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = {
	MIID_UIUSERINFO,		// replace the default userinfo module
	MIID_SREMAIL,			// Send/Receive E-Mail service is provided
	MIID_LAST
};

/**
 * This function is called by Miranda just to make it possible to unload some memory, ...
 *
 * @return	0
 **/
int CMPlugin::Unload()
{
	FreeLibrary(hDwmApi);
	return 0;
}

/**
 * This function is called by Miranda to initialize the plugin.
 *
 * @return	0
 **/
int CMPlugin::Load()
{
	// init common controls
	INITCOMMONCONTROLSEX ccEx;
	ccEx.dwSize = sizeof(ccEx);
	ccEx.dwICC = ICC_WIN95_CLASSES | ICC_DATE_CLASSES;
	InitCommonControlsEx(&ccEx);

	memset(&myGlobals, 0, sizeof(MGLOBAL));

	if (IsWinVerVistaPlus()) {
		hDwmApi = LoadLibraryA("dwmapi.dll");
		if (hDwmApi)
			dwmIsCompositionEnabled = (pfnDwmIsCompositionEnabled)GetProcAddress(hDwmApi, "DwmIsCompositionEnabled");
	}

	// load icon library
	IcoLib_LoadModule();

	SvcFlagsLoadModule();
	SvcTimezoneLoadModule();
	SvcRefreshContactInfoLoadModule();

	CtrlContactLoadModule();
	// load my button class
	CtrlButtonLoadModule();
	// initializes the Ex/Import Services
	SvcExImport_LoadModule();
	// load the UserInfoPropertySheet module
	DlgContactInfoLoadModule();

	// Anniversary stuff
	DlgAnniversaryListLoadModule();
	SvcReminderLoadModule();

	// Now the module is loaded! Start initializing certain things
	HookEvent(ME_OPT_INITIALISE, OnInitOptions);
	HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded);
	HookEvent(ME_TTB_MODULELOADED, OnTopToolBarLoaded);
	HookEvent(ME_SYSTEM_SHUTDOWN, OnShutdown);
	return 0;
}