/*********************************************************************//**
*	\brief Passworder.
*	realizuje objekt, na kterem je traba zadat ciselny kod, aby 
*	doslo k aktivaci.
*	
*	\author Michal Jirous
*	\date 23.04.2009
*	\file ent_func_passworder.h
**********************************************************************/

#ifndef __PASSWORDER_H__
#define __PASSWORDER_H__

#include "ent_basefunction.h"
#include "ent_environments.h"

const unsigned PASSWORD_MAX_LENGTH = 8;

const std::string BUTTONS_SOUND = "Buttons/button_pass.wav";



class Passworder : public CBaseFunction
{

	struct PickElem
	{
		GLuint m_uiSelectList;
		GLuint m_uiHighLightList;
		unsigned char m_Color[3];
		PickElem()
		{
			m_Color[0] = 0;
			m_Color[1] = 0;
			m_Color[2] = 0;
		}
		int m_iCommand;
		float x, y, w, h;
	};
	
	enum ids
	{
		NUMBER_1 = 1,
		NUMBER_2,
		NUMBER_3,
		NUMBER_4,
		NUMBER_5,
		NUMBER_6,
		NUMBER_7,
		NUMBER_8,
		NUMBER_9,
		COMMAND_X,	//od zdola doprava
		NUMBER_0,
		COMMAND_OK,
	};

	enum statuses
	{
		LOCKED = 0,
		UNLOCKED,
		WRONG
	};


	float m_fXAdapt, m_fYAdapt;
	float m_fLabelX, m_fLabelY, m_fLabelW, m_fLabelH;

	std::string m_sCurrentInsertedPassword;
	std::string m_sButtonMap;
	float m_fTotalWidth, m_fTotalHeight;
	GLuint m_uiPickingDList;
	
	//alg::PasiveModelPlane *m_pFace;

	alg::Point m_MyCenterPoint;

	int m_iStatus;
	float m_fAngle;
	float m_fZAngle, m_fXAngle;
	Uint32 m_uiWrongResetTime;
	Uint32 m_uiResetTime;
	std::string m_sPassword;
	Font *m_pDigitsFont;
	float m_fLabelScale;
	float m_fAlpha;
	GLuint m_uiDigitsDList;
	Uint32 m_uiFadeOutTime;
	
	
	GLuint m_transformationDList;
	void drawMyFace();
	void createPickingDList();
	void command( int c );
	void addPasswordChar( char c );
	void trigger();
	void createDigits();
	void createControlPanel();		//vytvori plochy z pixelu obrazky, kde je 100% pruhlednost
	void generatePassWord();
	
	
	
	std::list<PickElem> m_Elements;	//toto jsou plochy vznikle z funkce createControlPanel;
	Face* m_pFace;
	int m_iPassWordLength;
	std::string m_sTargetTexts;
	std::list<EnvText*> m_TargetTexts;	//texty, kde se ma zobrazit aktualni heslo
	virtual void passStoredEvent( BackTimeData &backData );

	SoundElement m_LockedSound, m_UnlockSound, m_ButtonSound;
public:
	Passworder();
	virtual void goBackInTime();
	virtual void setParameters( parameters_t &parametersMap );
	virtual void compile();
	virtual void decompile();

	virtual void onUsage( const RayTraceData &rayData );
	virtual void update( float seconds );
	virtual void render( RenderData &renderData );
	virtual void restart();
};

LINK_ENTITY_TO_CLASS( func_passworder, Passworder );

#endif

