#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 "../src_xmpp/contact_list.h"

#include "../../libuix/include/api.h"
#include "../../libuix/include/cs.h"


#ifdef	EMUELF
#	define  DrawLine			_DrawLine
#	define  DrawRect			_DrawRect
#	define  FillRect			_FillRect
#	define  DrawText			_DrawText
#	define  DrawTextW			_DrawTextW
#endif

#ifdef	DEBUG
#define  ELF_NAME				"mJabber_dbg"
#define  ELF_NAME_W			   L"mJabber_dbg"
#else
#define  ELF_NAME				"mJabber"
#define  ELF_NAME_W			   L"mJabber"
#endif

#define  ELF_VER				"v0.5"
#define  ELF_VER_W			   L"v0.5"
#define  DEBUG_APP_NAME			ELF_NAME
#define  LOG_FILE  				L"file://b/"ELF_NAME".log"

#include <tadbg.h> 	// Отладчик

// ----------------------------------------------------------------------------------------- //

/* Эта структура идентифицирует приложение. Передаётся в любой обработчик событий */
typedef struct
{ 
    APPLICATION_T		apt; /* Должно обязательно присутствовать, причём первым */
	UINT8				last_state;		// Последний стейт приложения до сворачивания
	UINT8       		entries_num;	// Кол-во пунктов в меню.
} APP_ELF_T;

/* Состояния приложения */
typedef enum
{
    APP_STATE_ANY, /* ANY-state всегда первым */
	APP_STATE_INIT, 	// Инитилизация приложения
	APP_STATE_BG, 		// Свернутое состояние.
	APP_STATE_MAIN, 	// Контакт лист.
	APP_STATE_EDIT, 	// Диалог-Редактора
	APP_STATE_VIEWER, 	// Просмоторщик.
	APP_STATE_MENU, 	// Меню.
	APP_STATE_CONNECT, 	// Подключение.
	APP_STATE_SMILES, 	// Диалог выбора смайлов.
	APP_STATE_CHAT,  	// Диалог чата.
	APP_STATE_SETTING,	// Настройки.
    APP_STATE_MAX /* Для удобства */
} APP_STATES_T;


typedef enum
{
	MAIN, 				// Список контактов.
	CHAT,				// Чат
	SET_STATUS, 		// Диалог выбора статуса.
	SET_XSTATUS, 		// Диалог выбора x-статуса.
	CONNECT, 			// Подключение.
	MAIN_MENU, 			// Главное меню.
	SETTINGS, 			// Меню Настройки.
	CONTACT_MENU,		// Контакт меню
	SUBSCRIPTION_MENU,	// Меню Управления подпиской.
	MUC_ENTER_UI,		// Меню входа в конференцию
	CLIENT_INFO, 		// Информация о контакте.
	CONTACT_INFO, 		// Информация о клиенте.
	MSG_VIEWER,
	REGISTRATION,		// Регистрация в транспорте.
	ADD_CONTACT,		// Добавить контакт.
	SELECT_GROUP,		// Диалог выбора группы
	
	ACCOUNTS_SELECT,
	ACCOUNTS_EDIT,
	
	EDIT_MSG,	 		// Редактор сообщения.
	EDIT_URL,	 		// Редактор URL.
	EDIT_STATUS_MSG,	// Редактор статус-сообщения.
	EDIT_XSTATUS_MSG,	// Редактор x-статус-сообщения.
	
	EDIT_LOGIN, 		// Редактировать логин.
	EDIT_SERVER, 		// Редактировать сервер.
	EDIT_PORT, 			// Редактировать порт.
	EDIT_RESOURCE, 		// Редактировать ресурс.
	EDIT_PRIORITY, 		// Редактировать приоритет.
	EDIT_PASSWORD, 		// Редактировать пароль.
	
	
	EDIT_EV_CODE, 		// Редактировать ивент запуска.
	EDIT_TIME_ZONE, 	// Редактировать часовой пояс.
	EDIT_RENAME,		// Переименовать контакт.
	
	EDIT_REG_USERNAME,	
	EDIT_REG_PASSWORD,	
	EDIT_REG_EMAIL,
	
	EDIT_MUC_NICK,		
	EDIT_MUC_PASS,
	EDIT_MUC_MESSAGE_NUM,
	ABOUT, 				// О программе...
	EXIT 				// Выход
}STATES_T;

typedef struct	// Все строки в win-1251
{
	UINT8		account_current;// Индекс текущей учетной записи	
	UINT32 		ev_code; 		// Ивент запуска
	BOOL 		sound_on;		// true - звук включен
	char		time_zone[3]; 	// Часовой пояс
	UINT8		status;			// Обычный статус
	char 		status_msg[7][64]; // Статусные сообщения
	UINT8		xstatus;		// X-статус
	UINT8		muc_ajoin;		// Автовход в конференции
	BOOL		show_off_contacts;// Показывать оффлайн контакты
	UINT8		console;		// Выводить уведомления в консоль EP2.0
	UINT8		color_theme;	// Цветовая схема
	UINT8		volume;			// Громкость
	BOOL		composing_events;// Исходящеее оповещение о наборе
	BOOL		auto_connect;	// Автоподключение
	BOOL		hide_empty_groups;// Скрывать пустые группы
	BOOL		show_app_under_new_msg;	// Развернуть эльф при новом сообщении.
	BOOL		use_uix_editor;	// true - Использовать редактор системы UIX.
	BOOL		save_history;	// true - Хранить историю
	BOOL		zlib_enable;	// true - zlib сжатие включено

} SETTING_T; // настройки

extern SETTING_T 	setting;

typedef struct
{
	UINT8		select;		// положение курсора в настройках
	UINT8		menu;		// в меню
	UINT8		chat;		// в чате
	UINT8		group;		// индекс текущей группы
	UINT8		first_idx;	// индекс первого элемента на экране
	UINT8		sel_account;
	UINT8		connect_percent;	// Процент подключения
	char		connect_text[128];
	UINT8		x;			// 
	UINT8		y;			// Положение курсора смайлика 
} ITEM;

typedef struct
{
	UINT32  text;			// Текст
	UINT32  text2;			// Текст меню
	UINT32  cursor;			// Курсор
	UINT32  cursor2;		// Рамка курсора
	UINT32	clock;			// Часы
	UINT32 	chat;			// Цвет контакта с чатом
	UINT32  background;		// Фон
	UINT32  bg_element;		// Цвет загаловка и софтбара
	UINT32  border;			// Рамка загаловка и софтбара

} COLOR; // цветавая палитра

#define  COLOR_THEME_COUNT	5
extern const char* color_theme[];

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 EditStateEnter( 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 MenuStateEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );
static UINT32 ConnectStateEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );
static UINT32 SmilesStateEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );
static UINT32 ChatStateEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );
static UINT32 SettingStateEnter( 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 HandleUITokenGranted( EVENT_STACK_T * ev_st, APPLICATION_T * app );
static UINT32 HandleTimer( EVENT_STACK_T *ev_st,  APPLICATION_T *app );
static UINT32 HandlePlay( EVENT_STACK_T *ev_st,  APPLICATION_T *app );
static UINT32 HandlePlayComplete( EVENT_STACK_T *ev_st,  APPLICATION_T *app );

static UINT32 HandleReqExit( EVENT_STACK_T *ev_st,  APPLICATION_T *app );	// Выход приложения через PM
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 mode ); // Назад в списке

static UINT32 HandleEditDone( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 l ); // "Done" в редакторе UIX

static UINT32 HandleEditData( EVENT_STACK_T *ev_st,  APPLICATION_T *app );
static UINT32 HandleEditOk( EVENT_STACK_T *ev_st,  APPLICATION_T *app );	// "Ok" в редакторе UIS
static UINT32 HandleEditCancel( EVENT_STACK_T *ev_st,  APPLICATION_T *app ); // "Отмена" в редакторе UIS

// Chat
static UINT32 HandleMessage( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );
static UINT32 HandleContactMenu( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );
static UINT32 HandleCopy( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );	
static UINT32 HandleQuote( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );	// Цитировать
static UINT32 HandlePaste( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );	// Вставить
static UINT32 HandleFreeHistory( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode ); // Очистить историю
static UINT32 HandleDeleteChat( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode ); // Удалить чат
static UINT32 HandleSendUrl( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode ); // Отправить ссылку

static UINT32 HandleUpdateNick( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );	// Обновить ник

static UINT32 HandleSend( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );	// Отправить сообщение
static UINT32 HandleSmiles( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );	// Смайлики
static UINT32 HandleSendTranportRegisterLogin( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );
static UINT32 HandleAccountSelect( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );
static UINT32 HandleAccountAddNew( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );
static UINT32 HandleAccountDelete( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );

//static void * ListEntryReq( APPLICATION_T * app, UINT32 idx );
static void * MenuEntryReq( APPLICATION_T * app, UINT32 idx );
static void * ChatEntryReq( APPLICATION_T * app, UINT32 idx );
static void * SettingEntryReq( APPLICATION_T * app, UINT32 idx );

// Обработчики клавиатуры
static UINT32 ListKeypress( EVENT_STACK_T * ev_st,  APPLICATION_T * app ); // Обработчик клавиатуры в списке контактов.
static UINT32 ConnectKeypress( EVENT_STACK_T * ev_st,  APPLICATION_T * app );// Обработчик клавиатуры в диалоге подключения
static UINT32 SmilesKeypress( EVENT_STACK_T * ev_st,  APPLICATION_T * app ); // Обработчик клавиатуры в диалоге выбора смайлика 

static UINT32 DrawSmiles(void);		// Функция рисования списка смайликов
static UINT32 DrawList( APPLICATION_T *app );	 // Контакт лист

static UINT32 DrawTitleBar(UINT8 icon, const char *text);				// Загаловок
static UINT32 DrawSoftBar(const char *left, const char *right);			// Софт бар
static UINT32 DrawMainSoftBar(void);									// Софт бар контакт листа
static UINT32 DrawScroll( UINT8 pos, UINT8 cnt, UINT8 size );			// Ползунок
	   UINT32 DrawIcon(AHIBITMAP_T *bitmap, UINT8 x, UINT8 y, UINT8 icon_index);

static UINT32 DrawLoadingScreen(char *text, UINT8 percent);	
static UINT32 DrawContact(CONTACT_T *contact, UINT8 x, UINT8 y);

static UINT32 SelectItemMainMenu( EVENT_STACK_T *ev_st,  APPLICATION_T *app );		// Выбрать в главном меню
static UINT32 SelectItemContactMenu( EVENT_STACK_T *ev_st,  APPLICATION_T *app );	// Выбрать в контакт меню
static UINT32 SelectItemSmiles( EVENT_STACK_T *ev_st,  APPLICATION_T *app );		// Выбрать смайлик
static UINT32 SelectItemSubscriptionMenu( EVENT_STACK_T *ev_st,  APPLICATION_T *app ); //

static UINT32 ReadSetting( void ); 	// Читаем конфиг
static UINT32 SaveSetting( void ); 	// Сохраняем конфиг

static UINT32 MsgDb_MsgAdd(char *jid, char *text, UINT8 type);// Добавить сообщение в историю	
static UINT32 MsgDb_LoadDb(char *jid); 			// Загружает до 15ти сообщений из истории в память и возращает число загруженных сообщений 
static UINT32 MsgDb_GetCount(char *jid); 		// Получить число сообщений в базе

static UINT32 LoadTheme( UINT8 theme_index );	// Загрузка цветовой палитры
	   UINT32 InitResouces( void );	// Инит графики

static UINT32 Create( WCHAR *name );	// 
static UINT32 SetVol(BOOL vol); // синхронизация громкости

static UIX_ICON_T ElfGetIcon( AHIBITMAP_T *image, UINT8 i );

static void XMPPProtocolNonify( UINT32 id, char * jid, void * data, UINT32 data_sz );

#ifdef	DEBUG
static void	ReportPhoneInfo( void );
#endif	

#endif
