#ifndef START_MENU_H
#define START_MENU_H

#include <apps.h> // Первым! Приложение!
#include <loader.h>
#include <ATI.h>
#include <paint.h>
#include <u.h>
#include <mem.h>
#include <utilities.h>
#include <func.h>
#include <res_def.h>
#include <charset_conv.h>
#include <obex_mgr.h>

#define  ELF_NAME				"MiniCommander"
#define  ELF_NAME_W			   L"MiniCommander"
#define  ELF_VER				"v0.6"
#define  ELF_VER_W			   L"v0.6"
#define  DEBUG_APP_NAME			ELF_NAME
#define  LOG_FILE  				L"file://b/"ELF_NAME".log"

#include <tadbg.h> 	// Отладчик

/* Эта структура идентифицирует приложение. Передаётся в любой обработчик событий */
typedef struct
{ 
    APPLICATION_T           apt; /* Должно обязательно присутствовать, причём первым */
	UINT16					window; 			// Номер текущего окна.
	UINT32					res; 				// Ресурс для заголовка редактора.
	UINT32       			entries_num;		// кол-во пунктов
	UINT32					entries_num_menu;	// кол-во пунктов в меню
	UINT32                  prev_state;
	
} APP_MC_T;

/* Состояния приложения */
typedef enum
{
    MC_STATE_ANY, /* ANY-state всегда первым */
	MC_STATE_MAIN, // Список файлов.
	MC_STATE_EDIT, // Диалог-Редактора
	MC_STATE_NOTICE, // Диалог-Потвердение.
	MC_STATE_VIEWER, // Просмоторщик.
	MC_STATE_EDIT_PROPS, // Редактор атрибутов.
	MC_STATE_MENU, // Меню.
    MC_STATE_MAX /* Для удобства */
} MC_STATES_T;


typedef enum
{
	MAIN, // Список файлов.
	HELP, // Справка.
	VIEW_FILE, // Простмотреть файла.
	EDIT_FILE, // Редактировать файла.
	COPY_FILE, // Копировать файла.
	PASTE_FILE, // Вставить файл.
	RENAME, //Переименовать.
	CREATE_DIR, // Создать папку.
	CREATE_FILE, // Создать файл.
	DEL_DIR, // Удалить папку.
	ZIP_BROWSER, // 
	ZIP_BROWSER_COPY, //Извлечь из zip - архива.
	ZIP_BROWSER_PASTE, // Вставить из zip - архива.
	EDIT_ATTR, // Редактор атрибутов.
	MAIN_MENU, //  Главное меню.
	FAST_MENU, // Быстрое меню по *.
	OPEN_WITH, // Меню 'Открыть с помошьщью...' по #.
	CHANGE_CP, // Меню выбора кодировки.
	ABOUT // О программе...
}STATES_T;

typedef enum{
    CODE_NULL=0,
    CODE_ANSI, // однабайтовая кодировка
    CODE_UCS2_BE, // UTF-16Big Endian
	CODE_UTF8,
	CODE_UTF8_BOM // UTF-8 с сигнатурой

}CODE_TYPE_T;


typedef struct
{
	WCHAR   	ini[128]; // путь к mc.ini
	WCHAR   	menu[128]; // путь к mc.menu
	WCHAR   	cfg[128];
	
	WCHAR   	*src_copy_name[24]; 
	WCHAR   	*src_copy_uri[24]; // что копируем 
	WCHAR   	*dst_copy_uri[24]; // куда копируем
	WCHAR   	zip_uri[256]; // путь к  zip архиву
	WCHAR   	temp_uri[256]; // куда распаковать файл из zip архива
	FILE        handle; // указатель файла
	UINT32      size; //размер файла
	CODE_TYPE_T code_type; //  кодировка
	UINT32      cur_position; // текущая позиция в файле
	UINT32      page_size; // кол-во байт на экране
	UINT32      s_page_size; // среднестатистическое кол-во байт на странице 
    UINT32      count_pages; // кол-во страниц
    UINT32      num_page; //текущая страница
	WCHAR   	buffer[BUFFER_SIZE+1]; // Полное содержимое файла
    
} FILE_T;// файлы


typedef struct
{
	UINT32 		ev_code; 		// Ивент запуска	
	WCHAR  		temp_dir[128]; // путь к временной папке 
	WCHAR       cur_folder1[272];  // текущая папка, окно 1
	WCHAR       cur_folder2[272];  // текущая папка , окно 2

} SETTING_T;// настройки


typedef struct
{
	WCHAR		name[128]; // имя 
	WCHAR		ext[16]; //расширение
	UINT16		attrib;   // аттрибуты
	BOOL		selected;
} FILEINFO; // Память для списка. Инфа о файлах.

typedef struct
{
	WCHAR name[32]; 	//Имя пункта
	WCHAR value[256];   // Путь
} LINE; // Память для списка-меню

typedef struct
{
	UINT16		item;
	UINT16		sel;
} EDIT;

typedef struct
{
	UINT32		prev;
	UINT32		select;
	UINT32		select1;
	UINT32		select2;
	UINT32		menu;
	UINT32		edit;
} ITEM;


typedef struct
{
	UINT32				Background;  
	UINT32				Lines;
	UINT32				Cursor;
	UINT32				Dir;
	UINT32				App;
	UINT32				Arc;
	UINT32				Pic;
	UINT32				Audio;
	UINT32				Sys;
	UINT32				Def;
} COLOR; // цвета

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 NoticeStateEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );
static UINT32 ViewerStateEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );
static UINT32 EditPropsEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );
static UINT32 MenuStateEnter( 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 ListKeypress( EVENT_STACK_T * ev_st,  APPLICATION_T * app ); // Обработчи клавиатуры в списке файлов.
static UINT32 NoticeKeypress( EVENT_STACK_T * ev_st,  APPLICATION_T * app );
static UINT32 ViewerKeypress( EVENT_STACK_T * ev_st,  APPLICATION_T * app ); // Обработчи клавиатуры в просмоторщике
static UINT32 EditKeypress( EVENT_STACK_T * ev_st,  APPLICATION_T * app ); // Обработчи клавиатуры в редакторе атрибутов.
static UINT32 MenuKeypress( EVENT_STACK_T * ev_st,  APPLICATION_T * app ); // Обработчи клавиатуры в меню.

static UINT32 LoadSkin(void); 

static UINT32 Paint( EVENT_STACK_T *ev_st,  APPLICATION_T *app );
static UINT32 DrawLoadingScreen(WCHAR *text);
static UINT32 DrawMenu(UINT16 index, APPLICATION_T *app);
static UINT32 DrawMenu2(UINT16 index, APPLICATION_T *app);
static UINT32 DrawEditProps(UINT16 index); // Рисует редактор атрубутов.
static UINT32 DrawViewer(void);

static UINT32 DrawList(APPLICATION_T *app);
static UINT32 DrawInfo(APPLICATION_T *app);

static UINT32 MakeContentFromFlie(void); // 
static UINT32 MakeContentAboutFlie(APPLICATION_T *app ); // Инфо о файле
static UINT32 SelectItemList( EVENT_STACK_T *ev_st,  APPLICATION_T *app ); //Выбрать
static UINT32 SelectItemMenu( EVENT_STACK_T *ev_st,  APPLICATION_T *app );//Выбрать в меню
static UINT32 SelectItemMenu2( EVENT_STACK_T *ev_st,  APPLICATION_T *app );//Выбрать в main меню
static UINT32 Save( EVENT_STACK_T *ev_st,  APPLICATION_T *app );

static UINT32 EditOk( EVENT_STACK_T *ev_st,  APPLICATION_T *app );
static UINT32 EditData( EVENT_STACK_T *ev_st,  APPLICATION_T *app );
static UINT32 EditCancel( EVENT_STACK_T *ev_st,  APPLICATION_T *app ); //Обработчик кнопки "Отмена" в редакторе
static UINT32 OpenFile(WCHAR *uri); //Передаем файл в extmgr.elf

static BOOL   IsRoot(void); 
static WCHAR* Language(UINT8 lng);
static void   TestMem(void); // Тест свободной памяти
static void   util_ul2u( UINT32 src, WCHAR * dst, int count );
static BOOL   cmpstr(WCHAR *str1, WCHAR *str2); // сравнить две строки без учёта регистра

static UINT32 ReadSetting(void); // читаем данные из конфига
static UINT32 SaveSetting(APPLICATION_T *app); // записываем в конфиг
static UINT32 Action( EVENT_STACK_T * ev_st,  APPLICATION_T *app );

static UINT32 FindFile( WCHAR *folder, WCHAR *filtr, APPLICATION_T *app); // поиск файлов
static UINT32 UtilCopyFile(WCHAR *src, WCHAR *dst ); // Копирование одного файла
static UINT32 UtilRDelDir(WCHAR *uri, WCHAR *filtr );//  Рекурсивное удаление папки
static UINT32 UtilRGetDirSize( WCHAR *uri );
static UINT32 UtilSetColForFile(UINT32 index);
static UINT32 UtilGetTotalSelectFiles(APPLICATION_T *app);
static UINT32 UtilEditAtt(WCHAR *uri, UINT16 attrib);

static UINT32 ZIP_ReadFileList(WCHAR * uri, APPLICATION_T *app);
static UINT32 ReadMenu(APPLICATION_T *app);

static UINT32 LoadBuffer(INT32 off_set); // грузит чаcть файла в буффер
static UINT32 SizePrevPage(WCHAR *str, UINT8 x, UINT8 y); // размер предидущей страницы в байтах
static UINT32 DrawTextInFullDisplay_(WCHAR *str, UINT8 x, UINT8 y); //Нарисовать текст

#endif