#ifndef START_MENU_H
#define START_MENU_H
#include <apps.h> 	// Первым! Приложение!
#include <loader.h>
#include <solib.h>
#include <bmp.h>
#include <paint.h>
#include <u.h>
#include <mem.h>
#include <utilities.h>
#include <func.h>
#include <socket.h>
#include <charset_conv.h>
#include <list_ctrl.h>

#ifdef	EMUELF
#	define  DrawLine				_DrawLine
#	define  DrawRect				_DrawRect
#	define  FillRect				_FillRect
#	define  DrawText				_DrawText
#	define  DrawTextW				_DrawTextW
#endif

#define  ELF_NAME					"TaskMgr"
#define  DEBUG_APP_NAME				ELF_NAME
#define  LOG_FILE  					L"file://b/"ELF_NAME".log"

#include <tadbg.h> 	// Отладчик

// ----------------------------------------------------------------------------------------- //

/* Эта структура идентифицирует приложение. Передаётся в любой обработчик событий */
typedef struct
{ 
    APPLICATION_T           apt; /* Должно обязательно присутствовать, причём первым */
	UINT8       			entries_num;		// Кол-во пунктов в меню.
	UINT32                  prev_state; 		// Предидущий стейт, до сворачивания.
	
} APP_ELF_T;

/* Состояния приложения */
typedef enum
{
    APP_STATE_ANY, /* ANY-state всегда первым */
	APP_STATE_MAIN, 		// Контакт лист.
	APP_STATE_BACKGROUND, 	// Свернутое состояние.
    APP_STATE_MAX /* Для удобства */
} APP_STATES_T;


ldrElf * _start( WCHAR * uri, WCHAR * params );

static UINT32 startApp( EVENT_STACK_T *ev_st,  REG_ID_T reg_id,  UINT32 param2 ); 
static UINT32 destroyApp( EVENT_STACK_T *ev_st,  APPLICATION_T *app ); // Выход
	   UINT32 AppChangeState( APPLICATION_T * app, UINT8 new_state, BOOL force_show );
static UINT32 HandleChangeState( EVENT_STACK_T * ev_st, APPLICATION_T * app );

static UINT32 MainStateEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );

static UINT32 StateExit( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  EXIT_STATE_TYPE_T type );

static UINT32 HandleReqExit( EVENT_STACK_T *ev_st,  APPLICATION_T *app );

// Обработчики клавиатуры
static UINT32 ListKeypress( EVENT_STACK_T * ev_st,  APPLICATION_T * app ); // Обработчик клавиатуры в списке контактов.
static UINT32 DrawList( APPLICATION_T *app );	 // Контакт лист

static UINT32 	ElfGetCount( void );
static ldrElf * ElfGet( UINT32 index );
static UINT32 	ElfRestore( UINT32 index );
static UINT32 	ElfUnLoad( UINT32 index );

#ifdef	DEBUG
static void	ReportPhoneInfo( void );
#endif	

#endif
