/*

Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2008 Miranda ICQ/IM project,
all portions of this codebase are copyrighted to the people
listed in contributors.txt.

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 "hdr/modern_commonheaders.h"
#include "hdr/modern_clist.h"
#include "m_genmenu.h"
#include "m_clui.h"
#include "hdr/modern_commonprototypes.h"

int LoadFavoriteContactMenu();
int UnloadFavoriteContactMenu();

#pragma hdrstop

INT_PTR CloseAction(WPARAM wParam,LPARAM lParam)
{
	int k;
	g_CluiData.bSTATE = STATE_PREPEARETOEXIT;  // workaround for avatar service and other wich destroys service on OK_TOEXIT
	do
	{	k = CallService(MS_SYSTEM_OKTOEXIT,0,0);
	}
	while (!k);

	if ( k ) {
		DestroyWindow(pcli->hwndContactList);
	}

	return 0;
}

int InitCustomMenus(void)
{
	CreateServiceFunction( "CloseAction", CloseAction );
	LoadFavoriteContactMenu();
	return 0;
}

void UninitCustomMenus(void)
{
	UnloadFavoriteContactMenu();
}

//////////////////////////////////////////////////////////////////////////
//
//  FAVORITE CONTACT SYSTEM
//
//////////////////////////////////////////////////////////////////////////

#define CLUI_FAVSETRATE "CLUI/SetContactRate"  //LParam is rate, Wparam is contact handle
#define CLUI_FAVTOGGLESHOWOFFLINE "CLUI/ToggleContactShowOffline" 

static HANDLE hFavoriteContactMenu = NULL;
static HANDLE *hFavoriteContactMenuItems = NULL;
static HANDLE hShowIfOflineItem = NULL;
static HANDLE hOnContactMenuBuild_FAV = NULL;

static int FAV_OnContactMenuBuild(WPARAM wParam,LPARAM lParam)
{
	BOOL NeedFree = FALSE;
	BYTE bContactRate = db_get_b((HANDLE)wParam, "CList", "Rate",0);
	//if (hFavoriteContactMenu)

	static TCHAR * FAVMENUROOTNAME  = _T("&Contact rate");

	TCHAR *rates[] = {
		_T( "None" ),
		_T( "Low" ),
		_T( "Medium" ),
		_T( "High" ) 
	};

	char* iconsName[] = {
		LPGEN( "Contact rate None" ),
		LPGEN( "Contact rate Low" ),
		LPGEN( "Contact rate Medium" ),
		LPGEN( "Contact rate High" )
	};

	if ( bContactRate >SIZEOF( rates ) - 1 )
		 bContactRate = SIZEOF( rates ) - 1;

	BOOL bModifyMenu = FALSE;
	int i;
	TCHAR * name = NULL;

	CLISTMENUITEM mi = { sizeof(mi) };
	mi.hIcon = CLUI_LoadIconFromExternalFile("clisticons.dll",8,TRUE,TRUE,iconsName[bContactRate],"Contact List",Translate(iconsName[bContactRate]),-IDI_FAVORITE_0 - bContactRate, &NeedFree);
	mi.pszPopupName = (char *)-1;
	mi.position = 0;
	if ( !bContactRate)
		mi.ptszName = FAVMENUROOTNAME;
	else
	{
		int bufsize = (lstrlen(FAVMENUROOTNAME)+lstrlen(rates[bContactRate])+15)*sizeof(TCHAR);
		name = (TCHAR*)_alloca(bufsize);
		mir_sntprintf(name,bufsize/sizeof(TCHAR),_T("%s (%s)"),FAVMENUROOTNAME,rates[bContactRate]);
		mi.ptszName = name;            
	}
	mi.flags = CMIF_ROOTPOPUP|CMIF_TCHAR;
	if ( !hFavoriteContactMenu) 
		hFavoriteContactMenu = Menu_AddContactMenuItem(&mi);
	else
	{
		mi.flags |= CMIM_FLAGS|CMIM_ICON|CMIM_NAME;
		CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM) hFavoriteContactMenu, (LPARAM)&mi);				
		bModifyMenu = TRUE;
	}
	{
		OptParam op;
		op.Handle	 = hFavoriteContactMenu;
		op.Setting	 = OPT_MENUITEMSETUNIQNAME;
		op.Value	 = (INT_PTR)"ModernClistMenu_ContactRate";
		CallService(MO_SETOPTIONSMENUITEM,0,(LPARAM)&op);
	}

	Skin_ReleaseIcon(mi.hIcon);
	if (mi.hIcon && NeedFree)
		DestroyIcon(mi.hIcon);

	mi.pszPopupName = (char*)hFavoriteContactMenu;
	if ( !hFavoriteContactMenuItems) {
		hFavoriteContactMenuItems = (HANDLE*)malloc(sizeof(HANDLE)*SIZEOF(rates));
		memset(hFavoriteContactMenuItems,0,sizeof(HANDLE)*SIZEOF(rates));
	}

	for (i=0; i < SIZEOF(rates); i++) {
		mi.hIcon = CLUI_LoadIconFromExternalFile("clisticons.dll",8+i,TRUE,TRUE,iconsName[i],"Contact List",Translate(iconsName[i]),-IDI_FAVORITE_0 - i, &NeedFree);
		mi.ptszName = rates[i];
		mi.flags = CMIF_CHILDPOPUP|CMIF_TCHAR|((bContactRate == i)?CMIF_CHECKED:0);
		mi.pszService = CLUI_FAVSETRATE;
		mi.popupPosition = i;
		if (bModifyMenu && hFavoriteContactMenuItems[i]) {
			mi.flags |= CMIM_FLAGS|CMIM_ICON;
			CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM) hFavoriteContactMenuItems[i], (LPARAM)&mi);
		}
		else hFavoriteContactMenuItems[i] = Menu_AddContactMenuItem(&mi);
		Skin_ReleaseIcon(mi.hIcon);
		if (mi.hIcon && NeedFree)
			DestroyIcon(mi.hIcon);
	}
		
	mi.hIcon = NULL;
	mi.ptszName = _T("Show even if offline");
	mi.flags = CMIF_CHILDPOPUP|CMIF_TCHAR|(db_get_b((HANDLE)wParam,"CList","noOffline",0)?CMIF_CHECKED:0);
	mi.pszService = CLUI_FAVTOGGLESHOWOFFLINE;
	mi.popupPosition = i+100000000;
	mi.position = -100000000;
	if (bModifyMenu && hShowIfOflineItem) {
		mi.flags |= CMIM_FLAGS|CMIM_ICON;
		CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM) hShowIfOflineItem, (LPARAM)&mi);            
	}
	else hShowIfOflineItem = Menu_AddContactMenuItem(&mi);

	return 0;
}

INT_PTR FAV_SetRate(WPARAM hContact, LPARAM nRate)
{
	if (hContact)
	{
		db_set_b((HANDLE)hContact, "CList", "Rate",(BYTE)nRate);
	}
	return 0;
}

INT_PTR FAV_ToggleShowOffline(WPARAM hContact,LPARAM lParam)
{
	if (hContact)
	{
		db_set_b((HANDLE)hContact,"CList","noOffline",
			db_get_b((HANDLE)hContact,"CList","noOffline",0)?0:1);
	}
	return 0;
}

int LoadFavoriteContactMenu()
{
	CreateServiceFunction(CLUI_FAVSETRATE,FAV_SetRate);
	CreateServiceFunction(CLUI_FAVTOGGLESHOWOFFLINE,FAV_ToggleShowOffline);
	hOnContactMenuBuild_FAV = HookEvent(ME_CLIST_PREBUILDCONTACTMENU,FAV_OnContactMenuBuild);
	return 0;
}

int UnloadFavoriteContactMenu()
{
	if (hFavoriteContactMenuItems)
		free (hFavoriteContactMenuItems);
	hFavoriteContactMenuItems = NULL;

	if (hFavoriteContactMenu)
		CallService(MO_REMOVEMENUITEM,(WPARAM)hFavoriteContactMenu,0);
	hFavoriteContactMenu = NULL;   

	return 0;
}