/*
"Last Seen mod" plugin for Miranda IM
Copyright ( C ) 2002-03  micron-x
Copyright ( C ) 2005-07  Y.B.

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.

File name      : $URL: http://svn.berlios.de/svnroot/repos/mgoodies/trunk/lastseen-mod/missed.c $
Revision       : $Rev: 1570 $
Last change on : $Date: 2007-12-30 01:30:07 +0300 (Вс, 30 дек 2007) $
Last change by : $Author: y_b $
*/
#include "seen.h"

#include <m_ignore.h>



MISSEDCONTACTS mcs;
extern HANDLE ehmissed;
extern HINSTANCE hInstance;



WPARAM IsUserMissed(WPARAM contact)
{
	int loop=0;

	for (;loop<mcs.count;loop++)
	{
		if(mcs.wpcontact[loop]==contact)
			return MAKEWPARAM(1,loop);
	}

	return 0;
}



int RemoveUser(int pos)
{
	int loop;

	for(loop=pos;loop<mcs.count-1;loop++)
		mcs.wpcontact[loop]=mcs.wpcontact[loop+1];

	mcs.count--;

	return 0;
}



int ResetMissed(void)
{
	HANDLE hcontact=NULL;

	hcontact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
	while(hcontact!=NULL)
	{
		DBWriteContactSettingByte(hcontact,S_MOD,"Missed",0);
		hcontact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hcontact,0);
	}

	ZeroMemory(&mcs,sizeof(mcs));

	return 0;
}


int CheckIfOnline(void)
{
	HANDLE hcontact;
//	char *szProto;
//	WORD status;

	hcontact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
	while(hcontact!=NULL)
	{
/*		szProto=(char *)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hcontact,0);
		status=(szProto==NULL)?ID_STATUS_OFFLINE:DBGetContactSettingWord(hcontact,szProto,"Status",ID_STATUS_OFFLINE);
		if(status!=ID_STATUS_OFFLINE)
*/
		if(CallService(MS_CLIST_GETCONTACTICON,(WPARAM)hcontact,0)!=ICON_OFFLINE)
			DBWriteContactSettingByte(hcontact,S_MOD,"Missed",2);

		hcontact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hcontact,0);
	}

	return 0;
}



INT_PTR CALLBACK MissedDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
{
	POINT pt;
	RECT rcinit,rcresized,rcb,rcd;
	HWND htemp;
		
	switch(msg){

		case WM_INITDIALOG:
			TranslateDialogDefault(hdlg);

			htemp=GetDlgItem(hdlg,IDC_CONTACTS);
			GetWindowRect(htemp,&rcinit);
			SetWindowPos(htemp,NULL,0,0,rcinit.right-rcinit.left,mcs.count*(rcinit.bottom-rcinit.top)/2,SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE);
			GetWindowRect(htemp,&rcresized);

			htemp=GetDlgItem(hdlg,IDOK);
			GetWindowRect(htemp,&rcb);
			pt.x=rcb.left;
			pt.y=rcb.top;

			ScreenToClient(hdlg,&pt);
			MoveWindow(htemp,pt.x,pt.y+(rcresized.bottom-rcinit.bottom),(rcb.right-rcb.left),(rcb.bottom-rcb.top),FALSE);
			GetWindowRect(hdlg,&rcd);
			SetWindowPos(hdlg,NULL,0,0,rcd.right-rcd.left,rcd.bottom-rcd.top+(rcresized.bottom-rcinit.bottom),SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE);
			
			SetDlgItemText(hdlg,IDC_CONTACTS,(LPCSTR)lparam);
			ShowWindow(hdlg,SW_SHOWNOACTIVATE);
			break;

		case WM_CLOSE:
			EndDialog(hdlg,0);
			break;

		case WM_COMMAND:
			if(LOWORD(wparam)==IDOK)
				SendMessage(hdlg,WM_CLOSE,0,0);
			break;
	}

	return 0;
}




int ShowMissed(void)
{
	int loop=0;
	char sztemp[1024]="",szcount[7];

	if (!mcs.count) return 0;

	for (;loop<mcs.count;loop++)
	{
		strcat(sztemp,(const char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,mcs.wpcontact[loop],0));
		if(DBGetContactSettingByte(NULL,S_MOD,"MissedOnes_Count",0))
		{
			wsprintf(szcount," [%i]",mcs.times[loop]);
			strcat(sztemp,szcount);
		}

		strcat(sztemp,"\n");
	}

	CreateDialogParam(hInstance,MAKEINTRESOURCE(IDD_MISSED),NULL,MissedDlgProc,(LPARAM)&sztemp[0]);

	return 0;
}

/*

int LogStatus(WPARAM wparam,LPARAM lparam)
{
	DBCONTACTWRITESETTING *cws;
	WPARAM wpvar;
	
	cws=(DBCONTACTWRITESETTING *)lparam;

	if(strcmp(cws->szSetting,"Status") || (strcmp(cws->szModule,"ICQ") && strcmp(cws->szModule,"MSN")) || (HANDLE)wparam==NULL) return 0;

	if(CallService(MS_IGNORE_ISIGNORED,wparam,IGNOREEVENT_USERONLINE))
		return 0;

	if(cws->value.wVal==ID_STATUS_OFFLINE)
	{
		if(DBGetContactSettingByte((HANDLE)wparam,S_MOD,"Missed",0)==1)
		{
			mcs.times[mcs.count]++;
			mcs.wpcontact[mcs.count++]=wparam;
			DBWriteContactSettingByte((HANDLE)wparam,S_MOD,"Missed",0);
		}

		else if(DBGetContactSettingByte((HANDLE)wparam,S_MOD,"Missed",0)==3)
			mcs.times[HIWORD(IsUserMissed(wparam))]++;

		return 0;
	}

	wpvar=IsUserMissed(wparam);
	if(LOWORD(wpvar))
		DBWriteContactSettingByte((HANDLE)wparam,S_MOD,"Missed",3);

	else
		DBWriteContactSettingByte((HANDLE)wparam,S_MOD,"Missed",1);

	return 0;
}

*/

int Test(WPARAM wparam,LPARAM lparam)
{
	if(lparam<ICON_OFFLINE || lparam>ICON_INVIS)
		return 0;

	if(CallService(MS_IGNORE_ISIGNORED,wparam,IGNOREEVENT_USERONLINE))
		return 0;

	if(DBGetContactSettingByte((HANDLE)wparam,S_MOD,"Missed",0)==2)
		return 0;

	switch(lparam){

		case ICON_OFFLINE:
			if(DBGetContactSettingByte((HANDLE)wparam,S_MOD,"Missed",0)==1)
			{
				WORD missed=IsUserMissed(wparam);

				if (!LOWORD(missed))
				{
					mcs.times[mcs.count]=1;
					mcs.wpcontact[mcs.count++]=wparam;
				}
				else
					mcs.times[HIWORD(missed)]++;

				DBWriteContactSettingByte((HANDLE)wparam,S_MOD,"Missed",0);
			}
			break;

		case ICON_ONLINE:
		case ICON_AWAY:
		case ICON_NA:
		case ICON_OCC:
		case ICON_DND:
		case ICON_FREE:
		case ICON_INVIS:
			DBWriteContactSettingByte((HANDLE)wparam,S_MOD,"Missed",1);
			break;
	}
		
	return 0;
}



int ModeChange_mo(WPARAM wparam,LPARAM lparam)
{
	ACKDATA *ack;
	int isetting=0;

	ack=(ACKDATA *)lparam;

	if(ack->type!=ACKTYPE_STATUS || ack->result!=ACKRESULT_SUCCESS || ack->hContact!=NULL) return 0;

	isetting=CallProtoService(ack->szModule,PS_GETSTATUS,0,0);

	switch(isetting){

		case ID_STATUS_AWAY:
		case ID_STATUS_DND:
		case ID_STATUS_NA:
			if(ehmissed==NULL)
			{
				ZeroMemory(&mcs,sizeof(mcs));
				CheckIfOnline();
				//ehmissed=HookEvent(ME_DB_CONTACT_SETTINGCHANGED,LogStatus);
				ehmissed=HookEvent(ME_CLIST_CONTACTICONCHANGED,Test);
			}
			break;

		default:
			if(ehmissed!=NULL)
			{
				UnhookEvent(ehmissed);
				ehmissed=NULL;
				ShowMissed();
				ResetMissed();
			}
			break;
	}

	return 0;
}