#ifndef START_MENU_H
#define START_MENU_H
#include <apps.h> 	// Первым! Приложение!
#include <loader.h>
#include <u.h>
#include <mem.h>
#include <utilities.h>
#include <func.h>
#include <charset_conv.h>
#include <file.h>
#include <list_ctrl.h>

#include "../../libuix/include/api.h"
#include "../../libuix/include/cs.h"

#define  ELF_NAME_W			   L"passmgr"
#define  ELF_NAME				"passmgr"
#define  ELF_VER				"v2.0"

#define  DEBUG_APP_NAME			ELF_NAME
#define  LOG_FILE  				L"file://b/"ELF_NAME".log"

#include <tadbg.h> 	// Отладчик

// ----------------------------------------------------------------------------------------- //

/* Эта структура идентифицирует приложение. Передаётся в любой обработчик событий */
typedef struct
{ 
    APPLICATION_T       apt; /* Должно обязательно присутствовать, причём первым */

} APP_ELF_T;

/* Состояния приложения */
typedef enum
{
    APP_STATE_ANY, /* ANY-state всегда первым */
	APP_STATE_MAIN, // Контакт лист.
	APP_STATE_EDIT, // Диалог-Редактора
    APP_STATE_MAX /* Для удобства */
} APP_STATES_T;

typedef enum
{
	LOGIN,
	MAIN,
	EDIT_ITEM,
	
	EDIT_ITEM_NAME,	 		// имя.
	EDIT_ITEM_LOGIN,
	EDIT_ITEM_PASSWORD,
	
	ABOUT, 				// О программе...
	EXIT 				// Выход
}STATES_T;

typedef struct
{
	char		name[16];
	char 		login[16];
	char 		password[32];	// В Base64
		
} PASSWORD_ITEM;

extern LIST 		pass;

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 ); // Выход

static UINT32 MainStateEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );
static UINT32 EditStateEnter( 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 HandleNavigate( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 idx );
static UINT32 HandleSelect( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 idx );
static UINT32 HandleBack( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 param );
static UINT32 HandleNew( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 param );
static UINT32 HandleDelete( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 param );
static UINT32 HandleExit( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );
static UINT32 EditDone( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 l );

static void * MainEntryReq( APPLICATION_T * app, UINT32 idx );

static UINT32 ReadSetting( void ); 	// Читаем конфиг
static UINT32 SaveSetting( void ); 	// Сохраняем конфиг

PASSWORD_ITEM * ElfGetDItem( int i );
static UIX_ICON_T ElfGetIcon( int i );


#ifdef	DEBUG
static void	ReportPhoneInfo( void );
#endif	

#endif
