/*
Plugin of Miranda IM for communicating with users of the AIM protocol.
Copyright (c) 2008-2009 Boris Krasnovskiy
Copyright (C) 2005-2006 Aaron Myles Landwehr

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, see <http://www.gnu.org/licenses/>.
*/
#include "stdafx.h"

/////////////////////////////////////////////////////////////////////////////////////////
// Icons init

static IconItem iconList[] =
{
	{	LPGEN("ICQ"),                    "icq",         IDI_ICQ             },
	{	LPGEN("Add"),                    "add",         IDI_ADD             },
	{	LPGEN("Block"),                  "block",       IDI_BLOCK           },
	{	LPGEN("Profile"),                "profile",     IDI_PROFILE         },
	{	LPGEN("AOL mail"),               "mail",        IDI_MAIL            },
	{	LPGEN("AIM icon"),               "aim",         IDI_AIM             },
	{	LPGEN("Hiptop"),                 "hiptop",      IDI_HIPTOP          },
	{	LPGEN("AOL bot"),                "bot",         IDI_BOT             },
	{	LPGEN("Admin"),                  "admin",       IDI_ADMIN           },
	{	LPGEN("Confirmed"),              "confirm",     IDI_CONFIRMED       },
	{	LPGEN("Not confirmed"),          "uconfirm",    IDI_UNCONFIRMED     },
	{	LPGEN("Blocked list"),           "away",        IDI_AWAY            },
	{	LPGEN("Idle"),                   "idle",        IDI_IDLE            },
	{	LPGEN("AOL"),                    "aol",         IDI_AOL             },

	{	LPGEN("Foreground color"),       "foreclr",     IDI_FOREGROUNDCOLOR },
	{	LPGEN("Background color"),       "backclr",     IDI_BACKGROUNDCOLOR },
	{	LPGEN("Bold"),                   "bold",        IDI_BOLD            },
	{	LPGEN("Not bold"),               "nbold",       IDI_NBOLD           },
	{	LPGEN("Italic"),                 "italic",      IDI_ITALIC          },
	{	LPGEN("Not italic"),             "nitalic",     IDI_NITALIC         },
	{	LPGEN("Underline"),              "undrln",      IDI_UNDERLINE       },
	{	LPGEN("Not underline"),          "nundrln",     IDI_NUNDERLINE      },
	{	LPGEN("Subscript"),              "sub_scrpt",   IDI_SUBSCRIPT       },
	{	LPGEN("Not subscript"),          "nsub_scrpt",  IDI_NSUBSCRIPT      },
	{	LPGEN("Superscript"),            "sup_scrpt",   IDI_SUPERSCRIPT     },
	{	LPGEN("Not superscript"),        "nsup_scrpt",  IDI_NSUPERSCRIPT    },
	{	LPGEN("Normal script"),          "norm_scrpt",  IDI_NORMALSCRIPT    },
	{	LPGEN("Not normal script"),      "nnorm_scrpt", IDI_NNORMALSCRIPT   }
};

void InitIcons(void)
{
	Icon_Register(hInstance, "Protocols/AIM", iconList, 14, "AIM");
	Icon_Register(hInstance, "Protocols/AIM/" LPGEN("Profile editor"), iconList + 14, 14, "AIM");
}

HICON LoadIconEx(const char *name, bool big)
{
	char szSettingName[100];
	mir_snprintf(szSettingName, "AIM_%s", name);
	return IcoLib_GetIcon(szSettingName, big);
}

HANDLE GetIconHandle(const char *name)
{
	for (int i = 0; i < _countof(iconList); i++)
		if (!mir_strcmp(iconList[i].szName, name))
			return iconList[i].hIcolib;

	return NULL;
}

void ReleaseIconEx(const char *name, bool big)
{
	char szSettingName[100];
	mir_snprintf(szSettingName, "%s_%s", "AIM", name);
	IcoLib_Release(szSettingName, big);
}

/////////////////////////////////////////////////////////////////////////////////////////
// Extra Icons

extern OBJLIST<CAimProto> g_Instances;

static HANDLE bot_icon, icq_icon, aol_icon, hiptop_icon;
static HANDLE admin_icon, confirmed_icon, unconfirmed_icon;

static HANDLE hExtraAT, hExtraES;

static const char* extra_AT_icon_name[5] =
{
	"uconfirm",
	"confirm",
	"icq",
	"aol",
	"admin",
};

static const char* extra_ES_icon_name[2] =
{
	"bot",
	"hiptop",
};

static void set_AT_icon(CAimProto* ppro, MCONTACT hContact)
{
	if (ppro->isChatRoom(hContact)) return;

	unsigned i = ppro->getByte(hContact, AIM_KEY_AC, 0) - 1;
	ExtraIcon_SetIcon(hExtraAT, hContact, (i < 5) ? GetIconHandle(extra_AT_icon_name[i]) : NULL);
}

static void set_ES_icon(CAimProto* ppro, MCONTACT hContact)
{
	if (ppro->isChatRoom(hContact)) return;

	unsigned i = ppro->getByte(hContact, AIM_KEY_ET, 0) - 1;
	ExtraIcon_SetIcon(hExtraAT, hContact, (i < 2) ? GetIconHandle(extra_ES_icon_name[i]) : NULL);
}

void set_contact_icon(CAimProto* ppro, MCONTACT hContact)
{
	if (!ppro->getByte(AIM_KEY_AT, 0)) set_AT_icon(ppro, hContact);
	if (!ppro->getByte(AIM_KEY_ES, 0)) set_ES_icon(ppro, hContact);
}

void remove_AT_icons(CAimProto* ppro)
{
	for (MCONTACT hContact = db_find_first(ppro->m_szModuleName); hContact; hContact = db_find_next(hContact, ppro->m_szModuleName))
		if (!ppro->isChatRoom(hContact))
			ExtraIcon_Clear(hExtraAT, hContact);
}

void remove_ES_icons(CAimProto* ppro)
{
	for (MCONTACT hContact = db_find_first(ppro->m_szModuleName); hContact; hContact = db_find_next(hContact, ppro->m_szModuleName))
		if (!ppro->isChatRoom(hContact))
			ExtraIcon_Clear(hExtraES, hContact);
}

void add_AT_icons(CAimProto* ppro)
{
	for (MCONTACT hContact = db_find_first(ppro->m_szModuleName); hContact; hContact = db_find_next(hContact, ppro->m_szModuleName))
		set_AT_icon(ppro, hContact);
}

void add_ES_icons(CAimProto* ppro)
{
	for (MCONTACT hContact = db_find_first(ppro->m_szModuleName); hContact; hContact = db_find_next(hContact, ppro->m_szModuleName))
		set_ES_icon(ppro, hContact);
}

void InitExtraIcons(void)
{
	hExtraAT = ExtraIcon_RegisterIcolib("aimaccounttype", LPGEN("AIM account type"), "AIM_aol");
	hExtraES = ExtraIcon_RegisterIcolib("aimextstatus", LPGEN("AIM extended status"), "AIM_hiptop");
}

/////////////////////////////////////////////////////////////////////////////////////////
// OnPreBuildContactMenu

int CAimProto::OnPreBuildContactMenu(WPARAM hContact, LPARAM)
{
	bool bIsChatRoom = isChatRoom(hContact);

	//see if we should add the html away message context menu items
	Menu_ShowItem(m_hHTMLAwayContextMenuItem, getWord(hContact, AIM_KEY_ST, ID_STATUS_OFFLINE) == ID_STATUS_AWAY && !bIsChatRoom);
	Menu_ShowItem(m_hAddToServerListContextMenuItem, !getBuddyId(hContact, 1) && m_state != 0 && !bIsChatRoom);

	ptrA id(getStringA(hContact, AIM_KEY_SN));
	if (id == NULL)
		return 0;

	switch (m_pd_mode) {
	case 1:
		Menu_ModifyItem(m_hBlockContextMenuItem, LPGENW("&Block"));
		break;

	case 2:
		Menu_ModifyItem(m_hBlockContextMenuItem, LPGENW("&Unblock"));
		break;

	case 3:
		Menu_ModifyItem(m_hBlockContextMenuItem, m_allow_list.find_id(id) ? LPGENW("&Block") : LPGENW("&Unblock"));
		break;

	case 4:
		Menu_ModifyItem(m_hBlockContextMenuItem, m_block_list.find_id(id) ? LPGENW("&Unblock") : LPGENW("&Block"));
		break;

	default:
		Menu_ShowItem(m_hBlockContextMenuItem, false);
		break;
	}
	return 0;
}

void CAimProto::InitMainMenus(void)
{
	CMenuItem mi;
	mi.root = Menu_GetProtocolRoot(this);

	mi.pszService = "/ManageAccount";
	CreateProtoService(mi.pszService, &CAimProto::ManageAccount);
	mi.position = 201001;
	mi.hIcolibItem = GetIconHandle("aim");
	mi.name.a = LPGEN("Manage account");
	m_hMainMenu[0] = Menu_AddProtoMenuItem(&mi, m_szModuleName);

	mi.pszService = "/InstantIdle";
	CreateProtoService(mi.pszService, &CAimProto::InstantIdle);
	mi.position = 201002;
	mi.hIcolibItem = GetIconHandle("idle");
	mi.name.a = LPGEN("Instant idle");
	m_hMainMenu[1] = Menu_AddProtoMenuItem(&mi, m_szModuleName);

	mi.pszService = "/JoinChatRoom";
	CreateProtoService(mi.pszService, &CAimProto::JoinChatUI);
	mi.position = 201003;
	mi.hIcolibItem = GetIconHandle("aol");
	mi.name.a = LPGEN("Join chat room");
	m_hMainMenu[2] = Menu_AddProtoMenuItem(&mi, m_szModuleName);
}

void CAimProto::InitContactMenus(void)
{
	CMenuItem mi;

	SET_UID(mi, 0xb961e2af, 0x87a, 0x4fbf, 0xb5, 0x32, 0x6, 0xe2, 0x18, 0xad, 0x29, 0xac);
	CreateProtoService("/GetHTMLAwayMsg", &CAimProto::GetHTMLAwayMsg);
	mi.pszService = "/GetHTMLAwayMsg";
	mi.position = -2000006000;
	mi.hIcolibItem = GetIconHandle("away");
	mi.name.a = LPGEN("Read &HTML away message");
	mi.flags = CMIF_NOTOFFLINE | CMIF_HIDDEN;
	m_hHTMLAwayContextMenuItem = Menu_AddContactMenuItem(&mi, m_szModuleName);

	SET_UID(mi, 0x7f7e4c24, 0x821c, 0x450f, 0x93, 0x76, 0xbe, 0x65, 0xe9, 0x2f, 0xb6, 0xc2);
	CreateProtoService("/GetProfile", &CAimProto::GetProfile);
	mi.pszService = "/GetProfile";
	mi.position = -2000005090;
	mi.hIcolibItem = GetIconHandle("profile");
	mi.name.a = LPGEN("Read profile");
	mi.flags = CMIF_NOTOFFLINE;
	Menu_AddContactMenuItem(&mi, m_szModuleName);

	SET_UID(mi, 0x3928ba10, 0x69bc, 0x4ec9, 0x96, 0x48, 0xa4, 0x1b, 0xbe, 0x58, 0x4a, 0x7e);
	CreateProtoService("/AddToServerList", &CAimProto::AddToServerList);
	mi.pszService = "/AddToServerList";
	mi.position = -2000005080;
	mi.hIcolibItem = GetIconHandle("add");
	mi.name.a = LPGEN("Add to server list");
	mi.flags = CMIF_NOTONLINE | CMIF_HIDDEN;
	m_hAddToServerListContextMenuItem = Menu_AddContactMenuItem(&mi, m_szModuleName);

	SET_UID(mi, 0xc6169b8f, 0x53ab, 0x4242, 0xbe, 0x90, 0xe2, 0x4a, 0xa5, 0x73, 0x88, 0x32);
	CreateProtoService("/BlockCommand", &CAimProto::BlockBuddy);
	mi.pszService = "/BlockCommand";
	mi.position = -2000005060;
	mi.hIcolibItem = GetIconHandle("block");
	mi.name.a = LPGEN("&Block");
	mi.flags = CMIF_HIDDEN;
	m_hBlockContextMenuItem = Menu_AddContactMenuItem(&mi, m_szModuleName);
}