#include "..\..\Global\Variablen.h"
#include "Geheimnis.h"
#include "..\..\Global\Initialisierung.h"
#include <Punkt.h>
#include <Text.h>

// Inhalt der GeheimnisÄndern Klasse aus Geheimnis.h
// Konstruktor
GeheimnisÄndern::GeheimnisÄndern( Schrift *zSchrift, Fenster *zVorLoginFenster )
{
	Punkt bildschirmmitte = Bildschirmmitte();
	geheimnisÄndern = initKnopf( 10, 250, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Geheimnis ändern" );
	geheimnisÄndern->setMausEreignisParameter( this );
	geheimnisÄndern->setMausEreignis( geheimnisÄndernGeheimnisÄndernME );
	initToolTip( geheimnisÄndern, "Account Geheimnis ändern.", zSchrift->getThis(), hauptScreen );
	zVorLoginFenster->addMember( geheimnisÄndern );
	fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 100, 250, 200, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Geheimnis ändern" );
	name = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
	name->setTastaturEreignisParameter( this );
	name->setTastaturEreignis( geheimnisÄndernNameTE );
	initToolTip( name, "Account Name.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( name );
	passwort = initTextFeld( 20, 50, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
	passwort->setTastaturEreignisParameter( this );
	passwort->setTastaturEreignis( geheimnisÄndernPasswortTE );
	initToolTip( passwort, "Account Passwort.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( passwort );
	geheimnis = initTextFeld( 20, 80, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Geheimis" );
	geheimnis->setTastaturEreignisParameter( this );
	geheimnis->setTastaturEreignis( geheimnisÄndernGeheimnisTE );
	initToolTip( geheimnis, "Account Geheimni.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( geheimnis );
	nGeheimnis = initTextFeld( 20, 110, 208, 20, zSchrift, TextFeld::Style::TextFeld, "neues Geheimnis" );
	nGeheimnis->setTastaturEreignisParameter( this );
	nGeheimnis->setTastaturEreignis( geheimnisÄndernNGeheimnisTE );
	initToolTip( nGeheimnis, "Neues Account Geheimnis.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( nGeheimnis );
	weiter = initKnopf( 74, 140, 100, 20, zSchrift, Knopf::Style::Sichtbar, "weiter" );
	weiter->setMausEreignisParameter( this );
	weiter->setMausEreignis( geheimnisÄndernWeiterME );
	nachricht = initTextFeld( 0, 5, 255, 150, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
	fenster->addMember( nachricht );
	fenster->addMember( weiter );
	zVorLoginFenster->addMember( fenster );
	ref = 1;
}

// Destruktor
GeheimnisÄndern::~GeheimnisÄndern()
{
	if( geheimnisÄndern )
		geheimnisÄndern = geheimnisÄndern->release();
	if( fenster )
		fenster = fenster->release();
	if( name )
		name = name->release();
	if( passwort )
		passwort = passwort->release();
	if( geheimnis )
		geheimnis = geheimnis->release();
	if( nGeheimnis )
		nGeheimnis = nGeheimnis->release();
	if( weiter )
		weiter = weiter->release();
	if( nachricht )
		nachricht = nachricht->release();
}

// Privat
void GeheimnisÄndern::zeigeNachricht( const char *txt )
{
	Punkt bildschirmmitte = Bildschirmmitte();
	name->löscheStyle( TextFeld::Style::Sichtbar );
	passwort->löscheStyle( TextFeld::Style::Sichtbar );
	geheimnis->löscheStyle( TextFeld::Style::Sichtbar );
	nGeheimnis->löscheStyle( TextFeld::Style::Sichtbar );
	fenster->setGröße( 250, 150 );
	fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 75 );
	weiter->setPosition( 139, 100 );
	weiter->setText( "Ok" );
	nachricht->setText( txt );
	if( nachricht->zText()->getLänge() > 30 )
	{
		int pos = -1;
		bool set = 0;
		int lastp = 0;
		for( int i = 20; i < nachricht->zText()->getLänge(); )
		{
			char *tmp = &nachricht->zText()->getText()[ i ];
			while( *tmp != ' ' && i < nachricht->zText()->getLänge() )
			{
				tmp++;
				i++;
				if( i - 30 >= lastp )
				{
					if( set )
					{
						lastp = pos;
						set = 0;
						nachricht->zText()->getText()[ pos ] = '\n';
					}
					else
						lastp += 5;
				}
			}
			if( i < nachricht->zText()->getLänge() )
			{
				pos = i;
				set = 1;
				tmp++;
				i++;
			}
		}
	}
	nachricht->addStyle( TextFeld::Style::Sichtbar );
}

// Knopfdruck
void GeheimnisÄndern::druckFremdKnopf() // Ein anderer Knopf wurde gedrückt
{
	fenster->löscheStyle( Fenster::Style::Sichtbar );
	registerKlient->trenne();
	geheimnisÄndern->setLinienRahmenBreite( 2 );
	geheimnisÄndern->setAlphaFeldFarbe( 0x5500FF00 );
	geheimnisÄndern->setAlphaFeldStärke( -5 );
}

bool GeheimnisÄndern::geheimnisÄndernME( void *obj, MausEreignis me ) // MausEreignis im Knopf geheimnisÄndern
{
	if( me.id == ME_RLinks )
	{
		vorLogin->setGeheimnisÄndern();

		geheimnisÄndern->setLinienRahmenBreite( 3 );
		geheimnisÄndern->setAlphaFeldFarbe( 0xFF000000 );
		geheimnisÄndern->setAlphaFeldStärke( 20 );
		Punkt bildschirmmitte = Bildschirmmitte();
		fenster->setGröße( 255, 200 );
		fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 100 );
		fenster->addStyle( Fenster::Style::Sichtbar );
		nachricht->löscheStyle( TextFeld::Style::Sichtbar );
		weiter->setText( "weiter" );
		weiter->setPosition( 75, 140 );
		name->addStyle( TextFeld::Style::Sichtbar );
		passwort->addStyle( TextFeld::Style::Sichtbar );
		geheimnis->addStyle( TextFeld::Style::Sichtbar );
		nGeheimnis->addStyle( TextFeld::Style::Sichtbar );
		name->addStyle( TextFeld::Style::Fokus );
		name->setAuswahl( name->zText()->getLänge(), 0 );
	}
	return 1;
}

bool GeheimnisÄndern::nameTE( void *obj, TastaturEreignis te ) // Tastaturereignis im Textfeld name
{
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Release && ( te.taste == T_Enter || te.taste == T_Tab ) )
	{
		name->löscheStyle( TextFeld::Style::Fokus );
		passwort->addStyle( TextFeld::Style::Fokus );
		passwort->setAuswahl( passwort->zText()->getLänge(), 0 );
	}
	if( name->zText()->getLänge() >= 25 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool GeheimnisÄndern::passwortTE( void *obj, TastaturEreignis te ) // Tastaturereignis im Textfeld passwort
{
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Press )
		passwort->setSchowChar( '*' );
	if( te.id == TE_Release && ( te.taste == T_Enter || te.taste == T_Tab ) )
	{
		passwort->löscheStyle( TextFeld::Style::Fokus );
		geheimnis->addStyle( TextFeld::Style::Fokus );
		geheimnis->setAuswahl( geheimnis->zText()->getLänge(), 0 );
	}
	if( passwort->zText()->getLänge() >= 25 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool GeheimnisÄndern::geheimnisTE( void *obj, TastaturEreignis te ) // Tastaturereignis im Textfeld geheimnis
{
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Press )
		geheimnis->setSchowChar( '*' );
	if( te.id == TE_Release && ( te.taste == T_Enter || te.taste == T_Tab ) )
	{
		geheimnis->löscheStyle( TextFeld::Style::Fokus );
		nGeheimnis->addStyle( TextFeld::Style::Fokus );
		nGeheimnis->setAuswahl( nGeheimnis->zText()->getLänge(), 0 );
	}
	if( geheimnis->zText()->getLänge() >= 50 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool GeheimnisÄndern::nGeheimnisTE( void *obj, TastaturEreignis te ) // Tastaturereignis im Textfeld nGeheimnis
{
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Release && te.taste == T_Enter )
	{
		nGeheimnis->löscheStyle( TextFeld::Style::Fokus );
		MausEreignis me;
		me.id = ME_RLinks;
		weiterME( 0, me );
	}
	if( nGeheimnis->zText()->getLänge() >= 25 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool GeheimnisÄndern::weiterME( void *obj, MausEreignis me ) // MausEreignis im Knopf weiter
{
	if( me.id == ME_RLinks )
	{
		if( weiter->zText()->istGleich( "weiter" ) )
		{
			if( name->zText()->getLänge() == 0 )
				zeigeNachricht( "Bitte gebe deinen Accountnamen ein." );
			if( passwort->zText()->getLänge() == 0 )
				zeigeNachricht( "Bitte gebe dein Accountpasswort ein." );
			if( geheimnis->zText()->getLänge() == 0 )
				zeigeNachricht( "Bitte gebe dein Accountgeheimnis ein." );
			if( nGeheimnis->zText()->getLänge() == 0 )
				zeigeNachricht( "Bitte gebe ein neues Accountgeheimnis ein." );
			if( weiter->zText()->istGleich( "Ok" ) )
				return 1;
			new AktionsThread( 10, name->zText()->getText(), passwort->zText()->getText(), geheimnis->zText()->getText(), nGeheimnis->zText()->getText(), 0 );
		}
		else
		{
			Punkt bildschirmmitte = Bildschirmmitte();
			fenster->setGröße( 255, 200 );
			fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 100 );
			fenster->addStyle( Fenster::Style::Sichtbar );
			nachricht->löscheStyle( TextFeld::Style::Sichtbar );
			weiter->setText( "weiter" );
			weiter->setPosition( 75, 140 );
			name->addStyle( TextFeld::Style::Sichtbar );
			passwort->addStyle( TextFeld::Style::Sichtbar );
			geheimnis->addStyle( TextFeld::Style::Sichtbar );
			nGeheimnis->addStyle( TextFeld::Style::Sichtbar );
			name->addStyle( TextFeld::Style::Fokus );
			name->setAuswahl( name->zText()->getLänge(), 0 );
		}
	}
	return 1;
}

void GeheimnisÄndern::setResult( bool ret ) // Setzt den Returnwert
{
	if( ret )
		zeigeNachricht( "Geheimnis erfolgreich geändert." );
	else if( registerKlient->getLetzterFehler() )
		zeigeNachricht( registerKlient->getLetzterFehler() );
	else
		zeigeNachricht( "Es ist ein Unbekannter Fehler aufgetreten." );
}

// Reference Counting
GeheimnisÄndern *GeheimnisÄndern::getThis()
{
	ref++;
	return 0;
}

GeheimnisÄndern *GeheimnisÄndern::release()
{
	ref--;
	if( !ref )
		delete this;
	return 0;
}


// Inhalt der GeheimnisVergessen Klasse aus Geheimnis.h
// Konstruktor
GeheimnisVergessen::GeheimnisVergessen( Schrift *zSchrift, Fenster *zVorLoginFenster )
{
	Punkt bildschirmmitte = Bildschirmmitte();
	geheimnisVergessen = initKnopf( 10, 370, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Geheimnis vergessen" );
	geheimnisVergessen->setMausEreignisParameter( this );
	geheimnisVergessen->setMausEreignis( geheimnisVergessenGeheimnisVergessenME );
	initToolTip( geheimnisVergessen, "Account Geheimnis per E-Mail senden.", zSchrift->getThis(), hauptScreen );
	zVorLoginFenster->addMember( geheimnisVergessen );
	fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 70, 250, 140, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Geheimnis vergessen" );
	name = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
	name->setTastaturEreignisParameter( this );
	name->setTastaturEreignis( geheimnisVergessenNameTE );
	initToolTip( name, "Account Name.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( name );
	passwort = initTextFeld( 20, 50, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
	passwort->setTastaturEreignisParameter( this );
	passwort->setTastaturEreignis( geheimnisVergessenPasswortTE );
	initToolTip( passwort, "Account Passwort.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( passwort );
	weiter = initKnopf( 74, 80, 100, 20, zSchrift, Knopf::Style::Sichtbar, "weiter" );
	weiter->setMausEreignisParameter( this );
	weiter->setMausEreignis( geheimnisVergessenWeiterME );
	nachricht = initTextFeld( 0, 5, 255, 150, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
	fenster->addMember( nachricht );
	fenster->addMember( weiter );
	zVorLoginFenster->addMember( fenster );
	ref = 1;
}

// Destruktor
GeheimnisVergessen::~GeheimnisVergessen()
{
	if( geheimnisVergessen )
		geheimnisVergessen = geheimnisVergessen->release();
	if( fenster )
		fenster = fenster->release();
	if( name )
		name = name->release();
	if( passwort )
		passwort = passwort->release();
	if( weiter )
		weiter = weiter->release();
	if( nachricht )
		nachricht = nachricht->release();
}

// Privat
void GeheimnisVergessen::zeigeNachricht( const char *txt )
{
	Punkt bildschirmmitte = Bildschirmmitte();
	name->löscheStyle( TextFeld::Style::Sichtbar );
	passwort->löscheStyle( TextFeld::Style::Sichtbar );
	fenster->setGröße( 250, 150 );
	fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 75 );
	weiter->setPosition( 139, 100 );
	weiter->setText( "Ok" );
	nachricht->setText( txt );
	if( nachricht->zText()->getLänge() > 30 )
	{
		int pos = -1;
		bool set = 0;
		int lastp = 0;
		for( int i = 20; i < nachricht->zText()->getLänge(); )
		{
			char *tmp = &nachricht->zText()->getText()[ i ];
			while( *tmp != ' ' && i < nachricht->zText()->getLänge() )
			{
				tmp++;
				i++;
				if( i - 30 >= lastp )
				{
					if( set )
					{
						lastp = pos;
						set = 0;
						nachricht->zText()->getText()[ pos ] = '\n';
					}
					else
						lastp += 5;
				}
			}
			if( i < nachricht->zText()->getLänge() )
			{
				pos = i;
				set = 1;
				tmp++;
				i++;
			}
		}
	}
	nachricht->addStyle( TextFeld::Style::Sichtbar );
}

// Knopfdruck
void GeheimnisVergessen::druckFremdKnopf() // Ein anderer Knopf wurde gedrückt
{
	fenster->löscheStyle( Fenster::Style::Sichtbar );
	registerKlient->trenne();
	geheimnisVergessen->setLinienRahmenBreite( 2 );
	geheimnisVergessen->setAlphaFeldFarbe( 0x5500FF00 );
	geheimnisVergessen->setAlphaFeldStärke( -5 );
}

bool GeheimnisVergessen::geheimnisVergessenME( void *obj, MausEreignis me ) // MausEreignis im Knopf geheimnisVergessen
{
	if( me.id == ME_RLinks )
	{
		vorLogin->setGeheilnisVergessen();

		geheimnisVergessen->setLinienRahmenBreite( 3 );
		geheimnisVergessen->setAlphaFeldFarbe( 0xFF000000 );
		geheimnisVergessen->setAlphaFeldStärke( 20 );
		Punkt bildschirmmitte = Bildschirmmitte();
		fenster->setGröße( 255, 140 );
		fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 70 );
		fenster->addStyle( Fenster::Style::Sichtbar );
		nachricht->löscheStyle( TextFeld::Style::Sichtbar );
		weiter->setText( "weiter" );
		weiter->setPosition( 75, 80 );
		name->addStyle( TextFeld::Style::Sichtbar );
		passwort->addStyle( TextFeld::Style::Sichtbar );
		name->addStyle( TextFeld::Style::Fokus );
		name->setAuswahl( name->zText()->getLänge(), 0 );
	}
	return 1;
}

bool GeheimnisVergessen::nameTE( void *obj, TastaturEreignis te ) // Tastaturereignis im Textfeld name
{
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Release && ( te.taste == T_Enter || te.taste == T_Tab ) )
	{
		name->löscheStyle( TextFeld::Style::Fokus );
		passwort->addStyle( TextFeld::Style::Fokus );
		passwort->setAuswahl( passwort->zText( )->getLänge( ), 0 );
	}
	if( name->zText( )->getLänge( ) >= 25 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool GeheimnisVergessen::passwortTE( void *obj, TastaturEreignis te ) // Tastaturereignis im Textfeld passwort
{
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Press )
		passwort->setSchowChar( '*' );
	if( te.id == TE_Release && te.taste == T_Enter )
	{
		passwort->löscheStyle( TextFeld::Style::Fokus );
		MausEreignis me;
		me.id = ME_RLinks;
		weiterME( 0, me );
	}
	if( passwort->zText( )->getLänge( ) >= 25 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool GeheimnisVergessen::weiterME( void *obj, MausEreignis me ) // MausEreignis im Knopf weiter
{
	if( me.id == ME_RLinks )
	{
		if( weiter->zText()->istGleich( "weiter" ) )
		{
			if( name->zText()->getLänge() == 0 )
				zeigeNachricht( "Bitte gebe deinen Accountnamen ein." );
			if( passwort->zText()->getLänge() == 0 )
				zeigeNachricht( "Bitte gebe dein Accountpasswort ein." );
			if( weiter->zText()->istGleich( "Ok" ) )
				return 1;
			new AktionsThread( 11, name->zText()->getText(), passwort->zText()->getText(), 0, 0, 0 );
		}
		else
		{
			Punkt bildschirmmitte = Bildschirmmitte();
			fenster->setGröße( 255, 140 );
			fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 70 );
			fenster->addStyle( Fenster::Style::Sichtbar );
			nachricht->löscheStyle( TextFeld::Style::Sichtbar );
			weiter->setText( "weiter" );
			weiter->setPosition( 75, 80 );
			name->addStyle( TextFeld::Style::Sichtbar );
			passwort->addStyle( TextFeld::Style::Sichtbar );
			name->addStyle( TextFeld::Style::Fokus );
			name->setAuswahl( name->zText()->getLänge(), 0 );
		}
	}
	return 1;
}

void GeheimnisVergessen::setResult( bool ret ) // Setzt den Returnwert
{
	if( ret )
		zeigeNachricht( "Dir wurde eine E-Mail mit deinem Accountgeheimnis gesendet." );
	else if( registerKlient->getLetzterFehler() )
		zeigeNachricht( registerKlient->getLetzterFehler() );
	else
		zeigeNachricht( "Es ist ein Unbekannter Fehler aufgetreten." );
}

// Reference Counting
GeheimnisVergessen *GeheimnisVergessen::getThis()
{
	ref++;
	return this;
}

GeheimnisVergessen *GeheimnisVergessen::release()
{
	ref--;
	if( !ref )
		delete this;
	return 0;
}


// messages
bool geheimnisÄndernGeheimnisÄndernME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (GeheimnisÄndern*)p )->geheimnisÄndernME( obj, me );
}

bool geheimnisÄndernNameTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (GeheimnisÄndern*)p )->nameTE( obj, te );
}

bool geheimnisÄndernPasswortTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (GeheimnisÄndern*)p )->passwortTE( obj, te );
}

bool geheimnisÄndernGeheimnisTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (GeheimnisÄndern*)p )->geheimnisTE( obj, te );
}

bool geheimnisÄndernNGeheimnisTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (GeheimnisÄndern*)p )->nGeheimnisTE( obj, te );
}

bool geheimnisÄndernWeiterME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (GeheimnisÄndern*)p )->weiterME( obj, me );
}


bool geheimnisVergessenGeheimnisVergessenME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (GeheimnisVergessen*)p )->geheimnisVergessenME( obj, me );
}

bool geheimnisVergessenNameTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (GeheimnisVergessen*)p )->nameTE( obj, te );
}

bool geheimnisVergessenPasswortTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (GeheimnisVergessen*)p )->passwortTE( obj, te );
}

bool geheimnisVergessenWeiterME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (GeheimnisVergessen*)p )->weiterME( obj, me );
}