#include "SpieleKaufen.h"
#include <Rahmen.h>
#include <Punkt.h>
#include "../../../Global/Initialisierung.h"
#include "../../../Global/Variablen.h"
#include <DateiSystem.h>
#include <AlphaFeld.h>
#include <KSGTDatei.h>

void SpielKaufenKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
{
	if( !p )
		return;
	( (SpieleKaufenAuswahl*)p )->ksgsAktion( parameter, retVal );
}

// Inhalt der SpieleKaufenAuswahl Klasse aus SpieleKaufen.h
// Konstruktor
SpieleKaufenAuswahl::SpieleKaufenAuswahl( Schrift *zSchrift )
{
	spielId = 0;
	alpha = 0;
	ksgs = dllDateien->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
	if( ksgs )
	{
		KSGSGetZeichnung getKSGScript = (KSGSGetZeichnung)GetProcAddress( ksgs, KSGS_START_FUNKTION );
		if( getKSGScript )
		{
			fenster = getKSGScript();
			fenster->setBildschirmZ( hauptScreen->getThis() );
			fenster->setSchriftZ( zSchrift->getThis() );
			fenster->setGröße( 555, 380 );
			fenster->setRückrufParam( this );
			fenster->setRückrufFunktion( SpielKaufenKSGSAktion );
		}
		else
		{
			fenster = 0;
			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
														  new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
																	"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
														  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
		}
	}
	else
	{
		fenster = 0;
		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
													  new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
													  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
	}
	ram = new LRahmen();
	ram->setGröße( 555, 380 );
	ram->setFarbe( 0xFFFFFFFF );
	laden = ( Framework::Animation2D* )ladeAnimation->dublizieren();
	laden->setPosition( 252, 165 );
	laden->setSichtbar( 0 );
	pos = Punkt( 220, 55 );
	aktion = 0;
	ref = 1;
}

// Destruktor
SpieleKaufenAuswahl::~SpieleKaufenAuswahl()
{
	if( run )
		warteAufThread( 2000 );
	if( run )
		ende();
	if( fenster )
	{
		fenster->zurücksetzen();
		fenster->release();
	}
	ram->release();
	laden->release();
	if( ksgs )
		dllDateien->releaseDLL( "KSGScript.dll" );
}

// nicht constant
void SpieleKaufenAuswahl::ladeSpielSeite( int id )
{
	if( run )
		warteAufThread( 2000 );
	if( run )
		return;
	spielId = id;
	aktion = 1;
	start();
}

void SpieleKaufenAuswahl::reset()
{
	if( run )
		warteAufThread( 2000 );
	if( run )
		return;
	aktion = 0;
	start();
}

void SpieleKaufenAuswahl::thread()
{
	laden->setSichtbar( 1 );
	if( !aktion || spielId )
	{
		while( alpha )
			Sleep( 100 );
		if( !aktion )
			spielId = 0;
		if( fenster )
			fenster->zurücksetzen();
	}
	if( aktion )
	{
		while( alpha )
			Sleep( 100 );
		shopKlient->ladeSpielSeite( spielId );
		Text *pfad = new Text( "data/tmp/shop/kaufen/spiele/" );
		pfad->anhängen( spielId );
		pfad->anhängen( "/seite.ksgs" );
		if( fenster )
		{
			fenster->setScriptDatei( pfad );
			fenster->neuLaden();
		}
	}
	laden->setSichtbar( 0 );
	run = 0;
}

void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
{
	KSGSVariable *befehl = parameter->z( 0 );
	if( !befehl )
		return;
	Text *b = befehl->getText();
	if( !b )
		return;
	if( b->istGleich( "GetBesitzStatus" ) )
	{
		int besitz = shopKlient->getSpielBesitzStatus( spielId );
		KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
		if( getKSGSVariable )
		{
			KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += besitz ).getText() };
			*retVal = getKSGSVariable( fenster, &def );
		}
		else
		{
			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
														  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
																	"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
														  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
		}
		b->release();
		return;
	}
	if( b->istGleich( "GetPreis" ) )
	{
		KSGSVariable *version = parameter->z( 1 );
		if( !version )
		{
			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
														  new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
																	"Sie könnte eventuell nicht richtig funktionieren." ),
														  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
		}
		else
		{
			bool testVersion = !version->getInt();
			int preis = shopKlient->getSpielPreis( spielId, testVersion );
			KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
			if( getKSGSVariable )
			{
				KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += preis ).getText() };
				*retVal = getKSGSVariable( fenster, &def );
			}
			else
			{
				nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
															  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
																		"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
															  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
			}
		}
		b->release();
		return;
	}
	if( b->istGleich( "GetTestVersionVerbleibend" ) )
	{
		int verbleibend = shopKlient->getSpielTestversion( spielId );
		KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
		if( getKSGSVariable )
		{
			KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += verbleibend ).getText() };
			*retVal = getKSGSVariable( fenster, &def );
		}
		else
		{
			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
														  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
																	"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
														  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
		}
		b->release();
		return;
	}
	if( b->istGleich( "GetErwerbbarStatus" ) )
	{
		int erwerbbar = shopKlient->istSpielErwerbbar( spielId );
		KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
		if( getKSGSVariable )
		{
			KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += erwerbbar ).getText() };
			*retVal = getKSGSVariable( fenster, &def );
		}
		else
		{
			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
														  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
																	"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
														  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
		}
		b->release();
		return;
	}
	if( b->istGleich( "GetKupfer" ) )
	{
		int kupfer = infoKlient->getKupfer();
		KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
		if( getKSGSVariable )
		{
			KSGSVariableDef def = { KSGS_INT, 0, 3, ( Text() += kupfer ).getText() };
			*retVal = getKSGSVariable( fenster, &def );
		}
		else
		{
			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
														  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
																	"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
														  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
		}
		b->release();
		return;
	}
	if( b->istGleich( "Kaufen" ) )
	{
		KSGSVariable *version = parameter->z( 1 );
		if( !version )
		{
			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
														  new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
																	"Sie könnte eventuell nicht richtig funktionieren." ),
														  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
		}
		else
		{
			bool testVersion = !version->getInt();
			if( !shopKlient->spielErwerben( spielId, testVersion ) )
			{
				nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
															  new Text( "Das Spiel konnte nicht erworben werden." ),
															  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
			}
			else
			{
				int dgId = infoKlient->getDateiGruppeIdVonSpiel( spielId );
				if( dgId )
				{
					KSGTDatei *dg = new KSGTDatei( "data/dg.ksgt" );
					dg->laden();
					bool gefunden = 0;
					for( int i = 0; i < dg->getZeilenAnzahl(); i++ )
					{
						if( dg->zFeld( i, 0 ) && TextZuInt( dg->zFeld( i, 0 )->getText(), 10 ) == dgId )
						{
							gefunden = 1;
							break;
						}
					}
					if( !gefunden )
					{
						for( int i = 0; i < dg->getZeilenAnzahl(); i++ )
						{
							if( dg->zFeld( i, 3 ) && !dg->zFeld( i, 3 )->istGleich( "SOFORT" ) && !dg->zFeld( i, 3 )->istGleich( "NICHT" ) )
							{
								int platz = TextZuInt( dg->zFeld( i, 3 )->getText(), 10 ) + 1;
								Text *plT = new Text();
								plT->anhängen( platz );
								dg->zFeld( i, 3 )->setText( plT );
							}
						}
						Text *idT = new Text();
						idT->anhängen( dgId );
						Text *pfad = infoKlient->getDateiGruppePfad( dgId );
						if( pfad )
						{
							RCArray< Text > *zeile = new RCArray< Text >();
							zeile->add( idT );
							zeile->add( pfad );
							zeile->add( new Text( "0" ) );
							zeile->add( new Text( "0" ) );
							dg->addZeile( 4, zeile );
						}
						else
							idT->release();
					}
					dg->speichern();
					dg->release();
				}
			}
			if( run )
				warteAufThread( 2000 );
			if( run )
			{
				b->release();
				return;
			}
			aktion = 1;
			start();
		}
		b->release();
		return;
	}
	if( b->istGleich( "GetBild" ) )
	{
		KSGSVariable *pfad = parameter->z( 1 );
		KSGSVariable *name = parameter->z( 2 );
		if( !pfad || !name )
		{
			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
														  new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
																	"Sie könnte eventuell nicht richtig funktionieren." ),
														  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
		}
		else
		{
			Text *pf = pfad->getText();
			Text *n = name->getText();
			if( !pf || !n )
			{
				nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
															  new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
																		"Sie könnte eventuell nicht richtig funktionieren." ),
															  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
			}
			else
			{
				KSGSGetVariable getKSGSVariable = (KSGSGetVariable)GetProcAddress( ksgs, KSGS_VARIABLE_FUNKTION );
				if( getKSGSVariable )
				{
					int p = n->positionVon( ".ltdb/" );
					if( p < 0 )
						p = 0;
					else
						p += 6;
					Bild *b = bilder->get( *n );
					if( !b )
					{
						LTDBDatei *dat = new LTDBDatei();
						dat->setDatei( pf->getThis() );
						dat->leseDaten( 0 );
						b = dat->laden( 0, n->getTeilText( p, n->getLänge() ) );
						dat->release();
						if( b )
							bilder->add( *n, b->getThis() );
					}
					if( b )
					{
						KSGSVariableDef def = { KSGS_BILD, 0, 3, "" };
						KSGSVariable *ret = getKSGSVariable( fenster, &def );
						KSGSSetBild setKSGSBild = (KSGSSetBild)GetProcAddress( ksgs, KSGS_SET_BILD_FUNKTION );
						if( !setKSGSBild )
						{
							nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
																		  new Text( "Der Einstiegspunkt '" KSGS_SET_BILD_FUNKTION "' in der DLL-Datei "
																		  "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
																		  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
							b->release();
						}
						else
							setKSGSBild( ret, b );
						*retVal = ret;
					}
				}
				else
				{
					nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
																  new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
																			"'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
																  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
				}
			}
			if( pf )
				pf->release();
			if( n )
				n->release();
		}
		b->release();
		return;
	}
}

void SpieleKaufenAuswahl::doMausEreignis( MausEreignis &me )
{
	if( run )
		return;
	me.mx -= pos.x;
	me.my -= pos.y;
	if( fenster )
		fenster->doMausEreignis( me );
	me.mx += pos.x;
	me.my += pos.y;
}

void SpieleKaufenAuswahl::doTastaturEreignis( TastaturEreignis &te )
{
	if( run )
		return;
	if( fenster )
		fenster->doTastaturEreignis( te );
}

bool SpieleKaufenAuswahl::tick( double zeit )
{
	bool rend = ( fenster && !run ) ? fenster->tick( zeit ) : 0;
	rend |= laden->tick( zeit );
	if( ( run || !spielId ) && alpha > 0 )
	{
		if( alpha - zeit * 150 < 0 )
			alpha = 0;
		else
			alpha -= (unsigned char)( zeit * 150 );
		rend = 1;
	}
	if( !run && spielId && alpha < 255 )
	{
		if( alpha + zeit * 150 > 255 )
			alpha = 255;
		else
			alpha += (unsigned char)( zeit * 150 );
		rend = 1;
	}
	return rend;
}

void SpieleKaufenAuswahl::render( Bild &zRObj )
{
	if( !zRObj.setDrawOptions( pos.x, pos.y, ram->getBreite(), ram->getHöhe() ) )
		return;
	zRObj.setAlpha( alpha );
	ram->render( zRObj );
	if( fenster )
		fenster->render( zRObj );
	zRObj.releaseAlpha();
	laden->render( zRObj );
	zRObj.releaseDrawOptions();
}

// constant

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

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


// Inhalt der SpieleKaufenListeEintrag Klasse aus SpieleKaufen.h
// Konstruktor
SpieleKaufenListeEintrag::SpieleKaufenListeEintrag( int id, Schrift *schrift )
{
	spielId = id;
	auswählen = initKnopf( 173, 73, 22, 22, 0, 0, "" );
	auswählen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Rahmen | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
	auswählen->setHintergrundBildZ( bilder->get( "shop.ltdb/weiter.png" ) );
	initToolTip( auswählen, "Spiel auswählen.", schrift, hauptScreen );
	auswählen->setLinienRahmenBreite( 1 );
	LTDBDatei *datei = new LTDBDatei();
	Text *bdpf = new Text( "data/tmp/shop/kaufen/spiele/" );
	bdpf->anhängen( id );
	bdpf->anhängen( "/titelbg.ltdb" );
	datei->setDatei( bdpf );
	hintergrund = datei->laden( 0, new Text( "auswbg.jpg" ) );
	datei->release();
	ausgewählt = new AlphaFeld();
	ausgewählt->setPosition( 1, 1 );
	ausgewählt->setGröße( 198, 98 );
	ausgewählt->setFarbe( 0x0000FF00 );
	ausgewählt->setStärke( 10 );
	ram = new LRahmen();
	ram->setGröße( 200, 100 );
	ram->setFarbe( 0xFFFFFFFF );
	ausw = 0;
	rend = 0;
	ref = 1;
}

// Destruktor
SpieleKaufenListeEintrag::~SpieleKaufenListeEintrag()
{
	auswählen->release();
	if( hintergrund )
		hintergrund->release();
	ausgewählt->release();
	ram->release();
}

// nicht constant
void SpieleKaufenListeEintrag::resetAuswahl()
{
	ausw = 0;
}

bool SpieleKaufenListeEintrag::doMausEreignis( MausEreignis &me )
{
	bool vera = me.verarbeitet;
	auswählen->doMausEreignis( me );
	if( !vera && me.verarbeitet && me.id == ME_RLinks )
	{
		ausw = 1;
		return 1;
	}
	return 0;
}

bool SpieleKaufenListeEintrag::tick( double zeit )
{
	rend |= ausgewählt->tick( zeit );
	rend |= auswählen->tick( zeit );
	int a = ( ausgewählt->getFarbe() >> 24 ) & 0xFF;
	if( ausw && a < 255 )
	{
		if( a + 150 * zeit > 255 )
			a = 255;
		else
			a += (int)( 150 * zeit );
		ausgewählt->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( ausgewählt->getFarbe() & 0xFFFFFF ) );
		rend = 1;
	}
	if( !ausw && a > 0 )
	{
		if( a - 150 * zeit < 0 )
			a = 0;
		else
			a -= (int)( 150 * zeit );
		ausgewählt->setFarbe( ( ( a << 24 ) & 0xFF000000 ) | ( ausgewählt->getFarbe() & 0xFFFFFF ) );
		rend = 1;
	}
	bool ret = rend;
	rend = 0;
	return ret;
}

void SpieleKaufenListeEintrag::render( int yOff, Bild &zRObj )
{
	if( !zRObj.setDrawOptions( 0, yOff, 200, 100 ) )
		return;
	ram->render( zRObj );
	if( hintergrund )
		zRObj.drawBild( 1, 1, 198, 98, *hintergrund );
	ausgewählt->render( zRObj );
	auswählen->render( zRObj );
	zRObj.releaseDrawOptions();
}

// constant
int SpieleKaufenListeEintrag::getSpielId() const
{
	return spielId;
}

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

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


// Inhalt der SpieleKaufenListe Klasse aus SpieleKaufen.h
// Konstruktor
SpieleKaufenListe::SpieleKaufenListe( Schrift *schrift )
{
	s = schrift;
	pos = Punkt( 5, 55 );
	ram = new LRahmen();
	ram->setGröße( 215, 380 );
	ram->setFarbe( 0xFFFFFFFF );
	einträge = new RCArray< SpieleKaufenListeEintrag >();
	vScroll = new VScrollBar();
	vScroll->setKlickScroll( 10 );
	vScroll->update( 0, 380 );
	rend = 0;
	ref = 1;
	InitializeCriticalSection( &cs );
}

// Destruktor
SpieleKaufenListe::~SpieleKaufenListe()
{
	s->release();
	ram->release();
	einträge->release();
	vScroll->release();
	DeleteCriticalSection( &cs );
}

// nicht constant
void SpieleKaufenListe::ladeSpiele( Array< int > *spiele )
{
	leeren();
	int anz = spiele->getEintragAnzahl();
	for( int i = 0; i < anz; i++ )
	{
		if( shopKlient->ladeSpielTitel( spiele->hat( i ) ? spiele->get( i ) : 0 ) )
			einträge->add( new SpieleKaufenListeEintrag( spiele->hat( i ) ? spiele->get( i ) : 0, s->getThis() ) );
	}
	vScroll->update( anz * 100, 380 );
	rend = 1;
}

void SpieleKaufenListe::leeren()
{
	EnterCriticalSection( &cs );
	einträge->leeren();
	LeaveCriticalSection( &cs );
	vScroll->update( 0, 380 );
	rend = 1;
}

int SpieleKaufenListe::doMausEreignis( MausEreignis &me )
{
	int mx = me.mx;
	int my = me.my;
	me.mx -= pos.x;
	me.my -= pos.y;
	vScroll->doMausMessage( 200, 0, 15, 380, me );
	me.my += vScroll->getScrollData()->anzeigeBeginn;
	int ret = 0;
	EnterCriticalSection( &cs );
	int anz = einträge->getEintragAnzahl();
	for( int i = 0; i < anz; i++ )
	{
		if( einträge->z( i )->doMausEreignis( me ) )
			ret = einträge->z( i )->getSpielId();
		me.my += 100;
	}
	if( ret )
	{
		for( int i = 0; i < anz; i++ )
		{
			if( einträge->z( i )->getSpielId() != ret )
				einträge->z( i )->resetAuswahl();
		}
	}
	LeaveCriticalSection( &cs );
	me.mx = mx;
	me.my = my;
	return ret;
}

bool SpieleKaufenListe::tick( double zeit )
{
	rend |= vScroll->getRend();
	EnterCriticalSection( &cs );
	int anz = einträge->getEintragAnzahl();
	for( int i = 0; i < anz; i++ )
		rend |= einträge->z( i )->tick( zeit );
	LeaveCriticalSection( &cs );
	bool ret = rend;
	rend = 0;
	return ret;
}

void SpieleKaufenListe::render( Bild &zRObj )
{
	int br = ram->getBreite();
	int hö = ram->getHöhe();
	if( !zRObj.setDrawOptions( pos.x, pos.y, br, hö ) )
		return;
	ram->render( zRObj );
	EnterCriticalSection( &cs );
	int anz = einträge->getEintragAnzahl();
	for( int i = 0; i < anz; i++ )
		einträge->z( i )->render( i * 100 - vScroll->getScrollData()->anzeigeBeginn, zRObj );
	LeaveCriticalSection( &cs );
	vScroll->render( 200, 0, 15, 380, zRObj );
	zRObj.releaseDrawOptions();
}

// constant
int SpieleKaufenListe::getEintragAnzahl()
{
	return einträge->getEintragAnzahl();
}

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

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


// Inhalt der SpieleKaufen Klasse aus SpieleKaufen.h
// Konstruktor
SpieleKaufen::SpieleKaufen( Schrift *zSchrift )
	: Thread()
{
	Bild *shopZurück = bilder->get( "shop.ltdb/zurück.png" );
	if( !shopZurück )
	{
		LTDBDatei *datei = new LTDBDatei();
		datei->setDatei( new Text( "data/client/bilder/shop.ltdb" ) );
		datei->leseDaten( 0 );
		shopZurück = datei->laden( 0, new Text( "zurück.png" ) );
		datei->release();
		bilder->add( "shop.ltdb/zurück.png", shopZurück->getThis() );
	}
	Bild *shopWeiter = bilder->get( "shop.ltdb/weiter.png" );
	if( !shopWeiter )
	{
		LTDBDatei *datei = new LTDBDatei();
		datei->setDatei( new Text( "data/client/bilder/shop.ltdb" ) );
		datei->leseDaten( 0 );
		shopWeiter = datei->laden( 0, new Text( "weiter.png" ) );
		datei->release();
		bilder->add( "shop.ltdb/weiter.png", shopWeiter->getThis() );
	}
	alpha = 255;
	sichtbar = 0;
	suchText = new Text( "" );
	ram = new LRahmen();
	ram->setGröße( 780, 440 );
	ram->setFarbe( 0xFFFFFFFF );
	pos = Punkt( 10, 50 );
	suchFilterT = initTextFeld( 5, 5, 70, 20, zSchrift, TextFeld::Style::Text, "Suchfilter:" );
	suchFilter = initTextFeld( 80, 5, 225, 20, zSchrift, TextFeld::Style::TextFeld, "" );
	initToolTip( suchFilter, "Gebe etwas vom Namen des Spieles ein, nach dem du suchst.", zSchrift->getThis(), hauptScreen );
	suchen = initKnopf( 310, 5, 100, 20, zSchrift, Knopf::Style::Sichtbar, "suchen" );
	seiten = initTextFeld( 55, 30, 250, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Seite 0 von 0, 0 Funde." );
	zurück = initKnopf( 5, 30, 20, 20, 0, 0, "" );
	zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
	zurück->setHintergrundBildZ( shopZurück );
	initToolTip( zurück, "Seite zurück blättern.", zSchrift->getThis(), hauptScreen );
	weiter = initKnopf( 30, 30, 20, 20, 0, 0, "" );
	weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
	weiter->setHintergrundBildZ( shopWeiter );
	initToolTip( weiter, "Seite weiter blättern.", zSchrift->getThis(), hauptScreen );
	liste = new SpieleKaufenListe( zSchrift->getThis() );
	auswahl = new SpieleKaufenAuswahl( zSchrift );
	laden = ( Framework::Animation2D* )ladeAnimation->dublizieren();
	laden->setPosition( 365, 195 );
	laden->setSichtbar( 0 );
	tickVal = 0;
	seite = 0;
	maxSeite = 0;
	rend = 0;
	ref = 1;
}

// Destruktor
SpieleKaufen::~SpieleKaufen()
{
	if( run )
		warteAufThread( 1000 );
	if( run )
		ende();
	suchText->release();
	ram->release();
	suchFilter->release();
	suchFilterT->release();
	suchen->release();
	seiten->release();
	weiter->release();
	zurück->release();
	liste->release();
	auswahl->release();
	laden->release();
}

// nicht constant
void SpieleKaufen::setSichtbar( bool sicht )
{
	sichtbar = sicht;
	if( sichtbar && !liste->getEintragAnzahl() )
	{
		MausEreignis me;
		me.id = ME_RLinks;
		me.verarbeitet = 0;
		me.mx = suchen->getX() + 1 + pos.x;
		me.my = suchen->getY() + 1 + pos.y;
		doMausEreignis( me );
	}
}

void SpieleKaufen::thread()
{
	laden->setSichtbar( 1 );
	Array< int > *list = shopKlient->suchSpiele( suchText->getText() );
	if( !list )
	{
		laden->setSichtbar( 0 );
		run = 0;
		return;
	}
	Array< int > *slist = new Array< int >();
	int anz = list->getEintragAnzahl();
	maxSeite = anz / 10 + 1;
	if( !( anz % 10 ) )
		maxSeite--;
	while( anz <= seite * 10 && seite > 0 )
		seite--;
	for( int i = seite * 10; i < anz && i < seite * 10 + 10; i++ )
		slist->add( list->hat( i ) ? list->get( i ) : 0 );
	list->release();
	auswahl->reset();
	liste->ladeSpiele( slist );
	slist->release();
	Text *t = new Text( "Seite " );
	t->anhängen( maxSeite ? seite + 1 : 0 );
	t->anhängen( " von " );
	t->anhängen( maxSeite );
	t->anhängen( ", " );
	t->anhängen( anz );
	if( anz == 1 )
		t->anhängen( " Fund." );
	else
		t->anhängen( " Funde." );
	seiten->setText( t );
	zurück->setStyle( TextFeld::Style::Erlaubt, seite > 0 );
	weiter->setStyle( TextFeld::Style::Erlaubt, seite + 1 < maxSeite );
	laden->setSichtbar( 0 );
	run = 0;
}

void SpieleKaufen::doMausEreignis( MausEreignis &me )
{
	if( !sichtbar || run )
		return;
	int mx = me.mx;
	int my = me.my;
	me.mx -= pos.x;
	me.my -= pos.y;
	suchFilter->doMausEreignis( me );
	int auswId = liste->doMausEreignis( me );
	if( auswId )
		auswahl->ladeSpielSeite( auswId );
	auswahl->doMausEreignis( me );
	int ak = 0;
	bool tmp = me.verarbeitet;
	suchen->doMausEreignis( me );
	ak = me.verarbeitet ? 1 : 0;
	zurück->doMausEreignis( me );
	ak = me.verarbeitet && !ak ? 2 : ak;
	weiter->doMausEreignis( me );
	ak = me.verarbeitet && !ak ? 3 : ak;
	if( tmp )
		ak = 0;
	if( me.id == ME_RLinks )
	{
		switch( ak )
		{
		case 1: // Suchen
			suchText->setText( suchFilter->zText()->getText() );
			seite = 1;
			maxSeite = 1;
			start();
			break;
		case 2: // Seite zurück blättern
			seite--;
			if( seite < 1 )
				seite = 1;
			start();
			break;
		case 3: // Seite vorwärts blättern
			seite++;
			if( seite > maxSeite )
				seite = maxSeite;
			start();
			break;
		}
	}
	me.mx = mx;
	me.my = my;
}

void SpieleKaufen::doTastaturEreignis( TastaturEreignis &te )
{
	if( !sichtbar || run )
		return;
	bool vera = te.verarbeitet;
	suchFilter->doTastaturEreignis( te );
	if( !vera && te.verarbeitet && te.taste == T_Enter && te.id == TE_Release )
	{
		MausEreignis me;
		me.id = ME_RLinks;
		me.verarbeitet = 0;
		me.mx = suchen->getX() + 1 + pos.x;
		me.my = suchen->getY() + 1 + pos.y;
		doMausEreignis( me );
	}
	auswahl->doTastaturEreignis( te );
}

bool SpieleKaufen::tick( double zeit )
{
	rend |= suchFilter->tick( zeit );
	rend |= suchFilterT->tick( zeit );
	rend |= suchen->tick( zeit );
	rend |= weiter->tick( zeit );
	rend |= zurück->tick( zeit );
	rend |= liste->tick( zeit );
	rend |= auswahl->tick( zeit );
	rend |= laden->tick( zeit );
	tickVal += zeit * 250;
	int val = (int)tickVal;
	if( val < 1 )
	{
		bool ret = rend;
		rend = 0;
		return ret;
	}
	if( val > 10 )
		val = 10;
	tickVal -= val;
	if( sichtbar && alpha != 255 && !run )
	{
		if( alpha + val > 255 )
			alpha = 255;
		else
			alpha += val;
		rend = 1;
	}
	if( sichtbar && alpha != 125 && run )
	{
		if( alpha > 125 )
		{
			if( alpha - val < 125 )
				alpha = 125;
			else
				alpha -= val;
			rend = 1;
		}
		else
		{
			if( alpha + val > 125 )
				alpha = 125;
			else
				alpha += 125;
			rend = 1;
		}
	}
	if( !sichtbar && alpha != 0 )
	{
		if( alpha - val < 0 )
			alpha = 0;
		else
			alpha -= val;
		rend = 1;
	}
	bool ret = rend;
	rend = 0;
	return ret;
}

void SpieleKaufen::render( Bild &zRObj )
{
	if( !alpha )
		return;
	int br = ram->getBreite();
	int hö = ram->getHöhe();
	if( !zRObj.setDrawOptions( pos.x, pos.y, br, hö ) )
		return;
	zRObj.setAlpha( alpha );
	ram->render( zRObj );
	suchFilterT->render( zRObj );
	suchFilter->render( zRObj );
	suchen->render( zRObj );
	seiten->render( zRObj );
	weiter->render( zRObj );
	zurück->render( zRObj );
	liste->render( zRObj );
	auswahl->render( zRObj );
	zRObj.releaseAlpha();
	laden->render( zRObj );
	zRObj.releaseDrawOptions();
}

// constant
bool SpieleKaufen::istSichtbar() const
{
	return sichtbar;
}

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

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