{$IFDEF M_API_UNIT}

//----- CListint -----
function IsHContactGroup  (h:TMCONTACT):bool;
function IsHContactInfo   (h:TMCONTACT):bool;
function IsHContactContact(h:TMCONTACT):bool;

function CLCDEFAULT_BKCOLOUR:dword;
function CLCDEFAULT_TEXTCOLOUR:dword;
function CLCDEFAULT_SELBKCOLOUR:dword;
function CLCDEFAULT_SELTEXTCOLOUR:dword;
function CLCDEFAULT_HOTTEXTCOLOUR:dword;

function CreateVersionString(version:dword;buf:PAnsiChar):PAnsiChar;
function CreateVersionStringPlugin(pluginInfo:PPluginInfoEx;buf:PAnsiChar):PAnsiChar;
function PLUGIN_MAKE_VERSION(a,b,c,d: Cardinal): int;
function PLUGIN_CMP_VERSION(verA: LongInt; verB: LongInt): int;

function mir_hashstr (const key:PAnsiChar):uint; {inline;}
function mir_hashstrW(const key:PWideChar):uint; {inline;}
function lrtrim (str:PAnsiChar):PAnsiChar; {inline}
function lrtrimp(str:PAnsiChar):PAnsiChar; {inline}

function Translate (sz: PAnsiChar): PAnsiChar;
function Translatew(sz: PWideChar): PWideChar;
function TranslateString    (const sz:AnsiString):AnsiString;
function TranslateWideString(const sz:WideString):WideString;
function TranslateUnicodeString(sz: UnicodeString): UnicodeString;
procedure TranslateDialogDefault(hwndDlg: THANDLE);
procedure TranslateMenu(hMenu: HMENU);
function Langpack_Register:Pointer;

function CreateProtoServiceFunction(const szModule, szService: PAnsiChar; serviceProc: TMIRANDASERVICE): int_ptr;

function Menu_AddContextFrameMenuItem(mi:PMO_MenuItem):HGENMENU;
function Menu_AddMainMenuItem        (mi:PMO_MenuItem):HGENMENU;
function Menu_AddContactMenuItem     (mi:PMO_MenuItem):HGENMENU;
function Menu_AddStatusMenuItem      (mi:PMO_MenuItem):HGENMENU;
function Menu_AddProtoMenuItem       (mi:PMO_MenuItem):HGENMENU;
function Menu_AddTrayMenuItem        (mi:PMO_MenuItem):HGENMENU;

procedure Srmm_AddButton(bbdi:pBBButton);

procedure SET_UID(pmi:PMO_MenuItem; strguid:PAnsiChar);

function Options_AddPage (wParam:WPARAM; odp:POPTIONSDIALOGPAGE):int_ptr;
function Hotkey_Register(hk:PHOTKEYDESC):int_ptr;

function Skin_AddIcon(si:PSKINICONDESC):THANDLE;
procedure Icon_Register (hInst:HINST; const szSection:PAnsiChar; pIcons:pIconItem ; iCount:size_t; prefix:PAnsiChar);
procedure Icon_RegisterW(hInst:HINST; const szSection:PWideChar; pIcons:pIconItemW; iCount:size_t; prefix:PAnsiChar);

procedure FontRegister(pFontID:pFontID);
procedure ColourRegister(pColorID:pColourID);

function TopToolbar_AddButton(pButton:PTTBButton):THANDLE;

function Options_Open(group,page,tab:PWideChar):int_ptr;

{$ELSE}

function _Srmm_AddButton(bbdi:pBBButton; pPlugin:Pointer) : integer; stdcall; 
             external AppDll name 'Srmm_AddButton';

function _AddMainMenuItem(mi:PMO_MenuItem) : HGENMENU; stdcall;
             external AppDll name 'Menu_AddMainMenuItem';

function _AddContactMenuItem(mi:PMO_MenuItem; pszProto:PAnsiChar) : HGENMENU; stdcall;
             external AppDll name 'Menu_AddContactMenuItem';

function _AddProtoMenuItem(mi:PMO_MenuItem; pszProto:PAnsiChar) : HGENMENU; stdcall;
             external AppDll name 'Menu_AddProtoMenuItem';

function _AddStatusMenuItem(mi:PMO_MenuItem; pszProto:PAnsiChar) : HGENMENU; stdcall;
             external AppDll name 'Menu_AddStatusMenuItem';

function _AddTrayMenuItem(mi:PMO_MenuItem) : HGENMENU; stdcall;
             external AppDll name 'Menu_AddTrayMenuItem';

//----- CListint -----

function IsHContactGroup(h:TMCONTACT):bool;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  result:=(h xor HCONTACT_ISGROUP)<(HCONTACT_ISGROUP xor HCONTACT_ISINFO);
end;
function IsHContactInfo(h:TMCONTACT):bool;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  result:=(h and HCONTACT_ISINFO)=HCONTACT_ISINFO;
end;
function IsHContactContact(h:TMCONTACT):bool;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
 result:=(h and HCONTACT_ISGROUP)=0;
end;

function CLCDEFAULT_BKCOLOUR:dword;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  result:=GetSysColor(COLOR_3DFACE);
end;
function CLCDEFAULT_TEXTCOLOUR:dword;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  result:=GetSysColor(COLOR_WINDOWTEXT);
end;
function CLCDEFAULT_SELBKCOLOUR:dword;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  result:=GetSysColor(COLOR_HIGHLIGHT);
end;
function CLCDEFAULT_SELTEXTCOLOUR:dword;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  result:=GetSysColor(COLOR_HIGHLIGHTTEXT);
end;
function CLCDEFAULT_HOTTEXTCOLOUR:dword;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  result:=RGB(0,0,255);
end;


function CreateVersionString(version:dword;buf:PAnsiChar):PAnsiChar;
var
  vers:array [0..3] of integer;
begin
  vers[0]:=(version shr 24) and $FF;
  vers[1]:=(version shr 16) and $FF;
  vers[2]:=(version shr  8) and $FF;
  vers[3]:=version and $FF;
  wvsprintfa(buf,'%d.%d.%d.%d',@vers);
  result:=buf;
end;

function CreateVersionStringPlugin(pluginInfo:PPluginInfoEx;buf:PAnsiChar):PAnsiChar;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  result:=CreateVersionString(pluginInfo^.version,buf);
end;

function PLUGIN_MAKE_VERSION(a,b,c,d: Cardinal): int;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  Result := (a shl 24) or (b shl 16) or (c shl 8) or d;
end;

function PLUGIN_CMP_VERSION(verA: LongInt; verB: LongInt): int;
begin
  Result := 0;
  { could be used to compare for severity of age for positive values, if a<b
  results are minus values, 0 for equal, positive if a is newer }
  Inc(Result, (verA and $FF      ) - (verB and $FF));
  Inc(Result, (verA and $FF00    ) - (verB and $FF00));
  Inc(Result, (verA and $FF0000  ) - (verB and $FF0000));
  Inc(Result, (verA and $FF000000) - (verB and $FF000000));
end;

function mir_hashstr(const key:PAnsiChar):uint; {inline;}
var
  len:int;
begin
  if key=NIL then
    result:=0
  else
  begin
    len:=lstrlena(key);
    result:=mir_hash(key, len);
  end;
end;

function mir_hashstrW(const key:PWideChar):uint; {inline;}
var
  len:int;
begin
  if key=NIL then
    result:=0
  else
  begin
    len:=lstrlenw(key);
    result:=mir_hash(key, len*SizeOF(WideChar));
  end;
end;

function lrtrim(str:PAnsiChar):PAnsiChar;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  result:=ltrim(rtrim(str));
end;
function lrtrimp(str:PAnsiChar):PAnsiChar;
  {$IFDEF AllowInline}inline;{$ENDIF}
begin
  result:=ltrimp(rtrim(str));
end;

function TranslateW(sz: PWideChar): PWideChar;
begin
  result:=TranslateW_LP(sz, @g_plugin);
end;

function Translate(sz: PAnsiChar): PAnsiChar;
begin
  result:=TranslateA_LP(sz, @g_plugin);
end;

function TranslateString(const sz:AnsiString):AnsiString;
begin
  Result:=AnsiString(TranslateA_LP(PAnsiChar(sz),@g_plugin));
end;

function TranslateWideString(const sz:WideString):WideString;
begin
  Result:=WideString(TranslateW_LP(PWideChar(sz),@g_plugin));
end;

function TranslateUnicodeString(sz: UnicodeString): UnicodeString;
begin
  Result:=UnicodeString(TranslateW_LP(PWideChar(sz),@g_plugin));
end;

procedure TranslateDialogDefault(hwndDlg: THANDLE);
begin
  TranslateDialog_LP(hwndDlg,@g_plugin);
end;

procedure TranslateMenu(hMenu: HMENU);
begin
  TranslateMenu_LP(hMenu,@g_plugin);
end;

function Langpack_Register:Pointer;
begin
  cli := Clist_GetInterface();
  result := @g_plugin;
end;


function CreateProtoServiceFunction(const szModule, szService: PAnsiChar; serviceProc: TMIRANDASERVICE): int_ptr;
var
  szStr: array [0..MAXMODULELABELLENGTH*2] of AnsiChar;
begin
  if (szModule=nil) or (szService=nil) then
  begin
    result:=0;
    exit;
  end;
  lstrcpya(@szStr, szModule);
  lstrcata(@szStr, szService);
  Result := CreateServiceFunction(szStr, @serviceProc);
end;


function Menu_AddContextFrameMenuItem(mi:PMO_MenuItem):HGENMENU;
begin
  mi^.pPlugin:=@g_plugin;
  result:=CallService(MS_CLIST_ADDCONTEXTFRAMEMENUITEM, 0,LPARAM(mi));
end;

function Menu_AddMainMenuItem(mi:PMO_MenuItem):HGENMENU;
begin
  mi^.pPlugin:=@g_plugin;
  result:=_AddMainMenuItem(mi);
end;

function Menu_AddContactMenuItem(mi:PMO_MenuItem):HGENMENU;
begin
  mi^.pPlugin:=@g_plugin;
  result:=_AddContactMenuItem(mi, nil);
end;

function Menu_AddStatusMenuItem(mi:PMO_MenuItem):HGENMENU;
begin
  mi^.pPlugin:=@g_plugin;
  result:=_AddStatusMenuItem(mi, nil);
end;

function Menu_AddProtoMenuItem(mi:PMO_MenuItem):HGENMENU;
begin
  mi^.pPlugin:=@g_plugin;
  result:=_AddProtoMenuItem(mi, nil);
end;

function Menu_AddTrayMenuItem(mi:PMO_MenuItem):HGENMENU;
begin
  mi^.pPlugin:=@g_plugin;
  result:=_AddTrayMenuItem(mi);
end;

function Hotkey_Register(hk:PHOTKEYDESC):int_ptr;
begin
	result:=_Hotkey_Register(hk, @g_plugin);
end;

function Skin_AddIcon(si:PSKINICONDESC):THANDLE;
begin
  result:=IcoLib_AddIcon(si, @g_plugin);
end;

procedure Icon_Register(hInst:HINST; const szSection:PAnsiChar; pIcons:pIconItem; iCount:size_t; prefix:PAnsiChar);
begin
	mir_Icon_Register(hInst, szSection, pIcons, iCount, prefix, @g_plugin);
end;

procedure Icon_RegisterW(hInst:HINST; const szSection:PWideChar; pIcons:pIconItemW; iCount:size_t; prefix:PAnsiChar);
begin
	mir_Icon_RegisterW(hInst, szSection, pIcons, iCount, prefix, @g_plugin);
end;

procedure FontRegister(pFontID:pFontID);
begin
   Font_Register(pFontID, @g_plugin);
end;

procedure ColourRegister(pColorID:pColourID);
begin
	Colour_Register(pColorID, @g_plugin);
end;

function TopToolbar_AddButton(pButton:PTTBButton):THANDLE;
begin
  result:=CallService(MS_TTB_ADDBUTTON, WPARAM(pButton), LPARAM(@g_plugin));
end;

function Options_AddPage(wParam:WPARAM; odp:POPTIONSDIALOGPAGE):int_ptr;
begin
  result:=_Options_AddPage(wParam, odp, @g_plugin);
end;

function Options_Open(group,page,tab:PWideChar):int_ptr;
begin
	result:=_Options_Open(group,page,tab,@g_plugin);
end;

procedure Srmm_AddButton(bbdi:pBBButton);
begin
   _Srmm_AddButton(bbdi,@g_plugin);
end;

function UuidFromStringA(StringUuid:PAnsiChar; var Uuid:TGUID) : integer; stdcall; external 'Rpcrt4.dll';

procedure SET_UID(pmi:PMO_MenuItem; strguid:PAnsiChar);
begin
   UuidFromStringA(strguid, pmi.uid);
end;

{$ENDIF}