#ifndef LBUFFER_H
#define LBUFFER_H

#include "GR_types.h"
#include "OS_types.h"

//Souhrn zvlastnich znaku
typedef enum SPECIAL_CHARS
{
	BEL = 7,
	BS = 8,
	HT = 9,
	VT = 10,
	FF = 12,
	ESC = 27,
}SPECIAL_CHARS;

//Rozmery konzole
#define CONSOLE_WIDTH 61
#define CONSOLE_HEIGHT 17

//Trida zahrnujici v sobe veskerou praci s konzolovymi daty. Zajistuje jejich tisk, 
//formatovani a zpracovani
class LBuffer
{
private:

	//Ukazatele potrebne pro sestaveni konzoloveho obrazoveho bufferu
	FORMATED_CHAR *primary[CONSOLE_HEIGHT];
	FORMATED_CHAR *alternative[CONSOLE_WIDTH];
	FORMATED_CHAR primaryLines[CONSOLE_HEIGHT][CONSOLE_WIDTH];
	FORMATED_CHAR alternativeLines[CONSOLE_HEIGHT][CONSOLE_WIDTH];
	FORMATED_CHAR **data;
	int offset;
	int top;
	int ctr;
	
	CURSOR_STATE CursorState;					//Aktualni stav kurzoru
	
	CURSOR_STATE SavedCursorState;				//Ulozeny stav kurzoru
	ANSWER ApplicationCursorKeys;				//typ kurozorových kláves
	char ScreenName[20];						//Název okna
	unsigned char currentColor;					//Aktuální barva
	char currentAttrs;							//Atributy textu
	char wrapping;								//Zalamování
	POSITION Cursor;							//Pozice kurzoru
	POSITION SavedCursor;						//Ulozena pozice kurzoru
	char scrolling;								//Posuny (není implementováno)					
	int scrollStart;						
	int scrollStop;
	void createLine(void);						//Vytvoření prázdného radku
	//LBuffer(void);
public:
	int length;									//Rozmer Y
	int lineLength;								//Rozmer X
	unsigned char * GetScreenName(void);		//Vraci nazev konzole
	int getLength(void);						//Vraci rozmer Y	
	int getLineLength(void);					//Vraci rozmer X
	void insertLine(unsigned char * input);		//Vlozi radek
	void insertData(unsigned char* input);		//Vlozi data ke zpracovani
	void Reset(void);							//Castecny reset
	int PrintLine(int line);					//Tisk formatovaneho textu
	LBuffer(void);								//Vychozi konstruktor
	void deleteLine(int line);					//Vymazani radku
	void deleteLine(int line, int start, int stop);
	~LBuffer(void);								//Destruktor
	void SaveCursor(void);						//Ulozi kurzor
	void RestoreCursor(void);					//Obnovi kurzor
	CURSOR_STATE* GetCursorState(void)			//Vraci stav kurzoru
			{return &this->CursorState;};
	friend char ParseEscape(LBuffer * curr, int maxLength, unsigned	char* input);//Pratelska funkce pro zpracovani xterm dat
        void Init(void);						//Init - rucni zavolani vychoziho konstruktoru
};

#define LBUFFER_OFFSET 1
char ParseEscape(LBuffer * curr, int maxLength, unsigned char* input);


#endif